背景・目的
AWS環境では、異なるアカウント間でのリソース管理が必要になる場合があります。
例えば、マルチアカウント構成や、運用上の要件から、1つのアカウントから別のアカウントにサブドメインを移譲し、そのサブドメインを使ってコンテンツを配信するケースがあります。
今回は、Amazon Route 53を使用してアカウントAからアカウントBにサブドメインを移譲し、アカウントAのCloudFront(S3オリジン)を利用してコンテンツを配信する手順を試してみます。
実践
今回、サブドメインを別アカウントに移譲し、移譲先のアカウントから、そのサブドメインを使用して別アカウントにあるCloudFrontへアクセスする流れを検証します。
1. サブドメイン移譲 (NSレコードの設定)
アカウントAのRoute 53で、移譲するサブドメイン(例:sub.xxx.com)のNSレコードを作成し、アカウントBのRoute 53のネームサーバーを指定します。
アカウントBのRoute 53で、サブドメイン用のホストゾーンを作成し、そのホストゾーンに割り当てられたネームサーバー情報をアカウントAのNSレコードに設定します。
アカウントBの作業
-
アカウントBでAWSにサインインします
-
Route 53に移動します
-
下記を入力し、ホストゾーンを作成します
-
NSレコードをメモします
アカウントAの作業
下記で作成したドメインとホストゾーンを使用します。
-
作成済みのホストゾーンをクリックします
-
「レコードを作成」をクリックします
-
「シンプルルーティング」を選択し、「次へ」をクリックします
-
下記を入力し、「シンプルなレコードを定義」をクリックします
-
「レコードを作成」をクリックします
動作確認
DNSの伝搬には時間がかかるので、必要に応じて、ネームサーバを指定してください。
-
ターミナルで、サブドメインに対して、digを実行します。QUESTION SECTIONとANSWER SECTIONが返ってきます
% dig xxx.yyy.com
-
上記で返ってこない場合は、ネームサーバを指定します
% dig xxx.yyy.com ns-nnnn.awsdns-nnnn.org
-
必要に応じてhttps://dnschecker.org/ などで確認します
2. CloudFrontの設定 (アカウントA)
アカウントAでCloudFrontディストリビューションを作成し、オリジンにS3バケットを設定します。
CloudFrontのカスタムドメイン名として、sub.xxx.comを追加します(この時点ではまだHTTP通信が可能です)。
S3バケットの作成
- S3に移動します
- 専用のバケットを作成します
- 下記のコンテツをアップロードします
% cat index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Welcome to CloudFront</title> <style> body { font-family: Arial, sans-serif; background-color: #f0f0f0; color: #333; text-align: center; padding: 50px; } h1 { color: #0073e6; } </style> </head> <body> <h1>Welcome to CloudFront</h1> <p>This HTML file is served via AWS CloudFront!</p> </body> </html> %
CloudFrontの作成
- CloudFrontに移動します
- 「CloudFrontディストリビューションを作成」をクリックします
S3バケットポリシーの更新
- S3に移動します
- アクセス許可タブをクリックします
- バケットポリシーの編集をクリックします
- 下記のバケットポリシーを貼り付けます
{ "Version": "2008-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "AllowCloudFrontServicePrincipal", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::XXXXXXXXXX/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::XXXXXXX:distribution/XXXXX" } } } ] }
動作確認
3. Route 53でAliasレコードを設定(アカウントB)
- Route 53に移動します
- ホストゾーンを選択します
- 「レコードを作成」をクリックします
- 下記を入力し、「レコードを作成」をクリックします
4. SSL証明書の発行と適用
アカウントAでAWS Certificate Manager(ACM)を使用し、sub.xxx.com用のSSL証明書を発行します。
ACMで「証明書のリクエスト」を行い、sub.xxx.comを指定します。
ドメイン所有確認のためのDNS検証が必要になるので、アカウントBのRoute 53に必要なDNSレコードを追加します。
ACMで発行されたSSL証明書をCloudFrontディストリビューションに適用し、HTTPS通信を有効にします。
証明書の作成(アカウントA)
-
AWS Certificate Managerに移動します
-
「証明書をリクエスト」をクリックします
-
下記を指定し、「リクエスト」をクリックします
CNAMEレコードを追加(アカウントB)
ACMのステータスの確認(アカウントA)
CNAMEレコードの追加から、発行済まで少し時間がかかります。
CloudFrontでCustom SSL Certificationを設定(アカウントA)
CNAMEを設定(アカウントA)
5. 動作確認
ブラウザやcurlコマンドを使用して、https://sub.xxx.comにアクセスし、HTTPSでセキュアにコンテンツが配信されているか確認します。
HTTPSでアクセスでき、CloudFront経由でS3のコンテンツが配信されることを確認します。
考察
今回は、サブドメインの移譲に加えて、動作確認のために別アカウントのCloudFrontにリクエストされるように設定しました。そのため、事前に証明書を発行したり、CNAMEの登録が必要だったりと、少し複雑な構成になっていしまいました。
参考