【Terraform】Dynamic BlockでModuleのArgumentを出し分ける

業務ではAWS Lambda FunctionをTerraformのModuleで管理しているが、先日Lambda Functionの1つに失敗時のアラートをつけるべく、dead letter queueを設定したいと思い立った。Terraformでは dead_letter_config Argumentを使うことで設定することができる。

registry.terraform.io

しかし、単に dead_letter_config ArgumentをModule内に付け足してしまうと、全てのLambda Functionでdead letter queueの設定をしなければならなくなってしまう。かといってModuleの呼び出し先で特定のArgumentを追加する方法も見当たらず、他のLambda Functionに変更を及ぼさずに済む方法がないか詰まってしまった。

このような場合、Terraform v0.12以上であればDynamic Blockを使うことでArgument自体の出し分けが可能となる。

www.terraform.io

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