0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

第7回 Terraform講座

0
Posted at

Target Group ― ALBとEC2をつなぐ橋渡し

今日はALBの次。

実は……

ALBだけ作っても、何も起こらない(笑)

今の構成は、

Internet
↓
ALB

ここで終わっています。

ALBからすると、

«「で、どこへ送るの?」»

という状態。

そこで登場するのが、Target Groupです。


  1. Target Groupとは?

まず全体像を見てみましょう。

Internet
↓
ALB
↓
Target Group
↓
EC2

Target Groupは、

ALBとEC2の橋渡し

をする役割です。

ALBが直接EC2を管理するのではなく、

ALB
↓
Target Group
↓
EC2

という形で、間にTarget Groupを置きます。

Target Groupには、

«「このグループに登録されているターゲットへ通信を送ってください」»

という役割があります。

今回はEC2をターゲットとして登録する構成を作ります。


  1. TerraformでTarget Groupを作る

まずはResourceを作ります。

resource "aws_lb_target_group" "app" {

}

これは、

«「AWSにTarget Groupを1つ作ります」»

という意味です。


name

name = "app-tg"

Target Groupの名前です。

今回は、

app-tg

という名前にします。


  1. port = 80

次が重要。

port = 80

ここで質問!

この80番ポートは誰の80番でしょう?

EC2?
ALB?
Internet?

少し考えてみましょう。

ここを理解すると、ALB → Target Group → EC2の通信がかなり見えるようになります。


  1. protocol

protocol = "HTTP"

これは通信プロトコルです。

今回は、

HTTP

を使用します。

つまり、

«Target Groupに登録されたターゲットへ、HTTPで通信する»

という設定です。


  1. vpc_id

vpc_id = aws_vpc.main.id

ここは、もうかなり慣れてきました(笑)

Target Groupが使用するVPCを指定しています。

Target Group
↓
このVPCで使います

という指定です。


  1. target_type

そして今日、一番重要なのがこれ。

target_type = "instance"

Target Groupには、さまざまな種類のターゲットを登録できます。

例えば、

  • EC2インスタンス
  • IPアドレス
  • Lambda

などです。

今回は、

target_type = "instance"

なので、

«EC2インスタンスをターゲットとして登録する»

という意味になります。


  1. 完成した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でも基本的な考え方は同じです。


  1. 今日の回答

今回の回答はこちら。

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でも同じです。


  1. Target GroupとEC2の関係

ここで重要なのが、

Target GroupそのものがEC2を作るわけではない

ということ。

Target Groupはあくまで、

«「どのターゲットをグループとして扱うか」»

を管理するものです。

例えば、

Target Group
│
├── EC2-1
├── EC2-2
└── EC2-3

という状態を作れます。

そしてALBがこのTarget Groupに対して、

«「このグループに登録されているターゲットへ通信してください」»

という形で処理します。


  1. もう一つ惜しかったところ

今回、

«ALBはTarget GroupへEC2インスタンスのIDを通じて繋げる»

という回答がありました。

これは方向性としては良いですが、ここも少し整理しましょう。

実際の通信経路は、

Internet
↓
ALB
↓
Listener
↓
Target Group
↓
EC2

です。

つまり、

ALBが直接EC2を知っているわけではありません。

役割を分けると、

ALB
↓
「通信を受け取る」

Listener
↓
「どのポート・プロトコルで受けて、
どう処理するか決める」

Target Group
↓
「どのターゲット群へ送るか管理する」

EC2
↓
「実際にアプリケーションを処理する」

という関係になります。

ここが分かると、次回のListenerが一気に分かりやすくなります。


  1. 今まで勉強したものを全部つなげる

ここまで来たので、今までの構成を一度全部つなげてみましょう。

                Internet
                   │
                   ▼
          Internet Gateway
                   │
                   ▼
            Route Table
                   │
                   ▼
            Public Subnet
                   │
         ┌─────────┴─────────┐
         │                   │
         ▼                   ▼
        ALB             NAT Gateway
         │
         ▼
      Listener
         │
         ▼
    Target Group
         │
         ▼
   EC2(Private)
         │
         ▼
        RDS

かなりAWSらしい構成になってきました。

しかも、今まで勉強した内容が全部つながっています。


  1. そしてTerraformでは「この構成をコードにする」

ここがTerraformの面白いところです。

AWSコンソールなら、

VPCを作る
↓
Subnetを作る
↓
IGWを作る
↓
Route Tableを作る
↓
NAT Gatewayを作る
↓
ALBを作る
↓
Target Groupを作る
↓
Listenerを作る
↓
EC2を登録する

という操作をします。

Terraformでは、それをコードとして表現していきます。

つまりTerraformを覚えることそのものが目的ではありません。

本質は、

«AWS上でどんな通信経路・システム構成を作りたいのかを理解し、それをコードで表現すること»

です。


  1. 今回の学習でかなり大きなポイント

今回の学習で重要なのは、

ALB
↓
Target Group
↓
EC2

という構造を理解できたことです。

Terraformのコードだけ暗記すると、

target_type = "instance"

を見て、

«「instanceだからEC2」»

で終わってしまいます。

でも構造を理解していれば、

«「Target GroupはALBからバックエンドへ通信を渡すためのグループで、今回はEC2をターゲットとして登録するからinstanceなんだな」»

と考えられます。

この差は大きいです。


  1. 今日のまとめ

今回覚えたことは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だけで構築できるところまで進めていきましょう🔥☁️🚀

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?