Amazon EC2 Auto Scaling Group (ASG) と Application Load Balancer (ALB) を組み合わせて使用する場合、以下の手順で設定を行います。
-
Application Load Balancer (ALB) の作成:
- AWS Management Console にログインし、EC2 ダッシュボードから「Load Balancers」を選択。
- 「Create Load Balancer」をクリックし、Application Load Balancer を選択。
- 必要な情報を入力して ALB を作成。
-
Target Group の作成:
- ALB 作成時に、Target Group を作成するか、後から手動で作成することができます。
- Target Group では、ALB がトラフィックを転送する EC2 インスタンスを指定します。
-
Auto Scaling Group (ASG) の作成:
- EC2 ダッシュボードから「Auto Scaling Groups」を選択して「Create Auto Scaling group」をクリック。
- Launch Configuration または Launch Template を選択または作成。
- ASG の詳細を設定。ここで、先ほど作成した Target Group を指定します。
-
ASG に ALB の Target Group を関連付ける:
- ASG の作成または編集時に、[Advanced settings] セクションで、先ほど作成した Target Group を選択。
-
ALB のリスナールールの設定:
- 必要に応じて、ALB のリスナールールを設定して、特定の URL パスやホストヘッダーに基づいてトラフィックを異なる Target Group にルーティングします。
-
ヘルスチェックの設定:
- ALB と ASG のヘルスチェックを適切に設定することで、正常でないインスタンスを自動的に取り除くことができます。
-
セキュリティグループの設定:
- ALB と EC2 インスタンスの両方に対して適切なセキュリティグループを設定します。
-
DNS と ALB の関連付け:
- 必要に応じて、ドメイン名を ALB の DNS 名にマッピングします。
以上で、ALB は受信したトラフィックを ASG 内のインスタンスに均等に分散して転送できるようになります。ASG は、インスタンスのヘルスチェックに基づいて、新しいインスタンスの起動や不健康なインスタンスの終了を自動的に行います。
Terraformで実装
1. ALB の作成
今回は、内部向けのApplication Load Balancer (ALB) をTerraformで作成するための基本的なコードを以下に示します。
provider "aws" {
region = "us-west-2" # 例としてus-west-2リージョンを使用しています。適切なリージョンに変更してください。
}
resource "aws_security_group" "alb_sg" {
name = "alb-sg"
description = "Security group for the internal ALB"
# 以下はHTTPアクセスを許可する例です。必要に応じて変更してください。
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["10.0.0.0/16"] # VPCのCIDR範囲を指定してください。
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_lb" "internal_alb" {
name = "my-internal-alb"
internal = true
load_balancer_type = "application"
security_groups = [aws_security_group.alb_sg.id]
enable_deletion_protection = false
enable_cross_zone_load_balancing = true
subnets = [
# ここに使用するサブネットのIDをリストとして指定してください。
# "subnet-0123456789abcdef0",
# "subnet-0123456789abcdef1",
# ...
]
tags = {
Name = "my-internal-alb"
}
}
resource "aws_lb_listener" "front_end" {
load_balancer_arn = aws_lb.internal_alb.arn
port = "80"
protocol = "HTTP"
default_action {
type = "fixed-response"
fixed_response {
content_type = "text/plain"
message_body = "Hello, World"
status_code = "200"
}
}
}
上記のコードは、内部向けのALBを作成するための基本的なTerraformコードです。必要に応じて、セキュリティグループの設定やサブネットのID、リスナーの設定などを変更してください。
2. Target Group の作成
ALBのTarget GroupをTerraformで作成する方法を以下に示します。
provider "aws" {
region = "us-west-2" # 例としてus-west-2リージョンを使用しています。適切なリージョンに変更してください。
}
resource "aws_lb_target_group" "alb_target_group" {
name = "my-alb-target-group"
port = 80
protocol = "HTTP"
vpc_id = "vpc-0123456789abcdef0" # 適切なVPCのIDに変更してください。
health_check {
enabled = true
interval = 30
path = "/"
port = "traffic-port"
timeout = 5
healthy_threshold = 3
unhealthy_threshold = 3
protocol = "HTTP"
matcher = "200-399"
}
tags = {
Name = "my-alb-target-group"
}
}
上記のコードは、ALBのTarget Groupを作成するための基本的なTerraformコードです。必要に応じて、ヘルスチェックの設定やVPCのIDなどを変更してください。
このTarget Groupを使用して、EC2インスタンスや他のリソースを登録することで、ALBがトラフィックを転送する先として機能します。
3. ASG の作成
Auto Scaling Group (ASG) をTerraformで作成する方法を以下に示します。
まず、Launch Configurationを作成し、その後でAuto Scaling Groupを作成します。以下はその基本的なTerraformコードです。
provider "aws" {
region = "us-west-2" # 例としてus-west-2リージョンを使用しています。適切なリージョンに変更してください。
}
resource "aws_launch_configuration" "asg_config" {
name_prefix = "my-asg-config-"
image_id = "ami-0123456789abcdef0" # 適切なAMI IDに変更してください。
instance_type = "t2.micro"
security_groups = ["sg-0123456789abcdef0"] # 適切なセキュリティグループIDに変更してください。
# 必要に応じて他の設定を追加してください。
lifecycle {
create_before_destroy = true
}
}
resource "aws_autoscaling_group" "asg" {
name = "my-asg"
launch_configuration = aws_launch_configuration.asg_config.name
min_size = 1
max_size = 3
desired_capacity = 2
vpc_zone_identifier = ["subnet-0123456789abcdef0", "subnet-0123456789abcdef1"] # 適切なサブネットIDに変更してください。
target_group_arns = ["arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-alb-target-group/abcdef0123456"] # 先ほど作成したTarget GroupのARNに変更してください。
tags = {
Name = "my-asg"
}
}
上記のコードは、Launch ConfigurationとAuto Scaling Groupを作成するための基本的なTerraformコードです。必要に応じて、AMI ID、セキュリティグループID、サブネットID、Target GroupのARNなどを変更してください。
4. ALB と ASG の関連付け
4番の「ASG に ALB の Target Group を関連付ける」に関して、3番の手順で提供したTerraformコード内で既に実施しています。具体的には、aws_autoscaling_group
リソースの中で target_group_arns
属性を使用して、ASGにTarget Groupを関連付けています。
以下はその部分を再掲します:
resource "aws_autoscaling_group" "asg" {
...
target_group_arns = ["arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-alb-target-group/abcdef0123456"] # 先ほど作成したTarget GroupのARNに変更してください。
...
}
この target_group_arns
属性により、ASGのインスタンスが起動または終了する際に、ALBのTarget Groupに自動的に登録または登録解除されます。
5. ALB のリ スナールールの設定
5番の手順「ALB のリスナールールの設定」に関して、1番の手順で提供したTerraformコードの中で部分的に実施しています。具体的には、aws_lb_listener
リソースを使用して、デフォルトのリスナールールを設定しています。
しかし、特定のURLパスやホストヘッダーに基づいてトラフィックを異なるTarget Groupにルーティングするような詳細なリスナールールの設定はまだ行っていません。
以下は、特定のURLパス(例:/api
)に基づいてトラフィックを異なるTarget Groupにルーティングするリスナールールを追加するTerraformコードの例です:
resource "aws_lb_listener_rule" "api_path_rule" {
listener_arn = aws_lb_listener.front_end.arn
action {
type = "forward"
target_group_arn = aws_lb_target_group.api_target_group.arn
}
condition {
path_pattern {
values = ["/api*"]
}
}
}
resource "aws_lb_target_group" "api_target_group" {
name = "api-target-group"
port = 80
protocol = "HTTP"
vpc_id = "vpc-0123456789abcdef0" # 適切なVPCのIDに変更してください。
health_check {
enabled = true
interval = 30
path = "/api/health"
port = "traffic-port"
timeout = 5
healthy_threshold = 3
unhealthy_threshold = 3
protocol = "HTTP"
matcher = "200-399"
}
tags = {
Name = "api-target-group"
}
}
上記のコードでは、/api
パスにアクセスがあった場合、api_target_group
というTarget Groupにトラフィックをルーティングするリスナールールを設定しています。
このようにして、異なるURLパスやホストヘッダーに基づいてトラフィックを異なるTarget Groupにルーティングするリスナールールを設定することができます。必要に応じて、上記のコードを変更・追加してください。
6. ヘルスチェックの設定
6番の手順「ヘルスチェックの設定」に関して、2番の手順で提供したTerraformコードの中で既に実施しています。具体的には、aws_lb_target_group
リソース内で health_check
属性を使用して、ヘルスチェックの設定を行っています。
以下はその部分を再掲します:
resource "aws_lb_target_group" "alb_target_group" {
...
health_check {
enabled = true
interval = 30
path = "/"
port = "traffic-port"
timeout = 5
healthy_threshold = 3
unhealthy_threshold = 3
protocol = "HTTP"
matcher = "200-399"
}
...
}
上記のコードでは、ヘルスチェックの設定を行っており、特定のパス(/
)に対してHTTPリクエストを行い、ステータスコードが200から399の範囲内であればインスタンスを健康と判断しています。必要に応じて、上記のヘルスチェックの設定を変更してください。
7. セキュリティグループの設定
7番の手順「セキュリティグループの設定」に関して、1番の手順で提供したTerraformコードの中で既に実施しています。具体的には、aws_security_group
リソースを使用して、ALBのセキュリティグループを設定しています。
以下はその部分を再掲します:
resource "aws_security_group" "alb_sg" {
name = "alb-sg"
description = "Security group for the internal ALB"
# 以下はHTTPアクセスを許可する例です。必要に応じて変更してください。
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["10.0.0.0/16"] # VPCのCIDR範囲を指定してください。
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
上記のコードでは、セキュリティグループを作成し、HTTPアクセスを許可する設定を行っています。
ただし、EC2インスタンスや他のリソースに関するセキュリティグループの設定も必要であれば、それに関するTerraformコードを追加する必要があります。
8. DNS と ALB の関連付け
8番の手順「DNS と ALB の関連付け」に関して、ALBのDNS名を使用してRoute 53や他のDNSサービスでドメイン名をマッピングする設定を行います。
以下は、AWSのRoute 53を使用して、特定のドメイン名(例:myapp.example.com
)をALBのDNS名にマッピングするTerraformコードの例です:
resource "aws_route53_zone" "example" {
name = "example.com"
}
resource "aws_route53_record" "alb_record" {
zone_id = aws_route53_zone.example.zone_id
name = "myapp.example.com"
type = "A"
alias {
name = aws_lb.internal_alb.dns_name
zone_id = aws_lb.internal_alb.zone_id
evaluate_target_health = false
}
}
上記のコードでは、まずexample.com
というドメインのRoute 53ホストゾーンを作成し、その後でmyapp.example.com
というサブドメインをALBのDNS名にマッピングするAレコード(エイリアスレコード)を作成しています。
このコードを適用する前に、example.com
のドメインがRoute 53で管理されていること、および、そのドメインのネームサーバー設定が正しく行われていることを確認してください。