Variables
이번엔 Variable을 사용해서 코드에서 사용할 수 있도록 해보자.
이전 포스팅에서 사용했던 main.tf 파일에서 다음을 추가한다.
variable "vpc_name" {
}
이 코드는 vpc_name 이라는 변수를 만든 것이다. 여기에 기본값을 설정하지 않으면 Apply를 할 때 변수 이름을 받도록 되어 있다.
그래서 이 변수를 사용해보기 위해 VPC의 name 값을 var.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 = {}
}
최종 소스 코드는 다음과 같다.
#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}-public-002/az2" = {
cidr_block = "10.0.11.0/24"
availability_zone_id = "apne2-az2"
}
}
tags = {}
}
Apply를 실행해보자. 다음과 같이 변수 값을 받는다. 이는 vpc_name의 기본값을 설정해주지 않았기 때문이다.
나는 다음과 같이 변수값을 지정했다.
이렇게 하고 Enter를 입력하면 이제 Plan 정보들이 나온다.
그 Plan 정보를 잘 보면 내가 넣은 "tftf"값이 보여진다.
이제 생성을 완료해서 AWS Console에서 확인해보자. 잘 만들어졌다.
Variables 지정 방식들
이러한 변수를 설정하고 지정하는 방식에는 여러 방법이 있는데 문서를 살펴보면 자세히 나와있다.
이 문서에 보면 다음과 같은 코드 예시가 있다. 위에서 우리가 작성한 것과 다른 부분은 type을 지정한다거나 default 값을 지정한다.
variable "image_id" {
type = string
}
variable "availability_zone_names" {
type = list(string)
default = ["us-west-1a"]
}
variable "docker_ports" {
type = list(object({
internal = number
external = number
protocol = string
}))
default = [
{
internal = 8300
external = 8300
protocol = "tcp"
}
]
}
실행 시 옵션으로 변수 지정
그리고 이 변수에 기본값을 지정했더라도 다음처럼 실행 시 변수값을 변경할 수 있다.
terraform apply -var="image_id=ami-abc123"
terraform apply -var='image_id_list=["ami-abc123","ami-def456"]' -var="instance_type=t2.micro"
terraform apply -var='image_id_map={"us-east-1":"ami-abc123","us-east-2":"ami-def456"}'
환경변수로 등록해서 변수 지정
또는 다음과 같이 환경변수로도 설정할 수 있다.
export TF_VAR_image_id=ami-abc123
변수 파일(.tfvars / .tfvars.json)로 변수 지정
또는 다음과 같이 여러 변수가 있는 경우 변수만을 위한 파일을 만들어서 그 파일을 가리키게 할 수 있다.
파일명은 ".tfvars" 또는 ".tfvars.json"형식이어야 한다.
근데, 기본으로 파일명은 "terraform.tfvars"라는 파일만을 바라보게 되어있다. 그래서 이런 파일명이 아닌 경우 Apply시에 인지를 못하는데 그 때 해결하는 방법은 다음처럼 실행 시 옵션을 주는 것이다.
terraform apply -var-file="testing.tfvars"
이 변수 파일은 main.tf 파일이랑 같은 경로에 있으면 된다. 그리고 아래와 같이 작성해주면 된다.
#terraform.tfvars
vpc_name = "varsfile"
Local Variables
이 Local Variable은 main.tf 파일 내에서만 공통으로 사용할 변수를 선언하고 그 변수를 사용하기에 적합한 방식이다.
기존 main.tf 파일에 다음과 같은 코드를 추가해보자.
locals {
common_tags = {
Project = "Network"
Owner = "cwchoi"
}
}
그리고 이 로컬 변수를 각 모듈의 태그에서 사용해보자.
provider "aws" {
region = "ap-northeast-2"
}
variable "vpc_name" {
}
locals {
common_tags = {
Project = "Network"
Owner = "cwchoi"
}
}
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 = local.common_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}-public-002/az2" = {
cidr_block = "10.0.11.0/24"
availability_zone_id = "apne2-az2"
}
}
tags = local.common_tags
}
이렇게 해당 파일 내에서 반복적으로 사용되는 변수를 로컬 변수라는 형식으로 지정할 수 있다.
Outputs
Outputs은 Apply를 진행 후 결과를 저장할 때 사용한다. 예를 들어 다음과 같은 코드를 추가했다고 가정해보자.
output "vpc_name" {
value = module.vpc.name
}
output "vpc_id" {
value = module.vpc.id
}
output "public_subnet_group" {
value = module.subnet_group__public
}
output "subnets" {
value = {
public = module.subnet_group__public
private = module.subnet_group__private
}
}
지금 3개의 output이 있는것을 확인할 수 있다. 이렇게 3개의 아웃풋이 Apply를 진행 후 만들어지는 데이터라고 생각하면 된다.
이 Output을 다른곳에서 가져다가 사용할 수도 있고 Apply 진행 후 결과를 알고 싶을때도 사용할 수 있다. Apply를 해보자.
다음과 같은 Outputs 결과를 볼 수 있다.
public_subnet_group = {
"arns" = [
"arn:aws:ec2:ap-northeast-2:135149110460:subnet/subnet-0a3d08dd50460e153",
"arn:aws:ec2:ap-northeast-2:135149110460:subnet/subnet-00c04ce3dead87b6d",
]
"availability_zone_ids" = tolist([
"apne2-az1",
"apne2-az2",
])
"availability_zones" = tolist([
"ap-northeast-2a",
"ap-northeast-2b",
])
"cache_subnet_group_id" = null
"cidr_blocks" = [
"10.0.0.0/24",
"10.0.1.0/24",
]
"dax_subnet_group_id" = null
"db_subnet_group_arn" = null
"db_subnet_group_id" = null
"dms_replication_subnet_group_id" = null
"docdb_subnet_group_arn" = null
"docdb_subnet_group_id" = null
"ids" = [
"subnet-0a3d08dd50460e153",
"subnet-00c04ce3dead87b6d",
]
"ipv6_cidr_blocks" = tolist([])
"name" = "varsfile-public"
"neptune_subnet_group_arn" = null
"neptune_subnet_group_id" = null
"redshift_subnet_group_arn" = null
"redshift_subnet_group_id" = null
"subnets" = [
{
"arn" = "arn:aws:ec2:ap-northeast-2:135149110460:subnet/subnet-0a3d08dd50460e153"
"assign_ipv6_address_on_creation" = false
"availability_zone" = "ap-northeast-2a"
"availability_zone_id" = "apne2-az1"
"cidr_block" = "10.0.0.0/24"
"customer_owned_ipv4_pool" = ""
"enable_dns64" = false
"enable_lni_at_device_index" = 0
"enable_resource_name_dns_a_record_on_launch" = false
"enable_resource_name_dns_aaaa_record_on_launch" = false
"id" = "subnet-0a3d08dd50460e153"
"ipv6_cidr_block" = ""
"ipv6_cidr_block_association_id" = ""
"ipv6_native" = false
"map_customer_owned_ip_on_launch" = false
"map_public_ip_on_launch" = true
"outpost_arn" = ""
"owner_id" = "135149110460"
"private_dns_hostname_type_on_launch" = "ip-name"
"tags" = tomap({
"Name" = "varsfile-public-001/az1"
"Owner" = "cwchoi"
"Project" = "Network"
"module.terraform.io/full-name" = "terraform-aws-network/subnet-group"
"module.terraform.io/instance" = "varsfile-public"
"module.terraform.io/name" = "subnet-group"
"module.terraform.io/package" = "terraform-aws-network"
"module.terraform.io/version" = "0.24.0"
})
"tags_all" = tomap({
"Name" = "varsfile-public-001/az1"
"Owner" = "cwchoi"
"Project" = "Network"
"module.terraform.io/full-name" = "terraform-aws-network/subnet-group"
"module.terraform.io/instance" = "varsfile-public"
"module.terraform.io/name" = "subnet-group"
"module.terraform.io/package" = "terraform-aws-network"
"module.terraform.io/version" = "0.24.0"
})
"timeouts" = null /* object */
"vpc_id" = "vpc-01166744a0ba4ca4a"
},
{
"arn" = "arn:aws:ec2:ap-northeast-2:135149110460:subnet/subnet-00c04ce3dead87b6d"
"assign_ipv6_address_on_creation" = false
"availability_zone" = "ap-northeast-2b"
"availability_zone_id" = "apne2-az2"
"cidr_block" = "10.0.1.0/24"
"customer_owned_ipv4_pool" = ""
"enable_dns64" = false
"enable_lni_at_device_index" = 0
"enable_resource_name_dns_a_record_on_launch" = false
"enable_resource_name_dns_aaaa_record_on_launch" = false
"id" = "subnet-00c04ce3dead87b6d"
"ipv6_cidr_block" = ""
"ipv6_cidr_block_association_id" = ""
"ipv6_native" = false
"map_customer_owned_ip_on_launch" = false
"map_public_ip_on_launch" = true
"outpost_arn" = ""
"owner_id" = "135149110460"
"private_dns_hostname_type_on_launch" = "ip-name"
"tags" = tomap({
"Name" = "varsfile-public-002/az2"
"Owner" = "cwchoi"
"Project" = "Network"
"module.terraform.io/full-name" = "terraform-aws-network/subnet-group"
"module.terraform.io/instance" = "varsfile-public"
"module.terraform.io/name" = "subnet-group"
"module.terraform.io/package" = "terraform-aws-network"
"module.terraform.io/version" = "0.24.0"
})
"tags_all" = tomap({
"Name" = "varsfile-public-002/az2"
"Owner" = "cwchoi"
"Project" = "Network"
"module.terraform.io/full-name" = "terraform-aws-network/subnet-group"
"module.terraform.io/instance" = "varsfile-public"
"module.terraform.io/name" = "subnet-group"
"module.terraform.io/package" = "terraform-aws-network"
"module.terraform.io/version" = "0.24.0"
})
"timeouts" = null /* object */
"vpc_id" = "vpc-01166744a0ba4ca4a"
},
]
"vpc_id" = "vpc-01166744a0ba4ca4a"
}
subnets = {
"private" = {
"arns" = [
"arn:aws:ec2:ap-northeast-2:135149110460:subnet/subnet-0396c6b38c61fb88f",
"arn:aws:ec2:ap-northeast-2:135149110460:subnet/subnet-058b0d0699a85f174",
]
"availability_zone_ids" = tolist([
"apne2-az1",
"apne2-az2",
])
"availability_zones" = tolist([
"ap-northeast-2a",
"ap-northeast-2b",
])
"cache_subnet_group_id" = null
"cidr_blocks" = [
"10.0.10.0/24",
"10.0.11.0/24",
]
"dax_subnet_group_id" = null
"db_subnet_group_arn" = null
"db_subnet_group_id" = null
"dms_replication_subnet_group_id" = null
"docdb_subnet_group_arn" = null
"docdb_subnet_group_id" = null
"ids" = [
"subnet-0396c6b38c61fb88f",
"subnet-058b0d0699a85f174",
]
"ipv6_cidr_blocks" = tolist([])
"name" = "varsfile-private"
"neptune_subnet_group_arn" = null
"neptune_subnet_group_id" = null
"redshift_subnet_group_arn" = null
"redshift_subnet_group_id" = null
"subnets" = [
{
"arn" = "arn:aws:ec2:ap-northeast-2:135149110460:subnet/subnet-0396c6b38c61fb88f"
"assign_ipv6_address_on_creation" = false
"availability_zone" = "ap-northeast-2a"
"availability_zone_id" = "apne2-az1"
"cidr_block" = "10.0.10.0/24"
"customer_owned_ipv4_pool" = ""
"enable_dns64" = false
"enable_lni_at_device_index" = 0
"enable_resource_name_dns_a_record_on_launch" = false
"enable_resource_name_dns_aaaa_record_on_launch" = false
"id" = "subnet-0396c6b38c61fb88f"
"ipv6_cidr_block" = ""
"ipv6_cidr_block_association_id" = ""
"ipv6_native" = false
"map_customer_owned_ip_on_launch" = false
"map_public_ip_on_launch" = false
"outpost_arn" = ""
"owner_id" = "135149110460"
"private_dns_hostname_type_on_launch" = "ip-name"
"tags" = tomap({
"Name" = "varsfile-private-001/az1"
"Owner" = "cwchoi"
"Project" = "Network"
"module.terraform.io/full-name" = "terraform-aws-network/subnet-group"
"module.terraform.io/instance" = "varsfile-private"
"module.terraform.io/name" = "subnet-group"
"module.terraform.io/package" = "terraform-aws-network"
"module.terraform.io/version" = "0.24.0"
})
"tags_all" = tomap({
"Name" = "varsfile-private-001/az1"
"Owner" = "cwchoi"
"Project" = "Network"
"module.terraform.io/full-name" = "terraform-aws-network/subnet-group"
"module.terraform.io/instance" = "varsfile-private"
"module.terraform.io/name" = "subnet-group"
"module.terraform.io/package" = "terraform-aws-network"
"module.terraform.io/version" = "0.24.0"
})
"timeouts" = null /* object */
"vpc_id" = "vpc-01166744a0ba4ca4a"
},
{
"arn" = "arn:aws:ec2:ap-northeast-2:135149110460:subnet/subnet-058b0d0699a85f174"
"assign_ipv6_address_on_creation" = false
"availability_zone" = "ap-northeast-2b"
"availability_zone_id" = "apne2-az2"
"cidr_block" = "10.0.11.0/24"
"customer_owned_ipv4_pool" = ""
"enable_dns64" = false
"enable_lni_at_device_index" = 0
"enable_resource_name_dns_a_record_on_launch" = false
"enable_resource_name_dns_aaaa_record_on_launch" = false
"id" = "subnet-058b0d0699a85f174"
"ipv6_cidr_block" = ""
"ipv6_cidr_block_association_id" = ""
"ipv6_native" = false
"map_customer_owned_ip_on_launch" = false
"map_public_ip_on_launch" = false
"outpost_arn" = ""
"owner_id" = "135149110460"
"private_dns_hostname_type_on_launch" = "ip-name"
"tags" = tomap({
"Name" = "varsfile-public-002/az2"
"Owner" = "cwchoi"
"Project" = "Network"
"module.terraform.io/full-name" = "terraform-aws-network/subnet-group"
"module.terraform.io/instance" = "varsfile-private"
"module.terraform.io/name" = "subnet-group"
"module.terraform.io/package" = "terraform-aws-network"
"module.terraform.io/version" = "0.24.0"
})
"tags_all" = tomap({
"Name" = "varsfile-public-002/az2"
"Owner" = "cwchoi"
"Project" = "Network"
"module.terraform.io/full-name" = "terraform-aws-network/subnet-group"
"module.terraform.io/instance" = "varsfile-private"
"module.terraform.io/name" = "subnet-group"
"module.terraform.io/package" = "terraform-aws-network"
"module.terraform.io/version" = "0.24.0"
})
"timeouts" = null /* object */
"vpc_id" = "vpc-01166744a0ba4ca4a"
},
]
"vpc_id" = "vpc-01166744a0ba4ca4a"
}
"public" = {
"arns" = [
"arn:aws:ec2:ap-northeast-2:135149110460:subnet/subnet-0a3d08dd50460e153",
"arn:aws:ec2:ap-northeast-2:135149110460:subnet/subnet-00c04ce3dead87b6d",
]
"availability_zone_ids" = tolist([
"apne2-az1",
"apne2-az2",
])
"availability_zones" = tolist([
"ap-northeast-2a",
"ap-northeast-2b",
])
"cache_subnet_group_id" = null
"cidr_blocks" = [
"10.0.0.0/24",
"10.0.1.0/24",
]
"dax_subnet_group_id" = null
"db_subnet_group_arn" = null
"db_subnet_group_id" = null
"dms_replication_subnet_group_id" = null
"docdb_subnet_group_arn" = null
"docdb_subnet_group_id" = null
"ids" = [
"subnet-0a3d08dd50460e153",
"subnet-00c04ce3dead87b6d",
]
"ipv6_cidr_blocks" = tolist([])
"name" = "varsfile-public"
"neptune_subnet_group_arn" = null
"neptune_subnet_group_id" = null
"redshift_subnet_group_arn" = null
"redshift_subnet_group_id" = null
"subnets" = [
{
"arn" = "arn:aws:ec2:ap-northeast-2:135149110460:subnet/subnet-0a3d08dd50460e153"
"assign_ipv6_address_on_creation" = false
"availability_zone" = "ap-northeast-2a"
"availability_zone_id" = "apne2-az1"
"cidr_block" = "10.0.0.0/24"
"customer_owned_ipv4_pool" = ""
"enable_dns64" = false
"enable_lni_at_device_index" = 0
"enable_resource_name_dns_a_record_on_launch" = false
"enable_resource_name_dns_aaaa_record_on_launch" = false
"id" = "subnet-0a3d08dd50460e153"
"ipv6_cidr_block" = ""
"ipv6_cidr_block_association_id" = ""
"ipv6_native" = false
"map_customer_owned_ip_on_launch" = false
"map_public_ip_on_launch" = true
"outpost_arn" = ""
"owner_id" = "135149110460"
"private_dns_hostname_type_on_launch" = "ip-name"
"tags" = tomap({
"Name" = "varsfile-public-001/az1"
"Owner" = "cwchoi"
"Project" = "Network"
"module.terraform.io/full-name" = "terraform-aws-network/subnet-group"
"module.terraform.io/instance" = "varsfile-public"
"module.terraform.io/name" = "subnet-group"
"module.terraform.io/package" = "terraform-aws-network"
"module.terraform.io/version" = "0.24.0"
})
"tags_all" = tomap({
"Name" = "varsfile-public-001/az1"
"Owner" = "cwchoi"
"Project" = "Network"
"module.terraform.io/full-name" = "terraform-aws-network/subnet-group"
"module.terraform.io/instance" = "varsfile-public"
"module.terraform.io/name" = "subnet-group"
"module.terraform.io/package" = "terraform-aws-network"
"module.terraform.io/version" = "0.24.0"
})
"timeouts" = null /* object */
"vpc_id" = "vpc-01166744a0ba4ca4a"
},
{
"arn" = "arn:aws:ec2:ap-northeast-2:135149110460:subnet/subnet-00c04ce3dead87b6d"
"assign_ipv6_address_on_creation" = false
"availability_zone" = "ap-northeast-2b"
"availability_zone_id" = "apne2-az2"
"cidr_block" = "10.0.1.0/24"
"customer_owned_ipv4_pool" = ""
"enable_dns64" = false
"enable_lni_at_device_index" = 0
"enable_resource_name_dns_a_record_on_launch" = false
"enable_resource_name_dns_aaaa_record_on_launch" = false
"id" = "subnet-00c04ce3dead87b6d"
"ipv6_cidr_block" = ""
"ipv6_cidr_block_association_id" = ""
"ipv6_native" = false
"map_customer_owned_ip_on_launch" = false
"map_public_ip_on_launch" = true
"outpost_arn" = ""
"owner_id" = "135149110460"
"private_dns_hostname_type_on_launch" = "ip-name"
"tags" = tomap({
"Name" = "varsfile-public-002/az2"
"Owner" = "cwchoi"
"Project" = "Network"
"module.terraform.io/full-name" = "terraform-aws-network/subnet-group"
"module.terraform.io/instance" = "varsfile-public"
"module.terraform.io/name" = "subnet-group"
"module.terraform.io/package" = "terraform-aws-network"
"module.terraform.io/version" = "0.24.0"
})
"tags_all" = tomap({
"Name" = "varsfile-public-002/az2"
"Owner" = "cwchoi"
"Project" = "Network"
"module.terraform.io/full-name" = "terraform-aws-network/subnet-group"
"module.terraform.io/instance" = "varsfile-public"
"module.terraform.io/name" = "subnet-group"
"module.terraform.io/package" = "terraform-aws-network"
"module.terraform.io/version" = "0.24.0"
})
"timeouts" = null /* object */
"vpc_id" = "vpc-01166744a0ba4ca4a"
},
]
"vpc_id" = "vpc-01166744a0ba4ca4a"
}
}
vpc_id = "vpc-01166744a0ba4ca4a"
vpc_name = "varsfile"
'AWS' 카테고리의 다른 글
AWS DynamoDB를 Python과 연동해보기 (2) | 2024.03.05 |
---|---|
AWS Lambda와 DynamoDB를 연동해보기 (0) | 2024.03.04 |
AWS Lambda와 Step functions (0) | 2024.03.04 |
AWS Lambda와 Layers (0) | 2024.03.04 |
AWS Lambda와 API Gateway로 Canary Release 하기 (0) | 2024.03.03 |