Amazon CloudWatch 事件
用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

排除 CloudWatch Events 的故障

您可以使用此部分中的步骤排除 CloudWatch Events 的故障。

我的规则已触发,但未调用我的 Lambda 函数

确保您已经为您的 Lambda 函数设置了正确的权限。使用 AWS CLI 运行以下命令 (将函数名替换为您的函数并使用函数所在的 AWS 区域):

Copy
aws lambda get-policy --function-name MyFunction --region us-east-1

您应该可以看到类似于如下所示的输出内容:

Copy
{ "Policy": "{\"Version\":\"2012-10-17\", \"Statement\":[ {\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:events:us-east-1:123456789012:rule/MyRule\"}}, \"Action\":\"lambda:InvokeFunction\", \"Resource\":\"arn:aws:lambda:us-east-1:123456789012:function:MyFunction\", \"Effect\":\"Allow\", \"Principal\":{\"Service\":\"events.amazonaws.com\"}, \"Sid\":\"MyId\"} ], \"Id\":\"default\"}" }

如果您看到以下内容:

Copy
A client error (ResourceNotFoundException) occurred when calling the GetPolicy operation: The resource you requested does not exist.

或者,您看到输出,但无法将 events.amazonaws.com 定位为策略中的受信任实体,请运行以下命令:

Copy
aws lambda add-permission \ --function-name MyFunction \ --statement-id MyId \ --action 'lambda:InvokeFunction' \ --principal events.amazonaws.com \ --source-arn arn:aws:events:us-east-1:123456789012:rule/MyRule

注意

如果策略不正确,您还可以在 CloudWatch Events 控制台中编辑规则,方式是删除策略并将策略重新添加到规则中。CloudWatch Events 控制台将设置目标的正确权限。

如果您使用特定的 Lambda 别名或版本,则必须在 --qualifieraws lambda get-policy 命令中添加 aws lambda add-permission 参数。

Copy
aws lambda add-permission \ --function-name MyFunction \ --statement-id MyId \ --action 'lambda:InvokeFunction' \ --principal events.amazonaws.com \ --source-arn arn:aws:events:us-east-1:123456789012:rule/MyRule --qualifier alias or version

Lambda 函数无法触发的另一个原因是,您在运行 get-policy 时看到的策略包含 SourceAccount 字段。SourceAccount 设置会导致 CloudWatch Events 无法调用该函数。

我刚刚创建/修改了规则,但规则未匹配测试事件

在更改规则或其目标时,传入事件可能无法立即开始或停止与新的或更新后的规则的匹配。请稍等片刻,以便更改生效。如果在一段时间后事件仍未匹配,您也可以检查 CloudWatch 中的多个事件指标 (例如 TriggeredRulesInvocationsFailedInvocations) 以进一步调试。

您还可以执行 TestEventPattern 操作,以使用测试事件来测试规则的事件模式,确保规则的事件模式设置正确。有关详细信息,请参阅 Amazon CloudWatch Events API 参考 中的 TestEventPattern

我的规则未在 ScheduleExpression 中指定的时间自触发

ScheduleExpressions 用 UTC 表示。确保已采用 UTC 时区设置使规则自触发的计划。如果 ScheduleExpression 正确,则按照 我刚刚创建/修改了规则,但规则未匹配测试事件 下的步骤操作。

我的规则时未在我期望的时间自触发

当您创建每一个规定时间段都会运行的规则时,CloudWatch Events 不支持设置精确的开始时间。规则一旦创建,倒计时立即开始。

您可以使用 cron 表达式在指定时间调用目标。例如,您可以使用 cron 表达式创建每 4 小时触发一次 (整点时触发) 的规则。在 CloudWatch 控制台中,您将使用 cron 表达式 0 0/4 * * ? *;而在 AWS CLI 中,您将使用 cron 表达式 cron(0 0/4 * * ? *)。例如,要使用 AWS CLI 创建一个每 4 小时会触发一次的名为 TestRule 的规则,您应该在命令提示符窗口键入以下内容:

Copy
aws events put-rule --name TestRule --schedule-expression 'cron(0 0/4 * * ? *)'

您可以使用 0/5 * * * ? * cron 表达式创建一个每 5 分钟触发一次的规则。例如:

Copy
aws events put-rule --name TestRule --schedule-expression 'cron(0/5 * * * ? *)'

