CloudWatch 事件排查 - Amazon CloudWatch Events
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

CloudWatch 事件排查

注意

Amazon EventBridge 是管理事件的首选方式。CloudWatch 事件和 EventBridge 是相同的底层服务和 API,但 EventBridge 提供了更多功能。您在 CloudWatch 或 EventBridge 中所作的更改将显示在每个控制台中。有关更多信息,请参阅 。Amazon EventBridge

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

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

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

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

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

{ "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\"}" }

如果您看到以下内容:

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

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

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 事件控制台将设置目标的正确权限。

如果您使用特定的 Lambda 别名或版本,则必须将--qualifier中的参数aws lambda get-policyaws lambda add-permission命令。

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 指标,例如TriggeredRulesInvocations, 和FailedInvocations以进一步调试。有关这些指标的更多信息,请参阅Amazon CloudWatch Events 指标与维度中的Amazon CloudWatch 用户指南

如果该规则由来自 Amazon 服务的事件触发,您还可以执行 TestEventPattern 操作,以使用测试事件来测试规则的事件模式,确保规则的事件模式设置正确。有关更多信息,请参阅 。TestEventPattern中的Amazon CloudWatch Events API 参考

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

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

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

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

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

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

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

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

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

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

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

我的规则无效,因为与规则关联的 IAM 角色在规则触发时会忽略与规则关联的角色

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

确保您的区域Amazon STS终端节点处于启用状态。CloudWatch 活动会谈区域Amazon STS终端节点时,您可以使用您提供的 IAM 角色。有关更多信息,请参阅 。激活和停用Amazon STS在Amazon区域中的IAM 用户指南

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

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

此外,并非每个事件(如AmazonAPI 调用 CloudTrail)。

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

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

某些事件从未传送到我的目标

如果 CloudWatch 事件规则的目标长时间受限,CloudWatch 事件可能不会重试传输。例如,如果该目标未预配置为处理传入事件流量且目标服务当前限制 CloudWatch 事件代表您发出的请求,则 CloudWatch 事件可能不会重试传输。

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

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

防止无限循环

在 CloudWatch Events 中,可能创建导致无限循环的规则,即反复触发一个规则。例如,某规则可能检测到 S3 存储桶上的 ACL 已更改,然后触发软件以将 ACL 更改为所需状态。如果编写该规则时不小心,则 ACL 的后续更改将再次触发该规则,从而产生无限循环。

为防止出现这种情况,请在编写规则时使触发的操作不会重复激发同一规则。例如,您的规则可能仅在发现 ACL 处于错误状态时而不是在进行任何更改之后激发。

无限循环可能快速导致费用超出预期。我们建议您使用预算功能,以便在费用超出您指定的配额时提醒您。有关更多信息,请参阅通过预算管理成本

我的事件没有传送到目标 Amazon SQS 队列

Amazon SQS 队列可能已加密。如果您创建的规则使用加密的 Amazon SQS 队列作为目标,则您必须在您的 KMS 密钥策略中包含以下部分,事件才能成功传送到encryptedqueue.

{ "Sid": "Allow CWE to use the key", "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "*" }

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

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

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

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

"{\"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\"}]}"

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

"{\"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,请使用 Amazon CLI 设置主题策略属性。

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

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

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

使用 Amazon CLI 设置主题属性:

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 事件控制台中编辑规则,方式是删除策略并将策略重新添加到规则中。CloudWatch 事件将设置目标的正确权限。

我的 Amazon SNS 主题仍然具有 CloudWatch Amazon SNS vents 的权限

当您以 Amazon SNS 为目标创建规则时,CloudWatch Events 会代表您将权限添加到您的 Amazon SNS 主题中。如果您在创建规则后不久删除规则,CloudWatch 事件可能无法从您的 Amazon SNS 主题删除权限。这种情况下,您可以从主题中删除权限,使用Amazon SNS 设置主题属性命令。

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

CloudWatch 事件支持Amazon范围的条件键(请参阅可用键中的IAM 用户指南)以及以下特定于服务的条件键。

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

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

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

  1. 通过以下网址打开 CloudWatch 控制台:https://console.aws.amazon.com/cloudwatch/

  2. 选择 Create Alarm (创建警报)。在 CloudWatch Metrics by Category 窗格中,选择 Events Metrics

  3. 在指标列表中,选择 FailedInvocations

  4. 在图形上方,依次选择 StatisticSum

  5. 对于 Period,选择一个值,例如 5 minutes。选择 Next

  6. Alarm Threshold 下的 Name 中,为警报键入一个唯一的名称,例如:myFailedRules。对于 Description,键入警报的描述,例如:Rules are not delivering events to targets

  7. 对于 is,依次选择 >=1。对于 for,输入 10

  8. 操作下面,为每当此警报选择状态为“警报”

  9. 适用于Send notification to (发送通知到)中,选择一个现有 Amazon SNS 主题或创建一个新的主题。要创建新主题,请选择新建列表。为新 Amazon SNS 主题键入名称,例如:myFailedRules

  10. 对于 Email list,请键入警报变为 ALARM 状态时将通知发送到的电子邮件地址列表 (以逗号分隔)。

  11. 选择 Create Alarm (创建警报)