카이도스의 Tech Blog

[CHAPTER 2] ASG/ELB 본문

Terraform

[CHAPTER 2] ASG/ELB

카이도스 2023. 6. 1. 14:28
728x90
반응형
CloudNet@-가시다(Gasida)님의 Terraform 스터디를 기준으로 작성됩니다.

참고링크 - https://registry.terraform.io/providers/hashicorp/aws/latest/docs

 

Terraform Registry

 

registry.terraform.io

 

이전글 : 2023.05.23 - [Terraform] - [CHAPTER 1&2] 기초

 

[CHAPTER 1&2] 기초

CloudNet@-가시다(Gasida)님의 Terraform 스터디를 기준으로 작성됩니다. Terraform 참고링크 : Code Github - 번역본 & 원서 [Hashicorp] Learn - 링크 & Docs - 링크 & Language - 링크 & CLI - 링크 & Github - 링크 [송주영] Ter

djdakf1234.tistory.com


1. VPC + 보안그룹 + EC2 배포

코드 파일 내용에 리소스의 이름(myvpc, mysubnet1 등)을 반드시! 꼭! 자신의 닉네임으로 변경해서 배포 후,
해당 **테라폼 코드(파일)**를 올려주세요

  • 리소스의 유형리소스의 이름이 차이를 알고, 리소스의 속성(예. ID)를 참조하는 방법에 대해서 익숙해지자

1-1. VPC 배포 : vpc.tf

# 신규 디렉터리 생성
mkdir my-vpc-ec2-asg
cd my-vpc-ec2-asg
  • VPC 생성
cat <<EOT > vpc.tf
provider "aws" {
  region  = "ap-northeast-2"
}

resource "aws_vpc" "pjhvpc" {
  cidr_block       = "10.10.0.0/16"

  tags = {
    Name = "t101-study"
  }
}
EOT
# 배포
terraform init
terraform plan && terraform apply -auto-approve
terraform state list
aws_vpc.pjhvpc

# VPC 확인
export AWS_PAGER=""
aws ec2 describe-vpcs | jq
aws ec2 describe-vpcs --output yaml
  • 생성된 VPC DNS 옵션 수정
cat <<EOT > vpc.tf
provider "aws" {
  region  = "ap-northeast-2"
}

resource "aws_vpc" "pjhvpc" {
  cidr_block       = "10.10.0.0/16"
  enable_dns_support   = true
  enable_dns_hostnames = true

  tags = {
    Name = "t101-study"
  }
}
EOT
# 배포
terraform plan && terraform apply -auto-approve
  • 서브넷 2개 생성 추가
cat <<EOT > vpc.tf
provider "aws" {
  region  = "ap-northeast-2"
}

resource "aws_vpc" "pjhvpc" {
  cidr_block       = "10.10.0.0/16"
  enable_dns_support   = true
  enable_dns_hostnames = true

  tags = {
    Name = "t101-study"
  }
}

resource "aws_subnet" "pjhsubnet1" {
  vpc_id     = aws_vpc.pjhvpc.id
  cidr_block = "10.10.1.0/24"

  availability_zone = "ap-northeast-2a"

  tags = {
    Name = "t101-subnet1"
  }
}

resource "aws_subnet" "pjhsubnet2" {
  vpc_id     = aws_vpc.pjhvpc.id
  cidr_block = "10.10.2.0/24"

  availability_zone = "ap-northeast-2c"

  tags = {
    Name = "t101-subnet2"
  }
}

output "aws_vpc_id" {
  value = aws_vpc.pjhvpc.id
}
EOT
  • 배포
# 배포
terraform plan && terraform apply -auto-approve
terraform state list
aws_subnet.pjhsubnet1
aws_subnet.pjhsubnet2
aws_vpc.pjhvpc

terraform output
terraform output aws_vpc_id
terraform output -raw aws_vpc_id

# 서브넷 확인
aws ec2 describe-subnets --output text

# 참고 : aws ec2 describe-subnets --filters "Name=vpc-id,Values=vpc-<자신의 VPC ID>"
VPCID=$(terraform output -raw aws_vpc_id)
aws ec2 describe-subnets --filters "Name=vpc-id,Values=$VPCID" | jq
aws ec2 describe-subnets --filters "Name=vpc-id,Values=$VPCID" --output table
cat <<EOT > vpc.tf
provider "aws" {
  region  = "ap-northeast-2"
}

