Home
home

03. Terraform HCL - Block Type

테라폼 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 예시