#目的
AWSのEC2のインスタンスでウェブアプリ を個人開発していたのですが、SSLを取得しようと思った時に詰まったので要点だけまとめました。
#注意点
DNSのネームサーバの変更に最大72時間かかりますので、2番までは早めにやった方が良いかと思います。
うまく言っていない場合、ロードバランサが機能しているかの確認方法として、
- パブリックDNSベタ打ちで閲覧可能かどうか
- ロードバランサのヘルスチェックができているかどうかを確認
- 2の結果が
・ できている場合
Route53でAレコードの確認をしてみてください。これが間違っていると上手くいきません。
・できていない場合
ヘルスチェックのpingのuriを確認してください。デフォルトでは/index.htmlになっています。このuriが存在しなければ他のuriで設定してください。 - これでも上手くいかなければロードバランサを削除して作り直すといいと思います。
#環境
・お名前.comにてドメイン取得済
・EC2インスタンス使用
・Amazon Certificate Manager(ACM)使用
・EC2のロードバランサ使用
・Route53使用
・サーバにNginxを使用
#流れ
####1. Route53でHosted Zoneの作成
####2. お名前.comでネームサーバの変更
####3. Amazon Certificate Managerで証明書取得(DNS)
####4. 証明書のCNAMEレコードをRoute53に追加
####5. 証明書が取得できたらロードバランサでEC2インスタンスと紐付け
####6. Route53にロードバランサを追加
####7. Nginxでhttp→httpsのリダイレクト
#作業
##1. Route53でHosted Zoneの作成
AWSのRoute53にて、お名前.comで取得したドメイン名でHosted Zoneを作成します。
ここで取得したネームサーバの情報を3で使用します。
##2. お名前.comでネームサーバの変更
お名前.com naviにて、ネームサーバを変更します。
左側のタブのネームサーバ を変更から、対象のドメインを選択肢、1で取得したネームサーバのアドレスを4つ入力します。
反映まで最大72時間かかります。
##3. Amazon Certificate Managerで証明書取得(DNSで認証)
お名前.comで取得したドメインの証明書をACMで取得します。
認証方法はメールとDNSの二種類がありますが、WHOIS代行を利用しているためDNSを利用します。
ここで表示されるDNS情報を4で使用します。
##4. 証明書のCNAMEレコードをRoute53に追加
ACMで表示されたCNAMEの情報をRoute53に追加します。
##5. 証明書が取得できたらロードバランサでEC2インスタンスと紐付け
4を完了してから数分〜15分程度で証明書の発行が完了するかと思います。
EC2の左側のタブの下の方にあるロードバランサを使用します。
注意点としては、ヘルスチェックのデフォルトのPingターゲットが/index.htmlになっているかと思いますが、ルートディレクトリが/の場合は変更しましょう。
##6. Route53にロードバランサを追加
最後にRoute53のAレコードにロードバランサを追加します。
Aレコードのエイリアスをyesにして先ほど作成したロードバランサ を選択します。
##7. Nginxでhttp→httpsのリダイレクト
http://ドメイン名
にアクセスしたときに
https://ドメイン名
にリダイレクトされるようにNginxの設定を書き換えます。(https://aws.amazon.com/jp/premiumsupport/knowledge-center/redirect-http-https-elb/ を参考)
参考リンクではhttpの識別が
if ($http_x_forwarded_proto = 'http')
となっていますが、
if ($http_x_forwarded_proto = http)
にしたら動きました。
環境によって違うのか、Amazonが誤った表記をしているのかはわかりませんがもしうまくいかなかったらためしてみてください。
また、
if ($http_x_forwarded_proto != https)
を試してみましたが、この場合だとELBの使用上、無限リダイレクトになってしまいましたので気をつけてください。
$ sudo vim /etc/nginx/nginx.conf
example.comの部分にはお名前.comで取得したドメイン名を入れてください。
httpでアクセスされたらhttpsにリダイレクトする部分を追加してください。
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.com;
root /usr/share/nginx/html;
・・・中略・・・
if ($http_x_forwarded_proto = http) {
return 301 https://$server_name$request_uri;
}
}
$ sudo nginx -s stop
$ sudo service nginx start