resource "aws_vpc" "pjhvpc" {
  cidr_block       = "10.10.0.0/16"
  enable_dns_support   = true
  enable_dns_hostnames = true

  tags = {
    Name = "t101-study"
  }
}

resource "aws_subnet" "pjhsubnet1" {
  vpc_id     = aws_vpc.pjhvpc.id
  cidr_block = "10.10.1.0/24"

  availability_zone = "ap-northeast-2a"

  tags = {
    Name = "t101-subnet1"
  }
}

resource "aws_subnet" "pjhsubnet2" {
  vpc_id     = aws_vpc.pjhvpc.id
  cidr_block = "10.10.2.0/24"

  availability_zone = "ap-northeast-2c"

  tags = {
    Name = "t101-subnet2"
  }
}


resource "aws_internet_gateway" "pjhigw" {
  vpc_id = aws_vpc.pjhvpc.id

  tags = {
    Name = "t101-igw"
  }
}

output "aws_vpc_id" {
  value = aws_vpc.pjhvpc.id
}
EOT
  • 배포
# 배포
terraform plan && terraform apply -auto-approve
terraform state list
aws_internet_gateway.pjhigw
aws_subnet.pjhsubnet1
aws_subnet.pjhsubnet2
aws_vpc.pjhvpc
cat <<EOT > vpc.tf
provider "aws" {
  region  = "ap-northeast-2"
}

resource "aws_vpc" "pjhvpc" {
  cidr_block       = "10.10.0.0/16"
  enable_dns_support   = true
  enable_dns_hostnames = true

  tags = {
    Name = "t101-study"
  }
}

resource "aws_subnet" "pjhsubnet1" {
  vpc_id     = aws_vpc.pjhvpc.id
  cidr_block = "10.10.1.0/24"

  availability_zone = "ap-northeast-2a"

  tags = {
    Name = "t101-subnet1"
  }
}

resource "aws_subnet" "pjhsubnet2" {
  vpc_id     = aws_vpc.pjhvpc.id
  cidr_block = "10.10.2.0/24"

  availability_zone = "ap-northeast-2c"

  tags = {
    Name = "t101-subnet2"
  }
}


resource "aws_internet_gateway" "pjhigw" {
  vpc_id = aws_vpc.pjhvpc.id

  tags = {
    Name = "t101-igw"
  }
}

resource "aws_route_table" "pjhrt" {
  vpc_id = aws_vpc.pjhvpc.id

  tags = {
    Name = "t101-rt"
  }
}

resource "aws_route_table_association" "pjhrtassociation1" {
  subnet_id      = aws_subnet.pjhsubnet1.id
  route_table_id = aws_route_table.pjhrt.id
}

resource "aws_route_table_association" "pjhrtassociation2" {
  subnet_id      = aws_subnet.pjhsubnet2.id
  route_table_id = aws_route_table.pjhrt.id
}

resource "aws_route" "pjhdefaultroute" {
  route_table_id         = aws_route_table.pjhrt.id
  destination_cidr_block = "0.0.0.0/0"
  gateway_id             = aws_internet_gateway.pjhigw.id
}

output "aws_vpc_id" {
  value = aws_vpc.pjhvpc.id
}
EOT
  • 배포
# 배포
terraform plan && terraform apply -auto-approve
terraform state list
aws_internet_gateway.pjhigw
aws_route.pjhdefaultroute
aws_route_table.pjhrt
aws_route_table_association.pjhrtassociation1
aws_route_table_association.pjhrtassociation2
aws_subnet.pjhsubnet1
aws_subnet.pjhsubnet2
aws_vpc.pjhvpc

# 라우팅 테이블 확인
#aws ec2 describe-route-tables --filters 'Name=tag:Name,Values=t101-rt' --query 'RouteTables[].Associations[].SubnetId'
aws ec2 describe-route-tables --filters 'Name=tag:Name,Values=t101-rt' --output table