CloudWatch Events 不在计划表达式中提供第二级精度。使用 cron 表达式的最高解析精度是一分钟。由于 CloudWatch Events 和目标服务的分布式特性,计划规则触发时间与目标服务实际执行目标资源的时间之间的延迟可能有几秒钟。您的计划规则会在这一分钟内触发,但不会精确到在 0 秒时触发。

我的规则匹配 IAM API 调用但未触发

IAM 服务仅在 美国东部(弗吉尼亚北部)地区 中可用,因此来自 IAM 的任何 AWS API 调用事件仅在该区域内可用。有关更多信息,请参阅 CloudWatch Events 的事件类型示例

我的规则不起作用,因为与规则关联的 IAM 角色在规则触发时被忽略

规则的 IAM 角色仅用于将事件与 Kinesis 流关联。对于 Lambda 函数和 Amazon SNS 主题,您需要提供基于资源的权限。

确保您的区域 AWS STS 终端节点已启用。在承担您提供的 IAM 角色时,CloudWatch Events 会与区域 AWS STS 终端节点进行通信。有关详细信息,请参阅 IAM 用户指南 中的在 AWS 区域中激活和停用 AWS STS

我创建了一个包含应与资源匹配的 EventPattern 的规则,但我未看到与该规则匹配的任何事件

AWS 中的大多数服务会在 Amazon 资源名称 (ARN) 中将 : 或 / 视为相同的字符。不过,CloudWatch Events 在事件模式和规则中使用精确匹配。请在创建事件模式时务必使用正确的 ARN 字符,以使其匹配需要匹配的事件中的 ARN 语法。

此外,并非每个事件都具有已填写的 resources 字段 (例如,来自 CloudTrail 的 AWS API 调用事件)。

向目标传输我的事件时存在延迟

Amazon CloudWatch Events 会在长达 24 小时内一直尝试传输事件到目标 。事件一旦到达事件流,立即会进行第一次尝试。但是,如果目标服务遇到问题或您的账户被阻止,CloudWatch Events 会自动重新计划将来的另一次传输。如果从事件到达时算起过去了 24 小时,则不再计划更多的尝试,而且 FailedInvocations 指标会发布在 Amazon CloudWatch 中。

我的规则在回应两次相同事件时被多次触发。CloudWatch Events 提供了什么有关触发规则或传输事件到目标的保证?

Amazon CloudWatch Events 保证在响应一个事件或计划时至少触发一次规则。在很少的情况下,同一规则可能会因一个事件或计划事件而被多次触发,或同一目标可能会因特定的已触发规则而被多次调用。

我的规则正在被触发,但我发现没有任何消息发布到我的 Amazon SNS 主题

确保您已经为您的 Amazon SNS 主题设置了正确的权限。使用 AWS CLI 运行以下命令 (将主题 ARN 替换为您的主题并使用主题所在的 AWS 区域):

Copy
aws sns get-topic-attributes --region us-east-1 --topic-arn "arn:aws:sns:us-east-1:123456789012:MyTopic"

您应该可以看到类似如下所示的策略属性:

Copy
"{\"Version\":\"2012-10-17\", \"Id\":\"__default_policy_ID\", \"Statement\":[{\"Sid\":\"__default_statement_ID\", \"Effect\":\"Allow\", \"Principal\":{\"AWS\":\"*\"}, \"Action\":[\"SNS:Subscribe\", \"SNS:ListSubscriptionsByTopic\", \"SNS:DeleteTopic\", \"SNS:GetTopicAttributes\", \"SNS:Publish\", \"SNS:RemovePermission\", \"SNS:AddPermission\", \"SNS:Receive\", \"SNS:SetTopicAttributes\"], \"Resource\":\"arn:aws:sns:us-east-1:123456789012:MyTopic\", \"Condition\":{\"StringEquals\":{\"AWS:SourceOwner\":\"123456789012\"}}},{\"Sid\":\"Allow_Publish_Events\", \"Effect\":\"Allow\", \"Principal\":{\"Service\":\"events.amazonaws.com\"}, \"Action\":\"sns:Publish\", \"Resource\":\"arn:aws:sns:us-east-1:123456789012:MyTopic\"}]}"

如果您看到如下所示的策略,则您只设置了默认策略:

