📝

パブリックなALBからプライベートなEC2にアクセスしてみた

9 min read

「なんだかEC2をプライベートに置きたいなあ」
なんてことないですか?
僕はよくあります。
そんな時に、NATゲートウェイなどを使う方法もありますが、今回はALBを使用してプライベートなEC2にアクセスしてみたいと思います。

構成図

  • パブリックサブネットにALBを設置
  • プライベートサブネットにEC2を設置
  • EC2にはALBからのアクセスを許可
  • せっかくなのでマルチAZにしてみる

前提

  • VPCは10.0.0.0/16で作成済み
  • パブリックサブネットは10.0.1.0/2410.0.2.0/24で作成済み
  • プライベートサブネットは10.0.10.0/2410.0.11.0/24で作成済み
  • 「AmazonSSMManagedInstanceCore」ポリシーをアタッチしたEC2用IAMロール作成済み
    作成方法はこちらをご覧ください。

1. EC2インスタンスを構築する

まずはEC2インスタンスを2つのプライベートサブネットに1つずつ構築していきます。
マネジメントコンソールからEC2コンソールに移動します。

EC2ダッシュボードからインスタンスを起動します。

今回はAmazon Linux 2 AMI (HVM)を選択します。

インスタンスタイプはt2.microにしておきます。

詳細設定は以下の通りです。
・ネットワーク:作成済みのVPC
・サブネット:作成済みのプライベートサブネットのどちらか
・キャパシティーの予約:余計な課金を抑えるためになし
・IAMロール:作成済みのIAMロール

今回はユーザーデータでApacheをインストールします。

#!/bin/bash
sudo su
yum update -y
yum -y install httpd
chkconfig httpd on
service httpd start

ストレージはデフォルトのまま次に進みます。

タグは任意で付けてください。
今回はNameキーにWeb-1とつけました。

セキュリティグループは既存のものでもよいですが、今回は新しく作成します。
設定はあとで変えるのでこの時点ではデフォルトでOKです。

設定を確認して「起動」をクリックします。

キーペアはなしで起動します。

これで片方のプライベートサブネットに1台のEC2インスタンスが起動しました。

同様の手順で、もう片方のプライベートサブネットにも起動しましょう。
・AMI、インスタンスタイプは同じ
・サブネットはもう片方のプライベートサブネットを選択
・IAMロールやユーザーデータは同じ
・ストレージはデフォルト
・タグはわかりやすいように別の名前をつける
・セキュリティグループは1つ目で作成したグループ
・キーペアは不要

これで2つのAZ(1aと1c)に1つずつEC2インスタンスを起動しました。

2. セキュリティグループの設定

ALBを作成する前に、セキュリティグループの設定を行います。
EC2コンソールから行いましょう。

とりあえずわかりやすいように、1で作成したセキュリティグループのNameタグを編集します。

次にALB用のセキュリティグループを作成します。

任意の名前と説明を入力し、作成済みのVPCを選択します。

インバウンドのHTTPを全許可に設定し、アウトバウンドはデフォルトのままにしておきます。
わかりやすいように、タグもつけておきます。

続いてEC2用のセキュリティグループのインバウンドルールを編集します。

既存のルールは削除します。

「ルールを追加」をクリックします。

HTTPで先ほど作成したALBのセキュリティグループからの通信を許可します。

これで、ALBはどこからでもアクセス可能、EC2はALBからのみアクセス可能となるセキュリティグループの設定ができました。

3. ALBを作成する

次はALBを作成します。
EC2コンソールのサイドバーから「ロードバランサー」をクリックしましょう。

「ロードバランサーの作成」をクリックします。

Application Load Balancerの「Create」をクリックします。

任意の名前を入力します。

VPCは作成済みのVPCを選択します。
サブネットはEC2を配置したAZと同じAZのパブリックサブネットを選択します。
今回は1aと1cにEC2を構築したので、こちらでも1aと1cを選択しています。
ただし、こちらで使用するサブネットはEC2とは異なり、パブリックサブネットである点に注意してください。

セキュリティグループは作成済みのALB用のグループを選択します。

ターゲットグループは新規に作成しましょう。

target typeはInstancesのままにしておき、任意の名前を入力します。

プロトコルはHTTPのままにしておき、VPCが作成済みのものになっているかを確認します。

その他はデフォルトのまま次に進みます。

起動済みの2台のインスタンスをターゲットに登録します。

ターゲットグループを作成します。

ターゲットグループを作成したらALBの作成画面に戻り、ターゲットグループのリロードボタンを押して、グループを選択しましょう。

設定を確認して、ロードバランサーを作成します。

状態が「プロビジョニング」から「Active」になれば作成完了です。

ALBのDNS名でアクセスし、Apacheのデフォルトページが表示されればOKです。

4. (おまけ)プライベートなEC2の中身を編集する

現状だと、ターゲットグループのヘルスチェックが失敗しています。

これは、Apacheはインストールしたけど、/var/www/html/にindex.htmlなどのファイルがないためです。
せっかくなので、プライベートなEC2にアクセスして、index.htmlを作成してみます。
プライベートなEC2にアクセスする方法については、
プライベートなEC2にSSMセッションマネージャーで接続してみた
をご覧ください。

必要なエンドポイントを3つ作りました。
・VPCはEC2を構築した時のVPC
・サブネットはEC2を構築したプライベートサブネット2つを選択
・セキュリティグループはエンドポイント用のグループを作成し、HTTPSを10.0.0.0/16で許可

EC2インスタンスを選択して「接続」をクリックします。

「セッションマネージャー」タブから接続します。

/var/www/html/にindex.htmlを適当に作ります。

同様にもう1つのインスタンスにも接続し、「Web-2」と記述したindex.htmlを作成します。

index.html作成後、しばらくするとターゲットグループでインスタンスが「healthy」になります。

これでヘルスチェックも正常になったので、再度ALBのDNS名でアクセスしてみましょう。
ページをリロードすると、ALBによる負荷分散で各インスタンスのindex.htmlが表示されると思います。

これでやりたいことはすべてできました!

まとめ

今回はパブリックなALBからプライベートなEC2にアクセスしてみました。
NATゲートウェイを使わずに
「なんだかEC2をプライベートに置きたいなあ」
という希望をかなえることができました。(だってNATゲートウェイ高いんだもん)
この構成にCloudFrontを合わせて、CloudFront経由のアクセスのみ許可し、EC2、ALBの直接アクセスは禁止するということもできるので、別の機会に紹介したいと思います。
今回の内容がどなたかの参考になれば幸いです。

課金に関する注意

今回構築したリソースのうち、以下のリソースは放っておいても時間で課金されるので、不要になったらすぐに削除することをお勧めします。

  • EC2インスタンス×2
  • ALB
  • VPCエンドポイント×3

その他、VPC、サブネット、セキュリティグループ、IAMロールは課金対象ではありませんが、不要であれば削除して下さい。

Discussion

ログインするとコメントできます