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