AWS: 複数のドメインを別のドメインのページにリダイレクトするにはどうすればよいですか?

AWS: 複数のドメインを別のドメインのページにリダイレクトするにはどうすればよいですか?

私の目的

ドメインが複数(10または20)あり、リダイレクトしたいどれでも訪問者どこでもそれらのページを別のドメインの 1 つのページ (たとえば、私の stackoverflow.com プロフィール ページ) に移動します。

これも

  1. 頂点ドメインhttp(例http://mydomain01.com)
  2. 頂点ドメインhttps(例https://mydomain01.com)
  3. サブドメインhttp(例:http://www.mydomain01.comまたはhttp://blog.mydomain01.com)
  4. サブドメインhttps(例:https://www.mydomain01.comまたはhttps://blog.mydomain01.com)
  5. 任意のパス(例:http://mydomain01.com/some_pathまたはhttps://www.mydomain01.com/another/path.html

mydomain02.comさらに、他のすべてのドメイン( 、mydomain03.comなど。それぞれ上記のユースケース)についても同様です。

私の研究

  1. このAWSの記事インターネットトラフィックを頂点ドメインから別のドメインにリダイレクトする方法を説明します(私のケース#1)これも上記のリストを使用してAWS のそしてAWS ルート 53: これは では機能しますhttpが、 では機能しませんhttps
  2. このAWSの記事インターネットトラフィックをリダイレクトする方法をいくつかのケースで説明しています(私の場合、すべてのケースをカバーしているようです)。これも上記のリストを使用してAWS のAWS ルート 53そしてAWS クラウドフロント: これはhttpとの両方で機能しますhttps。(Application Load Balancer の使用についても説明していますが、ここでは説明の範囲を超えていると思います...)
  3. このAWSの記事CloudFront ディストリビューションの設定とログ ファイルの詳細を取得する方法について、さらに詳しく説明します。
  4. このAWSの記事高度な条件付きリダイレクトを使用するためのドキュメントのリダイレクト ルール: 目的を達成するためにそこに行く必要があるかどうかわからないので、まだ詳しく調べていません。

さらに、SOに関する質問はたくさんあることは明らかです(関連している(この質問の右側にある)およびこのテーマに関する他の投稿がありますが、それらのほとんどの問題は、AWS コンソール UI の以前のバージョンのスクリーンショットを使用していることです。コンテンツの大部分は同じであるはずですが、それらのスクリーンショットを現在の UI と関連付けると、さらに混乱が生じると思います。

AWS (およびその他の) ドキュメントから得られる重要なポイント:

  1. AWS S3にバケットを作成し、その中でリダイレクトを設定する必要があります。
  2. AWS CloudFront でディストリビューションを作成する必要があります。
  3. CloudFrontでカスタムドメインを使用するには、AWS ACMで証明書を作成する必要があります。
  4. AWS Route 53 にホストゾーンを作成し、その中にレコードを設定する必要があります。

これまでの私の仕事

最新の AWS CLI がインストールされ、regionoutput設定され~/.aws/config、 で認証情報がセットアップされています~/.aws/credentials(各 AWS アカウントごとに)。AWS_*環境変数編集されていますexport

US East (N. Virginia) (us-east-1)AWS リソースがリージョン内で利用できないことによる追加の問題を防ぐために、すべてにAWS リージョンを使用しています。

$ aws --version
aws-cli/2.2.23 Python/3.9.6 Darwin/19.6.0 source/x86_64 prompt/off

>この投稿からシェルにコピーしやすくするために、シェルのプロンプトやシェルの行継続文字は省略しています。

S3バケットを設定する

警告:これにより、アクセス制限のない「すべてパブリック」バケットが作成されます。この場合、保護するバケットの内容がないため、これは問題になりませんが、このようなパブリック バケットは一般に悪い習慣です。また、アクセス制限によって発生する追加の問題を防ぐために、パブリック バケットを使用しています。まず、動作させる。次に、セキュリティを確保する

バケットを作成する

aws s3api create-bucket --bucket mydomain01.com
  • 応答:
{
    "Location": "/mydomain01.com"
}

リダイレクトを設定する

aws s3api put-bucket-website --bucket mydomain01.com --website-configuration \
    '{ "RedirectAllRequestsTo": { "HostName": "stackoverflow.com/users/217844/ssc" } }'
  • 応答なし

わかったよ:S3 バケット名は Apex ドメイン名と一致する必要があります。

任意のバケット名を使用しましたが、mydomain01.com(私の例では)原因が示されずに失敗するようです。AWS ドキュメントではこの点についてあまり明確に説明されていません。実際、ここで何か大きく誤解しているかどうかはまだわかりませんが、私が知る限り、公式 AWS ドキュメントではこの点についてかなりずさんです。私の意見では、重要なポイントは次のとおりです。たとえば、#2ただ言う

  1. グローバルに一意の名前を持つ S3 バケットを作成します。

それはどれでもグローバルに一意の名前。#1何らかの形でそのことを言及しています - それらのビットの読み方がわかれば...

ちなみに、記事2は私を混乱させ続けています

カスタムドメインを使用していない場合は...

なぜ私がないカスタム ドメインを使用しているのですか?!? 重要なのは、カスタム ドメインをリダイレクトすることですよね?!? とにかく...

わかったよ:ホスト名の前にプロトコルを追加しないでください。

AWSコンソールもAWS CLIも、プロトコル(http://またはhttps://)が入力されたかどうかをテストしていないようです。ホスト名UIフィールド/はHostNameJSON文字列で渡されます。ただし、先頭に付加されている場合はリダイレクトは失敗します。リダイレクトをテストする下に。

わかったよ:AWS S3 コンソール UI のバグ。

リダイレクトが設定されると、AWSコンソールのUIにhttp://mydomain01.com.s3-website-us-east-1.amazonaws.comバケットの一番下にバケットURL( )へのクリック可能なリンクが表示されます。プロパティタブの静的ウェブサイトホスティングセクション。

http://https//stackoverflow.com/users/217844/ssc/そのリンクをクリックしてもページを開くことができません。これは、プロトコルに関係なく、AWS コンソールが URL を間違えて開こうとするためと思われます。

リダイレクトをテストする

  • 使用してHTTPieシェルの代わりに、curlまたはwgetそれが最近のクールな若者が使っているものだからです
  • ブラウザのAWSコンソールからシェルへのリンクをコピーします
http http://mydomain01.com.s3-website-us-east-1.amazonaws.com/
HTTP/1.1 301 Moved Permanently
Content-Length: 0
Date: Mon, 02 Aug 2021 12:39:09 GMT
Location: http://stackoverflow.com/users/217844/ssc/
Server: AmazonS3
x-amz-id-2: rakAqUMnRraGvo/WkSa6AnbuhWn/9YZX/CAlI/OJQKYoWp/OdQIbyhsvHSwNved3suwMdgglqpE=
x-amz-request-id: C5BBG833Q9TQ9J6X

--> 動作するようです

  • プロトコルが誤ってホスト名の先頭に付加された場合のリダイレクトをテストします。壊れたLocationURL に注意してください。
http http://mydomain01.com.s3-website-us-east-1.amazonaws.com/
HTTP/1.1 301 Moved Permanently
Content-Length: 0
Date: Mon, 02 Aug 2021 12:52:10 GMT
Location: http://https://stackoverflow.com/users/217844/ssc/
Server: AmazonS3
x-amz-id-2: Ee2/ob0faTpRdp6mGITdmClozXNmF1Q2oTbPioms8O91VA8n5VA3MoHhveeFz7v2VS65YKFKlDA=
x-amz-request-id: ZJP653R50YD5HSRS

私の質問 #1

注: この文章を書き始めたとき、私は次のような疑問を抱いていました。考える私は自分で答えることができたので(wwwサブドメインレコードをテストする以下参照)。もし私が間違っていたら、誰か訂正してください。

  1. 質問:CloudFront を使用する場合でも、「バケット名 == ドメイン名」の要件は適用されますか?
    答え:はい。
  2. 質問:Apexドメインとサブドメインごとに1つのバケットを作成する必要がありますか?私の例では
    • mydomain01.com
    • www.mydomain01.com
    • blog.mydomain01.com?
      答え:はい。

Route 53ホストゾーンを設定する

ホストゾーンを作成する

aws route53 create-hosted-zone --caller-reference "$(date '+%Y%m%d-%H%M%S')" --name mydomain01.com
  • 応答
{
    "Location": "https://route53.amazonaws.com/2013-04-01/hostedzone/Z123456789EXAMPLE0SKX",
    "HostedZone": {
        "Id": "/hostedzone/Z123456789EXAMPLE0SKX",
        "Name": "mydomain01.com.",
        "CallerReference": "20210802-150736",
        "Config": {
            "PrivateZone": false
        },
        "ResourceRecordSetCount": 2
    },
    "ChangeInfo": {
        "Id": "/change/C1234567890SKXEXAMPLE",
        "Status": "PENDING",
        "SubmittedAt": "2021-08-02T13:07:37.860000+00:00"
    },
    "DelegationSet": {
        "NameServers": [
            "ns-1234.awsdns-12.com",
            "ns-5678.awsdns-34.co.uk",
            "ns-1234.awsdns-56.net",
            "ns-5678.awsdns-78.org"
        ]
    }
}
  • Z123456789EXAMPLE0SKX次のステップで必要となるホストゾーンIDをメモします。

apexドメインのレコードを作成する

{
  "Changes": [
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "mydomain01.com.",
        "Type": "A",
        "AliasTarget": {
          "HostedZoneId": "Z3AQBSTGFYJSTF",
          "DNSName": "s3-website-us-east-1.amazonaws.com",
          "EvaluateTargetHealth": false
        }
      }
    }
  ]
}

わかったよ:s3-website-us-east-1.amazonaws.comはそのまま使用する必要がありますDNSName

AWSのドキュメントでは、さまざまな場所でexample.comexample.com.s3-website-us-east-1.amazonaws.comなどについて説明しています。この場合、これは独自の値(例 )に置き換えられる例ではなくmydomain01.com.s3-website-us-east-1.amazonaws.com逐語的価値はテーブルつまりs3-website-us-east-1.amazonaws.com

わかったよ:ホスト名の前にプロトコルを追加しないでください。

上記の問題と同様に、AWSコンソールとAWS CLIはどちらも、入力された値の前にプロトコル(http://または)を喜んで受け入れます。https://ホスト名UIフィールド/として渡されますDNSName。少なくとも、これはとてもコンソールで間違っている、例:http\072\057\057mydomain01.s3-website-us-east-1.amazonaws.com.

AWS コンソールでは、レコードの作成時または編集時にドロップダウン ボックスから値を選択できるため、両方の問題がある程度緩和されます。AWS CLI を使用する場合は、送信する内容を再確認する必要があります。

同じ落とし穴と緩和策が、レコード名UI フィールド / NameJSON 値。

apex ドメインのレコードを作成します (続き)。

  • 使用jq簡単なテストのために、一時ファイルに有効なJSONが含まれています
jq . < change-batch.apex.json 1> /dev/null
  • 出力なし --> 有効な JSON
aws route53 change-resource-record-sets --hosted-zone-id Z123456789EXAMPLE0SKX \
    --change-batch "file://$(pwd)/change-batch.apex.json"
  • 応答
{
    "ChangeInfo": {
        "Id": "/change/C1234567890EXAMPLESKX",
        "Status": "PENDING",
        "SubmittedAt": "2021-08-02T14:20:09.370000+00:00"
    }
}

Apexドメインレコードをテストする

  • テストhttp
http http://mydomain01.com
HTTP/1.1 301 Moved Permanently
Content-Length: 0
Date: Mon, 02 Aug 2021 15:06:08 GMT
Location: http://stackoverflow.com/users/217844/ssc/
Server: AmazonS3
x-amz-id-2: EfDtCxif2iV4eInskirSBAOjQS7o9arzJCeZjscF6mW7cwwmm9Nxb7QJT50x2kjdslX2fOxA+lk=
x-amz-request-id: WM7K9TDEF75A6P1V

--> 良さそうだ

  • httpパスでテストする
http http://mydomain01.com/some/path
 ... similar output as above ...
  • テストhttps
http https://mydomain01.com

http: error: ConnectionError: HTTPSConnectionPool(host='mydomain01.com', port=443):
  Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x101a48100>:
    Failed to establish a new connection: [Errno 60] Operation timed out')) while doing a GET request to URL: https://mydomain01.com/
  • (読みやすさのために応答は折り返されています)

--> タイムアウト (60 秒後?) - 予想どおり: S3 バケットを使用したリダイレクトは機能しませんhttps(上記を参照)

わかったよ:DNS 変更の伝播遅延。

AWSとGoogleはとてもDNS設定の変更を伝播する速度は数秒または数分と高速ですが、他の「遅い」ネームサーバーが関係している可能性があります。説明に従ってそれらをバイパスしてください。ここ混乱の原因を排除するためです。このアプローチは macOS でのみ機能しますが、概念はどの OS でも同じです。

わかったよ:ブラウザのキャッシュ。

DNS の変更をシェルではなくブラウザでテストする場合、ブラウザはキャッシュから結果を取得する可能性があります。私はほとんどの作業を Chrome で行いますが、テストには Firefox (または Safari) を使用します。これにより、Google、AWS などからログアウトすることなく、テストの前にキャッシュ全体をクリアして潜在的な問題を排除できます。

wwwサブドメインのレコードを作成する

  • 唯一の違いはNameJSON値です
sed -e 's|mydomain01.com.|www.mydomain01.com.|g' change-batch.apex.json > change-batch.www.json
aws route53 change-resource-record-sets --hosted-zone-id Z123456789EXAMPLE0SKX \
    --change-batch "file://$(pwd)/change-batch.www.json
  • 上記と同様の回答

wwwサブドメインレコードをテストする

  • テストhttp
http http://www.mydomain01.com
HTTP/1.1 404 Not Found
Content-Length: 363
Content-Type: text/html; charset=utf-8
Date: Mon, 02 Aug 2021 15:28:05 GMT
Server: AmazonS3
x-amz-id-2: MGLcynq1iEGKh+pT6N6iRpCuQSN243q/5zm2Y7rXTnM7iW9nvDokF6s20xEUBr7QiEtBPEzZmII=
x-amz-request-id: TK83G35EMYFR8SKX

<html>
<head><title>404 Not Found</title></head>
<body>
<h1>404 Not Found</h1>
<ul>
<li>Code: NoSuchBucket</li>
<li>Message: The specified bucket does not exist</li>
<li>BucketName: www.mydomain01.com</li>
<li>RequestId: TK83G35EMYFR8SKX</li>
<li>HostId: MGLcynq1iEGKh+pT6N6iRpCuQSN243q/5zm2Y7rXTnM7iW9nvDokF6s20xEUBr7QiEtBPEzZmII=</li>
</ul>
<hr/>
</body>
</html>
  • これが2番目の質問の答えだと思います私の質問 #1上記: 転送するには、頂点/サブドメインごとに 1 つの S3 バケットが必要です。

CloudFront ディストリビューションを設定する

証明書を作成する

  • AWS ACMrequest-certificateドキュメント
  • 証明書は頂点とすべてのサブドメインで機能するはずなので、この証明書に別の名前を追加する/ 合格--subject-alternative-names; 見るこのAWSの記事(上の青いボックス)。
  • 引用符で囲む*.mydomain01.comとシェルは解釈しません*
aws acm request-certificate --domain-name mydomain01.com --validation-method DNS \
    --subject-alternative-names '*.mydomain01.com'
  • 応答:
{
    "CertificateArn": "arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-1234567890ab"
}
  • 123456789012は私のAWSアカウントIDです。それ以降はcertificate/UUIDです。

証明書の詳細を取得する

  • AWS ACMdescribe-certificateドキュメント
  • 応答を一時ローカルファイルに保存し、抽出しResourceRecord.NameResourceRecord.Value使用するjq
  • AWS Route 53レコードに必要なのは、私が所有していることを証明するものですmydomain01.com
  • または、--queryパラメータをaws acm describe-certificate
aws acm describe-certificate \
    --certificate-arn "arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-1234567890ab" \
 > describe-certificate.json
jq -r '.Certificate.DomainValidationOptions[0].ResourceRecord.Name' describe-certificate.json
_1234567890abcdef1234567890abcdef.mydomain01.com.

jq -r '.Certificate.DomainValidationOptions[0].ResourceRecord.Value' describe-certificate.json 
_1234567890abcdef1234567890abcdef.weirdchars.acm-validations.aws.

証明書検証用のRoute 53レコードを作成する

  • AWS ACMによって自動的にチェックされ、このレコードが見つかると証明書が検証されます。
  • 以前と同様に、一時的なローカルファイルを使用しますchange-batch.cert.json。例を参照してください。apexドメインのレコードを作成する; コンテンツ:
{
  "Changes": [
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "_1234567890abcdef1234567890abcdef.mydomain01.com.",
        "Type": "CNAME",
        "TTL": 300,
        "ResourceRecords": [
          {
            "Value": "_1234567890abcdef1234567890abcdef.weirdchars.acm-validations.aws."
          }
        ]
      }
    }
  ]
}
  • シェルコマンド:
aws route53 change-resource-record-sets --hosted-zone-id Z123456789EXAMPLE0SKX \
    --change-batch "file://$(pwd)/change-batch.cert.json
  • 上記のレコードを作成するときと同様の応答
  • 注意: ACM が証明書を検証するまでに数分かかる場合があります。

CloudFrontディストリビューションを作成する

  • AWS CloudFrontcreate-distributionドキュメント
  • 繰り返しますが、CallerReferenceこれは単純に一意の文字列である必要があります。date '+%Y%m%d-%H%M%S'例えば、シェルで使用してファイルを作成し、コピーします。ホストゾーンを作成する
  • create-distribution.json以前と同様に、複雑な値には一時的なローカルファイルを使用します。内容は以下のとおりです。
  • MinimumProtocolVersion: 値を取得するこのAWSの記事
  • OriginProtocolPolicy:http-onlyオリジン(S3バケット)ではhttp
  • ViewerProtocolPolicy:redirect-to-httpsこのディストリビューションを作成する目的は、からにリダイレクトすることですhttphttps
  • 注: どのフィールドが必須であるかはわかりません (AWS ドキュメントにも記載されていません)。送信されたデータに欠落または誤りがある場合、AWS CLI コマンドによって明確で詳細なメッセージが表示されます。
{
    "CallerReference": "20210802-191725",
    "Aliases": {
        "Quantity": 2,
        "Items": ["mydomain01.com", "*.mydomain01.com"]
    },
    "Origins": {
        "Quantity": 1,
        "Items": [
            {
                "Id": "mydomain01.com.s3.us-east-1.amazonaws.com_20210802-191725",
                "DomainName": "mydomain01.com.s3.us-east-1.amazonaws.com",
                "CustomOriginConfig": {
                    "HTTPPort": 80,
                    "HTTPSPort": 443,
                    "OriginProtocolPolicy": "http-only"
                }
            }
        ]
    },
    "OriginGroups": {
        "Quantity": 0
    },
    "DefaultCacheBehavior": {
        "TargetOriginId": "mydomain01.com.s3.us-east-1.amazonaws.com_20210802-191725",
        "ForwardedValues": {
            "QueryString": false,
            "Cookies": {
                "Forward": "none"
            },
            "Headers": {
                "Quantity": 0
            },
            "QueryStringCacheKeys": {
                "Quantity": 0
            }
        },
        "TrustedSigners": {
            "Enabled": false,
            "Quantity": 0
        },
        "ViewerProtocolPolicy": "redirect-to-https",
        "MinTTL": 0,
        "AllowedMethods": {
            "Quantity": 2,
            "Items": [
                "HEAD",
                "GET"
            ],
            "CachedMethods": {
                "Quantity": 2,
                "Items": [
                    "HEAD",
                    "GET"
                ]
            }
        },
        "SmoothStreaming": false,
        "DefaultTTL": 86400,
        "MaxTTL": 31536000,
        "Compress": false,
        "LambdaFunctionAssociations": {
            "Quantity": 0
        },
        "FieldLevelEncryptionId": ""
    },
    "CacheBehaviors": {
        "Quantity": 0
    },
    "CustomErrorResponses": {
        "Quantity": 0
    },
    "Comment": "",
    "Logging": {
        "Enabled": false,
        "IncludeCookies": false,
        "Bucket": "",
        "Prefix": ""
    },
    "PriceClass": "PriceClass_All",
    "Enabled": true,
    "ViewerCertificate": {
        "ACMCertificateArn": "arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-1234567890ab",
        "MinimumProtocolVersion": "TLSv1.2_2021",
        "SSLSupportMethod": "sni-only"
    },
    "Restrictions": {
        "GeoRestriction": {
            "RestrictionType": "none",
            "Quantity": 0
        }
    },
    "WebACLId": "",
    "HttpVersion": "http2",
    "IsIPV6Enabled": true
}
  • シェルコマンド:
  • 注:--no-cli-pagerページングを無効にし、検査のために応答を一時的なローカルファイルに保存するには追加します。
aws --no-cli-pager cloudfront create-distribution \
    --distribution-config "file://$(pwd)/create-distribution.json"
 > create-distribution.response.json
  • 応答: 大きな JSON 構造。主に、いくつかのディストリビューション メタ情報とともに送信された構成です。

わかったよ:CloudFront ディストリビューションのデプロイには少し時間がかかります。

の中に配布概要としては、最終更新日と書かれたフィールド展開中変更するたびにしばらくの間、画面とブラウザ ウィンドウの幅に応じてこのフィールドが非表示になる場合があり、そのため UI ではディストリビューションが稼働しているように見えますが、実際には稼働していません。

テスト配布

  • DomainName応答から取得
jq -r '.Distribution.DomainName' create-distribution.response.json
abcdefghij1234.cloudfront.net
  • テストhttp
http http://abcdefghij1234.cloudfront.net
HTTP/1.1 301 Moved Permanently
Connection: keep-alive
Content-Length: 183
Content-Type: text/html
Date: Mon, 02 Aug 2021 20:14:27 GMT
Location: https://abcdefghij1234.cloudfront.net/
Server: CloudFront
Via: 1.1 8640a37b586353bc916562c577770223.cloudfront.net (CloudFront)
X-Amz-Cf-Id: ooT0Y1QvDE7_yoRmb0p0Un2Db6O713rBvudtmz1xer7YwEU0GE8smw==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: Redirect from cloudfront

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>CloudFront</center>
</body>
</html>

したがって、ディストリビューションは から にリダイレクトしますhttp://abcdefghij1234.cloudfront.nethttps://abcdefghij1234.cloudfront.netこれは当然のことです。ディストリビューションはそのために作成されたのです。

  • テストhttps
HTTP/1.1 403 Forbidden
Connection: keep-alive
Content-Type: application/xml
Date: Mon, 02 Aug 2021 20:14:35 GMT
Server: AmazonS3
Transfer-Encoding: chunked
Via: 1.1 c3e656776c8a9f0e1ea24405ab1dcc85.cloudfront.net (CloudFront)
X-Amz-Cf-Id: or4SC8urWEv_8c3jDURv5IINwFU1TDVLSQ3_X7tya7Ncz8ujyz0-IQ==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: Error from cloudfront
x-amz-bucket-region: us-east-1

<?xml version="1.0" encoding="UTF-8"?>
<Error>
  <Code>AccessDenied</Code>
  <Message>Access Denied</Message>
  <RequestId>EAST1CM5WJR8QM3S</RequestId>
  <HostId>zF2dJm2vsuSM633NHuzcA5VqrCrNkfYGu31FRmKKIkebuI5+6l5DlVnr4kk9be262hcqktoiROw=</HostId>
</Error>
  • (読みやすいようにxml形式にフォーマットされています)

それは良くないようです。それが予想されていたことなのかわかりません?!?

AWS Route 53レコードを更新する

  • S3バケットの使用からCloudFrontディストリビューションの使用に変更する
  • 以前と同様に、以前のファイルを ing しchange-batch.apex.updatejsonて一時的なローカルファイルを作成します。sedchange-batch.apex.json
  • UPSERTの代わりに使用CREATE: レコードは既に存在するため、更新する必要があります。
  • HostedZoneId: 古い値Z3AQBSTGFYJSTF(S3用)を で置き換えZ2FDTNDATAQYW2、そこからマジック値を取得しますchange-resource-record-setsドキュメント
  • DNSName: 引用元change-resource-record-setsドキュメント

ディストリビューションを作成したときに CloudFront によって割り当てられたドメイン名を指定します。

CloudFront ディストリビューションには、リソースレコードセットの名前と一致する代替ドメイン名が含まれている必要があります。たとえば、リソースレコードセットの名前が acme.example.com の場合、CloudFront ディストリビューションには代替ドメイン名の 1 つとして acme.example.com が含まれている必要があります。

--> s3-website-us-east-1.amazonaws.com(S3の場合)を次のように置き換えますabcdefghij1234.cloudfront.net

sed -e 's|CREATE|UPSERT|g' \
    -e 's|Z3AQBSTGFYJSTF|Z2FDTNDATAQYW2|g' \
    -e 's|s3-website-us-east-1.amazonaws.com|abcdefghij1234.cloudfront.net|g' \
    change-batch.apex.json > change-batch.apex.update.json
  • ファイルの内容:
{
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "mydomain01.com.",
        "Type": "A",
        "AliasTarget": {
          "HostedZoneId": "Z2FDTNDATAQYW2",
          "DNSName": "abcdefghij1234.cloudfront.net",
          "EvaluateTargetHealth": false
        }
      }
    }
  ]
}
  • シェルコマンド
aws route53 change-resource-record-sets \
    --hosted-zone-id Z123456789EXAMPLE0SKX \
    --change-batch "file://$(pwd)/change-batch.apex.update.json"
  • 上記のレコードを作成するときと同様の応答

Apexドメインレコードをテストする

  • テストhttp
http http://mydomain01.com
HTTP/1.1 301 Moved Permanently
Connection: keep-alive
Content-Length: 183
Content-Type: text/html
Date: Mon, 02 Aug 2021 19:08:27 GMT
Location: https://mydomain01.com/
Server: CloudFront
Via: 1.1 2408979685aa1bdb752824d292e63bf7.cloudfront.net (CloudFront)
X-Amz-Cf-Id: Ww60Ol_0fdR8SsgcHeRYUd_de1rVejX6w_wuK80aR21e3IHstB-irA==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: Redirect from cloudfront

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>CloudFront</center>
</body>
</html>
  • 応答は S3 からではなく CloudFront から送信されるようになったため、更新された DNS レコードは機能しているようです :-)
  • httpパスでテストする
http http://mydomain01.com/some/path
 ... similar output as above ...

--> 良さそうだ

  • テストhttps
http https://mydomain01.com
HTTP/1.1 403 Forbidden
Connection: keep-alive
Content-Type: application/xml
Date: Mon, 02 Aug 2021 18:53:51 GMT
Server: AmazonS3
Transfer-Encoding: chunked
Via: 1.1 ea89c67081222c8c680e7a37ad75f4f0.cloudfront.net (CloudFront)
X-Amz-Cf-Id: 5prv5_g5zXOX3aRBp2Gq64JJPuwC2o5dHIp9RCAHm6Ls8hK6EFghXw==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: Error from cloudfront
x-amz-bucket-region: us-east-1

<?xml version="1.0" encoding="UTF-8"?>
<Error>
  <Code>AccessDenied</Code>
  <Message>Access Denied</Message>
  <RequestId>T78ASF3FA9QGV4T5</RequestId>
  <HostId>xaEgwEtbeesL4XfxMdxVoPAt9Lpb1ZDM9Fs5W4htBbcWNbV9sMUTjVAPIuWwAQ3Xh1yRhh4b4Ts=</HostId>
</Error>
  • (以前と同様に、読みやすいように XML 形式になっています)

注: この応答はAmazonS3CloudFront前の応答ではなく から来ています。S3バケットにはアクセス制限が一切設定されていないので、アクセスが拒否されました?!?

バケットの権限を再確認する

aws s3api get-bucket-policy --bucket mydomain01.com

An error occurred (NoSuchBucketPolicy) when calling the GetBucketPolicy operation: The bucket policy does not exist

それは空に一致するバケットポリシーAWS S3 コンソールのフィールドですが、バケットポリシーがまったくなくても本当に大丈夫なのでしょうか?

振り返ってみるとテスト配布上記のように、直接アクセスした場合の応答abcdefghij1234.cloudfront.netも CloudFront からではなく S3 から来ていることがわかります。したがって、問題は非常に明確なようです。

私の質問 #2

  1. S3 バケットがアクセスを拒否するのはなぜですか?
  2. S3 バケットにアクセス ポリシーがまったくないのは普通ですか? 通常、「パブリック」バケットには、誰に対してもアクセスを明示的に許可するポリシーはありませんか?
  3. に似ている頂点/サブドメインごとに 1 つの S3 バケット頂点/サブドメインごとに 1 つの CloudFront ディストリビューションも必要ですか?
  4. もしそうなら、*.mydomain01.com証明書 (および配布) に代替ドメインを追加しても、実際には意味がないのではないでしょうか?!? また、配布ごとに 1 つのドメイン専用の証明書が 1 つ必要になりますか?

答え1

全体的には正しい方向に進んでいます。ただ 1 つコメントがあります。ドメインがすでに他の DNS サービス プロバイダーを使用している場合は、Route53 を省略できます。

Q: CloudFront を使用する場合でも、「バケット名 == ドメイン名」の要件は適用されますか?

いいえ、CloudFront を使用する場合はそうではありません。CNAME は CloudFront で個別に設定されます。

Q: Apex ドメインとすべてのサブドメインごとに 1 つのバケットを作成する必要がありますか?

いいえ、ドメイン/サブドメインごとに 1 つのバケットは必要ありません。

S3 バケットがアクセスを拒否するのはなぜですか?

s3-website-us-east-1.amazonaws.comCF オリジンとして自分のドメインを使用する必要があります。

S3 バケットにアクセス ポリシーがまったくないのは普通ですか? 通常、「パブリック」バケットには、誰に対してもアクセスを明示的に許可するポリシーはありませんか?

トラフィックをリダイレクトするためだけにバケットを使用する場合は、アクセス ポリシーなしでも問題ありません。

頂点 / サブドメインごとに 1 つの S3 バケットと同様に、頂点 / サブドメインごとに 1 つの CloudFront ディストリビューションも必要ですか?

はい、1 つのディストリビューションで最大 1 つの ACM 証明書をアタッチできるため、ドメイン/サブドメインごとに 1 つの CloudFront ディストリビューションが必要です。

もしそうなら、*.mydomain01.com証明書 (および配布) に代替ドメインを追加しても、実際には意味がないのではないでしょうか?!? また、配布ごとに 1 つのドメイン専用の証明書が 1 つ必要になりますか?

CF ディストリビューションではサブドメイン トラフィックも処理する必要があるため、ワイルドカード ドメインを追加することは理にかなっています。

さらにご質問がある場合は、AWS チャットチャットで私に@してください。

関連情報