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はそのまま使う
コード
############################################
# 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
}
}
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 じゃない
✅ 正解
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
security_groups = [aws_security_group.alb_sg.id] # ← ここ修正
}
🔧 modules/ec2 の ASG
👉 これ入ってる?
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が使われている
🛠 修正
resource "aws_launch_template" "web" {
❌ たぶん今
# SG指定なし
✅ 修正
vpc_security_group_ids = [var.web_sg_id]
variable "web_sg_id" {}
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 が設定されていない
👉 もしくは
違うキーペアを使っている
🛠 修正方法
resource "aws_launch_template" "web" {
key_name = var.key_name # ✅ 追加
variable "key_name" {}
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を自動取得
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