본문 바로가기
Project/Cloud Project

IaC를 이용한 클라우드 인프라 구축 프로젝트 4

by kjy1010 2023. 12. 5.

이전 포스팅에서는 Terraform을 이용해 AWS 환경 구성 구현 을 아래와 같은 순서로 설명하는 시간을 가졌습니다.  

 

5. VPC 생성하기

6. Internet Gateway 생성하기

7. Routing Table 생성하기

8. Public Subet 연결하기

9. AutoScailing 생성

 

이번 포스팅에서 launch-configuration를 설정하는 부분부터 설명을 이어가보도록 하겠습니다. 

 

10. launch-configuration 설정

Terraform을 사용하여 AWS에서 웹 애플리케이션 또는 서비스에 필요한 인스턴스를 생성하고 관리하기 위한 코드

[nana@master auto-lb]$ vim launch_conf.tf
resource "aws_launch_configuration" "web" {
 name_prefix = "web-"
 image_id = "ami-07a713e7842da99d4"       #이미지 리젼에 따라 변경
 instance_type = "t2.largel"      #용량 맞게 변경
 key_name = aws_key_pair.terraform_key.key_name
 security_groups = [ aws_security_group.instance.id ]
 associate_public_ip_address = true
 user_data = file("user-data.sh")
 lifecycle {
 create_before_destroy = true
 }
}

 

 

새로 생성될 인스턴스에 httpd 서버를 설치하고 그 index.html 파일을 생성해서 자동으로 그 서비스를 시작하기 위한 설정

[nana@master auto-lb]$ vim user-data.sh

#!/bin/bash
sudo yum install -y httpd
sudo systemctl enable --now httpd
echo "Hello, World" > /var/www/html/index.html

[nana@master auto-lb]$ chmod 755 user-data.sh

 

11. ELB 생성

Load Balancer 의 경우 80 포트로의 접근을 위한 보안그룹을 별도로 생성하고 이를 적용

[nana@master auto-lb]$ vim lb.tf 
resource "aws_security_group" "elb_http" {
 name = "elb_http"
 description = "Allow HTTP traffic to instances through Elastic Load Balancer"
 vpc_id = aws_vpc.terraformVPC.id
 ingress {
 from_port = 80
 to_port = 80
 protocol = "tcp"
 cidr_blocks = ["0.0.0.0/0"]
 }
 egress {
 from_port = 0
 to_port = 0
 protocol = "-1"
 cidr_blocks = ["0.0.0.0/0"]
 }
 tags = {
 Name = "Allow HTTP through ELB Security Group"
 }
}
resource "aws_elb" "web_elb" {
 name = "web-elb"
 security_groups = [
 aws_security_group.elb_http.id
 ]
 subnets = [
 aws_subnet.public_3a.id,
 aws_subnet.public_3b.id
 ]
 cross_zone_load_balancing = true
 health_check {
 healthy_threshold = 2
 unhealthy_threshold = 2
 timeout = 3
 interval = 30
 target = "HTTP:80/"
 }
 listener {
 lb_port = 80
 lb_protocol = "http"
 instance_port = "80"
 instance_protocol = "http"
 }
}

 

12. Auto Scaling 설정

launch_configuration 의 설정에 따라 몇대의 인스턴스를 상황에 따라 조정할 지 그 개수를 명확히 지정

(기본 2개 생성되도록 지정)

[nana@master auto-lb]$ vim asg.tf
resource "aws_autoscaling_group" "web" {
 name = "${aws_launch_configuration.web.name}-asg"
 min_size = 1
 desired_capacity = 2
 max_size = 4

 health_check_type = "ELB"
 load_balancers = [
 aws_elb.web_elb.id
 ]
 launch_configuration = aws_launch_configuration.web.name
 enabled_metrics = [
 "GroupMinSize",
 "GroupMaxSize",
 "GroupDesiredCapacity",
 "GroupInServiceInstances",
 "GroupTotalInstances"
 ]
 metrics_granularity = "1Minute"
 vpc_zone_identifier = [
 aws_subnet.public_3a.id,    #변경
 aws_subnet.public_3b.id     #변경
 ]

 lifecycle {
 create_before_destroy = true
 }
 tag {
 key = "Name"
 value = "web"
 propagate_at_launch = true
 }
}
output "elb_dns_name" {
 value = aws_elb.web_elb.dns_name
}

 

