이전 포스팅에서는 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
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" # 버전 관리 활성화
}
}
15. 결과 확인하기
지금까지 생성한 파일을 apply -auto-approve 명령어를 통해 apply해보도록 하겠습니다.
우선 AutoScailing이 적용된 인스턴스 생성을 위해 auto-lb 디렉토리에서 생성한 tf파일을 apply 해보겠습니다.
[nana@master auto-lb] $ terraform plan
[nana@master auto-lb] $ terraform apply -auto-approve
다음으로는 s3생성을 위해 s3 디렉토리로 이동하여 tf파일을 apply해보겠습니다.
[nana@master s3] $ terraform plan
[nana@master s3] $ terraform apply -auto-approve
마지막으로 rds생성을 위해 rds디렉토리로 이동하여 tf파일을 apply합니다.
지금까지 Terraform을 이용해 AWS 환경 구성에 대한 소개와 구현방법에 대해 설명 진행하였습니다.
다음 포스팅에는 IaC를 이용한 클라우드 인프라 구축 프로젝트에서 2번째로 진행한
CloudWatch 이용 EC2 서비스 모니터링에 대해 소개하는 시간을 가지도록 하겠습니다.
'Project > Cloud Project' 카테고리의 다른 글
IaC를 이용한 클라우드 인프라 구축 프로젝트 5 (0) | 2023.12.05 |
---|---|
IaC를 이용한 클라우드 인프라 구축 프로젝트 3 (0) | 2023.12.05 |
IaC를 이용한 클라우드 인프라 구축 프로젝트 2 (2) | 2023.12.05 |
IaC를 이용한 클라우드 인프라 구축 프로젝트 1 (0) | 2023.12.05 |