今回はパブリックサブネットにNLBを配置し、リダイレクト先にALB(内部向け)を指定することで、
ALBおよびEC2を直接インターネットに公開することなく、SSL通信を実現します。
#前提条件:
・ACM(AWS Certificate Manager)でパブリック証明書を作成済みであること
・Route 53で独自ドメインを購入済みであること
・検証用VPCの作成
VPC>VPCを作成 をクリックします。
VPCなど を選択します。
名前タグの自動生成 にVPC名を入力します。
IPv4 CIDRブロック、アベイラビリティゾーンの数など、以降の設定はデフォルトのまま、VPCを作成 をクリックします。
特に、VPCエンドポイント>S3ゲートウェイ は”なし”を選択しないように注意してください。
後の手順でサーバ設定をする際に必要となります。
セキュリティグループの穴あけを行います。
セキュリティ>セキュリティグループ>”対象のセキュリティグループ” をクリックします。
インバウンドのルールを編集をクリックします。
ルールを追加 をクリックし、以下の内容を入力します。
1つ目:
・タイプ:HTTPS
・ソース:0.0.0.0
2つ目:
・タイプ:HTTP
・ソース:0.0.0.0.
※ターゲットグループからのヘルスチェック用にHTTPも許可します。
ルールを保存をクリックします。
・検証用EC2インスタンスの作成
ALB経由でのアクセスを確認するため、EC2を2台作成します。
本記事では1台目の手順を記載しますが、2台目も基本的に同じ手順で問題ありません。
EC2>インスタンス>インスタンスを起動 をクリックします。
名前とタグ に任意のインスタンス名を入力します。
アプリケーションおよびOSイメージ はデフォルトのまま、Amazon Linux とします。
インスタンスタイプ もデフォルトのままとします。
キーペア はキーペアなしで続行 をクリックします。
ネットワーク設定>編集 をクリックし、以下の内容を入力します。
・VPC:"先ほど作成したVPC"
・サブネット:"先ほど作成したサブネット" ※前回と違いインターネットゲートウェイの関連付けがない、プライベートサブネットを選択します。
・パブリックIPの自動割り当て:無効化
・ファイアウォール:既存のセキュリティグループを選択する>セキュリティグループを編集>"先ほど作成したセキュリティグループ"
高度な詳細>ユーザーデータ に以下のシェルスクリプトを入力します。
※echo “Hello Web01!”をパイプでHTMLファイルに渡しているため、Webページにアクセスした際はこのメッセージが表示されます。2台目は、echo “Hello Web02!”のようにして、ALBによるアクセス先の振り分けを確認できるようにします。
#!/bin/bash
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
touch /var/www/html/index.html
echo "Hello Web01!" | tee -a /var/www/html/index.html
インスタンスを起動 をクリックします。
2台目も同様の手順で作成してください。
ターゲットグループ(EC2用)の作成
ALBの作成に移る前にリダイレクト先であるEC2用ターゲットグループを作成します。
ロードバランシング>ターゲットグループ>ターゲットグループの作成 をクリックします。
基本的な設定 を以下の内容で設定します。
・ターゲットタイプの選択:インスタンス
・ターゲットグループ名:任意
・プロトコル:ポート:HTTP 80 ※SSL終端がALBのため、ALBからEC2間はHTTP接続となります。
・IPアドレスタイプ:デフォルトのまま
・VPC:”先ほど作成したVPC”
・プロトコルバージョン:デフォルト(HTTP1)のまま
・ヘルスチェックプロトコル:デフォルトのまま ※SSL終端がALBのため、ALBからEC2間のヘルスチェックプロトコル はHTTPのままです。
以降の設定はデフォルトのままとし、次へ をクリックします。
使用可能なインスタンス>”先ほど作成したEC2″ にチェックを入れ、保留中として以下を含める をクリックします。
ターゲットグループの作成 をクリックします。
Application Load Balancerの作成
次に、ALBを作成します。
EC2>ロードバランサー>ロードバランサーの作成 をクリックします。
Application Load Balancer>作成 をクリックします。
基本的な設定 に以下の内容を入力します。
・ロードバランサー名:任意
・スキーム:内部向け
・ロードバランサーのIPアドレスタイプ:IPv4 ※デフォルト
ネットワークマッピングに以下の内容を設定します。
・VPC>"先ほど作成したVPC"
・マッピング>表示されたAZにチェック>サブネット>"先ほど作成したサブネット" ※プライベートサブネットを選択します。
・セキュリティグループ:デフォルトのまま
・リスナーとルーティング:
・1つ目:
・プロトコル:HTTP
・ポート:80
・デフォルトアクション:転送先>ターゲットグループの選択>"先ほど作成したEC2のターゲットグループ"
・2つ目:
・プロトコル:HTTPS
・ポート:443
・デフォルトアクション:転送先>ターゲットグループの選択>"先ほど作成したEC2のターゲットグループ"
・セキュアリスナーの設定: ※2つ目のリスナーをHTTPSにした場合、追加で設定が必要です。
・セキュリティポリシー:デフォルトのまま
・デフォルト SSL/TLS サーバー証明書:証明書の取得先>ACMから>証明書の選択>"事前に作成したパブリック証明書"
以降の設定はデフォルトのまま、作成 をクリックします。
ALBの作成後、ターゲットグループが関連付けられます。
ステータスが以下のようになると思います。初期: Target registration is in progress
ターゲットグループ(ALB用)の作成
NLBの作成に移る前にリダイレクト先であるALB用ターゲットグループを作成します。
ロードバランシング>ターゲットグループ>ターゲットグループの作成 をクリックします。
基本的な設定 を以下の内容で設定します。
・ターゲットタイプの選択:Application Load Balancer
・ターゲットグループ名:任意の名前を入力
・プロトコル:ポート:HTTP 443 ※SSL終端がALBのため、NLBからALB間はHTTPS接続となります。
・IPアドレスタイプ:デフォルト
ネットワークマッピング を以下の内容で設定します。
・VPC:"先ほど作成したVPC"
・プロトコルバージョン:デフォルト(HTTP1)のまま
・ヘルスチェックプロトコル:HTTPS ※SSL終端がALBのため、NLBからALB間のヘルスチェックプロトコル はHTTPSとします。
以降の設定はデフォルトのままとし、次へ をクリックします。
ターゲットを登録>今すぐ登録>Application Load Balancerを選択>”先ほど作成したALB” を選択します。
ターゲットグループの作成 をクリックします。
Network Load Balancerの作成
次に、NLBを作成します。
EC2>ロードバランサー>ロードバランサーの作成 をクリックします。
Network Load Balancer>作成 をクリックします。
・基本的な設定 に以下の内容を入力します。
・ロードバランサー名:任意
・スキーム:インターネット向け
・ロードバランサーのIPアドレスタイプ:IPv4 ※デフォルト
ネットワークマッピング に以下の内容を設定します。
・VPC:"先ほど作成したVPC"
・マッピング:"先ほど作成したサブネット" ※パブリックサブネットを選択します。
・セキュリティグループ:デフォルトのまま
・リスナーとルーティング:
・1つ目:
・プロトコル:TCP
・ポート:80
・デフォルトアクション:転送先>ターゲットグループの選択>"先ほど作成したALBのターゲットグループ"
・2つ目:
・プロトコル:TCP ※TLSを選択するとヘルスチェックエラーとなります。
・ポート:443
・デフォルトアクション:転送先>ターゲットグループの選択>"先ほど作成したALBのターゲットグループ"
以降の設定はデフォルトのまま、作成 をクリックします。
NLBの作成後、ALB用ターゲットグループが関連付けられます。
EC2用ターゲットグループの時と同様、ステータスが以下のようになると思います。初期: Target registration is in progress
Route 53へのレコード登録
締めくくりとして、Route 53にNLBのレコードを登録します。
Route 53>ホストゾーン>”Route 53で購入した独自ドメイン” にアクセスします。
レコード>”独自ドメイン” にをチェックを入れ、レコードを編集 をクリックします。
以下の内容でレコードを編集します。
・レコード名:未入力 ※サブドメインを設定する予定がなければ、空白のままとします。
・レコードタイプ:A
・エイリアス
・トラフィックのルーティング先:Network Load Balancerへのエイリアス
・リージョン:先ほど作成したNLBのリージョン
・Network Load Balancerを選択:先ほど作成したNLB
・ルーティングポリシー:シンプルルーティング
保存 をクリックします。
SSL通信によるアクセス確認
実際にアクセスしていきましょう。
ブラウザからRoute 53に登録したドメインでアクセスし、Webページが表示されることを確認します。例:https://"独自ドメイン".com
Webページがきちんと表示されました。
F5キーを繰り返すと、バックエンドの2台目のEC2にアクセスが分散されていることも確認できます。
HTTPアクセスも試してみます。
F12キー>デベロッパーツール>Network タブを開いた状態で、HTTPアクセスします。例:http://"独自ドメイン".com
Name:”独自ドメイン”.com に対して、Status:300系 および200 が表示されています。
300系の方をクリックすると、HTTPSにリダイレクトされたことを確認できます。
以上、プライベートALB(内部向けALB)によるSSL通信環境を構築してみました。
インターネットからのパブリックアクセスはNLBで受け、ALBおよびバックエンドのEC2は隠ぺいできるため、
よりセキュアな環境を構築できました。
ただ、セキュリティグループは全リソースで共有しているため、(インターネットから直接アクセス不可とはいえ)若干の懸念は残ります。
そこで、次回はNLB・ALB・EC2ごとにセキュリティグループを作成し、
ALBおよびEC2はアクセス元をNLB、ALBに限定することで、セキュリティ強度を高めていきたいと思います。
ここまで見ていただき、ありがとうございました。