アラームの状態が変化した場合に、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""
SNS は、アクセスポリシーを使用して、トピックにメッセージを発行できるソースを制限します。アクセス許可エラーが発生した場合、SNS アクセスポリシーのステートメントセクションに次のアクセス許可を追加します。このポリシーの更新により、CloudWatch アラームサービスに、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"
}
**注:**us-east-1 をこの通知の対象となる AWS リージョンに置き換えてください。ACCOUNT_ID をお使いのアカウント ID に置き換えます。TOPIC_NAME を SNS トピック名に置き換えます。
トピックへのメッセージを公開する機能を特定のアラームに制限するには、グローバル条件キーを追加します。次のポリシー例では、ARNLike 条件演算子と aws:SourceArn グローバル条件キーを使用しています。詳細については、Amazon SNS アクセスコントロールのケース例を参照してください。
{
"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"
}
}
}
**注:**us-east-1 をこの通知の対象となる AWS リージョンに置き換えてください。ACCOUNT_ID をお使いのアカウント ID に置き換えます。TOPIC_NAME を SNS トピック名に置き換えます。ALARM_NAME をアラーム名に置き換えます。
**重要:**条件に含まれるアカウントのアラームはすべて、ポリシー内のリソースの SNS トピックに発行できます。たとえば、アラームリソース所有者のアカウント ID をトピックに発行できます。SNS トピックアカウント ID とアラームを所有するアカウント ID の両方に対して、ポリシーを同じアカウントに制限します。
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;)""
SNS では、トピックの保存時の暗号化が許可されています。SNS でデフォルトの AWS Key Management Service (AWS KMS) キー alias/aws/sns がこの暗号化に使用されている場合、CloudWatch アラームはメッセージを SNS トピックに発行できません。SNS のデフォルトの AWS KMS キーのポリシーでは、CloudWatch アラームが kms:Decrypt と kms:GenerateDataKey API 呼び出しを実行することを許可していません。このキーは AWS マネージドであるため、ポリシーを手動で編集することはできません。
SNS トピックを保存時に暗号化する必要がある場合は、カスタマーマネージドキーを使用します。カスタマーマネージドキーには、キーポリシーのステートメントセクションに次の許可が含まれている必要があります。この許可により、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"
これは、CloudWatch アラームが SNS トピックにメッセージを正常に発行したことを意味します。通知が SNS によって配信されなかった場合は、SNS トピックスとそのメトリクスで配信の失敗がないかを確認します。詳細については、プッシュ通知の Amazon SNS トピック配信ログにアクセスするにはどうすればよいですか?を参照してください。
**注:**CloudWatch は、指定したアクションをテストまたは検証しません。また、CloudWatch は、存在しないアクションを呼び出そうとしたために発生した Amazon EC2 Auto Scaling または Amazon SNS エラーも検出しません。アクションが存在することを確認してください。
関連情報
Amazon CloudWatch でのアラームの使用
AWS KMS を使用して Amazon SNS に発行されたメッセージの暗号化