当記事について

最近サーバレスの相談をよく受けることもあって,せっかくなので自分のサイトも簡単にサーバレス構成にしようと思い立った.

実際S3の独自ドメインは基本行うとしても,それをHTTPS化したり,CDN化したりといったところまでは業務以外ではやらなかったのでちょうど良い機会だった.

この記事は,サーバレスの基礎編.これに今後LambdaやCognito,DynamoDBとのRelayを入れていく.その記事はまた今度書くことにする.

構成図

f:id:sinsinchang:20170717223408p:plain 構成は,お名前ドットコムで取得したドメインをSESを利用して,Certification Managerで申請したドメインで,HTTPS通信をしてCloudFrontでCDN化したS3の静的ページを表示させるというもの.

AWSの利用サービス

  • S3: S3
  • CloudFront: CF
  • Certification Manager: CM
  • SES: SES
  • Route53(今回は,お名前ドットコムのドメイン設定で代用): R

手順

  1. R: 任意のドメインを購入する(例として, example.com を買ったとする)
  2. SES: ドメインを登録する(us-east-1)(example.com)
  3. R: MX(example.com),TXT(_amazonses.example.com)レコードを登録する dig example.com mx
  4. SES: Active Rule Setを設定する(us-east-1)→Verification statusがVerifiedになればMXレコードが正常に設定されている
  5. S3: メール受信用のバケットを作成し,IAMのポリシーを設定する(グローバル)
  6. admin@example.com などにメールが届くことを確認する
  7. CM: ドメインのSSLを申請する(us-east-1)→s.example.comなどを登録する
  8. S3: 該当の場所へメールが届くので中身にあるURLにアクセスして承諾する.これは,https://us-west-2.certificates.amazon.com/approvals?code={CODE}&context={CONTENT} というURLになる.
  9. S3: 新規でバケットを作成し(Certification Managerで定義したルールと同様の名前にする),何らかの静的ページを配置する.
  10. CF: 該当のバケットと,SSLを指定する
  11. R: CloudFrontのDomainNameをCNAMEで設定する
  12. CF: StatusがIn ProgressからDeployedに変わったら完了.結構時間がかかった. dig example.com cname

※説明がわかりづらいのでもっと詳細について書いたほうがいいかも.

S3

注意点としては,一般的にS3をサイトとして公開する時のように Web Site Endpointを利用するとSSL通信ができない ということ.CNAMEをこのエンドポイントで設定するだけで,独自ドメインにできるため便利なのだが,思わぬ落とし穴であった.

docs.aws.amazon.com

公式が言っているので間違いないのだが,HTTPS化したいのならば通常のREST API エンドポイントにするしかない.

docs.aws.amazon.com

Amazon S3 バケットがウェブサイトエンドポイントとして構成されている場合、オリジンとの通信に HTTPS を使用するように CloudFront を構成することはできません。

Amazon S3 はその構成で HTTPS 接続をサポートしていないためです。

こちらでも明記されている.

REST APIエンドポイントは以下にあるので参考にしたい. docs.aws.amazon.com

Certification Manager,CloudFront

CloudFrontはus-east-1などのSSLしか受け付けていないので,SSLも同様の場所で申請する必要がある.

また, S3は元々バケットとドメインがイコール でないと表示できないという制約があるため,CloudFrontでCDN化する時もその点に注意して作成する必要がある.

例えば,cf.example.comというドメインで表示させたいなら,S3のバケットもcf.example.comという名前で作成する.

さいごに

待ちが発生する事が多いため,手順をミスると大幅な時間がかかってしまうので注意.特に先に述べたWeb Site Endpointは使わないことや,S3は元々バケットとドメインがイコールであることには注意. 今回は単純なものであるが,普通に一般的なS3のサイトにも応用できそうだったのでまとめておく.料金がいくらかかったかは,また1ヶ月後にでも追記しようと思う.