Target Group ― ALBとEC2をつなぐ橋渡し
今日はALBの次。
実は……
ALBだけ作っても、何も起こらない(笑)
今の構成は、
Internet
↓
ALB
ここで終わっています。
ALBからすると、
«「で、どこへ送るの?」»
という状態。
そこで登場するのが、Target Groupです。
- Target Groupとは?
まず全体像を見てみましょう。
Internet
↓
ALB
↓
Target Group
↓
EC2
Target Groupは、
ALBとEC2の橋渡し
をする役割です。
ALBが直接EC2を管理するのではなく、
ALB
↓
Target Group
↓
EC2
という形で、間にTarget Groupを置きます。
Target Groupには、
«「このグループに登録されているターゲットへ通信を送ってください」»
という役割があります。
今回はEC2をターゲットとして登録する構成を作ります。
- TerraformでTarget Groupを作る
まずはResourceを作ります。
resource "aws_lb_target_group" "app" {
}
これは、
«「AWSにTarget Groupを1つ作ります」»
という意味です。
name
name = "app-tg"
Target Groupの名前です。
今回は、
app-tg
という名前にします。
- port = 80
次が重要。
port = 80
ここで質問!
この80番ポートは誰の80番でしょう?
EC2?
ALB?
Internet?
少し考えてみましょう。
ここを理解すると、ALB → Target Group → EC2の通信がかなり見えるようになります。
- protocol
protocol = "HTTP"
これは通信プロトコルです。
今回は、
HTTP
を使用します。
つまり、
«Target Groupに登録されたターゲットへ、HTTPで通信する»
という設定です。
- vpc_id
vpc_id = aws_vpc.main.id
ここは、もうかなり慣れてきました(笑)
Target Groupが使用するVPCを指定しています。
Target Group
↓
このVPCで使います
という指定です。
- target_type
そして今日、一番重要なのがこれ。
target_type = "instance"
Target Groupには、さまざまな種類のターゲットを登録できます。
例えば、
- EC2インスタンス
- IPアドレス
- Lambda
などです。
今回は、
target_type = "instance"
なので、
«EC2インスタンスをターゲットとして登録する»
という意味になります。
- 完成したTarget Group
ここまでをまとめると、こうなります。
resource "aws_lb_target_group" "app" {
name = "app-tg"
port = 80
protocol = "HTTP"
vpc_id = aws_vpc.main.id
target_type = "instance"
}
ここまでで、Target Groupそのものは作れます。
ただし……
まだEC2は書いていません。
ここが今日の重要ポイントです。
今日の問題
Q1
port = 80
これは誰の80番ポートでしょう?
Q2
なぜ、
target_type = "instance"
なのでしょう?
Q3【今日一番重要】
まだTerraformにEC2を書いていません。
なのに、なぜTarget Groupを先に作れるのでしょう?
AWSコンソールを思い出してみてください。
Target Groupは、EC2がまだ存在しなくても作れましたよね。
作成したあとに、
登録ターゲット
0件
という状態にしておくこともできます。
そして、あとからEC2を登録できます。
Terraformでも基本的な考え方は同じです。
- 今日の回答
今回の回答はこちら。
Q1
«ターゲットグループからインスタンスへのポート»
Q2
«ターゲットグループの最終通信地点がインスタンスだから»
Q3
«ターゲットグループはどのインスタンスへ通信するのかを決めれるため。»
さらに、
«ALBはTarget GroupへEC2インスタンスのIDを通じて繋げる»
という回答でした。
では、今回も詳しくレビューしていきます。
今回のレビュー
"resource "aws_lb_target_group" "app""
«アプリケーションロードバランサーターゲットグループを作ります»
評価:100点
正しく理解できています。
Terraformでは、
resource "aws_lb_target_group"
によってTarget GroupというAWSリソースを作成します。
"name = "app-tg""
«app-tgという名の»
評価:100点
その通りです。
Target Groupの名前を指定しています。
"port = 80"
«インスタンスにポート80»
評価:100点
ここは非常に重要。
今回の回答は正しいです。
Internet
↓
ALB
↓
Target Group
↓
EC2:80
この構成におけるTarget Groupの"port = 80"は、
ターゲットとなるEC2へ接続するときのポート
を表しています。
つまり、
«「このTarget Groupに登録されているEC2には80番ポートで接続してください」»
というイメージです。
最初は、
«「この80番ってALB?EC2?」»
となりやすいところですが、今回はきちんと通信の流れを見て判断できています。
"protocol = "HTTP""
«HTTPでの通信»
評価:100点
これも正しいです。
protocol = "HTTP"
なので、ターゲットへの通信プロトコルとしてHTTPを使用します。
"vpc_id = aws_vpc.main.id"
«vpc.main.idという名のVPCで作成する»
評価:100点
ここもOK。
より正確には、
«"aws_vpc.main.id"で参照しているVPCをTarget Groupに関連付ける»
という意味です。
Terraformでは、以前作ったリソースをこうやって参照できます。
aws_vpc.main.id
この感覚もかなり身についてきました。
"target_type = "instance""
«インスタンスをターゲットにして»
評価:100点
正解です。
target_type = "instance"
なので、
Target Group
↓
EC2 Instance
という関係になります。
Q1
"port = 80"は誰の80番?
«ターゲットグループからインスタンスへのポート»
評価:100点
これでOKです。
ここは今後も重要なので、頭の中にこの図を残しておきましょう。
ALB
│
│ Listener
│
▼
Target Group
│
│ HTTP :80
▼
EC2 :80
Q2
なぜ "target_type = "instance"" なの?
«ターゲットグループの最終通信地点がインスタンスだから»
評価:100点
これも正しく理解できています。
今回の構成では、Target Groupに登録する対象がEC2だからです。
target_type = "instance"
となります。
Q3【今日の最重要問題】
ここです。
回答は、
«ターゲットグループはどのインスタンスへ通信するのかを決めれるため。»
でした。
評価:95点
かなり良いです。
ただし、ここには1つだけ整理しておきたいポイントがあります。
Target Groupを作ることと、EC2を登録することは別
ここが超重要です。
Target Groupは、
EC2が0台でも作成できます。
例えばAWSコンソールで、
Target Group
↓
登録ターゲット
0件
という状態を作れます。
そのあとで、
EC2-1
EC2-2
EC2-3
を登録できます。
つまり、
Target Groupを作る
↓
あとからEC2を登録する
という2段階になっています。
Terraformでも同じです。
- Target GroupとEC2の関係
ここで重要なのが、
Target GroupそのものがEC2を作るわけではない
ということ。
Target Groupはあくまで、
«「どのターゲットをグループとして扱うか」»
を管理するものです。
例えば、
Target Group
│
├── EC2-1
├── EC2-2
└── EC2-3
という状態を作れます。
そしてALBがこのTarget Groupに対して、
«「このグループに登録されているターゲットへ通信してください」»
という形で処理します。
- もう一つ惜しかったところ
今回、
«ALBはTarget GroupへEC2インスタンスのIDを通じて繋げる»
という回答がありました。
これは方向性としては良いですが、ここも少し整理しましょう。
実際の通信経路は、
Internet
↓
ALB
↓
Listener
↓
Target Group
↓
EC2
です。
つまり、
ALBが直接EC2を知っているわけではありません。
役割を分けると、
ALB
↓
「通信を受け取る」
Listener
↓
「どのポート・プロトコルで受けて、
どう処理するか決める」
Target Group
↓
「どのターゲット群へ送るか管理する」
EC2
↓
「実際にアプリケーションを処理する」
という関係になります。
ここが分かると、次回のListenerが一気に分かりやすくなります。
- 今まで勉強したものを全部つなげる
ここまで来たので、今までの構成を一度全部つなげてみましょう。
Internet
│
▼
Internet Gateway
│
▼
Route Table
│
▼
Public Subnet
│
┌─────────┴─────────┐
│ │
▼ ▼
ALB NAT Gateway
│
▼
Listener
│
▼
Target Group
│
▼
EC2(Private)
│
▼
RDS
かなりAWSらしい構成になってきました。
しかも、今まで勉強した内容が全部つながっています。
- そしてTerraformでは「この構成をコードにする」
ここがTerraformの面白いところです。
AWSコンソールなら、
VPCを作る
↓
Subnetを作る
↓
IGWを作る
↓
Route Tableを作る
↓
NAT Gatewayを作る
↓
ALBを作る
↓
Target Groupを作る
↓
Listenerを作る
↓
EC2を登録する
という操作をします。
Terraformでは、それをコードとして表現していきます。
つまりTerraformを覚えることそのものが目的ではありません。
本質は、
«AWS上でどんな通信経路・システム構成を作りたいのかを理解し、それをコードで表現すること»
です。
- 今回の学習でかなり大きなポイント
今回の学習で重要なのは、
ALB
↓
Target Group
↓
EC2
という構造を理解できたことです。
Terraformのコードだけ暗記すると、
target_type = "instance"
を見て、
«「instanceだからEC2」»
で終わってしまいます。
でも構造を理解していれば、
«「Target GroupはALBからバックエンドへ通信を渡すためのグループで、今回はEC2をターゲットとして登録するからinstanceなんだな」»
と考えられます。
この差は大きいです。
- 今日のまとめ
今回覚えたことは5つ。
① Target GroupはALBとバックエンドの橋渡し
ALB
↓
Target Group
↓
EC2
② "port = 80"はターゲットへの接続ポート
Target Group
↓
EC2:80
③ "protocol = "HTTP""はターゲットとの通信プロトコル
protocol = "HTTP"
④ "target_type = "instance""はEC2をターゲットにする
target_type = "instance"
⑤ Target GroupはEC2がなくても作れる
Target Group作成
↓
登録ターゲット 0件
↓
あとからEC2を登録
これが今日の一番重要なポイントです。
次回予告
次回はいよいよ……
Listener!
ここから一気に通信がつながってきます。
今は、
Internet
↓
ALB
↓
Listener???
↓
Target Group
↓
EC2
となっています。
この「???」がListenerです。
Listenerは、
«「ALBがどのポート・プロトコルで通信を受けて、どこへ渡すのか」»
を決めます。
例えば、
Internet
↓
ALB
↓
Listener :80
↓
Target Group
↓
EC2 :80
という流れです。
さらにHTTPSまで考えると、
Internet
↓
HTTPS :443
↓
ALB
↓
Listener :443
↓
Target Group
↓
EC2
という構成も見えてきます。
ここまで来ると、ブラウザからアクセスした通信がAWS内部をどう流れていくのかが、かなり具体的に見えるようになります。
先生から一言
最初は、
«「Terraformのコードを教えて!」»
というところから始まりました。
でも今は、
«「このコードはAWSのどの仕組みを表しているのか?」»
を考えながらコードを書けています。
これがTerraform学習ではかなり大事です。
Terraformだけを覚えるなら、書き方を暗記すればいい。
でも、
AWSの仕組みを理解する
↓
通信の流れを理解する
↓
AWSコンソールでの構成を理解する
↓
それをTerraformでコード化する
という順番で学べば、Terraform以外のIaCにも応用できます。
そして何より……
今までAWS資格で覚えてきた知識が、実際の構成として一本につながってきています。
知識が「点」から「線」になってきたところです。
このまま最後まで、
AWSの構成を理解する → Terraformでコードを書く
を繰り返して、最終的には一つのAWS環境を最初から最後までTerraformだけで構築できるところまで進めていきましょう🔥☁️🚀