何度も調べているのでそろそろメモしておく

やりたいこと

var.env に入っている dev stg prod などの環境文字列を基に、共通moduleのresourceやstatementを分岐させたい( dev だけ実装したい)などのケース

そもそも分岐書く必要あるmoduleの構造がそもそもダメじゃん、みたいな話はここではナシ。そういうコードに出会った場合の対処法です。

例: 三項演算子

1
2
3
4
## var.env = "dev"の場合のみ、`Hoge = "hoge"` となる
tags = {
Hoge = var.env == "dev" ? "hoge" : ""
}

例: countを使ってresourceを動的に生成

1
2
3
## var.env = "dev"の場合のみ、 `resource "aws_ecs_service" "moge"` が生成される
resource "aws_ecs_service" "moge" {
count = var.env == "dev" ? 1 : 0

例: dynamicとfor_eachを使ってIAMのstatementを動的に生成

dynamic は、 count が使えないため、 for_each で実装します

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# iam_policy_documentの場合
data "aws_iam_policy_document" "ecs_task_role" {
statement {
effect = "Allow"
actions = [
"[なんらかの権限]",
]
}

dynamic "statement" {
for_each = var.env == "dev" ? [1] : [] ## var.env = "dev"の場合のみ、この `statement` の権限が付与される

content {
actions = [
"[devにだけ追加したい権限]",
]
effect = "Allow"
resources = ["*"]
}
}

statement {
effect = "Allow"
actions = [
"[なんらかの権限]",
]
}
}

dynamicは、CodePipelineの action などでも使用可能です