Your 3D

AWS EC2 https通信化方法[ACM, ELB, Route 53]

本記事では、インターネットー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へアクセスしたした際のログを取得できるため、どの処理でエラーが起きているかが確認できます。

 

まとめ

Http化は業務でも外部の認証局から発行してもらった証明書を使って、Nginxでリバースプロキシサーバ立てて証明書登録する方法でもやったことがあるのですが、AWSのACMとELBを利用した場合かなり楽に実装できました。デメリットを上げるとするならELB利用分の料金が発生することぐらいですかね。

証明書の更新も自動でしてくれるみたいなので、ゆるい制約でAWS上で環境構築する場合はこれ使っとけばいいかなと思います。

 

以上、最後までお読みいただきありがとうございました。