Copy
"{\"Version\":\"2008-10-17\", \"Id\":\"__default_policy_ID\", \"Statement\":[{\"Sid\":\"__default_statement_ID\", \"Effect\":\"Allow\", \"Principal\":{\"AWS\":\"*\"}, \"Action\":[\"SNS:Subscribe\", \"SNS:ListSubscriptionsByTopic\", \"SNS:DeleteTopic\", \"SNS:GetTopicAttributes\", \"SNS:Publish\", \"SNS:RemovePermission\", \"SNS:AddPermission\", \"SNS:Receive\", \"SNS:SetTopicAttributes\"], \"Resource\":\"arn:aws:sns:us-east-1:123456789012:MyTopic\", \"Condition\":{\"StringEquals\":{\"AWS:SourceOwner\":\"123456789012\"}}}]}"

如果您未看到策略中具有发布权限的 events.amazonaws.com,请使用 AWS CLI 设置主题策略属性。

复制当前策略并将以下语句添加到语句列表中:

Copy
{\"Sid\":\"Allow_Publish_Events\", \"Effect\":\"Allow\",\"Principal\":{\"Service\":\"events.amazonaws.com\"}, \"Action\":\"sns:Publish\", \"Resource\":\"arn:aws:sns:us-east-1:123456789012:MyTopic\"}

新策略应与上面描述的策略类似。

使用 AWS CLI 设置主题属性:

Copy
aws sns set-topic-attributes --region us-east-1 --topic-arn "arn:aws:sns:us-east-1:123456789012:MyTopic" --attribute-name Policy --attribute-value NEW_POLICY_STRING

注意

如果策略不正确,您还可以在 CloudWatch Events 控制台中编辑规则,方式是删除策略并将策略重新添加到规则中。CloudWatch Events 控制台将设置目标的正确权限。

在我删除与 Amazon SNS 主题关联的规则之后,我的 Amazon SNS 主题仍然具有针对 CloudWatch Events 的权限

当您以 Amazon SNS 为目标创建规则时,CloudWatch Events 会代表您将权限添加至您的 Amazon SNS 主题。如果您在创建规则后不久删除规则,CloudWatch Events 可能无法从您的 Amazon SNS 主题删除权限。如果发生此情况,您可以使用 aws sns 设置主题属性命令从该主题删除权限。有关用于发送事件的基于资源权限的更多信息,请参阅 使用 CloudWatch Events 的基于资源的策略

我可以对 CloudWatch Events 使用哪种 IAM 条件键

Amazon CloudWatch Events 支持 AWS 范围内的条件键 (请参阅 IAM 用户指南 中的可用键) 以及以下特定于服务的条件键。有关更多信息,请参阅 使用 IAM 策略条件实现精细访问控制

我如何在违反 CloudWatch Events 规则发出通知

您可以使用以下警报来在违反 CloudWatch Events 规则时发出通知。

创建警报以在违反规则时发出通知

  1. 通过以下网址打开 CloudWatch 控制台:https://console.amazonaws.cn/cloudwatch/

  2. 单击 Create Alarm,然后在 CloudWatch Metrics by Category 窗格中,选择 Events Metrics

  3. Create Alarm 对话框的指标列表中,选中 FailedInvocations 复选框。

  4. 在图形上方,从 Statistic 下拉列表中选择 Sum

  5. “Period”下拉列表中选择一个时间段,例如:5 分钟

  6. 单击 Next,然后在 Alarm Threshold 下方的 Name 字段中,为警报输入唯一名称,例如:myFailedRules

  7. Description 字段中,输入警报的描述,例如:Rules are not delivering events to targets

  8. is 下拉列表中,选择 >=

  9. is 下拉列表旁边的字段中,输入 1,然后在 for 字段中输入 10

  10. Actions (操作) 下,在 Whenever this alarm (每当此警报) 下拉列表中选择 State is ALARM (状态为“警报”)

  11. Send notification to (发送通知到) 下拉列表中,选择一个现有 Amazon SNS 主题或创建一个新主题。

  12. 要创建新 Amazon SNS 主题,请选择 New list (新建列表)

  13. Send notification to 字段中,输入新的 Amazon SNS 主题的名称,例如 myFailedRules,然后在 Email list 字段中,输入电子邮件地址 (当报警的状态更改为 ALARM 时,将向这些地址发送通知) 的逗号分隔的列表。

  14. 在导航窗格中,选择 Create Alarm 以完成警报创建过程。