728x90
반응형
2.6 웹 서버 클러스터 배포
- 단일 서버 배포에 성공하셨습니다!
- 다음 단계로 서버 클러스터 구성을 진행해보죠!!
- 트래픽 분산, 트래픽 양에 따라 클러스터 크기를 늘리거나 줄여봅시다!!
- 오토스케일링 그룹 (ASG) 활용
- EC2 인스턴스 클러스터 시작
- 각 인스턴스 상태 모니터링
- 실패한 인스턴스 교체
- 로드에 따른 클러스터 사이즈 조정 등의 작업을 자동으로 처리
- 가이드는 시작 구성(Launch configuration)을 활용하여 ASG 생성 진행
- aws_launch_configuration 리소스는 aws_instance와 거의 동일한 매개변수를 사용
# main.tf
resource "aws_launch_configuration" "launch_config" {
image_id = "ami-0ba5cd124d7a79612" # EC2 인스턴스에서는 ami 였었습니다
instance_type = "t3.micro"
security_groups = [aws_security_group.instance.id] # EC2 인스턴스에서는 vpc_security_group_ids 였었습니다.
user_data = <<-EOF
#!/bin/bash
echo "Hello, World" > index.html
nohup busybox httpd -f -p ${var.server_port} &
EOF
}
### 위에서 생성한 launch configuratio을 활용하여 ASG 생성
resource "aws_autoscaling_group" "WEB-ASG" {
launch_configuration = aws_launch_configuration.launch_config.name # name 변수는 시작 구성의 Name 값 설정
min_size = 2
max_size = 3
tag {
key = "Name"
value = "terraform-web-asg"
propagate_at_launch = "true"
}
}
resource "aws_security_group" "instance" {
name = "TEST-WEB-sg"
ingress {
from_port = var.server_port
to_port = var.server_port
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "TEST-WEB-sg"
}
}
variable "server_port" {
description = "The port the server will user for HTTP requests"
type = number
default = 8080
}
# 에러 발생
╷
│ Error: Error creating Auto Scaling Group: ValidationError: At least one Availability Zone or VPC Subnet is required.
│ status code: 400, request id: 81011bf4-e265-4da3-b29f-cefb81dad699
│
│ with aws_autoscaling_group.WEB-ASG,
│ on main.tf line 129, in resource "aws_autoscaling_group" "WEB-ASG":
│ 129: resource "aws_autoscaling_group" "WEB-ASG" {
│
# 가이드 내용대로 진행 시, 발생하는 에러
# ValidationError: At least one Availability Zone or VPC Subnet is required.
# 주된 에러 내용으로 AZ 또는 VPC의 subnet 선택이 필수적임을 알 수 있습니다.
# 아래의 두 개 링크를 통해 이슈 해결에 대한 힌트를 얻을 수 있습니다.
# aws_vpc
# aws_subnet_ids
- aws_subnet_ids
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/subnet_ids
- subnet_ids 매개변수를 지정하여 에러를 해결해봅시다!
- subnet_ids는 매개변수는 ASG가 EC2를 어느 VPC의 서브넷에 배포할지 지정해줍니다.
- 데이터 소스를 활용하여 AWS 계정의 서브넷 목록을 얻어오도록 합시다. (하드코딩은 네버...🤬)
데이터 소스는 테라폼을 실행할 때마다 공급자(provider)에서 가져온 읽기 전용 정보를 나타냅니다.
- 테라폼 구성에 데이터 소스를 추가해도 새로운 것이 생성되지 않습니다.
- 단순히 데이터 공급자의 API만 물어보고 해당 데이터를 나머지 테라폼 코드에서 사용할 수 있도록 합니다.
# 데이터 소스를 사용하는 구문은 리소스 구문과 매우 유사합니다.
data "<PROVIDER>_<TYPE>" "<NAME>" {
[CONFIG ...]
}
- PROVIDER: 공급자를 넣어주시면 됩니다.
- TYPE: vpc와 같이 사용하려는 데이터 소스 유형을 입력하면 됩니다.
- NAME: 테라폼 코드에서 이 데이터 소스를 참조하는데 사용할 식별자를 입력해줍니다.
- CONFIG: 해당 데이터 소스에 고유한 하나 이상의 인수로 구성
- 인수는 원하는 정보를 데이터 소스에 표시하는 "검색 필터" 로 이해해주시면 좋습니다.
# aws_vpc 데이터 소스를 사용하여 default vpc의 데이터를 조회하는 예시
data "aws_vpc" "default" {
default = true
}
# 이렇게 사용하시면 default vpc를 활용하실 준비가 되신 것입니다!!
# 데이터 소스에서 데이터를 가져오려면 아래와 같은 속성 참조 구문을 사용합니다.
data.<PROVIDER>_<TYPE>.<NAME>.<ATTRIBUTE>
# 예를 들어, aws_vpc 데이터 소스에서 VPC의 ID를 얻으려면 아래와 같은 속성 참조 구문을 사욯합니다.
data.aws_vpc.default.id
# 위의 데이터를 다른 데이터 소스인 aws_subnet_id에 적용해보도록 합니다. (default vpc)
data "aws_subnet_ids" "default" {
vpc_id = data.aws_vpc.default.id
}
# 마지막으로 vpc_zone_identifier 인수를 이용해 aws_subnet_ids 데이터 소스에서 서브넷 ID를 가져와 ASG가 해당 서브넷을 사용하도록 설정할 수 있습니다.
vpc_zone_identifier = data.aws_subnet_ids.default.ids
# main.tf 중, 데이터 소스를 추가한 코드입니다
# 이제는 확실히 data.tf 등으로 분리해야 할 것 같습니다.. 코드 전체로 봤을 때, 많이 지저분하네요...🥲
resource "aws_autoscaling_group" "WEB-ASG" {
launch_configuration = aws_launch_configuration.launch_config.name
vpc_zone_identifier = data.aws_subnet_ids.default.ids # 추가된 내용
min_size = 2
max_size = 3
tag {
key = "Name"
value = "terraform-web-asg"
propagate_at_launch = "true"
}
}
data "aws_subnet_ids" "default" { # 추가된 내용
vpc_id = data.aws_vpc.default.id # 추가된 내용
} # 추가된 내용
data "aws_vpc" "default" { # 추가된 내용
default = true # 추가된 내용
} # 추가된 내용
- 추가적으로 리소스를 생성할 때, 이전 리소스에 대한 참조가 있기 때문에 테라폼이 해당 리소스를 삭제할 수 없는 이슈가 있습니다.
- 이러한 문제를 해결하기 위해 수명 주기 설정을 사용할 수 있습니다!
- create_before_destroy 는 특히 유용하게 사용할 수 있는 수명 주기 설정입니다!!
- 옵션을 true 로 설정할 경우, 교체 리소스를 먼저 생성하고 기존 리소스 삭제를 진행합니다.
resource "aws_launch_configuration" "launch_config" {
image_id = "ami-0ba5cd124d7a79612" # EC2 인스턴스에서는 ami 였었습니다
instance_type = "t3.micro"
security_groups = [aws_security_group.instance.id] # EC2 인스턴스에서는 vpc_security_group_ids 였었습니다.
user_data = <<-EOF
#!/bin/bash
echo "Hello, World" > index.html
nohup busybox httpd -f -p ${var.server_port} &
EOF
# 수명 주기 설정을 추가합니다 👻
lifecycle {
create_before_destroy = true
}
}
🌟 지금까지 작성한 코드 확인 🌟
provider "aws" {
region = "ap-northeast-2"
}
### ASG 생성에 사용되는 launch configuration 생성
resource "aws_launch_configuration" "launch_config" {
name = "terraform-web-launch-config" # 지정하지 않을 경우, terraform- [기본 태그]에 날짜-난수로 입력됩니다.
image_id = "ami-0ba5cd124d7a79612" # EC2 인스턴스에서는 ami 였었습니다
instance_type = "t3.micro"
security_groups = [aws_security_group.instance.id] # EC2 인스턴스에서는 vpc_security_group_ids 였었습니다.
user_data = <<-EOF
#!/bin/bash
echo "Hello, World" > index.html
nohup busybox httpd -f -p ${var.server_port} &
EOF
# 수명 주기 설정을 추가합니다 👻
lifecycle {
create_before_destroy = true
}
}
### 위에서 생성한 launch configuratio을 활용하여 ASG 생성
resource "aws_autoscaling_group" "WEB-ASG" {
name = "terraform-web-asg" # 해당 config가 없을 경우, terraform- [기본 태그]에 날짜(Y,M,D)-난수로 입력됩니다.
launch_configuration = aws_launch_configuration.launch_config.name
vpc_zone_identifier = data.aws_subnet_ids.default.ids
min_size = 2
max_size = 3
tag {
key = "Name"
value = "terraform-web-asg-server"
propagate_at_launch = "true"
}
}
data "aws_subnet_ids" "default" {
vpc_id = data.aws_vpc.default.id
}
data "aws_vpc" "default" {
default = true
}
resource "aws_security_group" "instance" {
name = "TEST-WEB-sg"
ingress {
from_port = var.server_port
to_port = var.server_port
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "TEST-WEB-sg"
}
}
variable "server_port" {
description = "The port the server will user for HTTP requests"
type = number
default = 8080
}
- 지금까지 진행한 main.tf 파일은 위와 같습니다.
- ASG, 시작 구성의 name (config) 값은 가이드에는 없지만 난수로 표현되는 부분이
(개인적으로)싫어서 추가한 내용입니다 👻(태그 값이 잘 들어가서 기분이 좋네요) - 하지만 main.tf 에서 data.tf, variables.tf 등으로 분리가 반드시 필요해보이네요.
긴 글 읽어주셔서 감사합니다 😍
다음 내용은 로드 밸런서를 활용하는 인프라, 인프라 정리 및 2장의 결론 내용을 작성 예정입니다.
감사합니다 😘
728x90
반응형
'Terraform' 카테고리의 다른 글
Terraform 101 Study - 2주차 (0) | 2024.06.23 |
---|---|
Terraform 101 Study - 1주차 (0) | 2024.06.16 |
[Terraform] 2장. 왜 테라폼인가? (61~76p) (0) | 2021.07.13 |
[Terraform] 2장. 왜 테라폼인가? (45~60p) (0) | 2021.07.12 |
[Terraform] 1장. 왜 테라폼인가? (1~44p) (0) | 2021.07.12 |