CloudWatch アラームトリガーに関する SNS 通知が届かないのはなぜですか?

所要時間2分
0

アラームの状態が変化した場合に、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:Decryptkms: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 に発行されたメッセージの暗号化

コメントはありません