1-2. 데이터 소스 data : AWS 데이터 소스의 경우 “VPC data, subnet data, AMI IDs, IP address ranges, the current user’s identity, and much more.” 정보를 제공 - 링크 Docs Sample Instance

  • ASG에 추가해야 작동하는 subnet_ids 매개 변수도 있습니다. subnet_ids 는 ASG가 EC2를 어느 VPC의 서브넷에 배포할지 지정하는 매개 변수입니다.
  • subnet_ids는 데이터 소스를 사용하여 AWS 계정에서 서브넷 목록을 얻는 것이 좋습니다.
  • AWS 데이터 소스의 경우 “VPC data, subnet data, AMI IDs, IP address ranges, the current user’s identity, and much more.” 정보를 제공
data “<PROVIDER>_<TYPE>” “<NAME>” {
  [CONFIG …]
}
  • PROVIDER : aws 같은 공급자의 이름
  • TYPE : vpc 같은 사용하려는 데이터 소스의 유형
  • NAME : 테라폼 코드에서 이 데이터 소스를 참조하는 데 사용할 수 있는 식별자
  • CONFIG : 해당 데이터 소스에 고유한 하나 이상의 인수로 구성됨
  • 예를 들어 aws_vpc 데이터 소스를 사용하여 기본 VPC(default vpc)의 데이터를 사용하는 구문
data “aws_vpc” “default” {
  default = true
}
  • 데이터 소스에서 데이터를 가져오려면 다음과 같은 속성 참조 구문을 사용합니다
data.<PROVIDER>_<TYPE>.<NAME>.<ATTRIBUTE>
  • 예를 들어 aws_vpc 데이터 소스에서 VPC의 ID를 얻으려면 속성 참조 구문을 다음과 같이 사용합니다.
data.aws_vpc.default.id
  • 이 데이터를 다른 데이터 소스인 aws_subnet_ids 와 결합하여 해당 VPC 내 서브넷을 조회할 수 있습니다.
data "aws_subnets" "default" {
  filter {
    name   = "vpc-id"
    values = [data.aws_vpc.default.id]
  }
}
  • 마지막으로 vpc_zone_identifier 인수를 이용해 aws_subnet_ids 데이터 소스에서 서브넷ID를 가져와서 ASG가 이 서브넷을 사용하도록 지시할 수 있습니다
resource "aws_autoscaling_group" "example" {
  launch_configuration = aws_launch_configuration.example.name
  vpc_zone_identifier  = data.aws_subnets.default.ids

  min_size = 2
  max_size = 10

  tag {
    key                 = "Name"
    value               = "terraform-asg-example"
    propagate_at_launch = true
  }
}

1-3. 보안그룹/EC2 배포 : sg.tf, ec2.tf

  • 보안그룹 생성
cat <<EOT > sg.tf
resource "aws_security_group" "pjhsg" {
  vpc_id      = aws_vpc.pjhvpc.id
  name        = "T101 SG"
  description = "T101 Study SG"
}

resource "aws_security_group_rule" "pjhsginbound" {
  type              = "ingress"
  from_port         = 0
  to_port           = 80
  protocol          = "tcp"
  cidr_blocks       = ["0.0.0.0/0"]
  security_group_id = aws_security_group.pjhsg.id
}

resource "aws_security_group_rule" "pjhsgoutbound" {
  type              = "egress"
  from_port         = 0
  to_port           = 0
  protocol          = "-1"
  cidr_blocks       = ["0.0.0.0/0"]
  security_group_id = aws_security_group.pjhsg.id
}
EOT
# 배포
terraform plan && terraform apply -auto-approve
terraform state list
aws_internet_gateway.pjhigw
aws_route.pjhdefaultroute
aws_route_table.pjhrt
aws_route_table_association.pjhrtassociation1
aws_route_table_association.pjhrtassociation2
aws_security_group.pjhsg
aws_security_group_rule.pjhsginbound
aws_security_group_rule.pjhsgoutbound
aws_subnet.pjhsubnet1
aws_subnet.pjhsubnet2
aws_vpc.pjhvpc
  • EC2 생성 : CMD창에서 바로 복사&붙여넣기로 파일 생성 시 \ 주의 ⇒ 그냥 직접 IDE에 붙여넣을때는 \ 제거하세요
