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

概要

AWS S3 のウェブサイトホスティング機能にはリダイレクト機能があります。

S3 単体では HTTP のリクエストが捌けますが、CloudFront を組み合わせることで HTTPS にも対応できます。EC2 や Lambda を用意する必要もありません。

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


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

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


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


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

画面に記載されているエンドポイント (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) から証明書を発行しておきます。無料です。

f:id:yuu2634:20180708232319p:plain


注意点として、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 のバケット名ではないため注意が必要です。

f:id:yuu2634:20180708235320p:plain


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

f:id:yuu2634:20180708234449p:plain


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 レコードが適しています。

f:id:yuu2634:20180708235714p:plain


独自ドメインで、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) でも同様の処理が可能となりました。 blog.yuu26.com