AWSのRoute53でZone Apexへのアクセスをリダイレクトする

やりたい事

AWS(Amazon Web Service)のRoute53で管理しているドメイン(example.com)について、Zone Apex(example.com)へのHTTP/HTTPSアクセスをサブドメイン(www.example.com)にリダイレクトする。

Route 53ではZone Apexに対して通常のCNAMEやAレコードを設定することはできない。その代わりにS3やCloud Frontへのエイリアスと呼ばれるレコードを作成することができるので、それを利用する。

HTTPアクセスのリダイレクト

S3を使用してZone ApexのURLのアクセスをホスティングするWebサイトをセットアップする。以下の記事が参考になる。
docs.aws.amazon.com

*S3でホスティングするWebサイトではHTTPSでのアクセスをリダイレクトすることはできない。HTTPSでのアクセスについてはCloud Frontを使用する。

手順

  1. S3に独自ドメイン名(example.com)でバケットを作成する
    • プロパティは特に変更する必要はない。
    • パブリックアクセスをすべてブロックのチェックを外す。
  2. 作成したバケットアクセス権限からバケットポリシーを選択し、パブリックアクセスを許可する以下のポリシーをコピー&ペーストする。
    { "Version":"2012-10-17", "Statement":[ { "Sid":"PublicReadGetObject", "Effect":"Allow", "Principal":"*", "Action":[ "s3:GetObject" ], "Resource":[ "arn:aws:s3:::example.com/*" ] } ] }
    *別のドメインで設定する場合は独自ドメイン部分(example.com)は変更すること。
  3. 'プロパティ'からStatic website hostingを有効にする

*この段階でStatic website hostingのダイアログ内に表示されているエンドポイントにアクセスすると、入力したプロトコルドメインのURLにリダイレクトされる。 そのため、Route53にZone ApexのレコードとしてこのS3へのAレコードエイリアスを作成すると、HTTPでのアクセスについては指定したURLにリダイレクトすることができるようになる。

HTTPSアクセスのリダイレクト

基本的に以下の手順に従う。異なるのはOrigin Domain NameにS3のStatic website hostingで作成したエンドポイントドメインを指定することのみ。 aws.amazon.com

手順

  1. Certificate Managerを開き、"証明書のリクエスト"を行う。
  2. Cloud Frontを開き、"Create Distribution"を選択する。
    • "Web"の項目の"Get Started"を選択する。
    • Origin Domain Nameに上記の手順で生成したS3のエンドポイントのドメインを入力する。
      *入力欄をクリックすると候補一覧が表示されるが、このURLとは異なるので使用しないこと。
    • Alternate Domain Names(CNAMEs)独自ドメイン名(example.com)を入力する。
    • SSL CertificateCustom SSL Certificateを選択する。入力欄をクリックすると最初の手順で作成した証明書が表示されるので、それを選択する。
    • "Create Distribution"ボタンでCloud Frontディストリビューション生成する。
      *結構時間がかかるので、完了するまで待つ。
  3. Route53を開き、"Record Setの作成"を行う。

以上で完了。

確認

ブラウザで http://example.com, https://example.comにアクセスし、S3のStatic website hostingで指定したリダイレクト先のURLにリダイレクトされることを確認する。

また、curlを使用して以下のようにリダイレクトが行われていることを確認できる。

$ curl -I http://example.com
HTTP/1.1 301 Moved Permanently
Content-Length: 0
Connection: keep-alive
Date: Thu, 21 Nov 2019 11:32:08 GMT
Location: https://www.example.com/
Server: AmazonS3
X-Cache: Miss from cloudfront
Via: 1.1 b86f96ad1cdd596db48371f729df3b5c.cloudfront.net (CloudFront)
X-Amz-Cf-Pop: NRT12-C2
X-Amz-Cf-Id: kfKRt3fPcv7QGqEi0b9GLiGl9TwxEs4X6hxhMYCH82rV9jmOi32ljQ==
$ curl -I https://example.com
HTTP/2 301 
content-length: 0
location: https://www.example.com/
date: Thu, 21 Nov 2019 11:32:08 GMT
server: AmazonS3
x-cache: Hit from cloudfront
via: 1.1 06f6824c0d57ccd48408cb017c7bce76.cloudfront.net (CloudFront)
x-amz-cf-pop: NRT12-C2
x-amz-cf-id: kNgNZfUqz_wiNPnpQjrkvUQfrkYw3_zuPh8fvR1BvcULVKMQ5LsICw==
age: 12