私の目的
ドメインが複数(10または20)あり、リダイレクトしたいどれでも訪問者どこでもそれらのページを別のドメインの 1 つのページ (たとえば、私の stackoverflow.com プロフィール ページ) に移動します。
これも
- 頂点ドメイン
http
(例http://mydomain01.com
) - 頂点ドメイン
https
(例https://mydomain01.com
) - サブドメイン
http
(例:http://www.mydomain01.com
またはhttp://blog.mydomain01.com
) - サブドメイン
https
(例:https://www.mydomain01.com
またはhttps://blog.mydomain01.com
) - 任意のパス(例:
http://mydomain01.com/some_path
またはhttps://www.mydomain01.com/another/path.html
)
mydomain02.com
さらに、他のすべてのドメイン( 、mydomain03.com
など。それぞれ上記のユースケース)についても同様です。
私の研究
- このAWSの記事インターネットトラフィックを頂点ドメインから別のドメインにリダイレクトする方法を説明します(私のケース#1)これも上記のリストを使用してAWS のそしてAWS ルート 53: これは では機能します
http
が、 では機能しませんhttps
。 - このAWSの記事インターネットトラフィックをリダイレクトする方法をいくつかのケースで説明しています(私の場合、すべてのケースをカバーしているようです)。これも上記のリストを使用してAWS の、AWS ルート 53そしてAWS クラウドフロント: これは
http
との両方で機能しますhttps
。(Application Load Balancer の使用についても説明していますが、ここでは説明の範囲を超えていると思います...) - このAWSの記事CloudFront ディストリビューションの設定とログ ファイルの詳細を取得する方法について、さらに詳しく説明します。
- このAWSの記事高度な条件付きリダイレクトを使用するためのドキュメントのリダイレクト ルール: 目的を達成するためにそこに行く必要があるかどうかわからないので、まだ詳しく調べていません。
さらに、SOに関する質問はたくさんあることは明らかです(関連している(この質問の右側にある)およびこのテーマに関する他の投稿がありますが、それらのほとんどの問題は、AWS コンソール UI の以前のバージョンのスクリーンショットを使用していることです。コンテンツの大部分は同じであるはずですが、それらのスクリーンショットを現在の UI と関連付けると、さらに混乱が生じると思います。
AWS (およびその他の) ドキュメントから得られる重要なポイント:
- AWS S3にバケットを作成し、その中でリダイレクトを設定する必要があります。
- AWS CloudFront でディストリビューションを作成する必要があります。
- CloudFrontでカスタムドメインを使用するには、AWS ACMで証明書を作成する必要があります。
- AWS Route 53 にホストゾーンを作成し、その中にレコードを設定する必要があります。
これまでの私の仕事
最新の AWS CLI がインストールされ、region
にoutput
設定され~/.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
put-bucket-website
ドキュメント - 私の SO プロフィールを編集しても意味がありません...
aws s3api put-bucket-website --bucket mydomain01.com --website-configuration \
'{ "RedirectAllRequestsTo": { "HostName": "stackoverflow.com/users/217844/ssc" } }'
- 応答なし
わかったよ:S3 バケット名は Apex ドメイン名と一致する必要があります。
任意のバケット名を使用しましたが、mydomain01.com
(私の例では)原因が示されずに失敗するようです。AWS ドキュメントではこの点についてあまり明確に説明されていません。実際、ここで何か大きく誤解しているかどうかはまだわかりませんが、私が知る限り、公式 AWS ドキュメントではこの点についてかなりずさんです。私の意見では、重要なポイントは次のとおりです。たとえば、#2ただ言う
- グローバルに一意の名前を持つ S3 バケットを作成します。
それはどれでもグローバルに一意の名前。#1何らかの形でそのことを言及しています - それらのビットの読み方がわかれば...
ちなみに、記事2は私を混乱させ続けています
カスタムドメインを使用していない場合は...
なぜ私がないカスタム ドメインを使用しているのですか?!? 重要なのは、カスタム ドメインをリダイレクトすることですよね?!? とにかく...
わかったよ:ホスト名の前にプロトコルを追加しないでください。
AWSコンソールもAWS CLIも、プロトコル(http://
またはhttps://
)が入力されたかどうかをテストしていないようです。ホスト名UIフィールド/はHostName
JSON文字列で渡されます。ただし、先頭に付加されている場合はリダイレクトは失敗します。リダイレクトをテストする下に。
わかったよ: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
--> 動作するようです
- プロトコルが誤ってホスト名の先頭に付加された場合のリダイレクトをテストします。壊れた
Location
URL に注意してください。
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
サブドメインレコードをテストする以下参照)。もし私が間違っていたら、誰か訂正してください。
- 質問:CloudFront を使用する場合でも、「バケット名 == ドメイン名」の要件は適用されますか?
答え:はい。 - 質問:Apexドメインとサブドメインごとに1つのバケットを作成する必要がありますか?私の例では
mydomain01.com
www.mydomain01.com
blog.mydomain01.com
?
答え:はい。
Route 53ホストゾーンを設定する
ホストゾーンを作成する
- AWS Route 53
create-hosted-zone
ドキュメント caller-reference
一意の文字列である必要があります
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ドメインのレコードを作成する
- AWS Route 53
change-resource-record-sets
ドキュメント - これは には有効です
http
が、https
- 渡すJSONはやや複雑です。
change-batch.apex.json
以下の内容のローカル一時ファイルを作成します。 - の値を取得
HostedZoneId
するDNSName
Amazon S3 ウェブサイトエンドポイント: バケットは に作成されたのでUS East (N. Virginia)
、Z3AQBSTGFYJSTF
{
"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.com
やexample.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 フィールド / Name
JSON 値。
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
サブドメインのレコードを作成する
- 唯一の違いは
Name
JSON値です
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コンソールを使用すると、証明書を申請するDNS を使用して検証します。
証明書を作成する
- AWS ACM
request-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 ACM
describe-certificate
ドキュメント - 応答を一時ローカルファイルに保存し、抽出し
ResourceRecord.Name
てResourceRecord.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 CloudFront
create-distribution
ドキュメント - 繰り返しますが、
CallerReference
これは単純に一意の文字列である必要があります。date '+%Y%m%d-%H%M%S'
例えば、シェルで使用してファイルを作成し、コピーします。ホストゾーンを作成する create-distribution.json
以前と同様に、複雑な値には一時的なローカルファイルを使用します。内容は以下のとおりです。MinimumProtocolVersion
: 値を取得するこのAWSの記事OriginProtocolPolicy
:http-only
オリジン(S3バケット)ではhttp
ViewerProtocolPolicy
:redirect-to-https
このディストリビューションを作成する目的は、からにリダイレクトすることですhttp
。https
- 注: どのフィールドが必須であるかはわかりません (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.net
。https://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
て一時的なローカルファイルを作成します。sed
change-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 形式になっています)
注: この応答はAmazonS3
、CloudFront
前の応答ではなく から来ています。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
- S3 バケットがアクセスを拒否するのはなぜですか?
- S3 バケットにアクセス ポリシーがまったくないのは普通ですか? 通常、「パブリック」バケットには、誰に対してもアクセスを明示的に許可するポリシーはありませんか?
- に似ている頂点/サブドメインごとに 1 つの S3 バケット頂点/サブドメインごとに 1 つの CloudFront ディストリビューションも必要ですか?
- もしそうなら、
*.mydomain01.com
証明書 (および配布) に代替ドメインを追加しても、実際には意味がないのではないでしょうか?!? また、配布ごとに 1 つのドメイン専用の証明書が 1 つ必要になりますか?
答え1
全体的には正しい方向に進んでいます。ただ 1 つコメントがあります。ドメインがすでに他の DNS サービス プロバイダーを使用している場合は、Route53 を省略できます。
Q: CloudFront を使用する場合でも、「バケット名 == ドメイン名」の要件は適用されますか?
いいえ、CloudFront を使用する場合はそうではありません。CNAME は CloudFront で個別に設定されます。
Q: Apex ドメインとすべてのサブドメインごとに 1 つのバケットを作成する必要がありますか?
いいえ、ドメイン/サブドメインごとに 1 つのバケットは必要ありません。
S3 バケットがアクセスを拒否するのはなぜですか?
s3-website-us-east-1.amazonaws.com
CF オリジンとして自分のドメインを使用する必要があります。
S3 バケットにアクセス ポリシーがまったくないのは普通ですか? 通常、「パブリック」バケットには、誰に対してもアクセスを明示的に許可するポリシーはありませんか?
トラフィックをリダイレクトするためだけにバケットを使用する場合は、アクセス ポリシーなしでも問題ありません。
頂点 / サブドメインごとに 1 つの S3 バケットと同様に、頂点 / サブドメインごとに 1 つの CloudFront ディストリビューションも必要ですか?
はい、1 つのディストリビューションで最大 1 つの ACM 証明書をアタッチできるため、ドメイン/サブドメインごとに 1 つの CloudFront ディストリビューションが必要です。
もしそうなら、
*.mydomain01.com
証明書 (および配布) に代替ドメインを追加しても、実際には意味がないのではないでしょうか?!? また、配布ごとに 1 つのドメイン専用の証明書が 1 つ必要になりますか?
CF ディストリビューションではサブドメイン トラフィックも処理する必要があるため、ワイルドカード ドメインを追加することは理にかなっています。
さらにご質問がある場合は、AWS チャットチャットで私に@してください。