nkmrtty’s blog

https://nkmrtty.com/

S3+CloudFrontによるhttpsなWebサイトの公開

個人サイト(https://nkmrtty.com)を自前のサーバからAWSに移設した際のログ。

独自ドメインをRoute 53で管理

Naked domain (Zone apex)を用いてサイトを公開するためにはドメインの管理をRoute 53上で行う必要がある。

これはS3のバケットを独自ドメインで公開する場合、バケットのエンドポイントへのCNAMEレコードを設定する必要があるため。しかし、RFC1912の規定によりNaked domainに対してCNAMEレコードを作成することができないとされている。

この制限に対してRoute 53では独自のAliasレコードを提供しており、このレコードを用いることでS3やCloudFrontのエンドポイントとNaked domainのマッピングが可能。

外部で取得したドメインをRoute 53で管理するための手順については公式ガイドを参照。

S3バケットの作成

基本的な手順についてはAWSのガイドにある通り。

今回、CloudFrontを経由してS3のバケットを配信するのでバケットのポリシー設定やS3のエンドポイントに対するDNSレコードの設定は不要。 作成するリージョンもCloudFrontを噛ませているので安いとこ選べばいいと思います。

SSL証明書の作成

独自ドメインを用いる場合、独自ドメイン用のSSL証明書が必要となる。この証明書じゃなきゃダメみたいな事情が無ければAWS Certificate Manager (ACM)で作成するのが楽。

今回の構成で使用する証明書をACMで作成する場合、以下の点に注意。 1. バージニア北部(us-east-1)リージョンで作成 2. 所有ドメインの特定のメールアドレス(e.g., admin@example.com)に対して、認証用のメールを受信できる環境が必要

厄介なのは2.で、このためだけにわざわざメールサーバを構築するのは面倒なのでAmazon Simple Mail Service (SES)を使って一時的にメールを受信できる環境を構築する。

SESの設定

特に難しいことはなく、公式のガイドに沿ってadmin@example.comでメールを受信できように設定をすれば良い。

ACMを用いたSSL証明書の取得

公式ガイドに従って証明書を取得する。認証のメールが届くまでに結構時間がかかるので気長に待つ。

CloudFrontによるS3バケットの配信

公式ガイドに従って設定する。今回は最終的に独自ドメインを使用するのでCNAMEの設定は忘れないように。SSL証明書の設定ではACMで作成した証明書を使用するように設定。まともに使えるようになるまでかなりの時間がかかるので気長に待つ(Q&A参照)

DNSレコードの追加

CloudFrontのデプロイが完了したら、Route 53のコンソールから対象のディストリビューションに対するDNSレコードを追加する。手順は公式ガイドの通り。

Q&A

所有ドメインまたはCloudFrontのエンドポイントにアクセスした際にS3バケットのURLにリダイレクトされてしまう

/*でInvalidationしてしばらく放置しておくと解決する。おそらく、CloudFrontのコンソールにおいてS3バケットを配信元として設定する際にバケットの仮想ホスト形式のURLが用いられているおり、CloudFrontのデプロイ時に適切なエンドポイントへのリダイレクトがキャッシュされてしまうのが原因。

料金で突然死しない?

今回の構成で各サービスの最小枠を最大限使用したとして、1.2 USD / month。個人サイトで転送量がTB近くなるとかDBやPHP使いたいとかならAmazon Lightsailを使うのが良いんじゃないでしょうか。

ちなみに、記事執筆時点の各サービスの料金は以下の通り

  • Route 53
    • 0.50 USD / host zone / month
    • 0.400 USD / 1M queries / month *クエリ数ベースの料金は実際のクエリ数に応じて案分計算されるみたい
  • S3 (バージニア北部)
    • 0.023 USD / GB / month (for first 50TB)
    • 0.005 USD / 1K PUT requests / month
    • 0.004 USD / 10K GET requests / month
  • CloudFront
    • 0.140 USD / GB (Transfar to Japan)
    • 0.012 USD / 10K HTTPS requests (from Japan)
  • SES(メール受信)
    • 無料(1000件まで)
  • ACM
    • 無料
    • ACMの鍵管理用にKMSが利用されるがこちらも基本無料