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?

AWS 無料チュートリアルその15: ALB 配下で EC2 が自動増減したり CPU 負荷 でスケールする Auto Scaling を実装したい

0
Posted at

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

modules/ec2/main.tf
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でスケールアウト

modules/ec2/main.tf
resource "aws_autoscaling_policy" "scale_out" {
  name                   = "scale-out"
  scaling_adjustment     = 1
  adjustment_type        = "ChangeInCapacity"
  autoscaling_group_name = aws_autoscaling_group.web.name
}

CPUでスケールイン

modules/ec2/main.tf
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高い → 増やす

modules/ec2/main.tf
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低い → 減らす

modules/ec2/main.tf
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

👉 これ追加

modules/ec2/variables.tf
variable "subnet_ids" {
  description = "List of subnet IDs"
  type        = list(string)
}

② root main.tf

👉 module "ec2" に追加

root main.tf
module "ec2" {
  source = "./modules/ec2"

  subnet_ids = module.vpc.public_subnets
}

🧠 重要ポイント

module.vpc.public_subnets は👇

["subnet-aaa", "subnet-bbb"]

👉 つまり

複数AZに配置される(高可用性)

③ modules/vpc の output 確認

modules/vpc/outputs.tf
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をすることで満たせました
image.png

image.png

無事にEC2が3台に増えました

image.png

その後 yes > /dev/nullkill した後、CPU-low の閾値を下回り、

image.png

インスタンスが停止している様子が見られました。

image.png

💡 今回の重要な理解まとめ

① スケール条件

CPU × 閾値 × 時間

② ALB連携

Target Groupに登録されて初めて配信

③ ASGの本質

「台数を維持・調整する仕組み」

④ CloudWatchの役割

「いつ増減するかのトリガー」
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?