為什麼我沒有 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 主題的許可:

{
  "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 取代為通知所針對的區域,將 ACCOUNT_ID 取代為您的帳戶 ID,將 TOPIC_NAME 取代為 SNS 主題名稱,將 ALARM_NAME 取代為警示名稱。

**重要事項:**帳戶中包含在條件中的任何警報都可以發佈至政策中資源的 SNS 主題。例如,警報資源擁有者的帳戶 ID 可以發佈至主題。針對 SNS 主題帳戶 ID 和擁有警報的帳戶 ID,將政策限制為相同的帳戶。

如果您的觸發動作因 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 不會測試或驗證您指定的動作。CloudWatch 也不會偵測您嘗試調用不存在的動作時導致的 Amazon EC2 Auto Scaling 或 Amazon SNS 錯誤。請確定您的動作存在。

相關資訊

使用 Amazon CloudWatch 警示

透過 AWS KMS 加密發佈至 Amazon SNS 的訊息

AWS 官方
AWS 官方已更新 8 個月前