[Terraform] 단일 서버, 단일 웹 서버 배포
[Terraform] terraform.tfvars를 통한 변수 값 저장 (with. AWS Credentials)
이전 글에 이어 진행입니다.
1. 단일 서버
1) 프로바이더 구성
main.tf
1 2 3 4 5
provider "aws" { region = var.AWS_REGION access_key = var.AWS_ACCESS_KEY secret_key = var.AWS_SECRET_KEY }
variable.tf
1 2 3
variable "AWS_ACCESS_KEY" {} variable "AWS_SECRET_KEY" {} variable "AWS_REGION" {}
terraform.tfvars
1 2 3
AWS_ACCESS_KEY = "[access key]" // 실제 AWS Access Key 입력 AWS_SECRET_KEY = "[secret key]" // 실제 AWS Secret Key 입력 AWS_REGION = "us-west-2"
프로바이더 구성 후 terraform init 명령으로 프로바이더에 대한 코드 초기화
(코드 스캔, 공급자 확인, 필요 코드 다운)
-> init 명령은 멱등성을 제공하며, 여러 번 실행하는 것이 안전하다!!
2) 단일 서버 구성
main.tf
1 2 3 4 5 6
resource "aws_instance" "example" { ami = "ami-0deb35a8202ca99c1" // Ubuntu 20.04 amd64 AMI instance_type = "t2.micro" tags = { Name = "terraform-example" } // Name 태그의 값을 terraform-example로 지정 }
2. 단일 웹 서버
1) 스크립트 or 유저데이터
위에서 생성한 인스턴스에서 웹 서버를 실행하는 단계이다. HTTP 응답에 요청할 수 있는 아주 간단한 단일 웹 서버를 배포할 예정이다.
실제 환경에서는 장고(Django)와 같은 웹 프레임워크를 사용해 웹 서버를 구축할 것이지만, 간단히 “Hello, World”를 출력하는 것으로 진행할 것이다.
1
2
3
#! /bin/bash
echo "Hello, World" > index.html
nohup busybox httpd -f -p 8080 &
이 배시 스크립트는 index.html 파일에 ‘Hello, World’라는 텍스트를 저장한 다음, 비지박스(Busybox)라는 도구로 포트 8080번에서 웹 서버를 실행하여 해당 파일을 제공한다. busybox httpd -f -p 8080 명령 구문을 nohup 명령으로 터미널이 종료되어도 실행되도록 하고, &를 통해 백그라운드에서 동작하도록 한다.
이런 웹 서버를 배포하는 방법은 패커와 같은 서버 템플릿 도구를 통해 AMI화 시켜 해당 AMI ID를 통해 배포할 수 있다. 이런 단순한 코드는 서버 템플릿 도구 이외에 유저 데이터(User data)를 통해 해당 스크립트를 실행할 수 있다.(EC2 인스턴스가 시작될 때, 쉘 스크립트 또는 Windows 파워 쉘 명령어를 유저 데이터에 전달하여 특정 작업을 수행하도록)
1
2
3
4
5
6
7
8
9
10
resource "aws_instance" "example" {
ami = "ami-0deb35a8202ca99c1" // Ubuntu 20.04 amd64 AMI
instance_type = "t2.micro"
user_data = <<-EOF
#!/bin/bash
echo "Hello, World" > index.html
nohup busybox httpd -f -p 8080 &
EOF
tags = { Name = "terraform-example" }
}
테라폼의 히어닥(heardoc) 구문(«-EOF 및 EOF)을 이용해 줄 바꿈 문자를 삽입하지 않고 여러 줄의 코드를 작성 가능하다.
user_data는 인스턴스가 실행될 때 처음 한 번만 실행될 수 있다. 그렇기 때문에 user_data가 변경되면 테라폼은 기존 인스턴스를 삭제하고 새로운 인스턴스를 구동한다.
2) 보안 그룹(Security Group) 생성
AWS는 기본적으로 인스턴스에 들어오거나 나가는 패킷을 허용하지 않기 때문에 별도 허용하는 보안 그룹을 생성해 매핑시켜줘야 한다.
1
2
3
4
5
6
7
8
9
10
resource "aws_security_group" "instance" {
name = "terraform-example-instance"
ingress {
from_port = 8080
to_port = 8080
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
0.0.0.0/0 (모든 IP 주소)의 8080으로 들어오는 요청을 허용
3) 인스턴스에서 생성한 보안 그룹(Security Group) 사용
생성한 보안 그룹(Security Group)의 id 속성값을 사용하도록 코드 작성할 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
resource "aws_instance" "example" {
ami = "ami-0deb35a8202ca99c1" // Ubuntu 20.04 amd64 AMI
instance_type = "t2.micro"
vpc_security_group_ids = [aws_security_group.instance.id] // 해당 코드 추가
user_data = <<-EOF
#!/bin/bash
echo "Hello, World" > index.html
nohup busybox httpd -f -p 8080 &
EOF
tags = { Name = "terraform-example" }
}
4) 배포
aws_instance 리소스의 인수 중 대다수는 변경 시 대체(-/+)를 강제 실행하므로, 원래 EC2 인스턴스가 종료되고 완전히 새로운 인스턴스가 생성된다. 이는 서버 템플릿 도구와 같은 불변 인프라 패러다임의 예시 중 하나이다.
이 다운타임에 대한 해결책으로 중단 없이 배포하는 방법이 존재한다!
terraform destroy 명령으로 모두 삭제하기!




