使用 EventBridge 的基于资源的策略 - Amazon EventBridge
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用 EventBridge 的基于资源的策略

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

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

AWS Lambda 权限

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

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

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

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

    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"

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

Amazon SNS 权限

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

注意

EventBridge 不支持在 Amazon SNS 主题策略中使用 Condition 块。

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

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

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

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

    { "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" 集合中。

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

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

    {\"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 命令设置新的策略。

    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 权限

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

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

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

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

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

  2. 以下语句允许 EventBridge 向 SQS 队列发送消息。

    { "Sid": "TrustCWEToSendEventsToMyQueue", "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "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. 然后,将上述语句转换成字符串。在将策略转换为字符串后,它应如下所示。

    {\"Sid\": \"TrustCWEToSendEventsToMyQueue\", \"Effect\": \"Allow\", \"Principal\": {\"Service\": \"events.amazonaws.com\"}, \"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 的文件。

    { "Policy": "{\"Version\":\"2012-10-17\",\"Id\":\"arn:aws:sqs:region:account-id:queue-name/SQSDefaultPolicy\",\"Statement\":[{\"Sid\": \"TrustCWEToSendEventsToMyQueue\", \"Effect\": \"Allow\", \"Principal\": {\"Service\": \"events.amazonaws.com\"}, \"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 文件作为输入,设置策略属性。在命令提示符处,输入以下命令。

    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 策略示例

CloudWatch Logs 权限

当 CloudWatch Logs 为规则的目标时,EventBridge 会创建日志流,并且 CloudWatch Logs 会将触发事件中的文本存储为日志条目。要允许 EventBridge 创建日志流和日志事件,CloudWatch Logs 必须包含基于资源的策略,该策略允许 EventBridge 对 CloudWatch Logs 进行写入。如果您使用 AWS 管理控制台将 CloudWatch Logs 作为规则目标添加,则会自动创建此策略。如果您使用 AWS CLI 添加目标,则必须创建此策略(如果它不存在)。以下示例显示了必要的策略。此示例允许 EventBridge 对名称以 /aws/events/ 开头的所有日志组进行写入。如果您对这些类型的日志使用其他日志组命名策略,请相应地调整该策略。

{ "Statement": [ { "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Resource": "arn:aws:logs:{{region}}:{{account}}:log-group:/aws/events/*:*", "Sid": "TrustEventsToStoreLogEvent" } ], "Version": "2012-10-17" }

有关更多信息,请参阅 IAM 用户指南 中的控制对资源的访问