本記事では、インターネットーAWS EC間の通信を暗号化(https通信)する設定手順について解説します。
以下の構成図のような内容になります。
簡潔にいうと、インターネット→ELB(ALB)までの通信をhttps化し、EC2へ通信を転送するといった流れになります。
https化の手法としては、プロキシサーバーやリバースプロキシを用意したり、サーバー自身に証明書を登録したりする方法があります。
AWSの場合は、インターネット→EC2の通信間にELB(ロードバランサー)を挟んであげることで、ELBにたどり着いた時点で暗号化することができます。サーバー自身(EC2)に証明書登録などが不要のため、管理が楽になります。
本記事の操作は以下を前提とします。
・ドメイン発行済み
・http疎通確認済み(Route 53設定済み)
具体的な作業手順は以下となります。
この手順に沿って説明していきます。
ACM(AWS Certificate Manager)より証明書発行
一番初めに、https通信の認証に利用する証明書の発行を行います。
AWSではACMという機能により、無料で証明書が発行できます!
1.証明書の発行
1.1 [リクエスト]をクリック。
1.2 [パブリック証明書をリクエスト]をクリック。
[次へ]をクリック。
2.パブリック証明書をリクエスト
2.1 [完全修飾ドメイン名]に[証明書を発行したいドメイン名]を入力。
例:http://example.comの場合は、example.comを入力
2.2 [検証方法]として、[DNS検証]を選択。
2.1 [リクエスト]をクリック。
3.DNS認証
3.1 リクエストした証明書を開き、[Route 53でレコードを作成]をクリック。
CNAMEが自動入力されるので、[レコード作成]をクリック。
3.2 Route 53に登録したドメインページから直接設定もできます。
3.1の[Route 53レコードを作成]の操作をした人は不要。
3.3 以下のように設定できたらOK。
3.3 証明書発行確認
リクエスト後、しばらく待つと、ステータスが[発行済み]になります。
私の場合は、3分ほどで発行完了しました。
ELB(ALB)の作成
続いて、ELBを作成していきます。
ELBを経由することで、EC2自体に証明書の登録・更新する作業が不要になります。
今回は古いUIベースで作るので、新UIを切って起きます。
0.ロードバランサーの種類の選択
[Application Load Balancer]を選択します。
1.ロードバランサーの設定
[名前]:お好みで
[リスナー]:HTTPS(セキュアHTTP) 443ポートを選択。
[アベイラビリティゾーン]:サブネットを2つ以上選択。
アベイラビリティゾーンの設定は、EC2があるサブネット1つと、空のサブネット1つでも問題ありません。設定の制約上サブネットが2つ以上必要となっています。
2.セキュリティ設定の構成
[証明書タイプ]:ACMから証明書を選択
[証明書の名簿]:記事の上部で発行した証明書を選択
3.セキュリティグループの設定
新しいセキュリティグループを作成するを選択し、HTTPとHTTPSのすべてのIPを許可します。
0.0.0.0/0がすべてのIPv4アドレスを、::/0がすべてのIPv6アドレスとマッチします。
4.ルーティングの設定
[名前]:お好みで
[プロトコル]:HTTP
[ポート]:80
ターゲットグループを作成します。ターゲットグループはELBへ届いたアクセスをどこにどう伝えるかを設定できます。今回は、ターゲットグループ内にEC2を関連付け、ELB→ターゲットグループ(→EC2)のような経路でアクセスを処理します。
プロトコルはHTTP、ポートは80を選択します。アクセスがELBに来た時点でhttpsプロトコルの暗号化がされるため、ELBからターゲットグループへアクセスを伝送する際はHTTP通信で問題ないというわけです。(私はここで詰まったので記事下のトラブルシューティング欄に詳細を説明しています。)
5.ターゲットの登録
[インスタンス]欄から対象のEC2インスタンスを選択し、[登録済みに追加]を選択します。この際も80ポートを指定します。
やっていることとしては、ターゲットグループへEC2インスタンスを登録しています。ここで複数のインスタンスを登録することで、負荷分散を行うことができます。
6.確認
問題ないか確認し、[作成]をクリックします。
ここまでで必要なリソースはすべて作れました。最後に各リソースのルーティング設定を行っていきます。
ルーティング設定
1.Route 53とELBのルーティング設定
Route 53のドメインページへアクセスし、Aレコードを選択し、[レコードを編集]をクリックします。
レコードの編集方法は以下の通り。
[エイリアス]:有効
[トラフィックのルーティング先]:以下のように設定します。
[Application Load Balancer] > [ELBのあるリージョン] > [作成したELB]
2.EC2のセキュリティグループ設定
EC2のセキュリティグループのHTTP/HTTPSについて、ELBのセキュリティグループを設定します。
記事内で作成したELBのセキュリティグループではHTTP/HTTPSのすべてのIPからの通信を許可しているため、その設定がEC2にも適用されます。
疎通確認&まとめ
疎通確認
疎通確認してみると、ちゃんとhttps通信されていることが確認できます。
一通り手順を書き出してみるといたってシンプルで簡単ですが、やっている最中はところどころ詰まって試行錯誤していました。ELBやRouteを初めて使った初心者でしたので><
最低限のhttps通信ができるようになったので、Webアプリの中身の部分に注力していきたいと思います。
ここまで読んだけどうまくできていない方のために、確認事項をまとめておきます。参考になれば幸いです。
トラブルシューティング
上記手順を進めていく上で、詰まったポイントを紹介します。
・セキュリティグループの設定
今回はEC2用、ELB用の2つ用意しています。セキュリティグループはインバウンドの設定だけしてます。
ELB用SG:http, httpsの全通信を許可(全IPを指定 0.0.0.0/32)
EC2用SG:http, httpsの通信について、ELBのセキュリティグループを指定
・502 Bad Gateway エラーが出る場合
ELBのターゲットグループの設定が以下になっているか確認してください。
ELBからターゲットグループ(EC2)への通信プロトコルはhttp:80を指定します。
やり方は【ELB(ALB)の作成】>手順3,4を確認してください。
このときプロトコルとポートは、HTTP / 80番ポートを選択することに注意してください。HTTPS / 443番ポートを指定すると、ELBからEC2へアクセスを伝送する通信もhttpsプロトコルを用いて通信することになってしまいます。クライアント→ELB間で暗号化した通信をさらにELB→EC2間で暗号化しようとするため、エラーとなります。
・通信の確認方法
通信の確認コマンドとして、curlコマンドを紹介します。
vオプションを付けることで、URLへアクセスしたした際のログを取得できるため、どの処理でエラーが起きているかが確認できます。
1 |
curl -v http://〇〇.com |
まとめ
Http化は業務でも外部の認証局から発行してもらった証明書を使って、Nginxでリバースプロキシサーバ立てて証明書登録する方法でもやったことがあるのですが、AWSのACMとELBを利用した場合かなり楽に実装できました。デメリットを上げるとするならELB利用分の料金が発生することぐらいですかね。
証明書の更新も自動でしてくれるみたいなので、ゆるい制約でAWS上で環境構築する場合はこれ使っとけばいいかなと思います。
以上、最後までお読みいただきありがとうございました。