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