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

使用 CloudWatch Events 的基于资源的策略

在 CloudWatch Events 中触发一个规则时,将调用与该规则关联的所有目标。调用是指调用 AWS Lambda 函数,发布到 Amazon SNS 主题并将事件中继到 Kinesis 流。为了能对您拥有的资源执行 API 调用,CloudWatch Events 需要相应权限。对于 Lambda、Amazon SNS 和 Amazon SQS 资源,CloudWatch Events 依赖基于资源的策略。对于 Kinesis 流,CloudWatch Events 依赖 IAM 角色。

您可以使用下列权限调用与您的 CloudWatch Events 规则相关联的目标。下面的过程使用 AWS CLI 将权限添加到您的目标。有关如何安装和配置 AWS CLI 的信息,请参阅 AWS Command Line Interface 用户指南 中的使用 AWS 命令行界面进行设置

AWS Lambda 权限

要使用 CloudWatch Events 规则调用您的 AWS Lambda 函数,可将以下权限添加到您的 Lambda 函数的策略中。

Copy
{ "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:region:account-id:function:function-name", "Principal": { "Service": "events.amazonaws.com" }, "Condition": { "ArnLike": { "AWS:SourceArn": "arn:aws:events:region:account-id:rule/rule-name" } }, "Sid": "TrustCWEToInvokeMyLambdaFunction" }

添加允许 CloudWatch Events 调用 Lambda 函数的权限

  • 在命令提示符处,输入以下命令:

    Copy
    aws lambda add-permission --statement-id "TrustCWEToInvokeMyLambdaFunction" \ --action "lambda:InvokeFunction" \ --principal "events.amazonaws.com" \ --function-name "arn:aws:lambda:region:account-id:function:function-name" \ --source-arn "arn:aws:events:region:account-id:rule/rule-name"

有关设置允许 CloudWatch Events 调用 Lambda 函数的权限的更多信息,请参阅 AWS Lambda Developer Guide中的 AddPermission使用 Lambda 处理计划的事件

Amazon SNS 权限

要允许 CloudWatch Events 发布 Amazon SNS 主题,请使用 aws sns get-topic-attributesaws sns set-topic-attributes 命令。

