Post

[Terraform] 단일 서버, 단일 웹 서버 배포

[Terraform] 단일 서버, 단일 웹 서버 배포

[Terraform] terraform.tfvars를 통한 변수 값 저장 (with. AWS Credentials)

이전 글에 이어 진행입니다.

1. 단일 서버

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
     }
    
  2. variable.tf

    1
    2
    3
    
     variable "AWS_ACCESS_KEY" {}
     variable "AWS_SECRET_KEY" {}
     variable "AWS_REGION" {}
    
  3. 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"
    
  4. 프로바이더 구성 후 terraform init 명령으로 프로바이더에 대한 코드 초기화
    (코드 스캔, 공급자 확인, 필요 코드 다운)
    -> init 명령은 멱등성을 제공하며, 여러 번 실행하는 것이 안전하다!! image

2) 단일 서버 구성

  1. 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. + : 추가 / - : 삭제 / ~ : 수정 image

  3. 생성 확인 image

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) 배포

image image image

aws_instance 리소스의 인수 중 대다수는 변경 시 대체(-/+)를 강제 실행하므로, 원래 EC2 인스턴스가 종료되고 완전히 새로운 인스턴스가 생성된다. 이는 서버 템플릿 도구와 같은 불변 인프라 패러다임의 예시 중 하나이다.
이 다운타임에 대한 해결책으로 중단 없이 배포하는 방법이 존재한다!

terraform destroy 명령으로 모두 삭제하기!

This post is licensed under CC BY 4.0 by the author.