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である。