添加允许 CloudWatch Events 发布 SNS 主题的权限

  1. 首先,列出 SNS 主题属性。在命令提示符处输入以下命令:

    Copy
    aws sns get-topic-attributes --topic-arn "arn:aws:sns:region:account-id:topic-name"

    该命令返回 SNS 主题的所有属性。以下示例显示新创建的 SNS 主题的结果。

    Copy
    { "Attributes": { "SubscriptionsConfirmed": "0", "DisplayName": "", "SubscriptionsDeleted": "0", "EffectiveDeliveryPolicy": "{\"http\":{\"defaultHealthyRetryPolicy\":{\"minDelayTarget\":20,\"maxDelayTarget\":20,\"numRetries\":3,\"numMaxDelayRetries\":0,\"numNoDelayRetries\":0,\"numMinDelayRetries\":0,\"backoffFunction\":\"linear\"},\"disableSubscriptionOverrides\":false}}", "Owner": "account-id", "Policy": "{\"Version\":\"2012-10-17\",\"Id\":\"__default_policy_ID\",\"Statement\":[{\"Sid\":\"__default_statement_ID\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"*\"},\"Action\":[\"SNS:GetTopicAttributes\",\"SNS:SetTopicAttributes\",\"SNS:AddPermission\",\"SNS:RemovePermission\",\"SNS:DeleteTopic\",\"SNS:Subscribe\",\"SNS:ListSubscriptionsByTopic\",\"SNS:Publish\",\"SNS:Receive\"],\"Resource\":\"arn:aws:sns:region:account-id:topic-name\",\"Condition\":{\"StringEquals\":{\"AWS:SourceOwner\":\"account-id\"}}}]}", "TopicArn": "arn:aws:sns:region:account-id:topic-name", "SubscriptionsPending": "0" } }
  2. 下一步,将以下语句转换为字符串并将其添加到“Policy”属性内部的“Statement”集合中。

    Copy
    { "Sid": "TrustCWEToPublishEventsToMyTopic", "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sns:Publish", "Resource": "arn:aws:sns:region:account-id:topic-name" }

    在将语句转换为字符串后,它应如下所示:

    Copy
    {\"Sid\":\"TrustCWEToPublishEventsToMyTopic\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"events.amazonaws.com\"},\"Action\":\"sns:Publish\",\"Resource\":\"arn:aws:sns:region:account-id:topic-name\"}
  3. 在您将语句字符串添加到语句集合后,使用 aws sns set-topic-attributes 命令设置新的策略。

    Copy
    aws sns set-topic-attributes --topic-arn "arn:aws:sns:region:account-id:topic-name" \ --attribute-name Policy \ --attribute-value "{\"Version\":\"2012-10-17\",\"Id\":\"__default_policy_ID\",\"Statement\":[{\"Sid\":\"__default_statement_ID\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"*\"},\"Action\":[\"SNS:GetTopicAttributes\",\"SNS:SetTopicAttributes\",\"SNS:AddPermission\",\"SNS:RemovePermission\",\"SNS:DeleteTopic\",\"SNS:Subscribe\",\"SNS:ListSubscriptionsByTopic\",\"SNS:Publish\",\"SNS:Receive\"],\"Resource\":\"arn:aws:sns:region:account-id:topic-name\",\"Condition\":{\"StringEquals\":{\"AWS:SourceOwner\":\"account-id\"}}}, {\"Sid\":\"TrustCWEToPublishEventsToMyTopic\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"events.amazonaws.com\"},\"Action\":\"sns:Publish\",\"Resource\":\"arn:aws:sns:region:account-id:topic-name\"}]}"

有关更多信息,请参阅 Amazon Simple Notification Service API Reference中的 SetTopicAttributes 操作。

Amazon SQS 权限

要允许 CloudWatch Events 规则调用 Amazon SQS 队列,请使用 aws sqs get-queue-attributesaws sqs set-queue-attributes 命令。

添加允许 CloudWatch Events 规则调用 SQS 队列的权限

  1. 首先,列出 SQS 队列属性。在命令提示符处输入以下命令:

    Copy
    aws sqs get-queue-attributes \ --queue-url https://sqs.region.amazonaws.com/account-id/queue-name \ --attribute-names Policy

    对于新创建的 SQS 队列,默认情况下其策略为空。除了添加语句之外,您还需要创建包含此语句的策略。

  2. 以下语句允许 CloudWatch Events 向 SQS 队列发送消息:

    Copy
    { "Sid": "TrustCWEToSendEventsToMyQueue", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "sqs:SendMessage", "Resource": "arn:aws:sqs:region:account-id:queue-name", "Condition": { "ArnEquals": { "aws:SourceArn": "arn:aws:events:region:account-id:rule/rule-name" } } }
  3. 然后,将上面的语句转换成字符串。在将策略转换为字符串后,它应如下所示:

    Copy
    {\"Sid\": \"TrustCWEToSendEventsToMyQueue\", \"Effect\": \"Allow\", \"Principal\": {\"AWS\": \"*\"}, \"Action\": \"sqs:SendMessage\", \"Resource\": \"arn:aws:sqs:region:account-id:queue-name\", \"Condition\": {\"ArnEquals\": {\"aws:SourceArn\": \"arn:aws:events:region:account-id:rule/rule-name\"}}
  4. 创建包含以下内容的、名为 set-queue-attributes.json 的文件:

    Copy
    { "Policy": "{\"Version\":\"2012-10-17\",\"Id\":\"arn:aws:sqs:region:account-id:queue-name/SQSDefaultPolicy\",\"Statement\":[{\"Sid\": \"TrustCWEToSendEventsToMyQueue\", \"Effect\": \"Allow\", \"Principal\": {\"AWS\": \"*\"}, \"Action\": \"sqs:SendMessage\", \"Resource\": \"arn:aws:sqs:region:account-id:queue-name\", \"Condition\": {\"ArnEquals\": {\"aws:SourceArn\": \"arn:aws:events:region:account-id:rule/rule-name\"}}}]}" }
  5. 使用 set-queue-attributes.json 文件作为输入来设置策略属性。在命令提示符下,输入:

    Copy
    aws sqs set-queue-attributes \ --queue-url https://sqs.region.amazonaws.com/account-id/queue-name \ --attributes file://set-queue-attributes.json

    如果 SQS 队列已有一个策略,您需要复制原始策略,并将其与 set-queue-attributes.json 文件中的新语句组合,然后运行上面的命令来更新策略。

有关更多信息,请参阅 Amazon Simple Queue Service 开发人员指南中的 Amazon SQS 策略示例