結構苦労したので備忘録しておきます。
前提
- ドメインは freenom で取得したものを使用します
- freenom は WHOIS が書き換わらないので、後述する AWS Certificate Manager (ACM) では Email による認証を選択する必要があります。これがクセモノです。
- ドメインは Route53 に登録済みとします
- ちょっと古いですが、 https://dev.classmethod.jp/articles/mesoko-r53-cdn/ の前半が参考になります
- SSL を実現する方法は、ALB や EC2 に Let’s Encrypt する方法でも可能ですが、今回は CloudFront を使用します
- 理由、EC2 で SSL 化するのは怠いなーというのうと、ALB は費用が高いなぁというくらいです
手順
大まかな流れ
まず結論ですが、以下大まかな流れです。
- (前提)freenom でドメインを取得し、 Route 53 のホストゾーンに登録
- ACM でSSL証明書のリクエストを作成
- 上述の通り、freenom では WHOIS 情報を変更できないので、メール認証で作成する必要があります
- この時点では Email を受信できないので、移行のステップで メール受信するための設定をします
- SES にて、取得したドメインを「Verified identities」する
- 対象のドメインを SES で扱えるようにするためかな?なんでこれをやるのかはっきりとした理由はわからないですが、やらないといけないです
- Route53 に
MX
レコードを追加- これをしないとメールを受け取れません
- SES にて、「Email Receiving」の設定を行い、S3バケットでメールを受信できるようにする
- ちょっとトリッキーな感じがしたけど、メールの受信ボックスはS3バケットを使うのがいいみたいです
- ACM でSSL証明書のリクエストを再送し、証明書発行できたことを確認する
- CloudFront で ACM で作った証明書を使用してSSL化を実現する
ググったら断片的には情報が出てくるのですが、AWS自体のUIが大きく変わっていたりして、情報が追い付いていなかったり、やりたいことと微妙にズレていたりと、この流れを把握すること自体がまぁまぁ苦労しました。
参考にさせてもらったサイト
- https://parameter.work/wordpress-aws_domain/
- 全体のざっくりとした流れが把握できました
- https://recipe.kc-cloud.jp/archives/11408
- CloudFront で SSL 化する方法
- https://note.com/li_oche1021/n/n119792c6c44a
- メール受信の方法を詳細に書いてくれているので助かりました
ACM でSSL証明書のリクエストを作成(バージニア北部)
前置き
AWS では、ACM にてSSL証明書を無料で作成することができます。
Route53 の管理下でないドメインも対象にできたりしますが、ここでは freenom のドメインを Route53 の管理下においている前提で話を進めます。
前述の通り、freenom で取得したドメインは WHOIS を書き換えられないので SSL の証明書を Email 認証にする必要があるのがクセモノです。
本当はこのSSL証明書リクエスト処理は最後の方にやってもいいのですが、説明の都合上、まずリクエスト処理から始めます。
注意:CloudFront にSSL証明書を差し込むためには、「バージニア北部」リージョンでSSL証明書作成をする必要があります。
(参考: https://aws.amazon.com/jp/premiumsupport/knowledge-center/migrate-ssl-cert-us-east/ )
フロー
- リージョンで「バージニア北部」を選択し、「証明書をリクエストする」を押す
- 「パブリック証明書をリクエスト」を選択する
- ドメイン名は、以下の2つを設定する(例:Route53 に登録しているドメインを
hoge.com
とする)*.hoge.com
hoge.com
- 「Eメール検証」を選択する
- リクエストを作成する
ここまでで、リクエスト作成処理がいったん完了します。
一覧を見てみると、以下のようになっているはずです。この「保留中の検証」状態を「発行済み」にさせるために、以下でEメールの受信設定などをしていく必要があります。
SES にて、取得したドメインを「Verified identities」する(オレゴン)
前置き
上述のメール検証の内容としては、以下のような流れになっています。
- 指定したドメインの固定アドレス(
hoge.com
だとするとadmin@hoge.com
など)、認証確認メールが送られてくる - メールに記載されたURLを押し、認証確認を承認する
なので、 admin@hoge.com
宛のメールを受信できるようにする必要があるのですが、とりあえず今の状態では Route53 にホストゾーンを登録しただけで、メールの受信はできないはずです。
なので、SES に受信処理を代行してもらう(更にいうと任意のhoge.com
宛メールを受信できるようにする)というのがここからやることになります。
まずは、SESがドメインが正当なものであるという認識をするように設定します。
注意:東京リージョンではEメールの受信に対応していません。とりあえずオレゴンは対応済みだったので、今回はオレゴンを使用しています。
ちなみに現時点でSESは全部英語表記です。地味に辛い・・・
フロー
- リージョンを「オレゴン」にする
- SES より、「Verified Identities」を選択する
- 「Create Identity」を押す
- 「Domain」を選択する
- Route53 に登録しているドメインを入力する(例:
hoge.com
) - 「DKIM signatures」を「Enabled」にする
これでいったんSESへのドメイン登録処理は完了します。
直後は以下のように pending になっていると思いますが、
2~3分すると Verified になるはずです。
なお、この一連の流れで、Route53のレコードに自動的に以下のように CNAME が3つ追加されていることを確認しておいてください。
(xxxxxxxxxxx._domainkey.hoge.com
みたいなやつ)
Route53 に MX レコードを追加
前置き
ここが一番つまずいたところになります。
メールを受信するためには、Route53に MX
レコードを追加する必要があります。Route53でこの処理をしないと、SES側ではどれだけ設定を変えてもメールを受信できません。
かなり泥臭いやり方なので、もしかしたらもっとエレガントな方法があるかもしれません。いったんここでは自分がやった方法を残しておきます。
なお、以下の公式を参考にしました。
フロー
- Route53 の ホストゾーンの画面でドメインを選択し、以下の画面を表示する
- 「レコードを作成」を押す
- 「レコード名」は空白(未入力)にする
- レコードタイプは「MX」を選択
- 値は
10 inbound-smtp.us-west-2.amazonaws.com
を入力- ↑SESのリージョンがオハイオの場合(オハイオ以外の場合は、
us-west-2
を適宜変更する)
- ↑SESのリージョンがオハイオの場合(オハイオ以外の場合は、
- 「レコードを作成」を押す
MXレコードが追加されるはずです。
SES にて、「Email Receiving」の設定を行い、S3バケットでメールを受信できるようにする(オレゴン)
前置き
SESで特定のメールアドレスを受信できるように設定します。
また、メールの受信先の設定もします。
受信先には色々選べますが、AWSで完結&楽に設定ということでメールボックスは S3 にします。
フロー
- SESの画面で、「Email receiving」を選択する
- 「Create rule set」を押す
- 任意のルール名を設定する(なんでもいい)
- 「Create rule」を押す
- 「Rule name」に任意の名前を設定する(なんでもいい)
- 「Recipient condition」に
admin@hoge.com
のようにadmin
でメールアドレスを入力する
- 「Create S3 bucket」を押す
- バケット名を入力する。このバケット名でS3バケットが生成される。
(この名前はグローバルに一位である必要性があります)
- 「Object key prefix」にバケット内に生成するフォルダ名を設定する(なんでもいい)
- 「Next」で次の画面に遷移し、そこで確定すると、メール受信設定完了
- <ここ重要>画面がもどってくるので、ここで「Set as active」を押して状態をアクティブにする
- これしないとメール受信設定が有効化されない
ACM でSSL証明書のリクエストを再送し、証明書発行できたことを確認する(バージニア北部)
前置き
ここまでで、admin@hoge.com
宛のメールを受信して、メールをS3のバケットに格納するところまで設定できました。
改めて、ACMの画面にて、SSL証明書のリクエストを再送(メールの再送信)をして、メールを受信します。
そして、メールの中身にあるリンクをクリックすることで、メール認証を完了させます。
フロー
- ACM の「証明書を一覧」画面を表示する
- 前述で実施した証明書リクエストの証明書IDをクリック
- 現時点でステータスが「保留中の検証」になっています。これを「発行済み」にすることが本ステップの目的になります
- 「検証Eメールを再送信」ボタンを押す
- 「再送信」を押す
- S3の画面に行き、先ほど作成したバケットを選択する
- バケットの中身を辿ってみると、下記のように3つ程度ファイルが格納されているはず
AMAZON_SES_SETUP_NOTIFICATION
というのと、ハッシュ値みたいな名前のファイルが2つ
- ハッシュ値みたいなファイルのどちらかを選択して、ダウンロードする
- たぶんどっちでもいい
- ダウンロードしたファイルは拡張子がないので、メモ帳か何かで開く
https://us-east-1.acm-certificates.amazon.com~
という行がるので、その行にかかれているURLをコピーする
- URLをブラウザに貼り付けると下記のような画面に飛ぶので、「I Approve」を押す
- ACM の画面を見てみると、ステータスが「発行済み」になっているはず
これでSSL証明書作成の作業完了です。
CloudFront で ACM で作った証明書を使用してSSL化を実現する
此処から先の流れは以下のサイトのままなので、いったん省略します。
クリーンアップ
環境をクリーンアップするには、以下を実施します。
- CloudFront
- ディストリビューションを削除
- SES
- Verified Identities からドメインを削除
- Email receiving からルールを削除
- S3
- 今回作成したバケットの中身を削除
- 今回作成したバケットを削除
- ACM
- SSL証明書を削除
- Route53
- NS と SOA 以外のすべてのレコードを削除
- ホストゾーンからドメインを削除
コメント