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 無料チュートリアルその14: Auto Scaling による EC2 を複数化したい

0
Posted at

AWSの無料枠で出来る範囲のチュートリアルを ChatGPT に示して頂いたので、試してみた経過を簡単にまとめてみました。
AWS等の実際の画面や操作はどんな感じか知りたい方を読者対象としているつもりです。

著者はAWS クラウドプラクティショナー、ソリューションアーキテクト アソシエイト という資格を取得済みで「AWSってなんぞや?」という概要を知識としてある程度理解しているが、実際にAWSの画面を触ったことが無いという状態でAWSのチュートリアルをこなしていくという状況です。

今回の内容としては、Auto Scaling による EC2 を複数化すること を目標にしたいと思います。

🎯 まず結論(超シンプル)

Auto Scaling = EC2を自動で増減させる仕組み

🧠 なぜ必要?

❌ 今の構成

EC2(1台) ← 落ちたら終わり

✅ Auto Scaling後

EC2(複数)+自動復旧

👉 つまり

壊れても勝手に復活する

🧩 構成要素

① Launch Template

EC2の設計図

👉 含むもの

  • AMI
  • instance_type
  • user_data(nginxなど)

② Auto Scaling Group(ASG)

EC2の台数管理

👉 設定例

最小:1
最大:3
通常:2

③ ALBと連携

EC2が増えても自動で振り分け

🔥 動き

通常

EC2 × 2台

アクセス増加

EC2 × 3台に増える

アクセス減少

EC2 × 1台に減る

🎯 やること

EC2(1台)を削除
→ Launch Template に置き換え
→ Auto Scaling Groupで複数台管理
→ ALBはそのまま使う

コード

modules/ec2/main.tf
############################################
# Launch Template(EC2の設計図)
############################################
resource "aws_launch_template" "web" {
  name_prefix   = "web-template-"
  image_id      = var.ami
  instance_type = "t3.micro"

  vpc_security_group_ids = [var.web_sg_id]

  user_data = base64encode(<<-EOF
    #!/bin/bash
    amazon-linux-extras install -y nginx1
    systemctl start nginx
    systemctl enable nginx
  EOF
  )

  tag_specifications {
    resource_type = "instance"

    tags = {
      Name = "terraform-asg-nginx"
    }
  }
}

############################################
# Auto Scaling Group(EC2を管理)
############################################
resource "aws_autoscaling_group" "web" {
  desired_capacity = 2
  max_size         = 3
  min_size         = 1

  vpc_zone_identifier = var.subnets

  target_group_arns = [var.target_group_arn]

  launch_template {
    id      = aws_launch_template.web.id
    version = "$Latest"
  }

  health_check_type = "ELB"

  tag {
    key                 = "Name"
    value               = "terraform-asg"
    propagate_at_launch = true
  }
}
modules/ec2/variables.tf
variable "ami" {}
variable "web_sg_id" {}
variable "subnets" {
  type = list(string)
}
variable "target_group_arn" {}

main.tf の変更

❌ 削除

resource "aws_instance" "web" {}

✅ module 呼び出し変更

module "ec2" {
  source = "./modules/ec2"

  ami              = "ami-0c3fd0f5d33134a76"
  web_sg_id        = module.sg.web_sg_id
  subnets          = module.vpc.public_subnets
  target_group_arn = module.alb.target_group_arn
}

ALB側の修正

❌ 削除

aws_lb_target_group_attachment の文

👉 理由

ASGが自動登録するため不要

🧠 動作確認ポイント

① EC2画面

👉 複数台出る

② Auto Scaling

👉 グループが存在

③ ALB

👉 Targetが増える

エラーその1

aws_instance.web を削除したのに outputs がまだ残っている

❌ 今

output "instance_id" {
  value = aws_instance.web.id
}

👉 でも

aws_instance.web はもう存在しない

👉 なぜ?

EC2はASGが作るようになったから

🛠 修正方法

👉 outputs削除

modules/ec2/outputs.tf

output "instance_id" {
  value = aws_instance.web.id
}

