
Interpolation Syntax란 개념이 등장한다.
서로 다른 자원에 공통적으로 필요한 정보들이 있다. 이때 미리 정의한 공통 변수 문자열을 연결하여 불필요한 중복 입력 작업을 줄인다.
특히, 테라폼에서 locals로 반복 작업을 줄인다.
variable "prefix" {
default = "ai-service"
}
(이하 생략)
terraform {
required_providers {
aws = {
version = "~> 4.50.0"
source = "hashicorp/aws"
}
}
}
provider "aws" {
access_key = var.aws_access_key
secret_key = var.aws_secret_access_key
region = var.aws_region
}
locals {
prefix = "${var.prefix}-${terraform.workspace}"
}
자원이 많아질수록 어떤 프로젝트의 자원인지, 어떤 환경(dev, staging, production)의 자원인지 빠르게 파악하기가 어려워진다. tags란 메타데이터를 통해 이를 해결한다.
variable "prefix" {
default = "ai-service"
}
variable "project" {
default = "Your Project Name"
}
variable "description" {
default = "추가 설명"
}
variable "aws_access_key" {}
variable "aws_secret_access_key" {}
variable "aws_region" {}
terraform {
required_providers {
aws = {
version = "~> 4.50.0"
source = "hashicorp/aws"
}
}
}
provider "aws" {
access_key = var.aws_access_key
secret_key = var.aws_secret_access_key
region = var.aws_region
}
locals {
prefix = "${var.prefix}-${terraform.workspace}"
common_tags = {
Environment = terraform.workspace
Project = var.project
Description = var.description
ManagedBy = "Terraform"
}
}
main.tf에 locals 블락에 공통으로 사용될 정보를 정의했다.
하지만 해당 locals를 참조할 땐, local로, 즉 s를 뺀 채로 사용해야 한다.
resource "aws_instance" "example_1" {
# ...
tags = local.common_tags,
}
resource "aws_instance" "example_2" {
# ...
tags = tags = merge(
local.common_tags,
tomap({ "Name" = "${local.prefix}-main" })
)
}
> tomap({"a" = 1, "b" = 2})
{
"a" = 1
"b" = 2
}
테라폼 tomap은 모두 동일한 데이터 타입이어야 한다.
따라서, 아래와 같이 데이터 타입이 다른 경우 다수의 데이터 타입인 문자열로 형변환 한다.
> tomap({"a" = "foo", "b" = true})
{
"a" = "foo"
"b" = "true"
}