https://haksuperman.tistory.com/48
이전 글에 이어 진행입니다.
1. 단일 서버
1) 프로바이더 구성
main.tf
provider "aws" {
region = var.AWS_REGION
access_key = var.AWS_ACCESS_KEY
secret_key = var.AWS_SECRET_KEY
}
variable.tf
variable "AWS_ACCESS_KEY" {}
variable "AWS_SECRET_KEY" {}
variable "AWS_REGION" {}
terraform.tfvars
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
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"를 출력하는 것으로 진행할 것이다.
#! /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 파워 쉘 명령어를 유저 데이터에 전달하여 특정 작업을 수행하도록)
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는 기본적으로 인스턴스에 들어오거나 나가는 패킷을 허용하지 않기 때문에 별도 허용하는 보안 그룹을 생성해 매핑시켜줘야 한다.
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 속성값을 사용하도록 코드 작성할 것이다.
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 명령으로 모두 삭제하기!
'Language > Terraform' 카테고리의 다른 글
[Terraform] ASG를 통한 웹 서버 클러스터 배포 (0) | 2024.06.01 |
---|---|
[Terraform] 변수를 통해 구성 가능한 서버 배포 (0) | 2024.06.01 |
[Terraform] terraform.tfvars를 통한 변수 값 저장(feat. AWS Credentials) (0) | 2024.05.28 |
[Terraform] IAM Group 생성 후 정책 적용 및 IAM User 추가 (0) | 2024.05.28 |
[Terraform] terraform 기본 명령어 및 프로바이더 선언(feat. init, plan, apply, destory) (0) | 2024.05.21 |
개인 공부 목적으로 사용하는 블로그입니다 :)
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!