0
0

for_eachでterraformリソースの作成を条件分岐する

Posted at

やりたいこと

varファイルにリソースを作成するか否かをtrue or falseで記載し、trueの場合のみリソースを作成する。

背景

AWSの検証用にterraformでリソース作成をしているのですが、検証パターンによっては、作成したくないリソースがいくつかあったので、varファイルの内容を書き換えるだけでリソース作成を操作したかった。
今回は、プライベートに配置したEC2にSSM接続する際に必要なvpc endpointを例に記載していきます。

コード

network.tf

resource "aws_vpc_endpoint" "this" {
  for_each            = var.creat_vpc_endpoint ? local.vpc_endpoint : {}
  vpc_id              = aws_vpc.this.id
  service_name        = each.value.service_name
  vpc_endpoint_type   = each.value.vpc_endpoint_type
  subnet_ids          = each.value.subnet_ids
  private_dns_enabled = true

variables.tf

creat_vpc_endpoint     = true

locals.tf

locals {
  vpc_endpoint = {
    ssm = {
      service_name      = "com.amazonaws.ap-northeast-1.ssm"
      vpc_endpoint_type = "Interface"
      subnet_ids        = [aws_subnet.private["private_subnet_1a"].id, aws_subnet.private["private_subnet_1c"].id]
    }
    ssmmessages = {
      service_name      = "com.amazonaws.ap-northeast-1.ssmmessages"
      vpc_endpoint_type = "Interface"
      subnet_ids        = [aws_subnet.private["private_subnet_1a"].id, aws_subnet.private["private_subnet_1c"].id]
    }
    ec2messages = {
      service_name      = "com.amazonaws.ap-northeast-1.ec2messages"
      vpc_endpoint_type = "Interface"
      subnet_ids        = [aws_subnet.private["private_subnet_1a"].id, aws_subnet.private["private_subnet_1c"].id]
    }
  }
}

上記でポイントとなるのは、下記の部分で、varファイルのcreat_vpc_endpointがtrueの場合のみ、local.vpc_endpointが参照されます。

  for_each            = var.creat_vpc_endpoint ? local.vpc_endpoint : {}

falseの場合は、空のオブジェクトが渡されるのでリソースは作成されません。

悩んだこと

条件分岐ならcountでも同様のことができるのですが、以下がデメリットと感じて今回はfor_eachを使用しました。

  • 作成されるリソースにインデックスが付与される
  • 他リソースから参照する際に、インデックスを指定する必要があり、変更が煩雑になる

もちろんcountを使用するメリットもあると思うので、そこは使用する際に調べてみたほうがいいかもしれません。

終わりに

terraformはとても便利ですが、一歩間違えると思いもよらないリソースを作成してしまったりするので、わかりやすい命名規則、仕組みが重要だと感じます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0