HCL variable
/main.tf
provider "aws" {
region = "ap-northeast-2"
}
variable "vpc_name" {}
module "vpc" {
source = "tedilabs/network/aws//modules/vpc"
version = "0.24.0"
name = var.vpc_name
cidr_block = "10.0.0.0/16"
internet_gateway_enabled = true
dns_hostnames_enabled = true
dns_support_enabled = true
tags = {}
}
module "subnet_group__public" {
source = "tedilabs/network/aws//modules/subnet-group"
version = "0.24.0"
name = "${module.vpc.name}-public"
vpc_id = module.vpc.id
map_public_ip_on_launch = true
subnets = {
"${module.vpc.name}-public-001/az1" = {
cidr_block = "10.0.0.0/24"
availability_zone_id = "apne2-az1"
}
"${module.vpc.name}-public-002/az2" = {
cidr_block = "10.0.1.0/24"
availability_zone_id = "apne2-az2"
}
}
tags = {}
}
module "subnet_group__private" {
source = "tedilabs/network/aws//modules/subnet-group"
version = "0.24.0"
name = "${module.vpc.name}-private"
vpc_id = module.vpc.id
map_public_ip_on_launch = false
subnets = {
"${module.vpc.name}-private-001/az1" = {
cidr_block = "10.0.10.0/24"
availability_zone_id = "apne2-az1"
}
"${module.vpc.name}-private-002/az2" = {
cidr_block = "10.0.11.0/24"
availability_zone_id = "apne2-az2"
}
}
tags = {}
}
module "route_table__public" {
source = "tedilabs/network/aws//modules/route-table"
version = "0.24.0"
name = "${module.vpc.name}-public"
vpc_id = module.vpc.id
subnets = module.subnet_group__public.ids
ipv4_routes = [
{
cidr_block = "0.0.0.0/0"
gateway_id = module.vpc.internet_gateway_id
},
]
tags = {}
}
module "route_table__private" {
source = "tedilabs/network/aws//modules/route-table"
version = "0.24.0"
name = "${module.vpc.name}-private"
vpc_id = module.vpc.id
subnets = module.subnet_group__private.ids
ipv4_routes = []
tags = {}
}
여기서 variable block을 통해 기존에 하드코딩 되어 있던 변수 이름을 변수로 바꾸었습니다.
이제 이 변수에 값을 어떻게 넣냐? 라고 의문점을 가지실 수도 있습니다.
https://www.terraform.io/language/values/variables
Input Variables - Configuration Language | Terraform by HashiCorp
Input variables allow you to customize modules without altering their source code. Learn how to declare, define, and reference variables in configurations.
www.terraform.io
일단 위 공식문서 무시하고 바로 아래 명령어를 쳐보겠습니다.
$ terraform apply
다음과 같이 인프라를 만드는 시점에 주입시켜줄 수 있습니다.
다음과 같이 hello라는 이름으로 VPC가 만들어 진 것을 보실 수 있습니다. 이 외에도 공식문서에 변수 우선순위가 존재합니다.
우선 가장 낮은 우선순위인, 환경변수 주입으로 변수를 지정해 줘보겠습니다.
환경변수로 주입하기 위해서는, TF_VAR_로 시작해야 합니다.
다음과 같이 변경이 될 내용들을 보실 수 있습니다 ( hello -> test )
다음과 같이 .tfvars파일로 변수 이름을 주입할 수 있습니다.
환경변수를 최화하고 다시 해보면
다음과 같이 정상작동합니다.
또한 위 그림에서 terraform.tfvars가 아닌 *.tfvars로 지정하려면, terraform apply에 추가 인수를 주면 됩니다.
또한 *.auto.tfvars로 지정해 주게 되면 추가 인수를 주지 않아도 됩니다.
이 외에도 그냥 변수 이름을 인수로 다 집어 넣는 방법이 있습니다.
Arguments
그 다음에는 variable의 인수를 주어 협업할 떄, 알아보기 쉽게 설명이나, 기본 부가적인 정보를 달아보도록 하겠습니다.
/main.tf
...
variable "vpc_name" {
description = "생성되는 VPC의 이름"
type = string
default = "default"
}
...
내용이 직관적으로 이해되실 텐데, description설명적고, type에 해당 변수의 자료형 적어주고, default는 variable을 주입안했을 때의 기본값이라고 보시면 됩니다.
HCL locals
그리고 지역변수도 사용할 수 있는데, 간단히 Tag를 추가하는 예제를 작성해 보도록 하겠습니다.
https://www.terraform.io/language/values/locals
Local Values - Configuration Language | Terraform by HashiCorp
Local values assign a name to an expression that can be used multiple times within a Terraform module.
www.terraform.io
/main.tf
provider "aws" {
region = "ap-northeast-2"
}
variable "vpc_name" {
description = "생성되는 VPC의 이름"
type = string
default = "default"
}
locals {
common_tags = {
Project = "Network"
Owner = "Hyunseo"
}
}
module "vpc" {
source = "tedilabs/network/aws//modules/vpc"
version = "0.24.0"
name = var.vpc_name
cidr_block = "10.0.0.0/16"
internet_gateway_enabled = true
dns_hostnames_enabled = true
dns_support_enabled = true
tags = local.common_tags
}
module "subnet_group__public" {
source = "tedilabs/network/aws//modules/subnet-group"
version = "0.24.0"
name = "${module.vpc.name}-public"
vpc_id = module.vpc.id
map_public_ip_on_launch = true
subnets = {
"${module.vpc.name}-public-001/az1" = {
cidr_block = "10.0.0.0/24"
availability_zone_id = "apne2-az1"
}
"${module.vpc.name}-public-002/az2" = {
cidr_block = "10.0.1.0/24"
availability_zone_id = "apne2-az2"
}
}
tags = {}
}
module "subnet_group__private" {
source = "tedilabs/network/aws//modules/subnet-group"
version = "0.24.0"
name = "${module.vpc.name}-private"
vpc_id = module.vpc.id
map_public_ip_on_launch = false
subnets = {
"${module.vpc.name}-private-001/az1" = {
cidr_block = "10.0.10.0/24"
availability_zone_id = "apne2-az1"
}
"${module.vpc.name}-private-002/az2" = {
cidr_block = "10.0.11.0/24"
availability_zone_id = "apne2-az2"
}
}
tags = local.common_tags
}
module "route_table__public" {
source = "tedilabs/network/aws//modules/route-table"
version = "0.24.0"
name = "${module.vpc.name}-public"
vpc_id = module.vpc.id
subnets = module.subnet_group__public.ids
ipv4_routes = [
{
cidr_block = "0.0.0.0/0"
gateway_id = module.vpc.internet_gateway_id
},
]
tags = local.common_tags
}
module "route_table__private" {
source = "tedilabs/network/aws//modules/route-table"
version = "0.24.0"
name = "${module.vpc.name}-private"
vpc_id = module.vpc.id
subnets = module.subnet_group__private.ids
ipv4_routes = []
tags = local.common_tags
}
이렇게 하고 terraform apply를 하게 되면
위와 같이 정상적으로 태그들이 들어가는 것을 보실 수 있습니다.
HCL Output
https://www.terraform.io/language/values/outputs
Output Values - Configuration Language | Terraform by HashiCorp
Output values are the return values of a Terraform module.
www.terraform.io
HCL Output은 그냥 마지막 결과로 인프라의 정보를 출력할 때에 쓰입니다.
/main.tf
provider "aws" {
region = "ap-northeast-2"
}
variable "vpc_name" {
description = "생성되는 VPC의 이름"
type = string
default = "default"
}
locals {
common_tags = {
Project = "Network"
Owner = "Hyunseo"
}
}
output "vpc_name" {
value = module.vpc.name
}
output "vpc_id" {
value = module.vpc.id
}
output "vpc_cidr" {
description = "생성된 VPC의 CIDR영역"
value = module.vpc.cidr_block
}
output "subnet_groups" {
value = {
public = module.subnet_group__public
private = module.subnet_group__private
}
}
module "vpc" {
source = "tedilabs/network/aws//modules/vpc"
version = "0.24.0"
name = var.vpc_name
cidr_block = "10.0.0.0/16"
internet_gateway_enabled = true
dns_hostnames_enabled = true
dns_support_enabled = true
tags = local.common_tags
}
module "subnet_group__public" {
source = "tedilabs/network/aws//modules/subnet-group"
version = "0.24.0"
name = "${module.vpc.name}-public"
vpc_id = module.vpc.id
map_public_ip_on_launch = true
subnets = {
"${module.vpc.name}-public-001/az1" = {
cidr_block = "10.0.0.0/24"
availability_zone_id = "apne2-az1"
}
"${module.vpc.name}-public-002/az2" = {
cidr_block = "10.0.1.0/24"
availability_zone_id = "apne2-az2"
}
}
tags = {}
}
module "subnet_group__private" {
source = "tedilabs/network/aws//modules/subnet-group"
version = "0.24.0"
name = "${module.vpc.name}-private"
vpc_id = module.vpc.id
map_public_ip_on_launch = false
subnets = {
"${module.vpc.name}-private-001/az1" = {
cidr_block = "10.0.10.0/24"
availability_zone_id = "apne2-az1"
}
"${module.vpc.name}-private-002/az2" = {
cidr_block = "10.0.11.0/24"
availability_zone_id = "apne2-az2"
}
}
tags = local.common_tags
}
module "route_table__public" {
source = "tedilabs/network/aws//modules/route-table"
version = "0.24.0"
name = "${module.vpc.name}-public"
vpc_id = module.vpc.id
subnets = module.subnet_group__public.ids
ipv4_routes = [
{
cidr_block = "0.0.0.0/0"
gateway_id = module.vpc.internet_gateway_id
},
]
tags = local.common_tags
}
module "route_table__private" {
source = "tedilabs/network/aws//modules/route-table"
version = "0.24.0"
name = "${module.vpc.name}-private"
vpc_id = module.vpc.id
subnets = module.subnet_group__private.ids
ipv4_routes = []
tags = local.common_tags
}
이렇게 output으로 다양한 정보를 출력할 수 있고, 다양한 인수로 description, sensitive... 등을 주어서 고급 기능들을 사용할 수 있습니다.
정리하면 tf workspace, module은 function, variable은 argument, local은 local variable, output은 return value라고 기본적인 프로그래밍에서의 개념을 차용해 올 수 있겠습니다.
'DevOps > AWS Architecture' 카테고리의 다른 글
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 HCL 조건문 (Conditional) (0) | 2022.07.21 |
---|---|
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 HCL count와 for_each (0) | 2022.07.21 |
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 HCL module (0) | 2022.07.21 |
[ DevOps ] - (VPC) VPC를 구성하는 기본 원리 ( 복습 ) (0) | 2022.07.21 |
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 HCL resource와 data (0) | 2022.07.21 |