1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWSでサブドメイン移譲とCloudFront配信を試したときのメモ

Posted at

背景・目的

AWS環境では、異なるアカウント間でのリソース管理が必要になる場合があります。
例えば、マルチアカウント構成や、運用上の要件から、1つのアカウントから別のアカウントにサブドメインを移譲し、そのサブドメインを使ってコンテンツを配信するケースがあります。

今回は、Amazon Route 53を使用してアカウントAからアカウントBにサブドメインを移譲し、アカウントAのCloudFront(S3オリジン)を利用してコンテンツを配信する手順を試してみます。

実践

今回、サブドメインを別アカウントに移譲し、移譲先のアカウントから、そのサブドメインを使用して別アカウントにあるCloudFrontへアクセスする流れを検証します。

image.png

1. サブドメイン移譲 (NSレコードの設定)

アカウントAのRoute 53で、移譲するサブドメイン(例:sub.xxx.com)のNSレコードを作成し、アカウントBのRoute 53のネームサーバーを指定します。
アカウントBのRoute 53で、サブドメイン用のホストゾーンを作成し、そのホストゾーンに割り当てられたネームサーバー情報をアカウントAのNSレコードに設定します。

アカウントBの作業

  1. アカウントBでAWSにサインインします

  2. Route 53に移動します

  3. 下記を入力し、ホストゾーンを作成します

    • ドメイン名:アカウントAのドメインのサブドメインを設定
    • タイプ:パブリックホストゾーン
      image.png
  4. NSレコードをメモします

アカウントAの作業

下記で作成したドメインとホストゾーンを使用します。

  1. 作成済みのホストゾーンをクリックします

  2. 「レコードを作成」をクリックします

  3. 「シンプルルーティング」を選択し、「次へ」をクリックします

  4. 下記を入力し、「シンプルなレコードを定義」をクリックします

    • ①. サブドメイン名
    • ②. NSレコード
    • ③. 値/トラフィックのルーティング先に、アカウントBのNSレコードに指定されているName Server
      image.png
  5. 「レコードを作成」をクリックします

動作確認

DNSの伝搬には時間がかかるので、必要に応じて、ネームサーバを指定してください。

  1. ターミナルで、サブドメインに対して、digを実行します。QUESTION SECTIONとANSWER SECTIONが返ってきます

    % dig xxx.yyy.com
    
  2. 上記で返ってこない場合は、ネームサーバを指定します

    % dig xxx.yyy.com ns-nnnn.awsdns-nnnn.org
    
  3. 必要に応じてhttps://dnschecker.org/ などで確認します
    image.png

2. CloudFrontの設定 (アカウントA)

アカウントAでCloudFrontディストリビューションを作成し、オリジンにS3バケットを設定します。
CloudFrontのカスタムドメイン名として、sub.xxx.comを追加します(この時点ではまだHTTP通信が可能です)。

S3バケットの作成

  1. S3に移動します
  2. 専用のバケットを作成します
  3. 下記のコンテツをアップロードします
    % 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の作成

  1. CloudFrontに移動します
  2. 「CloudFrontディストリビューションを作成」をクリックします

S3バケットポリシーの更新

  1. S3に移動します
  2. アクセス許可タブをクリックします
  3. バケットポリシーの編集をクリックします
  4. 下記のバケットポリシーを貼り付けます
    {
            "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"
                        }
                    }
                }
            ]
    }
    

動作確認

  1. CloudFrontのディストリビューションドメイン名でアクセスしてみます。画面が表示されました
    image.png

3. Route 53でAliasレコードを設定(アカウントB)

  1. Route 53に移動します
  2. ホストゾーンを選択します
  3. 「レコードを作成」をクリックします
  4. 下記を入力し、「レコードを作成」をクリックします
    • ①レコードタイプ:A
    • ②エイリアス:有効
    • ③ルーティング:CloudFrontディストリビューションへのエイリアス
    • ④ディストリビューション:アカウントAのCloudFrontディストリビューションドメイン名
      image.png

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)

  1. AWS Certificate Managerに移動します

  2. 「証明書をリクエスト」をクリックします

  3. 「パブリック証明書をリクエスト」を選択し、「次へ」をクリックします
    image.png

  4. 下記を指定し、「リクエスト」をクリックします

    • 完全修飾ドメイン名:サブドメイン
      image.png
      image.png
  5. ステータスが「保留中の検証」になります
    image.png

  6. ①CNAME名と、②CNAME値を保存します
    image.png

CNAMEレコードを追加(アカウントB)

  1. Route 53に移動しホストゾーンを選択します
  2. 「レコードを作成」をクリックします
  3. 下記を指定し、「レコードを作成」をクリックします
    • ①レコード名:上記のアカウントAのCNAME名
    • ②値:上記のアカウントAのCNAME値
      image.png
  4. 作成されました
    image.png

ACMのステータスの確認(アカウントA)

CNAMEレコードの追加から、発行済まで少し時間がかかります。

  1. ACMに移動します
  2. 作成した証明書を選択します
  3. 証明書のステータスが「発行済み」になっていることを確認します
    image.png

CloudFrontでCustom SSL Certificationを設定(アカウントA)

  1. CloudFrontに移動します
  2. 作成したディストリビューションを選択します
  3. Custom SSL certificate - optionalに作成した、ACMの証明書を指定します
    image.png

CNAMEを設定(アカウントA)

  1. CloudFrontに移動します
  2. 作成したディストリビューションを選択します
  3. ①「項目を追加」をクリックし、②「CNAMEs」に上記のサブドメインを指定し、「変更を保存」をクリックします
    image.png

5. 動作確認

ブラウザやcurlコマンドを使用して、https://sub.xxx.comにアクセスし、HTTPSでセキュアにコンテンツが配信されているか確認します。
HTTPSでアクセスでき、CloudFront経由でS3のコンテンツが配信されることを確認します。

  1. サブドメインでアクセスします。表示されました
    image.png

考察

今回は、サブドメインの移譲に加えて、動作確認のために別アカウントのCloudFrontにリクエストされるように設定しました。そのため、事前に証明書を発行したり、CNAMEの登録が必要だったりと、少し複雑な構成になっていしまいました。

参考

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?