0
Help us understand the problem. What are the problem?

posted at

updated at

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

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

構成図

temp-ALB.drawio.png

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

前提

  • VPCは10.0.0.0/16で作成済み
  • VPCのDNSホスト名の解決を「有効」に変更しておく(デフォルトでは無効)
  • パブリックサブネットは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コンソールに移動します。
image.png

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

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

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

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

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

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

image.png

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

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

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

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

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

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

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

image.png

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

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

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

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

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

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

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

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

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

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

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

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

3. ALBを作成する

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

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

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

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

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

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

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

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

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

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

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

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

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

image.png

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

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

image.png

image.png

image.png

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で許可
image.png

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

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

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

image.png

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

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

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

image.png

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

まとめ

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

課金に関する注意

今回構築したリソースのうち、以下のリソースは放っておいても時間で課金されるので、不要になったらすぐに削除することをお勧めします。
- EC2インスタンス×2
- ALB
- VPCエンドポイント×3

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?