카테고리 없음

AWS + Terraform (Variable)

cwchoiit 2024. 3. 6. 18:41
728x90
반응형
SMALL
728x90
SMALL

 

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 지정 방식들

이러한 변수를 설정하고 지정하는 방식에는 여러 방법이 있는데 문서를 살펴보면 자세히 나와있다.

 

Input Variables - Configuration Language | Terraform | HashiCorp Developer

Input variables allow you to customize modules without altering their source code. Learn how to declare, define, and reference variables in configurations.

developer.hashicorp.com

 

이 문서에 보면 다음과 같은 코드 예시가 있다. 위에서 우리가 작성한 것과 다른 부분은 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"

 

 

728x90
반응형
LIST