아키텍처의 뼈대가 되는 가상네트워크망을 구축하였으므로 원하는 인스턴스를 배포하여 아키텍처를 완성한다.
테라폼으로 EC2 인스턴스 생성이 잘 되는지 테스트 하기 위해서 작성하였다.
초기 user_data 검증을 진행한다.
키페어는 기존에 생성된 키페어를 지정함. ( 키페어 네임 : xgro )
associate_public_ip_address 를 이용해서 초기 생성시 퍼블릭ip를 부여할 수 있게 설정한다.
# ec2.tf
resource "aws_instance" "testEC201" {
ami = "ami-063db2954fe2eec9f"
instance_type = "t2.micro"
subnet_id = aws_subnet.publicSubnet1.id
key_name = "xgro"
associate_public_ip_address = "true"
user_data = <<-EOF
#!/bin/bash
echo "Hello, World" > index.html
nohup busybox httpd -f -p 8080 &
EOF
vpc_security_group_ids = [
aws_security_group.publicSG01.id
]
root_block_device {
volume_size = 8
volume_type = "gp2"
tags = {
"Name" = "test-private-ec2-01-vloume-1"
}
}
tags = {
"Name" = "test-ec2-01"
}
}
resource "aws_instance" "testEC202" {
ami = "ami-063db2954fe2eec9f"
instance_type = "t2.micro"
subnet_id = aws_subnet.publicSubnet2.id
key_name = "xgro"
associate_public_ip_address = "true"
user_data = <<-EOF
#!/bin/bash
echo "Hello, World" > index.html
nohup busybox httpd -f -p 8080 &
EOF
vpc_security_group_ids = [
aws_security_group.publicSG01.id
]
root_block_device {
volume_size = 8
volume_type = "gp2"
tags = {
"Name" = "test-private-ec2-02-vloume-1"
}
}
tags = {
"Name" = "test-ec2-02"
}
}
데이터베이스 구축을 위한 테라폼 파일 작성
이번 아키텍처는 private subnet을 이용하여 rds를 배치하고 자습서의 사양과 동일하게 구축하기 위해서 아래와 같이 작성함.
# rds.tf
resource "aws_db_subnet_group" "testSubnetGroup" {
name = "test"
subnet_ids = [
aws_subnet.privateSubnet1.id,
aws_subnet.privateSubnet2.id
]
tags = {
"Name" = "test-subnet-group"
}
}
resource "aws_db_instance" "testDB" {
allocated_storage = 20
max_allocated_storage = 50
availability_zone = "ap-northeast-2a"
vpc_security_group_ids = [aws_security_group.privateSG01.id]
db_subnet_group_name = aws_db_subnet_group.testSubnetGroup.name
engine = "mysql"
engine_version = "8.0.28"
instance_class = "db.t2.micro"
skip_final_snapshot = true
identifier = "test-mysql"
username = "root"
password = "qwer1234"
name = "testDB"
port = "3306"
}
로드밸런서 생성을 위한 테라폼 파일 작성
ASG 작성 전 EC2 테스트를 위한 타겟그룹을 아래 주석으로 명시함
Listener 80 → EC2 8080 그룹으로 연결됨
EC2 테스트가 완료 되었다면, ASG 배포전에 개별적으로 만들었던 인스턴스는 주석으로 Destory 해준다.
ALB 를 위한 보안그룹은 별도로 작성하지 않음.
# alb.tf
resource "aws_alb" "test" {
name = "test-alb"
internal = false
load_balancer_type = "application"
security_groups = [aws_security_group.publicSG01.id]
subnets = [aws_subnet.publicSubnet1.id, aws_subnet.publicSubnet2.id]
enable_cross_zone_load_balancing = true
}
resource "aws_alb_target_group" "test" {
name = "test-alb-tg"
port = 8080
protocol = "HTTP"
vpc_id = aws_vpc.vpc.id
}
# resource "aws_alb_target_group_attachment" "Instance01" {
# target_group_arn = aws_alb_target_group.test.arn
# target_id = aws_instance.testEC201.id
# port = 8080
# }
# resource "aws_alb_target_group_attachment" "Instance02" {
# target_group_arn = aws_alb_target_group.test.arn
# target_id = aws_instance.testEC202.id
# port = 8080
# }
resource "aws_alb_listener" "test" {
load_balancer_arn = aws_alb.test.arn
port = 80
protocol = "HTTP"
default_action {
type = "forward"
target_group_arn = aws_alb_target_group.test.arn
}
}
EC2 인스턴스를 동적으로 관리하기 위해서 ASG를 이용해서 인스턴스의 부하량을 조절함
Public Subnet 1, 2에서 동작하며 타겟 그룹은 위에서 테스트가 완료된 EC2를 기반으로 시작구성을 정의함.
# asg.tf
resource "aws_autoscaling_group" "asg-01" {
name = "asg-test"
min_size = 2
max_size = 10
health_check_grace_period = 300
health_check_type = "ELB"
desired_capacity = 4
force_delete = true
target_group_arns = [aws_alb_target_group.test.arn]
launch_configuration = aws_launch_configuration.ec2.name
vpc_zone_identifier = [aws_subnet.publicSubnet1.id, aws_subnet.publicSubnet2.id]
# placement_group = aws_placement_group.test.id # 오류 원인
}
# resource "aws_placement_group" "test" { # 오류 원인
# name = "test"
# strategy = "cluster"
# }
resource "aws_launch_configuration" "ec2" {
name_prefix = "ec2-"
image_id = "ami-063db2954fe2eec9f"
instance_type = "t2.micro"
key_name = "xgro"
security_groups = [aws_security_group.publicSG01.id]
associate_public_ip_address = true
user_data = <<-EOF
#!/bin/bash
echo "Hello, World" > index.html
nohup busybox httpd -f -p 8080 &
EOF
lifecycle {
create_before_destroy = true
}
}
테라폼으로 구축 완료후 로드밸런서의 DNS로 접속시 아래와 같이 Hello, World가 정상적으로 출력 되는것을 확인할 수 있다.