Terraformで、「AWS SNSトピックのサブスク + エンドポイントがメール」のパターンで、複数のメールアドレスを指定したかった。しかし、通常の記述方法だとエラーになってしまうのである。

それで調べてみたんだが、ほぼ情報が見当たらない。結論から言うと、以下記事参考にしたらできた。この例ではcountで繰り返し処理をしている。

How to add email subscribers to an AWS SNS topic with Terraform

 

参考記事によると、TerraformでSNSサブスクリプションのエンドポイントとしてメールがサポートされたのが、2021年初頭らしい。そのため、それまではこれまたトリッキーな記述をする必要があった模様。ちなみにアドレスが単体であればcoount処理をせずに通常の記述方法で作成可能である。

以下、ほぼパクリだがコード例。delivery_policyはデフォルトでよければ設定必要なしと想定する。

 

##################################################
# E-mail address definition
##################################################

locals {
  emails = ["foo@example.com","bar@example.com"]
}

##################################################
# SNS topic
##################################################

resource "aws_sns_topic" "sns_topic" {
  name            = "sns-test-topic"
  display_name    = "Notification Mail" # メールの差出人として表示される
  delivery_policy = jsonencode({
    "http" : {
      "defaultHealthyRetryPolicy" : {
        "minDelayTarget" : 20,
        "maxDelayTarget" : 20,
        "numRetries" : 3,
        "numMaxDelayRetries" : 0,
        "numNoDelayRetries" : 0,
        "numMinDelayRetries" : 0,
        "backoffFunction" : "linear"
      },
      "disableSubscriptionOverrides" : false,
      "defaultThrottlePolicy" : {
        "maxReceivesPerSecond" : 1
      }
    }
  })
}

##################################################
# SNS topic subscription(for multi e-mail address)
##################################################

resource "aws_sns_topic_subscription" "sns_topic_subs" {
  count     = length(local.emails)
  topic_arn = aws_sns_topic.sns_topic.arn
  protocol  = "email"
  endpoint  = local.emails[count.index]   #ここでlocal変数のメールアドレスを参照
}

 

上記、endpoint = ["foo@example.com","bar@example.com"] でいいじゃないかと思ってそう書くと失敗する。「何でこれでダメなんだ!」となるが仕方ない。簡単そうに見える場所にも何かと罠が潜んでいるTerraformである。

 

Park Park Park


関連がありそうな記事