業務では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には全く変更は生じない。