•
테라폼 HCL 구조는 Block 단위로 구성되며, 다양한 Block Type에 대해 살펴보겠습니다.
<BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>" {
# Block body
<IDENTIFIER> = <EXPRESSION> # Argument
}
Bash
복사
[Caption] 테라폼 HCL Block 기반의 구조
1. [Block Type] Provider
•
테라폼은 2000개가 넘는 다양한 Provider 플러그인을 사용하여 API와 상호 작용합니다.
•
테라폼으로 생성할 인프라 공급자를 지정하기 위해 Provider Block을 통해 선언합니다.
provider "aws" {
access_key = "MY_ACCESS_KEY_HERE"
secret_key = "MY_SECRET_KEY_HERE"
region = "ap-northeast-2"
}
Bash
복사
[Caption] provider block type 예시
2. [Block Type] Resource
•
테라폼을 통해 생성할 자원을 생성하기 위해 Resource Block을 통해 선언합니다.
•
Resource 유형은 “Provider_resource” 형태로 표현하고, 테라폼 내에서 사용할 이름을 지정
•
해당 Provider에서 사용할 수 있는 Agument를 1개 이상 정의
resource "aws_instance" "example" {
ami = "ami-01711d925a1e4cc3a"
instance_type = "t2.micro"
}
Bash
복사
[Caption] resource block type 예시
•
위 예시 코드를 보면 Resource 유형은 AWS 공급자의 EC2 인스턴스이며(aws_instance) 이름은 “example” 입니다.
•
ami와 instance_type에 대한 Argument를 선언
3. [Block Type] Variable
•
테라폼 HCL에서 사용할 변수를 지정하기 위해 Variable Block을 통해 선언합니다.
•
선언된 변수 값을 호출하여 사용하며, Variable을 정의한 별도의 .tf파일로 분리하는 것을 권장합니다.
•
변수를 호출할 때는 var.[VARIABLE_NAME] 형태로 사용합니다.
# variable.tf
variable "server_port" {
type = number
default = 8080
}
--------------------------------------------------
# main.tf
resource "aws_security_group" "instance" {
name = var.security_group_name
ingress {
from_port = var.server_port
to_port = var.server_port
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
Bash
복사
[Caption] variable block type 예시
4. [Block Type] Output
•
테라폼을 통해 다양한 속성 값을 저장하며, 이중에 필요한 값을 추출하고자 할 때 Output Block을 통해 선언합니다.
•
terraform apply를 통해 인프라 배포를 하고 Output에서 추출한 정보를 출력합니다.
•
별도의 terraform output 명령어를 통해 출력할 수도 있습니다.
...
output "public_ip" {
value = aws_instance.example.public_ip
}
Bash
복사
[Caption] output block type 예시
•
public_ip라는 Output 이름을 선언하고 추출하고자하는 값은 aws_instance.example.public_ip로 선언
terraform apply
================= output =================
...
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
public_ip = "3.36.95.39"
-----
terraform output public_ip
================= output =================
"3.36.95.39"
Bash
복사
5. [Block Type] Data
•
Provider에서 제공하는 Resource 정보를 가져와서 테라폼에서 활용할 수 있게 Data Block을 통해 선언합니다.
data "aws_subnets" "default" {
filter {
name = "vpc-id"
values = [data.aws_vpc.default.id]
}
}
Bash
복사
[Caption] data block type 예시
•
AWS의 VPC 정보에서 Filter를 통해 Default VPC ID를 가져와 매핑합니다.
6. [Block Type] Backend
•
여러명이 협업하는 경우 Backend를 통한 관리가 필요합니다.
•
테라폼 상태를 저장하는 tfstate를 저장하는 공간을 지정하기 위해 Backend Block을 통해 선언합니다.
•
지원되는 Backend
◦
local, AWS S3, Azure Blob Storage, Google Cloud Storage, Consul, Postgres database 등
terraform {
backend "s3" {
bucket = "ongja-apnorthease2-tfstate"
key = "terraform/IAM/terraform.tfstate"
region = "ap-northeast-2"
dynamodb_table = "TerraformStateLock"
}
}
Bash
복사
[Caption] backend block type 예시
7. [Block Type] Module
•
Module은 공통으로 활용할 수 있는 다수의 .tf 파일들로 모아 정의하는 것으로 라이브러리 같은 개념으로 사용하며 Module Block을 통해 선언합니다.
•
Root Module과 Child Module로 분류
◦
Root Module - 작업을 수행하는 디렉터리에 있는 테라폼 코드 모음
◦
Child Module - 다른 Module에서 참조하여 사용하는 테라폼 코드 모음
•
Module의 하위 Argument 중 Source를 통해 참조할 Module을 명시합니다.
◦
Local paths, Terraform Registry, Github, G3 Buckets, GCS buckets 등
•
테라폼은 Terraform Registry로 다양한 Module의 저장소를 제공합니다.
•
Module을 처음 사용 시 반드시 terraform init을 실행해야 합니다.
module "webserver_cluster" {
source = "../../../modules/services/webserver-cluster"
}
Bash
복사
[Caption] module block type 예시