👉 理由

ASGでは「単一のinstance_id」は意味がない

エラーその2

依存を一方向にする

✅ 正しい流れ

ALB(target group作成)
↓
EC2(ASGがtarget groupに登録)

👉 つまり

ALB → EC2 のみ

🧩 正しい構成

module.alb

output "target_group_arn" {
  value = aws_lb_target_group.tg.arn
}

module.ec2

target_group_arn = module.alb.target_group_arn

🎯 修正チェックリスト

🔲 modules/alb/main.tf

👉 削除

aws_lb_target_group_attachment

🔲 modules/alb/variables.tf

👉 削除

target_instance_id

🔲 root main.tf

👉 削除

target_instance_id = module.ec2.instance_id

エラーその3

EC2のセキュリティグループ
❌ NG

0.0.0.0/0 じゃない

✅ 正解

modules/sg/main.tf
ingress {
  from_port       = 80
  to_port         = 80
  protocol        = "tcp"
  security_groups = [aws_security_group.alb_sg.id] # ← ここ修正
}

🔧 modules/ec2 の ASG

👉 これ入ってる?

modules/ec2/main.tf
resource "aws_security_group" "web_sg" {
  target_group_arns = [var.target_group_arn]
  ...
}

エラーその4

🎯 結論

EC2に「default セキュリティグループ」が付いている
→ 設定したweb-sgが使われていない

💥 これが全ての原因

default SG = SSH(22) 開いてない
→ 接続タイムアウト

🧠 なぜこうなった?

Auto Scaling構成では👇

EC2の設定は「Launch Template」で決まる

👉 今の状態👇

Launch TemplateにSGが設定されていない
→ defaultが使われている

🛠 修正

modules/ec2/main.tf
resource "aws_launch_template" "web" {

❌ たぶん今

# SG指定なし

✅ 修正

modules/ec2/main.tf
vpc_security_group_ids = [var.web_sg_id]
modules/ec2/variables.tf
variable "web_sg_id" {}
root main.tf
module "ec2" {
  source = "./modules/ec2"

  web_sg_id = module.sg.web_sg_id
}

🔥 ポイント

Auto Scalingの場合

EC2のSGはここだけで決まる
Launch Template

👉 普通のEC2と違う

aws_instance のSG設定は無効(使われない)

🚀 修正後

ASGは既存インスタンスを使い続けるので👇

🧹 強制再作成

terraform destroy
terraform apply

エラーその5

Permission denied (publickey)

👉 これは

ネットワークはOK(SG・ルーティング正常)
でも「鍵認証で失敗」している

🧠 状況整理

  • SSH到達できている ✅(←タイムアウトじゃない)
  • EC2も起動している ✅
  • SGも正しい ✅

👉 つまり

認証だけNG

🔥 原因

Launch Template に
key_name が設定されていない

👉 もしくは

違うキーペアを使っている

🛠 修正方法

modules/ec2/main.tf
resource "aws_launch_template" "web" {
   key_name = var.key_name # ✅ 追加
variables.tf
variable "key_name" {}
root main.tf
module "ec2" {
  source = "./modules/ec2"

  key_name = "test-instance-key-pair"
}

※あなたが作ったキーペア名に合わせる

⚠️ 重要

変更しても既存EC2には反映されない

👉 必ず

terraform destroy
terraform apply

🔑 SSH接続時

正しいコマンド

ssh -i test-instance-key-pair.pem ec2-user@43.207.39.242

🎯 成功すると

[ec2-user@ip-xxx-xxx-xxx-xxx ~]$

🚀 その後

sudo systemctl status nginx

👉 止まってたら

sudo systemctl start nginx

🎉 ゴール

https://net-4.net → 正常表示

🔥 最新AMIを自動取得

(root) main.tf
data "aws_ami" "amazon_linux" {
  most_recent = true
  owners      = ["amazon"]

  filter {
    name   = "name"
    values = ["amzn2-ami-hvm-*-x86_64-gp2"]
  }
}

👉 使う

ami = data.aws_ami.amazon_linux.id
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?