cat <<EOT > ec2.tf
data "aws_ami" "pjh_amazonlinux2" {
  most_recent = true
  filter {
    name   = "owner-alias"
    values = ["amazon"]
  }

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

  owners = ["amazon"]
}

resource "aws_instance" "pjhec2" {

  depends_on = [
    aws_internet_gateway.pjhigw
  ]

  ami                         = data.aws_ami.pjh_amazonlinux2.id
  associate_public_ip_address = true
  instance_type               = "t2.micro"
  vpc_security_group_ids      = ["\${aws_security_group.pjhsg.id}"]
  subnet_id                   = aws_subnet.pjhsubnet1.id

  user_data = <<-EOF
              #!/bin/bash
              wget https://busybox.net/downloads/binaries/1.31.0-defconfig-multiarch-musl/busybox-x86_64
              mv busybox-x86_64 busybox
              chmod +x busybox
              RZAZ=\$(curl http://169.254.169.254/latest/meta-data/placement/availability-zone-id)
              IID=\$(curl 169.254.169.254/latest/meta-data/instance-id)
              LIP=\$(curl 169.254.169.254/latest/meta-data/local-ipv4)
              echo "<h1>RegionAz(\$RZAZ) : Instance ID(\$IID) : Private IP(\$LIP) : Web Server</h1>" > index.html
              nohup ./busybox httpd -f -p 80 &
              EOF

  user_data_replace_on_change = true

  tags = {
    Name = "HallsHolicker-jjang"
  }
}

output "pjhec2_public_ip" {
  value       = aws_instance.pjhec2.public_ip
  description = "The public IP of the Instance"
}
EOT
  • EC2 확인
terraform plan && terraform apply -auto-approve
Outputs:
pjhec2_public_ip = "43.201.59.6"

terraform state list
data.aws_ami.pjh_amazonlinux2
aws_instance.pjhec2
aws_internet_gateway.pjhigw
aws_route.pjhdefaultroute
aws_route_table.pjhrt
aws_route_table_association.pjhrtassociation1
aws_route_table_association.pjhrtassociation2
aws_security_group.pjhsg
aws_security_group_rule.pjhsginbound
aws_security_group_rule.pjhsgoutbound
aws_subnet.pjhsubnet1
aws_subnet.pjhsubnet2
aws_vpc.pjhvpc

# 출력된 EC2 퍼블릭IP로 cul 접속 확인
terraform output -raw pjhec2_public_ip
43.201.59.6

MYIP=$(terraform output -raw pjhec2_public_ip)
while true; do curl --connect-timeout 1  http://$MYIP/ ; echo "------------------------------"; date; sleep 1; done
<h1>RegionAz(apne2-az1) : Instance ID(i-0a8f28643a652228f) : Private IP(10.10.1.87) : Web Server</h1>
------------------------------
2023년 6월  1일 목요일 14시 42분 41초 KST
<h1>RegionAz(apne2-az1) : Instance ID(i-0a8f28643a652228f) : Private IP(10.10.1.87) : Web Server</h1>
------------------------------
2023년 6월  1일 목요일 14시 42분 42초 KST
<h1>RegionAz(apne2-az1) : Instance ID(i-0a8f28643a652228f) : Private IP(10.10.1.87) : Web Server</h1>
------------------------------
....
  • EC2 삭제
rm -f ec2.tf ; terraform apply -auto-approve

2. ASG 배포

목표 : ASG 에 ALB 연동 배포


2-1. 배포 : alb.tf

 

Terraform Registry

 

registry.terraform.io

  • ALB 생성
cat <<EOT > alb.tf
resource "aws_lb" "pjhalb" {
  name               = "t101-alb"
  load_balancer_type = "application"
  subnets            = [aws_subnet.pjhsubnet1.id, aws_subnet.pjhsubnet2.id]
  security_groups    = [aws_security_group.pjhsg.id]

  tags = {
    Name = "t101-alb"
  }
}

output "pjhalb_dns" {
  value       = aws_lb.pjhalb.dns_name
  description = "The DNS Address of the ALB"
}

EOT
  • 배포
# 배포 : 2분 10초 정도 소요
terraform plan && terraform apply -auto-approve
Outputs:
pjhalb_dns = "t101-alb-940947136.ap-northeast-2.elb.amazonaws.com"

terraform state list
aws_internet_gateway.pjhigw
aws_lb.pjhalb
aws_route.pjhdefaultroute
aws_route_table.pjhrt
aws_route_table_association.pjhrtassociation1
aws_route_table_association.pjhrtassociation2
aws_security_group.pjhsg
aws_security_group_rule.pjhsginbound
aws_security_group_rule.pjhsgoutbound
aws_subnet.pjhsubnet1
aws_subnet.pjhsubnet2
aws_vpc.pjhvpc

# ALB 정보 확인
aws elbv2 describe-load-balancers --output table
aws elbv2 describe-load-balancers | jq

# [터미널2] 출력된 ALB DNS주소로 cul 접속 확인
terraform output -raw pjhalb_dns
t101-alb-940947136.ap-northeast-2.elb.amazonaws.com

ALBDNS=$(terraform output -raw pjhalb_dns)
while true; do curl --connect-timeout 1  http://$ALBDNS/ ; echo; echo "------------------------------"; date; sleep 1; done
  • ALB의 리스너 생성 : http 80 인입, 리스너 규칙과 일치하지 않을 경우 404 페이지 리턴
 

Terraform Registry

 

registry.terraform.io

cat <<EOT > alb.tf
resource "aws_lb" "pjhalb" {
  name               = "t101-alb"
  load_balancer_type = "application"
  subnets            = [aws_subnet.pjhsubnet1.id, aws_subnet.pjhsubnet2.id]
  security_groups = [aws_security_group.pjhsg.id]

  tags = {
    Name = "t101-alb"
  }
}

resource "aws_lb_listener" "pjhhttp" {
  load_balancer_arn = aws_lb.pjhalb.arn
  port              = 80
  protocol          = "HTTP"

  # By default, return a simple 404 page
  default_action {
    type = "fixed-response"

    fixed_response {
      content_type = "text/plain"
      message_body = "404: page not found - T101 Study"
      status_code  = 404
    }
  }
}

output "pjhalb_dns" {
  value       = aws_lb.pjhalb.dns_name
  description = "The DNS Address of the ALB"
}
EOT
  • 배포 후 접속
# 배포
terraform plan && terraform apply -auto-approve

# ALB DNS 주소 curl 접속 확인
ALBDNS=$(terraform output -raw pjhalb_dns)
while true; do curl --connect-timeout 1  http://$ALBDNS/ ; echo; echo "------------------------------"; date; sleep 1; done
2023년 6월  1일 목요일 15시 06분 28초 KST
404: page not found - T101 Study
------------------------------
2023년 6월  1일 목요일 15시 06분 29초 KST
404: page not found - T101 Study
------------------------------
2023년 6월  1일 목요일 15시 06분 31초 KST
404: page not found - T101 Study
------------------------------
  • 다음으로 aws_lb_target_group 리소스를 사용하여 ASG의 대상 그룹을 생성
 

Terraform Registry

 

registry.terraform.io

cat <<EOT > alb.tf
resource "aws_lb" "pjhalb" {
  name               = "t101-alb"
  load_balancer_type = "application"
  subnets            = [aws_subnet.pjhsubnet1.id, aws_subnet.pjhsubnet2.id]
  security_groups = [aws_security_group.pjhsg.id]

  tags = {
    Name = "t101-alb"
  }
}

resource "aws_lb_listener" "pjhhttp" {
  load_balancer_arn = aws_lb.pjhalb.arn
  port              = 80
  protocol          = "HTTP"

  # By default, return a simple 404 page
  default_action {
    type = "fixed-response"

    fixed_response {
      content_type = "text/plain"
      message_body = "404: page not found - T101 Study"
      status_code  = 404
    }
  }
}

resource "aws_lb_target_group" "pjhalbtg" {
  name = "t101-alb-tg"
  port     = 80
  protocol = "HTTP"
  vpc_id   = aws_vpc.pjhvpc.id

  health_check {
    path                = "/"
    protocol            = "HTTP"
    matcher             = "200-299"
    interval            = 5
    timeout             = 3
    healthy_threshold   = 2
    unhealthy_threshold = 2
  }
}

output "pjhalb_dns" {
  value       = aws_lb.pjhalb.dns_name
  description = "The DNS Address of the ALB"
}
EOT

2-2. ALB + ASG 연동 : asg.tf

  • 대상그룹은 어느 EC2에 요청을 보내는지 아나요? → ASG + ALB 통합 이점 활용(aws_autoscaling_group 리소스에 target_group_arns 인수를 설정)하여 새 대상 그룹을 지정
  • 이때 헬스체크도 EC2가 아닌 ELB로 변경 → 이 경우 EC2 불량 시 자동으로 인스턴스가 교체되고 대상그룹에 등록됨
  • 코드 파일 작성 : CMD창에서 바로 복사&붙여넣기로 파일 생성 시 \ 주의 ⇒ 그냥 직접 IDE에 붙여넣을때는 \ 제거하세요
cat <<EOT > asg.tf
data "aws_ami" "pjh_amazonlinux2" {
  most_recent = true
	  filter {
    name   = "owner-alias"
    values = ["amazon"]
  }

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

  owners = ["amazon"]
}

resource "aws_launch_configuration" "pjhlauchconfig" {
  name_prefix     = "t101-lauchconfig-"
  image_id        = data.aws_ami.pjh_amazonlinux2.id
  instance_type   = "t2.micro"
  security_groups = [aws_security_group.pjhsg.id]
  associate_public_ip_address = true

  user_data = <<-EOF
              #!/bin/bash
              wget https://busybox.net/downloads/binaries/1.31.0-defconfig-multiarch-musl/busybox-x86_64
              mv busybox-x86_64 busybox
              chmod +x busybox
              RZAZ=\$(curl http://169.254.169.254/latest/meta-data/placement/availability-zone-id)
              IID=\$(curl 169.254.169.254/latest/meta-data/instance-id)
              LIP=\$(curl 169.254.169.254/latest/meta-data/local-ipv4)
              echo "<h1>RegionAz(\$RZAZ) : Instance ID(\$IID) : Private IP(\$LIP) : Web Server</h1>" > index.html
              nohup ./busybox httpd -f -p 80 &
              EOF

  # Required when using a launch configuration with an auto scaling group.
  lifecycle {
    create_before_destroy = true
  }
}

resource "aws_autoscaling_group" "pjhasg" {
  name                 = "pjhasg"
  launch_configuration = aws_launch_configuration.pjhlauchconfig.name
  vpc_zone_identifier  = [aws_subnet.pjhsubnet1.id, aws_subnet.pjhsubnet2.id]
  min_size = 2
  max_size = 10
  health_check_type = "ELB"
  target_group_arns = [aws_lb_target_group.pjhalbtg.arn]

  tag {
    key                 = "Name"
    value               = "terraform-asg"
    propagate_at_launch = true
  }
}

data "aws_instances" "web_instances" {
  instance_state_names = ["running"]
}

output "instance_state_privip" {
  description = "Instance Private IPs"
  value = data.aws_instances.web_instances.private_ips
}

output "instance_state_pubip" {
  description = "Instance Public IPs"
  value = data.aws_instances.web_instances.public_ips
}
EOT
 

Terraform Registry

 

registry.terraform.io

  • 마지막으로 aws_lb_listener_rule 리소스를 사용해 리스너 규칙을 생성하여 연결
cat <<EOT > alb.tf
resource "aws_lb" "pjhalb" {
  name               = "t101-alb"
  load_balancer_type = "application"
  subnets            = [aws_subnet.pjhsubnet1.id, aws_subnet.pjhsubnet2.id]
  security_groups = [aws_security_group.pjhsg.id]

  tags = {
    Name = "t101-alb"
  }
}

resource "aws_lb_listener" "pjhhttp" {
  load_balancer_arn = aws_lb.pjhalb.arn
  port              = 80
  protocol          = "HTTP"

  # By default, return a simple 404 page
  default_action {
    type = "fixed-response"

    fixed_response {
      content_type = "text/plain"
      message_body = "404: page not found - T101 Study"
      status_code  = 404
    }
  }
}

resource "aws_lb_target_group" "pjhalbtg" {
  name = "t101-alb-tg"
  port     = 80
  protocol = "HTTP"
  vpc_id   = aws_vpc.pjhvpc.id

  health_check {
    path                = "/"
    protocol            = "HTTP"
    matcher             = "200-299"
    interval            = 5
    timeout             = 3
    healthy_threshold   = 2
    unhealthy_threshold = 2
  }
}

resource "aws_lb_listener_rule" "pjhalbrule" {
  listener_arn = aws_lb_listener.pjhhttp.arn
  priority     = 100

  condition {
    path_pattern {
      values = ["*"]
    }
  }

  action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.pjhalbtg.arn
  }
}

output "pjhalb_dns" {
  value       = aws_lb.pjhalb.dns_name
  description = "The DNS Address of the ALB"
}
EOT

2-3. 배포 완료 후 curl 접속 확인

# 배포
terraform plan && terraform apply -auto-approve

# ALB DNS주소로 curl 접속 확인 
ALBDNS=$(terraform output -raw pjhalb_dns)
for i in {1..100}; do curl -s http://$ALBDNS/ ; done | sort | uniq -c | sort -nr
  51 <h1>RegionAz(apne2-az1) : Instance ID(i-01ddce72aecf6bde4) : Private IP(10.10.1.209) : Web Server</h1>
  49 <h1>RegionAz(apne2-az3) : Instance ID(i-01681d5b1e5704589) : Private IP(10.10.2.63) : Web Server</h1>
  
# EC2 최소 2대 => 3대로 증가 수정
sed -i -e 's/min_size = 2/min_size = 3/g' asg.tf

# 배포
terraform plan && terraform apply -auto-approve

# ALB DNS주소로 curl 접속 확인 
for i in {1..100}; do curl -s http://$ALBDNS/ ; done | sort | uniq -c | sort -nr
  34 <h1>RegionAz(apne2-az3) : Instance ID(i-01aa22c310a10aeb6) : Private IP(10.10.2.243) : Web Server</h1>
  34 <h1>RegionAz(apne2-az3) : Instance ID(i-01681d5b1e5704589) : Private IP(10.10.2.63) : Web Server</h1>
  32 <h1>RegionAz(apne2-az1) : Instance ID(i-01ddce72aecf6bde4) : Private IP(10.10.1.209) : Web Server</h1>

# 강제로 EC2 1대 삭제 후 curl 접속 확인 : 종료 확인 후 치료를 위한 인지까지 3분 정도 시간 소요 - (자가치료) 알아서 1대 추가
  50 <h1>RegionAz(apne2-az3) : Instance ID(i-01681d5b1e5704589) : Private IP(10.10.2.63) : Web Server</h1>
  50 <h1>RegionAz(apne2-az1) : Instance ID(i-01ddce72aecf6bde4) : Private IP(10.10.1.209) : Web Server</h1>

  • 3~5분후 확인

# curl 확인
for i in {1..100}; do curl -s http://$ALBDNS/ ; done | sort | uniq -c | sort -nr
 34 <h1>RegionAz(apne2-az3) : Instance ID(i-01681d5b1e5704589) : Private IP(10.10.2.63) : Web Server</h1>
 33 <h1>RegionAz(apne2-az3) : Instance ID(i-08dce6b47f8c63eca) : Private IP(10.10.2.225) : Web Server</h1>
 33 <h1>RegionAz(apne2-az1) : Instance ID(i-01ddce72aecf6bde4) : Private IP(10.10.1.209) : Web Server</h1>

2-4. 삭제 

destroy 는 ‘실행 취소(undo)’를 할 수 없으니, 실제 운영 환경에서는 주의해서 실행해야 함

terraform destroy -auto-approve
728x90
반응형

'Terraform' 카테고리의 다른 글

3주차 - 기본 사용 3/3 & 프로바이더  (0) 2023.07.21
2주차 - 테라폼 기본 사용 2/3  (0) 2023.07.12
1주차 - 테라폼 기본 사용 1/2  (0) 2023.07.05
[CHAPTER 1&2] 기초  (0) 2023.05.23
Comments