我想使用加密的 Amazon Simple Notification Service (Amazon SNS) 主题配置 Amazon CloudWatch 警报。
简短描述
您必须使用 AWS Key Management Service (AWS KMS) 客户自主管理型密钥才能传送带有 CloudWatch 警报加密 Amazon SNS 主题的 Amazon SNS 通知。如果您使用默认 alias/aws/sns AWS 托管式密钥进行加密,则 CloudWatch 警报无法启动警报操作。然后,您会在 Alarm History(警报历史记录)部分收到类似于以下内容的消息:
“无法执行操作 arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME。已收到错误: “CloudWatch Alarms 无权访问 SNS 主题加密密钥。””
**注意:**Amazon SNS 的默认 AWS KMS 密钥策略不允许 CloudWatch 警报执行 kms:Decrypt 和 kms:GenerateDataKey API 调用。您无法手动编辑 AWS 托管式密钥的策略。
解决方法
要使用加密的 Amazon SNS 主题配置 CloudWatch 警报,请完成以下步骤:
-
打开 Amazon SNS 控制台。
-
选择 Create topic(创建主题)。
-
对于 Type(类型),选择 Standard(标准),然后创建主题名称和显示名称。
-
展开 Encryption - optional(加密 - 可选)设置以打开 Encryption(加密)。
-
选择客户自主管理型密钥。
-
手动编辑密钥策略,以授予 CloudWatch 警报向加密的 Amazon SNS 主题发布消息的 Decrypt 和 GenerateDataKey 权限。
{
"Sid": "Allow_CloudWatch_for_CMK",
"Effect": "Allow",
"Principal": {
"Service": [
"cloudwatch.amazonaws.com"
]
},
"Action": [
"kms:Decrypt",
"kms:GenerateDataKey*"
],
"Resource": "*"
}
-
(可选)要使策略更具限制性,请添加 Condition 元素。例如,以下策略中的 Condition 上下文键仅允许来自组织 o-123456789 的操作:
"Resource": "*"
"Condition": {
"StringEquals": {
"aws:SourceOrgID": "o-123456789"
}
-
确保 Amazon SNS 主题的访问策略包含允许 CloudWatch 警报向 Amazon SNS 主题发布消息的 Publish(发布)权限:
{
"Sid": "Allow_Publish_Alarms",
"Effect": "Allow",
"Principal": {
"Service": [
"cloudwatch.amazonaws.com"
]
},
"Action": "sns:Publish",
"Resource": "arn:aws:sns:example-region:example-account-id:example-topic"}
**注意:**将 example-region 替换为您的 AWS 区域,将 example-account-id 替换为账户 ID,将 example-topic 替换为主题名称。
-
选择 Create topic(创建主题)。
-
根据以下任一条件创建 CloudWatch 警报:
静态阈值
指标数学表达式
Metrics Insights 查询
连接的数据源
异常检测
相关信息
使用 Amazon CloudWatch 警报
使用 AWS KMS 加密发布到 Amazon SNS 的消息
为什么我没有收到我的 Amazon CloudWatch 警报触发器的 SNS 通知?