以下省略!

タイダルウ(ry ほぼ毎日1記事執筆運動実施中。 ※記事に広告(アフィリエイト)リンクを掲載している場合があります。

Amazon SES+ACMでCloudFront運用のrita. xyzをSSL通信可能にしてみた

f:id:abyssluke:20160529164517p:plain:w200:leftrita.xyzAmazon CloudFrontを用いてS3内のコンテンツを配信している。何気にAmazon Certificate Manager(ACM)でSSL用の証明書を取得してSSL通信可能にしてみようと思ったが、ACMはメールでのドメイン認証が必要。あいにくrita.xyzにはMXレコードを設定していない。なのでAmazon Simple Email Service(SES)でドメイン認証メールを受信できるようにしてからACMで証明書を取得するという手を使ってみた。画像てんこ盛りで長いので続きを読むから。

目次

SESでメールを受信できるようにする

ACMからのドメイン認証メールを受信するため、MXレコードがないrita.xyz宛のメールをSES経由で受信できるようにしておく。
ここではオレゴンリージョン(us-west-2)、受信したメールの保存先として同じオレゴンリージョンにあるS3バケットを利用する。

ドメイン登録&認証

まずマネジメントコンソールからSESを開き、Domains→Verify a New Domainを押す。
f:id:abyssluke:20160529164026p:plain
ダイアログが出てくるので、登録したいドメイン(rita.xyz)を入力してVerify This Domainを押す。
f:id:abyssluke:20160529164041p:plain
するとドメイン認証のため次のレコードをDNSに登録しろと表示されるが、rita.xyzのネームサーバーはRoute 53を使用しているのでUse Route 53を押す。
f:id:abyssluke:20160529164049p:plain
Route 53に選択したレコードを登録するよと表示されるので、Email Receiving Recordにもチェックを入れてCreate Record Setsを押す。すでにMXレコードがある場合は上書きされるので注意。
f:id:abyssluke:20160529164101p:plain
しばらくするとSESでのドメイン認証が完了する。

受信ルールの設定

Email ReceivingのRule Sets→Create a Receipt Ruleを押す。
f:id:abyssluke:20160529164115p:plain
入力欄にドメイン名を入力してAdd Recipient→Next Step。
f:id:abyssluke:20160529164123p:plain
Add actionからS3を選択、S3 bucketに保存先のバケット、Object key prefixにプリフィックス(保存先のフォルダのみを指定する時は最後に/を付ける)を入力し、Add action→Stop Rule Setを選択してNext Step。
f:id:abyssluke:20160529164132p:plain
Rule nameに適当な名前を入力してNext Step。
f:id:abyssluke:20160529164140p:plain
Create Ruleを押す。この時S3に書き込みできないという表示が出た時はここを参考に当該バケットに対してバケットポリシーを追加すること。
f:id:abyssluke:20160529164150p:plain
これで受信できるようになった。適当にメールを送るとS3に送ったメールが保存されているはず(内部的なメッセージIDがファイル名として保存される。件名では保存されないので注意)。
f:id:abyssluke:20160529164157p:plain

ACMで証明書を作る

マネジメントコンソールからCertificate Managerを開き、今すぐ始めるを押す。
f:id:abyssluke:20160529164346p:plain
ドメイン名を入力して確認とリクエストを押す。ワイルドカード証明書も作成可能。上に「AWS Certificate Manager 証明書は Elastic Load Balancing のみで使用できます。」とCloudFront抜きで表示されている場合はリージョンをバージニア北部(us-east-1)にすること。
f:id:abyssluke:20160529164352p:plain
確定とリクエストを押す。
f:id:abyssluke:20160529164408p:plain
以下のアドレスに検証のメールを送ると表示される。
f:id:abyssluke:20160529164414p:plain
検証未完了の状態。S3にSESのメールを保存する設定にしたので、S3を確認し複数通届いている認証メールっぽいファイル(タイムスタンプが近くファイルサイズがほぼ同じなもの)のどれかを開きリンク先のページからApproveする。
f:id:abyssluke:20160529164423p:plain
ドメイン認証が完了すると発行済みに変わる。
f:id:abyssluke:20160529164436p:plain

CloudFrontに証明書を設定する

CloudFrontの画面から該当するDistributionを選択→GeneralタブでEdit→SSL CertificateからCustom SSL Certificateを選択すると取得した証明書が選べるはずなのでそれを選択し保存、Deployが終わるのを待つ。
f:id:abyssluke:20160529164447p:plain
Deployedになったら試しにhttpsでアクセスしてみる。Amazon発行の13ヶ月間有効な証明書が確認できる。
f:id:abyssluke:20160529164517p:plain

注意とか

ACMで発行される証明書はLet's Encryptと同じDV(ドメイン認証)タイプのもの。OV/EVタイプが欲しい人は他の所でOV/EV証明書を取得してIAMにアップロード、適用すべし。
・証明書は自動更新&適用されるので更新忘れを心配する必要はない。
・CloudFrontの設定でCustom SSL Client Supportという項目があるが、これをAll ClientsにしてしまうとSNI非対応クライアントのための専用IPを割り当てるため月600ドル(実際は有効化していた時間分課金されるが)掛かるので注意。通常はOnly Clients〜のままで十分。