2022.05.03  

【Terraform】複数の項目をfor文で渡す(for each~lookup)

Terraform    

Terraformで複数の項目をfor文で渡す方法について記載します。

今回は下記の構成で、networkディレクトリからterraform applyを実行する想定です。

├module
 |  ├── vpc.tf 
 |  ├── version.tf
 |  └── variables.tf
└network
    ├── network.tf
    ├── locals.tf
    └── config.tf

networkディレクトリ

network.tfからresourceの aws_vpc を読み込んで複数のVPCを作成します。

network.tfでは、locals.tfで定義した設定をfor_eachで受け取り、lookup(each.value,"")`のかたちで値を渡します。

network/network.tf
module "aws_vpc_module"  {
  # 共通設定
  instance_tenancy = "default"   
  enable_dns_support = true  

  # 各VPCごとに異なる部分をループで設定
  for_each  = local.vpc_setting
  cidr_block       = lookup(each.value,"cidr") 
  enable_dns_hostnames =  lookup(each.value,"dns")
  assign_generated_ipv6_cidr_block  =  lookup(each.value,"ipv6")
  name    = lookup(each.value,"name")
  date      = lookup(each.value,"date"
  }
}
network/locals.tf
locals {
  vpc_setting = {
    vpc1 = {
      "cidr" = "192.168.0.0/16"
      "dns" = true
      "ipv6" = false
      "name" = "vpc_no_1'"
      "date" = "20220501"
    },
    vpc2 = {
      cidr" = "10.0.0.0/16"
      "dns" = false
      "ipv6" = true
      "name" = "vpc_no_2'"
      "date" = "20220502"
    },
    vpc3 = {
      "cidr" = "192.168.0.0/16"
      "dns" = true
      "ipv6" = false
      "name" = "vpc_no_3'"
      "date" = "20220503"
    },
  }
}

moduleディレクトリ

network.tf経由で渡されたlocals.tfの設定を元にVPCを作成する処理です。

network.tfで設定された変数はvariables.tf経由でvpc.tfに渡されるので、variables.tfの設定も必要です。

module/vpc.tf
resource "aws_vpc" "vpc" {
  cidr_block       = var.cidr_block
  instance_tenancy = var.instance_tenancy   
  enable_dns_support = var.enable_dns_support
  enable_dns_hostnames  = var.enable_dns_hostnames
  assign_generated_ipv6_cidr_block = var.assign_generated_ipv6_cidr_block

  tags = {
    name    = var.name
    date      =  var.date
  }
}
module/variables.tf
variable "cidr_block" {
    type = string
}
variable "instance_tenancy" {
    type = string
}
variable "enable_dns_support" {
    type = bool
}
variable "enable_dns_hostnames" {
    type = bool
}
variable "assign_generated_ipv6_cidr_block" {
    type = bool
}
variable "name" {
    type = string
}
variable "date" {
    type = string
}
コメント
現在コメントはありません。
コメントする
コメント入力

名前 (※ 必須)

メールアドレス (※ 必須 画面には表示されません)

送信