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?

第6回 Terraform講座

0
Posted at

Application Load Balancer(ALB)

今回から、いよいよ**「AWSのサービスを組み合わせてシステムを作る」**ところに入っていく。

ここまで勉強してきたのは、

  • VPC
  • Subnet
  • Internet Gateway
  • Route Table
  • Route Table Association
  • NAT Gateway

だった。

これまでは、それぞれの役割を理解してきた。

でも今回は違う。

これらを使って、

«「インターネットからアクセスされたら、どうやってEC2まで通信を届けるのか?」»

を作っていく。

今日のゴールは、この構成。

Internet
│
▼
ALB
│
▼
Target Group
│
├── EC2
├── EC2
└── EC2

ここまで作れるようになると、AWSのネットワークが「サービスの暗記」ではなく、実際に動くシステムとして見えてくる。


まずALBって何?

ALBは、

Application Load Balancer

の略。

簡単に言うと、

«インターネットから来たリクエストを、複数のEC2へ振り分けるサービス»

だ。

例えばEC2が3台あるとする。

         ┌── EC2-1
         │

Internet → ALB ── EC2-2
│
└── EC2-3

ユーザーから見ると、

Internet
↓
ALB

にアクセスしている。

ALBがその後ろにあるEC2へ通信を振り分ける。


まず今回の構成

ここまで作ってきたAWSを整理すると、

VPC
│
├── Internet Gateway
│
├── Public Subnet
│ │
│ ├── ALB
│ └── NAT Gateway
│
└── Private Subnet
│
├── EC2
└── RDS

という構成になっている。

ここで重要なのが、

ALBはどこに置くのか?

ということ。

ALBはインターネットからアクセスされる。

だから、

Internet
↓
ALB

という通信を受けられる場所に配置する必要がある。

そこで、

Public Subnet

に配置する。


TerraformでALBを作る

まず基本形。

resource "aws_lb" "alb" {

name = "sample-alb"

internal = false

load_balancer_type = "application"

subnets = [
aws_subnet.public_a.id,
aws_subnet.public_c.id
]

security_groups = [
aws_security_group.alb.id
]

}

ここから一つずつ見ていこう。


resource "aws_lb" "alb"

