새소식

IaC/Terraform

1주차(4)_Terraform을 통한 EC2 웹 서버 배포

  • -
CloudNet@ 팀의 가시다님께서 Leading 하시는 Terraform T101 Study 내용 요약
해당 Terraform Study 는 Terraform Up and Running 책을 기반으로 진행 중입니다.

 

 

 

1. 웹 서버를 위한 main.tf 파일 생성

 

provider "aws" {
  region = "ap-northeast-2"
}

resource "aws_instance" "example" {
  ami                    = "ami-0e9bfdb247cc8de84"
  instance_type          = "t2.micro"

  // user_data는 EC2 Instance가 처음 배포될 때 실행되는 스크립트 내용
  user_data = <<-EOF
              #!/bin/bash
              echo "Hello, Terraform Study" > index.html
              nohup busybox httpd -f -p 80 &
              EOF

  tags = {
    Name = "Web-Server-01"
  }
}

 

위 main.tf 파일만으로는 웹 서버가 동작하지 않습니다.

 

 

※ 웹 서버를 위한 Port를 오픈해주지 않았기 때문입니다.

 

 

AWS 에서는 Security Group (보안 그룹) 이라고 하는 네트워크 인터페이스에서 작동하는 보안 서비스가 있는데,
해당 리소스를 통해 웹 서비스를 위한 80 포트를 오픈해주어야 합니다.

 

 

아래의 내용으로 main.tf 파일을 변경해줍니다.

provider "aws" {
  region = "ap-northeast-2"
}

resource "aws_instance" "example" {
  ami                    = "ami-0e9bfdb247cc8de84"
  instance_type          = "t2.micro"
  vpc_security_group_ids = [aws_security_group.web_sg.id]

  user_data = <<-EOF
              #!/bin/bash
              echo "Hello, Terraform Study" > index.html
              nohup busybox httpd -f -p 80 &
              EOF

  tags = {
    Name = "Web-Server-01"
  }
}

resource "aws_security_group" "web_sg" {
  name = var.security_group_name

  // Inbound Port
  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

variable "security_group_name" {
  description = "The name of the security group"
  type        = string
  default     = "terraform-example-instance"
}

output "public_ip" {
  value       = aws_instance.example.public_ip
  description = "The public IP of the Instance"
}

 

 

이후 Terraform apply 를 통해 코드를 실행하고 실제 서버의 IP로 들어가봅니다.

 

 

간단한 웹 서버를 배포하였습니다.

 

 

 

 

 

2. 코드 파헤치기

 

이번 웹서버를 배포 하면서 variable, output 등의 생소한 표현들이 등장하였습니다.

 

 

2.1. 참조 (Reference)

코드의 다른 부분의 값에 액세스할 수 있게 해주는 표현식

 

EC2 리소스 중에 다음과 같은 표현이 등장하였습니다.

 

resource "aws_instance" "example" { 
    // 생략 
    vpc_security_group_ids = [aws_security_group.web_sg.id]
}

 

원래라면 ami instance_type 처럼 고정된 값이 있어야 하는데, 다른 값이 들어가있습니다.
EC2의 보안 그룹을 적용시켜주는 데, web_sg의 값을 참조하겠다는 의미입니다.

 

테라폼에서는 다음과 같이 Reference 표현식을 나타낼 수 있다.

 

<PROVIDER>_<TYPE>.<NAME>.<ATTRIBUTE>
  • PROVIDER : ‘aws’ 같은 공급자의 이름
  • TYPE : ‘security_group’ 같은 리소스의 유형
  • NAME : 보안 그룹 이름인 ‘instance’ 같은 리소스의 이름
  • ATTRIBUTE : ‘name’ 과 같은 리소스의 인수 중 하나이거나 리소스가 내보낸 속성 중 하나

 

그렇다면 왜 참조가 필요할까요??

 

EC2에 보안 그룹을 적용하기 위해서는 해당 보안 그룹의 ID 값을 넣어줘야 합니다.

 

하지만, 보안 그룹 ID 값은 생성되기 전까지는 알 수 없으므로,

Reference 표현을 통해 Terraform에서 필요한 Dependency를 자동으로 지정하도록 하는 것입니다.

 

 

2.2. Variable (입력 변수)

 

  • Terraform 에서는 Variable 이라는 입력 변수를 이용해 리소스 생성 시, 고정값이 아닌 변동값을 부여해 줄 수 있다.
  • 보통 입력 변수 관리만을 위한 variables.tf 파일로 분리하여 사용한다.
  • Variable에 부여될 수 있는 type은 string, number, bool, map, list, set, object, tuple 등이 있다.

 

variable "security_group_name" {
  description = "The name of the security group"
  type        = string
  default     = "terraform-example-instance"
}

 

 

2.3. Output (출력 변수)

 

  • Terraform 에서 Output 이라는 출력 변수를 이용해 리소스 생성 후, 특정 값을 원하는 변수값에 부여해 줄 수 있다.
  • 보통 출력 변수 관리만을 위한 output.tf 파일로 분리하여 사용한다.
  • output 값을 다른 Terraform 코드에서 불러와서 사용하는 것도 가능하다.

 

output "public_ip" {
  value       = aws_instance.example.public_ip
  description = "The public IP of the Instance"
}

 

 

Terraform 테스트가 끝났다면 리소스를 삭제해주는 것을 습관화하는 것이 좋습니다.

 

terraform destroy -auto-approve

 

 

 


 

이번에는 테라폼을 이용해 간단한 웹 서버를 배포해보았습니다.
다음에는 테라폼을 이용해 웹 서버 AutoScaling Group 을 구성하고, LoadBalancer 를 통해 서비스를 구현해보겠습니다.

Contents

포스팅 주소를 복사했습니다