0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CloudFrontではサブドメインを1つのディストリビューションにまとめられない?その理由と回避策

Posted at

CloudFrontではサブドメインを1つのディストリビューションにまとめられない?その理由と回避策

AWS CloudFrontを使って複数のサブドメイン(例: api.example.com, static.example.com, cdn.example.com)をCDN配信しようとしたときに、こんなことを思ったことはありませんか?

「全部1つのCloudFrontディストリビューションにまとめたい!」

しかし、実際にはCloudFrontでは複数のオリジンに対して同じサブドメイン構造をまとめるのが難しい場面があります。本記事ではその理由と、回避策について解説します。


💡 問題の概要

CloudFrontの設定で、1つのディストリビューションに複数のオリジン(例えばS3やALB)を登録し、ビヘイビア(パスベース)で振り分けることは可能です。

example.com/api/*     → オリジンA(APIサーバ)
example.com/static/*  → オリジンB(S3静的サイト)

一方、次のように異なるサブドメインごとに振り分けることはCloudFront単体では直接できません。

api.example.com     → オリジンA(APIサーバ)
static.example.com  → オリジンB(S3静的サイト)

CloudFrontの1つのディストリビューションに割り当てられる Alternate Domain Names (CNAMEs) には、複数のサブドメインを指定できますが、ルーティングをドメイン名ベースで制御する仕組みが存在しません


❌ なぜできないのか?

CloudFrontの**ビヘイビアの条件分岐は「パス単位」**であり、ホスト名(サブドメイン)単位では分岐できないという制限があるためです。

つまり、CloudFrontのルーティングの流れは以下の通り:

  1. DNS(例:Route 53)で api.example.comstatic.example.com同じCloudFrontディストリビューション に向ける
  2. CloudFrontは来たリクエストの パス部分 を見てオリジンに振り分ける
  3. Hostヘッダ(サブドメイン) による分岐は できない

✅ 回避策

1. Lambda@Edge で Hostヘッダを見て動的にオリジンを切り替える

CloudFront + Lambda@Edge を使うことで、Hostヘッダ(=サブドメイン)ごとに処理を分岐することが可能です。

exports.handler = async (event) => {
  const request = event.Records[0].cf.request;
  const headers = request.headers;

  const host = headers.host[0].value;

  if (host === 'api.example.com') {
    request.origin = {
      custom: {
        domainName: 'api.internal.example.com',
        port: 443,
        protocol: 'https',
        path: '',
        sslProtocols: ['TLSv1.2'],
        readTimeout: 5,
        keepaliveTimeout: 5,
        customHeaders: {},
      },
    };
  } else if (host === 'static.example.com') {
    request.origin = {
      s3: {
        domainName: 'static-bucket.s3.amazonaws.com',
        region: 'us-east-1',
        authMethod: 'none',
        path: '',
        customHeaders: {},
      },
    };
  }

  return request;
};

ただし、Lambda@Edge には以下のような注意点があります:

  • デプロイがやや面倒(リージョン:us-east-1
  • デバッグがしづらい
  • レイテンシが増える可能性あり
  • コストが追加される

2. CloudFrontディストリビューションをサブドメインごとに分ける

最もシンプルで安定する方法は、CloudFrontディストリビューションを分けることです。

サブドメイン CloudFrontディストリビューション オリジン
api.example.com d1111111abcdef8.cloudfront.net API用
static.example.com d2222222bcdef9.cloudfront.net S3用

この方法は設定が明快で、CloudFrontの機能に制限されずに構成できます。


🔚 まとめ

項目 内容
✅ CloudFrontでのパス単位ルーティング 可能
❌ サブドメインごとのルーティング 不可(ビヘイビアでは)
🔁 Lambda@Edgeで回避 可能だが複雑
🎯 ディストリビューション分割 安定・おすすめ

📝 おわりに

「CloudFrontで複数のサブドメインを1つにまとめたい!」というアイデアは理にかなっていますが、現時点ではそのまま実現するには制限があります。

CloudFrontはパスルーティングは得意ですが、ホスト名ベースのルーティングは苦手という点を覚えておくと、構成を設計するときに役立つはずです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?