Terraformで作成したEventBridgeのルールが機能しない
やりたかったこと
AWSコンソールログインがあったらメールでアラートを送信するということを実現したく以下の構成をterraformで作成しました。
起こった問題
この時なぜかメールが送信されないということが起こりました。
Terraformで構築する前にコンソールから同じ環境を構築したのですが
それは動作していたので違いを調査しました。
結論
SNSのアクセスポリシーを設定したら動作するようになりました。
コード
sns/main.tf
resource "aws_sns_topic" "test-login-alert" {
name = "test-login-alert"
fifo_topic = false
}
resource "aws_sns_topic_subscription" "user_updates_sqs_target" {
topic_arn = aws_sns_topic.test-login-alert.arn
protocol = "email"
endpoint = "example@example.com"
}
+ resource "aws_sns_topic_policy" "default" {
+ arn = aws_sns_topic.test-login-alert.arn
+ policy = data.aws_iam_policy_document.sns_topic_policy.json
+ }
+ data "aws_iam_policy_document" "sns_topic_policy" {
+ statement {
+ effect = "Allow"
+ actions = ["SNS:Publish"]
+ principals {
+ type = "Service"
+ identifiers = ["events.amazonaws.com"]
+ }
+ resources = [aws_sns_topic.test-login-alert.arn]
+ }
+ }
経緯
まずコンソールで前述の構成を動作させることができました。
その後同じ環境をterraformから構築しました。
ここで問題が発生しました。
メールが送信されないという状態になりました。
検証1
EventBridgeのルールをまたコンソールから作成してテストしてみました。
するとメールが送信されるようになりました。
この時terraformで作成したルールも反応するようになり
メールは2通送信されるようになりました。
検証2
何はともあれ動作したのでコンソールから作成したルールを削除しました。
するとメールが反応しなくなりました。
検証3
aws cliでEvent Bridgeのルールを取得して情報を見比べてみましたが違いはありませんでした。
検証4
原因がわからず後は権限周りかな〜と思い色々検索してみたところ以下のページを発見することができました。
確認
前述の参考ページに習ってEventBeidgeコンソールから
[左メニューのルール] → [ルールを選択] → [モニタリングタブ]を確認しました。
FailedInvocationsのグラフに信号が確認できました。
これはEventBridgeからSNSに信号が送られて失敗しましたというものが計測された証拠なので
SNS側のアクセスポリシーが怪しいと予測を立てることができます。
原因
前述の通りコンソールからEventBridgeのルールを作成するとSNSのアクセスポリシーが裏側で作成されることが確認できました。
つまりTerraformでSNSを作成する際にアクセスポリシーの設定が足りておらずそれを追加したら動作するようになりました。
アクセスポリシー
AWS SNSコンソールから[左メニュートピック] → [アクセスポリシータブ]を開き
以下のようにEventBridgeからの通信が許可されていればOKです。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "events.amazonaws.com"
},
"Action": "SNS:Publish",
"Resource": "arn:aws:sns:us-east-1:xxxxxxxxxxxxxxxxx:aws-topic-name"
}
]
}
参考ページ
Discussion