【Terraform】Dynamic BlockでModuleのArgumentを出し分ける
業務ではAWS Lambda FunctionをTerraformのModuleで管理しているが、先日Lambda Functionの1つに失敗時のアラートをつけるべく、dead letter queueを設定したいと思い立った。Terraformでは dead_letter_config
Argumentを使うことで設定することができる。
しかし、単に dead_letter_config
ArgumentをModule内に付け足してしまうと、全てのLambda Functionでdead letter queueの設定をしなければならなくなってしまう。かといってModuleの呼び出し先で特定のArgumentを追加する方法も見当たらず、他のLambda Functionに変更を及ぼさずに済む方法がないか詰まってしまった。
このような場合、Terraform v0.12以上であればDynamic Blockを使うことでArgument自体の出し分けが可能となる。
Dynamic Blockは、resource内でネストされるブロックに対して使うことで、同じ構造のブロックを動的に生成できるようになるもの。ネストしたブロックを使って記述するArgument限定ではあるが、引数を空にすることでそのブロックを生成させないこともできる。
今回の場合、Moduleに以下のような記述を追加した。
variable "dead_letter_config_target" { default = [] type = list description = "(Optional) arn of dead_letter_config's target" }
resource "aws_lambda_function" "lambda" { # other arguments dynamic "dead_letter_config" { for_each = toset(var.dead_letter_config_target) content { target_arn = dead_letter_config.value } }
Lambda FunctionのModuleの中で、 dead_letter_config
の設定をDynamic Blockで作るようにする。この中では、 dead_letter_config_target
で指定したリスト内の要素がループされ、 target_arn
の値として使われる。
そのうえで、dead_letter_queueを使いたいLambda Functionで、Module呼び出しの際に dead_letter_config_target
変数を指定する。
module "udomomo-lambda-function" { source = "../module/lambda" # specify other variable dead_letter_config_target = ["arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:target-sns"] }
これでこのLambda Functionのみ dead_letter_config
の設定が追加される。 dead_letter_config_target
変数を指定しなければ、他のLambda Functionには全く変更は生じない。