はじめに
インプルの矢島です。
安全に管理するために、EC2をプライベートサブネットにおきたいことありますよね。
今回はプライベートサブネットに作成したEC2に、パブリックサブネットのALBからの接続を試みたいと思います。
前提
- VPCはデフォルトで作成してあるものを使います。
やること
下記の構成を作成します。

サブネット作成
2つのアベイラビリティゾーンにパブリックサブネットとプライベートサブネットを作成します。
ALBは各AZに作成されるため、インターネットに接続できるパブリックサブネットを作成しておく必要がある。
プライベートサブネットはEC2用に作成します。
合計4つのサブネットが作成できていればOKです。

S3のエンドポイントを作成
yum installでapacheをインストールするためにはインターネットに接続しておくか、S3エンドポイントをyum repoisitoryとして使用する方法があります。
(s3エンドポイントを使用するには、 Amazon Linux AMIの必要があります)
Nat Gatewayは高いですし、Nat Instanceも多少費用がかかるので、S3のエンドポイントを作成してみます。
VPCのエンドポイント項目から「エンドポイント作成」ボタンを押下します。
S3はサービスカテゴリの「AWSサービス」となります。

サービスはS3の「Gateway」タイプを選択します。(gatewayタイプは無料のため)
VPCは今回利用するVPCを選択してください。

ルートテーブルはインタネットゲートウェイに向けられてないルートテーブルを選択します。
テストなので、ポリシーはフルアクセスにしておきます。

これでS3エンドポイントの作成が完了しました。
EC2を作成
EC2のマネジメントコンソールから、インスタンスを起動します。

AMIはAmazon Linux AMIを選択します。

ネットワークの設定では、VPCとプライベートサブネットを選択します。

今回はセキュリティグループを作成しておきます。この後に編集するので、一旦はデフォルトのままで新規作成します。

ユーザーデータでapacheのインストールとindex.htmlを作成して、「サーバー1です」と書き込みます。

#!/bin/bash
sudo su
yum update -y
yum -y install httpd
touch /var/www/html/index.html
echo "サーバー1です" > /var/www/html/index.html
chkconfig httpd on
service httpd start
ここまで設定したら、インスタンスを作成してください。
無事インスタンスの作成が完了したら、別のアベイラビリティゾーンのプライベートサブネットにも同じようにEC2を作成します。
(ユーザーデータのindex.htmlに書き込みでは、「サーバー2です」に文字を変更して作成してください)
無事2つのアベイラビリティゾーンにEC2を作成しました。

セキュリティグループの編集
ALB用のセキュリティグループの作成
VPCのセキュリティグループから「セキュリティグループを作成」を押下します。

インバウンドルールには、HTTPを許可しておきます。(HTTPSは今回は設定しなくても大丈夫です。

EC2のセキュリティグループを編集する
EC2を作成した際に、セキュリティグループを作成したと思うので、そのセキュリティグループを編集してALBからのHTTPのみ許可します。
(HTTPSは設定しなくても大丈夫です)

これでセキュリティグループの設定が完了です。
ALBの作成
EC2のロードバランサからcreate load balancerを押下します。

ロードバランサーネームは任意で設定してください。

Network mappingではEC2を作成したアベイラビリティゾーンのパブリックサブネットを選択します。

セキュリティグループは、先ほど作成したALB用のセキュリティグループを選択します。

ターゲットグループを選択しますが、最初に選択する前にグループを作成する必要があります。
target typeはインスタンスを選択します。

Target group nameには任意で設定します。
プロトコルにはHTTPを選択します。

Health checksにはHTTPのままにしておきます。

Targetsには、2つのEC2を選択します。

作成が完了したら、そのグループを選択します。

これでロードバランサを作成します。

動作確認してみる
ロードバランサのARNをコピーして、ブラウザからアクセスしてみましょう。
すると下記のように「サーバー1です」と表示されます。

次に、リロードをしてみます。
何度かリロードしてみると、「サーバー2です」と表示されました。

このように無事2つのサーバーにうまく繋がっていることがわかります。
まとめ
いかがでしたでしょうか。
大体30分くらいで構築することができ、とても簡単だったので、ぜひ試してみていただけたらと思います。