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のルーティングの流れは以下の通り:
- DNS(例:Route 53)で
api.example.com
もstatic.example.com
も 同じCloudFrontディストリビューション に向ける - CloudFrontは来たリクエストの パス部分 を見てオリジンに振り分ける
-
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はパスルーティングは得意ですが、ホスト名ベースのルーティングは苦手という点を覚えておくと、構成を設計するときに役立つはずです。