resource "aws_lb" "alb" {

これは、

«ALBを作ります»

という宣言。

"aws_lb" がAWSのロードバランサーを作るTerraformリソース。

"alb" はTerraform上で付ける名前。


name

name = "sample-alb"

これは単純。

ALBの名前を

sample-alb

にする。


internal

ここが今回の重要ポイント。

internal = false

最初に見たとき、

「falseって何?」

となった。

でも、ここは英語の感覚に慣れると分かりやすい。

"internal" は、

«内部向けか?»

という意味。

だから、

internal = false

なら、

«内部向けではない»

つまり、

«インターネット向け»

になる。

逆に、

internal = true

なら、

«内部向け»

になる。


君が気付いたポイント

ここは日本語話者だと少しややこしい。

「No」と答えたら「Yes」になるような感覚がある。

でも、

internal = false

は、

«「内部向けではありません」»

という意味。

だから結果として、

Internet-facing ALB

になる。


load_balancer_type

load_balancer_type = "application"

これは、

«Application Load Balancerとして作ります»

という設定。

ALBはApplication Load Balancerなので、

application

と指定する。


そして今回の重要ポイント

subnets = [
aws_subnet.public_a.id,
aws_subnet.public_c.id
]

ここで疑問。

なぜ、

subnet

ではなく、

subnets

なのか?


なぜ複数のSubnetを指定する?

ALBは高可用性を考えて、

複数のAZにまたがって配置する。

例えば、

AZ-A
│
└── Public Subnet A
│
└── ALB

AZ-C
│
└── Public Subnet C
│
└── ALB

という形。

だからTerraformでも、

subnets = [
aws_subnet.public_a.id,
aws_subnet.public_c.id
]

と複数のSubnetを指定する。


ここで今回の君の回答

君の最初の回答は、

«「パブリックサブネットAとCに負荷分散させるため。」»

だった。

これは惜しい。

95点。

なぜなら、ALBがSubnetに負荷分散するわけではないから。

ALBが負荷分散する相手は、

EC2などのターゲット。

例えば、

Internet
↓
ALB
↓
┌──┼──┐
↓ ↓ ↓
EC2 EC2 EC2

という形。

では、なぜSubnetを2つ指定するのか?

答えは、

«ALB自体を複数のAZにまたがって配置し、高可用性を確保するため。»

ここがポイント。


「負荷分散」と「高可用性」は違う

ここはかなり重要。

ALBの役割は、

EC2への負荷分散。

一方、

複数AZにALBを配置する理由は、

高可用性。

つまり、

負荷分散
↓
ALB → 複数のEC2

と、

高可用性
↓
ALB → 複数AZ

は別の話。

SAPでもよく出てきた考え方が、Terraformを書くことで実際の構成として見えてくる。


security_groups

次。

security_groups = [
aws_security_group.alb.id
]

これは、

«ALBに適用するSecurity Groupを指定する»

という意味。

今回はまだSecurity Groupそのものは作っていないので、

「後で作るんだな」

くらいでOK。


そして今回の質問

ここからが今回のレビュー。

Q1

なぜ、

subnets = [
aws_subnet.public_a.id,
aws_subnet.public_c.id
]

と複数のSubnetを指定する?


君の回答

«パブリックサブネットAとCに負荷分散させるため。»

レビュー

95点。

考え方はかなり近い。

ただし、

ALBがSubnetに負荷分散するわけではない。

ALBが負荷分散するのは、

ALB
↓
EC2
EC2
EC2

の部分。

複数Subnetを指定する理由は、

«複数のAZにALBを配置して高可用性を確保するため。»

ここを区別できれば完璧。


Q2

なぜALBはPublic Subnetに置く?

君の回答は、

«「インターネットからサブネットへの通信を負荷分散させるため。」»

だった。

レビュー

90点。

ここも少し修正。

ALBが負荷分散する対象は、

SubnetではなくEC2。

では、なぜPublic Subnetに置くのか?

答えは、

«インターネットからの通信を最初に受け取る必要があるから。»

つまり、

Internet
↓
ALB
↓
EC2

という入口になる。

だからALBは、

インターネットから到達できるPublic Subnet

に配置する。


Q3

そして一番難しかった問題。

internal = false

これは何を意味する?

君の最初の回答は、

«「サブネットへの通信失敗を検知したときに負荷分散?」»

だった。

これは……

40点!

でも、この間違いはかなり良い。

なぜなら「ALBは通信を振り分けるもの」という知識から考えて、自分で答えを組み立てようとしているから。


正解

internal = false

は、

«インターネット向けのALB»

を意味する。

逆に、

internal = true

なら、

«VPC内部向けのALB»

になる。


具体例

例えば、

会社のWebサイト。

Internet
↓
ALB
↓
EC2

これは外部からアクセスされる。

だから、

internal = false


一方、社内システムなら、

社員
↓
VPN
↓
Internal ALB
↓
EC2

のような構成にできる。

この場合は、

internal = true

となる。


今回の君の修正版

その後、君自身で理解を更新してくれた。

«「internalは内部なので、Falseの場合はインターネット公開、TrueはVPCの内部だけ」»

これは100点。

さらに、

«「ALBがサブネットA・Cどちらにもあるから。負荷分散より、高可用性のほうが適切。」»

これも重要な修正。

そして、

«「ALBはサブネットじゃなく、EC2に振り分ける。」»

これが今回一番大きな理解。


今日のまとめ

今回覚えたことを整理すると、

設定| 意味
"aws_lb"| Load Balancerを作成
"name"| ALBの名前
"internal = false"| インターネット向け
"internal = true"| 内部向け
"load_balancer_type = "application""| ALBとして作成
"subnets"| ALBを配置するSubnetを指定
複数AZ| 高可用性のため
"security_groups"| ALBに適用するSG

そして通信の役割は、

Internet
↓
ALB
↓
Target Group
↓
EC2


今日、一番大事だったこと

今回の授業で面白かったのは、

最初の答えが間違っていても、そこから自分で修正できたこと。

例えば、

«「ALBがSubnetに負荷分散する」»

↓

«「ALBはEC2に振り分ける」»

さらに、

«「Subnetを複数指定するのは負荷分散のため」»

↓

«「複数AZに配置して高可用性を確保するため」»

と変わった。

これがただの暗記との違い。


Terraformを「AWSコンソールのコード化」として見る

ここまで来ると、

internal = false

を見たときに、

Terraformの文法として覚える必要がなくなる。

頭の中で、

ALB作成画面

○ Internet-facing
● Internal

……じゃなくて、

「今回はInternet-facingだからfalseだな」

とAWSの設定から逆算できる。

同じように、

subnets = [...]

を見たら、

«「ALBは複数AZに配置するから、Subnetを複数指定するんだな」»

と考えられる。

これが、

AWSの知識 → 構成設計 → Terraform

という流れ。


そして次回

次はいよいよ、

Target Group

ここで、

Internet
↓
ALB
↓
Target Group
↓
EC2

という構成を完成させる。

Target Groupは、

「ALBがどのEC2へ通信を送るのか」

を管理する場所。

さらに、

«「このEC2は正常に動いてる?」»

を確認するHealth Checkも登場する。

つまり次回から、

「ALBを作った」

ではなく、

「ALBから実際にEC2へ通信を届ける」

ところまで進む。


最後に

資格勉強をしていた頃は、

  • ALB
  • Target Group
  • Health Check
  • AZ
  • Subnet
  • Security Group

を、それぞれ別々の知識として覚えていた。

でも今は違う。

Internet
↓
Public Subnet
↓
ALB
↓
Target Group
↓
Private Subnet
↓
EC2

という一つのシステムとして考えられるようになってきた。

これが、資格で覚えた知識が実際のAWS設計につながる瞬間。

そしてTerraformは、その設計を

「コードとして再現するための道具」

になっている。

ここまで来ると、Terraformの文法を一つずつ暗記するより、

«「AWSコンソールなら、今どの設定をしている?」»

と考えながらコードを書く方が圧倒的に理解しやすい。

次回はTarget Group。

いよいよ、

ALBとEC2を本当に接続する。 ☁️🔥

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?