AWSの無料枠で出来る範囲のチュートリアルを ChatGPT に示して頂いたので、試してみた経過を簡単にまとめてみました。
AWS等の実際の画面や操作はどんな感じか知りたい方を読者対象としているつもりです。
著者はAWS クラウドプラクティショナー、ソリューションアーキテクト アソシエイト という資格を取得済みで「AWSってなんぞや?」という概要を知識としてある程度理解しているが、実際にAWSの画面を触ったことが無いという状態でAWSのチュートリアルをこなしていくという状況です。
今回の内容としては、 EC2 が自動増減したり CPU 負荷 でスケールする Auto Scaling を実装すること を目標にしたいと思います。
🎯 ゴール
今の構成👇
ALB → TargetGroup → EC2(1台 or ASG途中)
👉 これを
ALB → TargetGroup → Auto Scaling Group(複数EC2)
🔥 完成イメージ
ユーザー
↓
ALB
↓
Target Group
↓
EC2 × N(自動増減)
Auto Scaling Group
resource "aws_autoscaling_group" "web" {
# 通常台数(今は2台)
desired_capacity = 2
# 最大(3台まで増える)
max_size = 3
# 最低(1台は必ず維持)
min_size = 1
vpc_zone_identifier = var.subnet_ids
launch_template {
id = aws_launch_template.web.id
version = "$Latest"
}
target_group_arns = [var.target_group_arn]
# ALBが死活監視する
health_check_type = "ELB"
health_check_grace_period = 60
tag {
key = "Name"
value = "terraform-asg"
propagate_at_launch = true
}
}
スケーリングポリシー
CPUでスケールアウト
resource "aws_autoscaling_policy" "scale_out" {
name = "scale-out"
scaling_adjustment = 1
adjustment_type = "ChangeInCapacity"
autoscaling_group_name = aws_autoscaling_group.web.name
}
CPUでスケールイン
resource "aws_autoscaling_policy" "scale_in" {
name = "scale-in"
scaling_adjustment = -1
adjustment_type = "ChangeInCapacity"
autoscaling_group_name = aws_autoscaling_group.web.name
}
CloudWatchアラーム
CPU高い → 増やす
resource "aws_cloudwatch_metric_alarm" "cpu_high" {
alarm_name = "cpu-high"
comparison_operator = "GreaterThanThreshold"
evaluation_periods = 2
metric_name = "CPUUtilization"
namespace = "AWS/EC2"
period = 60
statistic = "Average"
threshold = 60
dimensions = {
AutoScalingGroupName = aws_autoscaling_group.web.name
}
alarm_actions = [aws_autoscaling_policy.scale_out.arn]
}
CPU低い → 減らす
resource "aws_cloudwatch_metric_alarm" "cpu_low" {
alarm_name = "cpu-low"
comparison_operator = "LessThanThreshold"
evaluation_periods = 2
metric_name = "CPUUtilization"
namespace = "AWS/EC2"
period = 60
statistic = "Average"
threshold = 20
dimensions = {
AutoScalingGroupName = aws_autoscaling_group.web.name
}
alarm_actions = [aws_autoscaling_policy.scale_in.arn]
}
エラー
var.subnet_ids が存在しない
👉 つまり
Auto Scaling Group に渡す「サブネット一覧」が未定義
ASGは👇
どのサブネットにEC2を置くか
を知る必要があります
修正(3ステップ)
① modules/ec2/variables.tf
👉 これ追加
variable "subnet_ids" {
description = "List of subnet IDs"
type = list(string)
}
② root main.tf
👉 module "ec2" に追加
module "ec2" {
source = "./modules/ec2"
subnet_ids = module.vpc.public_subnets
}
🧠 重要ポイント
module.vpc.public_subnets は👇
["subnet-aaa", "subnet-bbb"]
👉 つまり
複数AZに配置される(高可用性)
③ modules/vpc の output 確認
output "public_subnets" {
value = [
aws_subnet.public_1.id,
aws_subnet.public_2.id
]
}
🚀 実行
terraform apply
確認
$ ssh -i test-instance-key-pair.pem(鍵の名前) ec2-user@(IPアドレス)
# 接続後
yes > /dev/null
👉 これは
CPUを100%にする負荷テスト
🧠 これから起きること
⏱ 1〜3分後
CloudWatchが異常を検知
⏱ さらに少し後
EC2が増える(2 → 3台)
確認
私の場合は閾値60%は高すぎたようで、40%にして再度terraform applyをすることで満たせました

無事にEC2が3台に増えました
その後 yes > /dev/null を kill した後、CPU-low の閾値を下回り、
インスタンスが停止している様子が見られました。
💡 今回の重要な理解まとめ
① スケール条件
CPU × 閾値 × 時間
② ALB連携
Target Groupに登録されて初めて配信
③ ASGの本質
「台数を維持・調整する仕組み」
④ CloudWatchの役割
「いつ増減するかのトリガー」



