跳至內容

為什麼我沒有收到 CloudWatch 警示觸發的 Amazon SNS 通知?

2 分的閱讀內容
0

我已設定 Amazon CloudWatch 警示,讓它在警示狀態變更時將通知傳送至 Amazon Simple Notification Service (Amazon SNS) 主題。但是,當狀態變更時,我沒有收到 SNS 通知。

解決方法

若要判斷為何您未收到 SNS 通知,請檢查 CloudWatch 警示的歷程記錄以檢視觸發動作的狀態。

SNS 存取政策限制

您在 CloudWatch 警示歷程記錄中收到類似以下的錯誤訊息:

「Failed to execute action arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME.Received error: "CloudWatch Alarms is not authorized to perform: SNS:Publish on resource: arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME"」

會發生此錯誤是因為 SNS 存取政策限制了 CloudWatch 對 SNS 主題的存取。

Amazon SNS 使用存取政策來限制可以將訊息發佈至該主題的服務。若要授予 CloudWatch 將訊息發佈至 SNS 主題的權限,請將以下權限陳述式新增至 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 替換為您的 AWS 帳戶 ID,並將 TOPIC_NAME 替換為 SNS 主題名稱。

若要限制特定警示將訊息發佈至主題的能力,請新增全域條件金鑰。以下範例政策使用 ArnLike 條件運算子與 aws:SourceArn 全域條件金鑰:

{  "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 主題的帳戶與擁有警示的帳戶,將政策限制為同一個帳戶。

如需更多資訊,請參閱 Amazon SNS 存取控制的範例案例

SNS 主題加密問題

如果您的觸發動作因為 SNS 主題加密而失敗,則 CloudWatch 警示歷程記錄會顯示類似以下的錯誤訊息:

「Failed to execute action arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME.Received error: "CloudWatch Alarms does not have authorization to access the SNS topic encryption key."」

如果您將 Amazon SNS 設定為使用預設的 AWS Key Management Service (AWS KMS) alias/aws/sns 金鑰進行 伺服器端加密,則 CloudWatch 無法發佈至該 SNS 主題。Amazon SNS 的預設 AWS KMS 金鑰政策不允許 CloudWatch 執行 kms:Decryptkms:GenerateDataKey API 作業。由於 AWS 管理此金鑰,您無法手動編輯該政策。

如果您必須對靜態 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」

如果您未收到 SNS 通知,請檢查 SNS 主題及其指標,確認傳遞是否失敗。如需更多資訊,請參閱如何存取推播通知的 Amazon SNS 主題交付日誌?

CloudWatch 不會測試或驗證您指定的動作。當您嘗試調用不存在的動作時,CloudWatch 也不會偵測 Amazon EC2 Auto Scaling 或 Amazon SNS 發生的錯誤。請確定您的動作確實存在。

相關資訊

使用 Amazon CloudWatch 警示

使用 AWS KMS 加密發佈至 Amazon SNS 的訊息