테라폼을 이용해서 AWS 클라우드 아키텍처 설계하기 - 3(Instance)

xgro·2022년 7월 4일
0

Terraform

목록 보기
4/10
post-thumbnail

📌 인스턴스 구축하기

아키텍처의 뼈대가 되는 가상네트워크망을 구축하였으므로 원하는 인스턴스를 배포하여 아키텍처를 완성한다.

👉 EC2

테라폼으로 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"
  }
}

👉 RDS

데이터베이스 구축을 위한 테라폼 파일 작성

이번 아키텍처는 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"
}

👉 Application Load Balancer

로드밸런서 생성을 위한 테라폼 파일 작성

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
  }
}


👉 Auto Scaling Group

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가 정상적으로 출력 되는것을 확인할 수 있다.

profile
안녕하세요! DevOps 엔지니어 이재찬입니다. 블로그에 대한 피드백은 언제나 환영합니다! 기술, 개발, 운영에 관한 다양한 주제로 함께 나누며, 더 나은 협업과 효율적인 개발 환경을 만드는 과정에 대해 인사이트를 나누고 싶습니다. 함께 여행하는 기분으로, 즐겁게 읽어주시면 감사하겠습니다! 🚀

0개의 댓글