본문 바로가기
공부/IaC

[Terraform on AWS] 테라폼 채움 참조, 변수(variable), output 사용

by haejang 2021. 3. 19.
728x90
728x90

 

참조 : 책 Terraform Up & Running

코드 깃헙 주소 : github.com/stitchlabio/terraform-up-and-running-code

테라폼 기본 설정은 지난 글을 참조하자

 

Requirements

  • AmazonEC2FullAccess 권한이 있는 IAM User
  • 기본 VPC (버지니아 북부 : us-east-1)

 

생성할 리소스

  • 특정 포트를 열어놓는 보안 그룹
  • EC2
    • 해당 포트로 접속하면 Hello, World를 보여주는 User Data
    • 위에서 설명한 보안 그룹 연결

 

목차

1. 채움 참조(interpolation)를 사용해 리소스 생성

2. 변수를 사용해 리소스 생성

3. 더 다양한 variable

 

 

1. 채움 참조를 사용해 리소스 생성

provider "aws" {
  region = "us-east-1"
}

resource "aws_instance" "example" {
  ami                    = "ami-40d28157"
  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"
  }
}

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"]
  }
}

output "public_ip" {
  value = aws_instance.example.public_ip
}

먼저 "instance"란 이름의 aws_security_group 리소스 구문을 보자

name은 보안 그룹의 이름이며, ingress로 인바운드 규칙을 설정해주었다

이 보안 그룹이 연결된 EC2를 생성하기 위해, "example" 이름의 aws_instance 리소스 구문에서 채움 참조(interpolation)을 사용하였다

 

채움 참조 구문의 문법은 아래와 같다

"${TYPE.NAME.ATTRIBUTE}"

따라서 밑의 리소스 구문에서 정의된 보안그룹의 ID를 가져오기 위해 "${aws_security_group.instance.id}" 가 사용된 것이다

 

또한 output 구문에서도 aws_instance.example.public_ip 란 참조를 사용해, 테라폼 실행 시 생성되는 EC2의 퍼블릭 IP를 출력할 수 있다

 

user_data의 <<-EOFEOF 표시는 여러 줄을 하나의 단락으로 처리하는 테라폼의 히어닥(heredoc) 문법이다

 

terraform apply로 실행시켜보면

 

 

output 구문에서 설정한 퍼블릭 IP가 출력된다

콘솔에서도 확인해보면

 

 

설정한 대로 보안 그룹과 EC2가 잘 생성되었다

EC2의 IP와 설정한 8080 포트로 접속해보자

curl 52.90.144.92:8080

 

 

Hello, World도 멀쩡하게 잘 뜬다

 

 

2. 변수를 사용해 리소스 생성

위의 코드에서 8080이란 숫자가 반복이 된다

이를 변수로 처리해 8080이 아닌 다른 포트를 사용하게 될 때 바로바로 적용할 수 있도록 해보겠다

provider "aws" {
  region = "us-east-1"
}

variable "server_port" {
  description = "The port the server will use for HTTP requests"
  default     = 8080
}

resource "aws_instance" "example" {
  ami                    = "ami-40d28157"
  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 "${var.server_port}" &
              EOF

  tags = {
    Name = "terraform-example"
  }
}

resource "aws_security_group" "instance" {
  name = "terraform-example-instance"

  ingress {
    from_port   = var.server_port
    to_port     = var.server_port
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

output "public_ip" {
  value = aws_instance.example.public_ip
}

variable 구문이 추가되었다

server_port란 변수에 default값으로 8080을 설정해두어, 8080을 사용하던 user_data와 security group 구문들에 각각 적용할 수 있게 되었다

terraform apply를 해보면

 

 

user data가 바뀌느라 EC2도 새로 생성되었지만, 전체적으로 달라진 건 없다

8080이 아닌 다른 포트넘버를 사용해야 할 땐, variable 구문의 default값만 고쳐 쓰면 된다

 

그러나 default값도 아닌 테라폼 실행 때 마다 새로운 값을 입력받아 사용하고 싶다면, 아래와 같이 default 구문을 빼주자

variable "server_port" {
  description = "The port the server will use for HTTP requests"
}

이대로 terraform apply를 해주면

 

 

description 구문의 설명이 뜨면서 value를 입력하라고 한다

여기에 원하는 변수 값을 입력하면서 사용할 수 있다

또는, terraform apply -var server_port="8080" 과 같이 명령 줄 옵션으로 바로 변수를 지정하며 테라폼을 실행시킬수도 있다

 

+++

variable과 output은 파일을 따로 만들어서 사용하는게 좋다

vars.tfoutputs.tf 파일을 같은 폴더 내에 만들어서 각각의 구문들만 이동시켜서 사용하자

 

 

참고로 꼭 이 파일 이름들을 써야 하는건 아니다

terraform 명령을 실행 == 해당 폴더 내의 모든 tf 파일을 실행

이므로 아무렇게나 .tf 파일을 만들어서 사용하면 된다

 

3. 더 다양한 variable

variable 구문의 본문엔 3개의 매개변수가 포함될 수 있다

  • description
  • default
  • type

위에서도 봤듯이 description은 변수를 설명하는 문구이고, default는 입력받지 않을 때 기본 설정되는 값이다

이 때 type은 따로 설정하지 않으면 string으로 자동 설정되기 때문에 위에선 딱히 건드리지 않았다 (또한 defualt값이 존재한다면 그 값의 속성을 자동으로 선택한다)

하지만 string 외에도 list, map, object 등 다양한 속성이 있기 때문에 잘 알아두고 필요할 때 써먹자

Terraform variable 공식 문서

 

728x90
728x90

댓글