13.  RDS 생성

중복되어 실행되어 오류가 발생하는 것을 방지 하기 위해 새로운 rds 폴더를 만들어 실행

MySQL 데이터베이스 인스턴스를 생성하고 해당 인스턴스를 위한 서브넷 그룹을 구성하는 코드 생성

[nana@master auto-lb]$ cd ..
[nana@master aws]$ cd rds
[nana@master rds]$ vim rds.tf
resource "aws_db_instance" "my_rds" {
  allocated_storage    = 20
  storage_type        = "gp2"
  engine              = "mysql"
  engine_version      = "5.7"
  instance_class      = "db.t3.micro"
  identifier          = "myrds"  # 데이터베이스 식별자 설정
  username            = "admin"
  password            = "password123"
  db_subnet_group_name   = aws_db_subnet_group.rds.name

  skip_final_snapshot = true

  tags = {
    Name = "MyRDS"
  }
}
resource "aws_db_subnet_group" "rds" {
  name       = "team04_rds"
  subnet_ids = [ aws_subnet.public_3a.id,aws_subnet.public_3b.id ]

  tags = {
    Name = "rds"
  }
}

[nana@master rds]$ ls
rds.tf  terraform.tfstate  terraform.tfstate.backup

rds.tf파일에서 설정한  myrds라는 이름으로 RDS가 생성된 것을 확인 할 수 있음
rds.tf파일의 내용대로 설정됨을 확인 할 수 있음

 

14. S3 생성

중복되어 실행되어 오류가 발생하는 것을 방지 하기 위해 새로운 s3 폴더를 만들어 실행

Terraform 상태 파일을 저장하기 위한 S3 버킷을 생성하고 해당 버킷에 버전 관리를 활성화하는 코드 생성하여 실행

[nana@master rds]$ cd ..
[nana@master aws]$ mkdir s3
[nana@master aws]$ cd s3
[nana@master s3]$ vim s3.tf
resource "aws_s3_bucket" "terraform-state" {
  bucket = "terraform-up-and-running-state-seung"

  lifecycle {
    prevent_destroy = false
  }
}

resource "aws_s3_bucket_versioning" "terraform-state" {
  bucket = aws_s3_bucket.terraform-state.id

  versioning_configuration {
    status = "Enabled"  # 버전 관리 활성화
  }
}

s3.tf파일의 내용대로 생성됨을 확인 할 수 있음

 

 

15. 결과 확인하기

지금까지 생성한 파일을 apply -auto-approve 명령어를 통해 apply해보도록 하겠습니다.

우선 AutoScailing이 적용된 인스턴스 생성을 위해 auto-lb 디렉토리에서 생성한 tf파일을 apply 해보겠습니다.

[nana@master auto-lb] $ terraform plan 
[nana@master auto-lb] $ terraform apply -auto-approve

위에서 생성한 13개의 tf파일이 Apply에 성공하였음
2개의 인스턴스가 생성됨

 

다음으로는 s3생성을 위해 s3 디렉토리로 이동하여  tf파일을 apply해보겠습니다.

[nana@master s3] $ terraform plan 
[nana@master s3] $ terraform apply -auto-approve

정상적으로 apply됨을 확인 할 수 있음
정상적으로 s3가 생성됨을 확인 할 수 있음

 

마지막으로 rds생성을 위해 rds디렉토리로 이동하여 tf파일을 apply합니다.

정상적으로 apply됨을 확인 할 수 있음
설정한대로 rds가 생성됨을 확인 할 수 있음

 

지금까지 Terraform을 이용해 AWS 환경 구성에 대한 소개와 구현방법에 대해 설명 진행하였습니다.
다음 포스팅에는 IaC를 이용한 클라우드 인프라 구축 프로젝트에서 2번째로 진행한

CloudWatch 이용 EC2 서비스 모니터링에 대해 소개하는 시간을 가지도록 하겠습니다.