アラームの状態が変化した場合に、Amazon Simple Notification Service (Amazon SNS) トピックを介して通知が送信されるように、Amazon CloudWatch アラームを作成しました。しかし、CloudWatch アラームの状態が変わっても、SNS 通知が届きません。
解決方法
SNS 通知の配信は、SNS トピックの設定と CloudWatch アラームによって異なります。SNS 通知が届かない理由を判断するには、CloudWatch アラームの履歴をチェックしてトリガーアクションのステータスを確認します。
SNS アクセスポリシーの制限によりトリガーアクションが失敗した場合、CloudWatch アラーム履歴には次のようなメッセージが表示されます。
"Failed to execute action arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME.Received error: "Resource: arn:aws:cloudwatch:us-east-1:ACCOUNT_ID:alarm:ALARM_NAME is not authorized to perform: SNS:Publish on resource: arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME"" (「アクション arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME を実行できませんでした。受信エラー: "arn:aws:cloudwatch:us-east-1:ACCOUNT_ID:alarm:ALARM_NAME には実行する権限がありません: SNS: リソースで公開: arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME"」)
SNS は、アクセスポリシーを使用して、トピックにメッセージを発行できるソースを制限します。アクセス許可エラーが発生した場合、SNS アクセスポリシーの [Statement] (ステートメント) セクションに次のアクセス許可を追加する必要があります。この更新により、CloudWatch アラームサービスに、SNS トピックにメッセージを発行する許可が付与されます。
注: us-east-1 をこの通知の対象となる AWS リージョンに置き換えてください。ACCOUNT_ID をお使いのアカウント ID に置き換えます。TOPIC_NAME を SNS トピック名に置き換えます。
{
"Sid": "Allow_Publish_Alarms",
"Effect": "Allow",
"Principal": {
"Service": [
"cloudwatch.amazonaws.com"
]
},
"Action": "sns:Publish",
"Resource": "arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME"
}
上記のアクセス許可により、アカウントを使用しているすべてのユーザーがアラームを作成したり、SNS トピックにメッセージを発行したりできます。トピックへのメッセージを公開する機能を特定のアラームに制限するには、グローバル条件キーを追加します。次の例では、ArnLike 条件演算子と aws:SourceArn グローバル条件キーを使用しています。詳細については、「Amazon SNS アクセスコントロールのケース例」を参照してください。
**注:**注: us-east-1 をこの通知の対象となる AWS リージョンに置き換えてください。ACCOUNT_ID をお使いのアカウント ID に置き換えます。TOPIC_NAME を SNS トピック名に置き換えます。ALARM_NAME を次のアラーム名に置き換えます。
{
"Sid": "Allow_Publish_Alarms",
"Effect": "Allow",
"Principal": {
"Service": [
"cloudwatch.amazonaws.com"
]
},
"Action": "sns:Publish",
"Resource": "arn:aws:sns:REGION:ACCOUNT_ID:TOPIC_NAME",
"Condition": {
"ArnLike": {
"aws:SourceArn": "arn:aws:cloudwatch:us-east-1:ACCOUNT_ID:alarm:ALARM_NAME"
}
}
}
SNS トピックの暗号化が原因でトリガーアクションが失敗した場合、CloudWatch アラーム履歴には次のようなメッセージが表示されます。
"Failed to execute action arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME.Received error: "null (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException;)"" (「アクション arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME を実行できませんでした。受信したエラー: "null (サービス: AWSKMS; ステータスコード: 400; エラーコード: AccessDeniedException;)"」)
SNS では、トピックの保管時の暗号化が許可されています。SNS でデフォルトの AWS Key Management Service (AWS KMS) キー alias/aws/sns がこの暗号化に使用されている場合、CloudWatch アラームはメッセージを SNS トピックに発行できません。SNS のデフォルトの AWS KMS キーのポリシーでは、CloudWatch アラームが「kms:Decrypt」と「kms:GenerateDataKey」API 呼び出しを実行することを許可していません。このキーは AWS マネージドであるため、ポリシーを手動で編集することはできません。
SNS トピックを保存時に暗号化する必要がある場合は、カスタマーマネージドキーを使用します。カスタマーマネージドキーには、キーポリシーの [Statement] (ステートメント) セクションに次の許可が含まれている必要があります。この許可により、CloudWatch アラームが、暗号化された SNS トピックにメッセージを発行できるようになります。
{
"Sid": "Allow_CloudWatch_for_CMK",
"Effect": "Allow",
"Principal": {
"Service": [
"cloudwatch.amazonaws.com"
]
},
"Action": [
"kms:Decrypt",
"kms:GenerateDataKey*"
],
"Resource": "*"
}
トリガーアクションが成功すると、CloudWatch アラーム履歴に次のようなメッセージが表示されます。
「Successfully executed action arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME」(「アクション arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME が正常に実行されました」)
これは、CloudWatch アラームが SNS トピックにメッセージを正常に発行したことを意味します。通知が SNS によって配信されなかった場合は、SNS トピックとそのメトリクスで配信の失敗がないかを確認します。詳細については、プッシュ通知の Amazon SNS トピック配信ログにアクセスするにはどうすればよいでしょうかを参照してください。
注: CloudWatch は、指定したアクションをテストまたは検証しません。また、存在しないアクションを呼び出そうとしたために発生した Amazon EC2 Auto Scaling または Amazon SNS エラーも検出しません。アクションが存在することを確認してください。
関連情報
Amazon CloudWatch でのアラームの使用
AWS KMS を使用して Amazon SNS に発行されたメッセージの暗号化