為什麼我沒有 CloudWatch 警報觸發的 SNS 通知?

2 分的閱讀內容
0

我建立了 Amazon CloudWatch 警報,以便在警報狀態變更時透過 Amazon Simple Notification Service (Amazon SNS) 主題傳送通知。但是,當 CloudWatch 警報變更狀態時,我並未收到 SNS 通知。

解決方法

SNS 通知傳遞取決於 SNS 主題和 CloudWatch 警報的組態。若要確定您沒有收到 SNS 通知的原因,請檢查 CloudWatch 警報歷程以查看觸發動作的狀態。

如果您的觸發動作因 SNS 存取政策限制而失敗,CloudWatch 警報歷程即會顯示類似於下列訊息的訊息:

「無法執行動作 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 存取政策的陳述式區段下方新增下列權限。此更新會向 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 警報歷程即會顯示類似於下列訊息的訊息:

「無法執行動作 arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME。收到的錯誤:『null(服務: AWSKMS;狀態碼: 400;錯誤碼: AccessDeniedException;)』」

SNS 允許其主題進行靜態加密。如果 SNS 對此加密使用預設的 AWS Key Management Service (AWS KMS) 金鑰別名/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 警報歷程即會顯示類似於下列訊息的訊息:

「成功執行動作 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 的訊息

AWS 官方
AWS 官方已更新 1 年前