S3 + CloudFront を HTTPS 対応リダイレクトサーバとして活用する

AWS

AWS S3 のウェブサイトホスティング機能にはリダイレクト機能があります。
S3 単体では HTTP のリクエストが捌けますが、CloudFront を組み合わせることで HTTPS にも対応できます。EC2 や Lambda を用意する必要もありません。

今回は、例として https://hoge.yuu26.com へのアクセスを https://blog.yuu26.com にリダイレクトさせてみます。

S3 バケットのリダイレクト機能を有効化

S3 コンソール から新規バケットを作成します。

ドメイン名に合わせて hoge.yuu26.com で作成しました。
好きなリージョンを選んだだけで残りはすべてデフォルト設定です。

リダイレクト用ドメインのS3バケットを作成

バケットのプロパティから Static website hosting の設定を有効化します。
リダイレクト先のドメイン名とプロトコル欄を埋めます。

Static web site hostingでリダイレクト設定

 
画面に記載されているエンドポイント xxxxx.s3-website-xxx.amazonaws.com をメモします。
curl で呼び出してみるとリダイレクトされることが確認できます。

$ curl -I http://hoge.yuu26.com.s3-website-ap-northeast-1.amazonaws.com
HTTP/1.1 301 Moved Permanently
Location: https://blog.yuu26.com/
Server: AmazonS3

ACM で CloudFront 用の証明書を取得

S3 のウェブサイトホスティングでは、独自ドメインの HTTPS リクエストを受け付けられません。
そのため、一度 CloudFront を経由することで対応します。

ACM (Amazon Certificate Manager) から証明書を発行しておきます。無料です。

ACMでCloudFront用の証明書を発行する

 
注意点として、CloudFront で利用する証明書は バージニア北部リージョン (us-east-1) で取得する必要があります。東京リージョンで取得しても使えません。

CloudFront を組み合わせて HTTPS 対応

CloudFront の Distribution (Web) を新規作成します。

  • Origin Domain Name : S3 のウェブサイトホスティング用エンドポイント
  • Viewer Protocol Policy : HTTP and HTTPS
  • Alternate Domain Names (CNAMEs) : ドメイン名 (hoge.yuu26.com)
  • SSL Certificate : Custom SSL Certificate から ACM で作成した証明書を選択

 
オリジンには S3 のウェブサイト用エンドポイントを入力します。
予測で出てくる S3 のバケット名ではないため注意が必要です。

CloudFrontのOrigin設定

 
設定が有効になれば準備完了です。数分~長いときは数時間ほどかかります。

CloudFrontの設定反映を待つ

curl でも確認しておきます。

$ curl -I http://dyzmyxzffsq8f.cloudfront.net
HTTP/1.1 301 Moved Permanently
Location: https://blog.yuu26.com/
Server: AmazonS3
X-Cache: Miss from cloudfront

$ curl -I https://dyzmyxzffsq8f.cloudfront.net
HTTP/2 301
location: https://blog.yuu26.com/
server: AmazonS3
x-cache: Hit from cloudfront

Route 53 で ALIAS レコードを設定

CloudFront 経由でリダイレクトされることを確認したら、Route 53 に登録します。

今回は hoge.yuu26.comdyzmyxzffsq8f.cloudfront.net となるように設定します。
CNAME でも良いのですが、向き先が AWS 内部なので ALIAS レコードが適しています。

Route 53にCloudFront用のALIASレコードを設定する

 
独自ドメインで、HTTP および HTTPS のリダイレクトができるようになりました。

$ curl -I http://hoge.yuu26.com
HTTP/1.1 301 Moved Permanently
Location: https://blog.yuu26.com/
Server: AmazonS3
X-Cache: Hit from cloudfront

$ curl -I https://hoge.yuu26.com
HTTP/2 301
location: https://blog.yuu26.com/
server: AmazonS3
x-cache: Hit from cloudfront

まとめ

  • S3 と CloudFront を組み合わせて HTTPS 対応のリダイレクトサーバにしました
  • EC2 や Web サーバを用意することなくサーバレスで実現できます
  • CloudFront 用の証明書は us-east-1 の ACM で発行しましょう

規模にもよりますが、リダイレクトのみであれば S3 や CloudFront の費用も無視できるレベルかと思います。機会があればぜひご活用ください。

【追記】Application Load Balancer (ALB) でも同様の処理が可能となりました。