View a markdown version of this page

为亚马逊使用基于资源的政策 EventBridge - 亚马逊 EventBridge

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

为亚马逊使用基于资源的政策 EventBridge

规则运行时 EventBridge,将调用与该规则关联的所有目标。规则可以调用 AWS Lambda 函数、发布到 Amazon SNS 主题或将事件中继到 Kinesis 流。要对您拥有的资源进行 API 调用, EventBridge 需要相应的权限。对于 Amazon CloudWatch Logs 资源, EventBridge 使用基于资源的策略。对于 Lambda、Amazon SNS 和 Amazon SQS 资源, EventBridge 可以使用 IAM 执行角色或基于资源的策略。对于 Kinesis 流, EventBridge 使用基于身份的策略。

重要

对于 Amazon L CloudWatch ogs 目标,请勿RoleArn在目标配置中指定。对于 Lambda、Amazon SNS 和 Amazon SQS 目标,您可以使用 IAM 执行角色或基于资源的策略。如果您为 Lambda、Amazon SNS 或 Amazon SQS 目标指定,请确保该角色具有所需的权限(例如lambda:InvokeFunctionsns:Publish、或)。RoleArn sqs:SendMessage如果未配置执行角色,则对目标资源 EventBridge 使用基于资源的策略。

您可以使用 AWS CLI 向目标添加权限。有关如何安装和配置的信息 AWS CLI,请参阅AWS Command Line Interface 用户指南》 AWS Command Line Interface中的 “使用进行设置”。

Amazon API Gateway 权限

要使用 EventBridge 规则调用您的亚马逊 API 网关终端节点,请在您的 API 网关终端节点的策略中添加以下权限。

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "execute-api:Invoke", "Condition": { "ArnEquals": { "aws:SourceArn": "arn:aws:events:us-east-1:123456789012:rule/rule-name" } }, "Resource": [ "arn:aws:execute-api:us-east-1:123456789012:API-id/stage/GET/api" ] } ] }

CloudWatch 日志权限

当 CloudWatch 日志是规则的目标时, EventBridge 创建日志流, CloudWatch 日志将事件中的文本存储为日志条目。 EventBridge 要允许创建日志流和记录事件, CloudWatch 日志必须包含允许写入 CloudWatch 日志的基于资源 EventBridge 的策略。

如果您使用将 CloudWatch 日志添加 AWS 管理控制台 为规则的目标,则会自动创建基于资源的策略。如果您使用 AWS CLI 添加目标,但该策略尚不存在,则必须创建该策略。

以下基于资源的策略示例 EventBridge 允许写入所有名称以开头的/aws/events/日志组。如果您对这些类型的日志使用不同的命名策略,请相应地调整资源 ARN。

{ "Effect": "Allow", "Principal": { "Service": [ "events.amazonaws.com", "delivery.logs.amazonaws.com" ] }, "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:region:account-id:log-group:/aws/events/*:*" }
要为 CloudWatch 日志创建资源策略,请使用 AWS CLI
  • 在命令提示符处,输入以下命令:

    aws logs put-resource-policy --policy-name EventBridgeToCWLogsPolicy \ --policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":["events.amazonaws.com","delivery.logs.amazonaws.com"]},"Action":["logs:CreateLogStream","logs:PutLogEvents"],"Resource":"arn:aws:logs:region:account-id:log-group:/aws/events/*:*"}]}'

有关更多信息,请参阅PutResourcePolicyCloudWatch 日志 API 参考指南》

AWS Lambda 权限

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

注意

或者,您可以通过lambda:InvokeFunction权限在目标上配置 IAM 执行角色。 Resource-based 只有在目标上未配置执行角色时才需要策略。

{ "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": "InvokeLambdaFunction" }
要添加上述权限, EventBridge 允许使用调用 Lambda 函数 AWS CLI
  • 在命令提示符处,输入以下命令:

    aws lambda add-permission --statement-id "InvokeLambdaFunction" \ --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 开发人员指南中的AddPermission和在计划事件使用 Lambda。

Amazon SNS 权限

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

添加允许 EventBridge 发布 SNS 主题的权限
  1. 要列出某个 SNS 主题的属性,请使用以下命令。

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

    以下示例显示一个新 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\"],\"Resource\":\"arn:aws:sns:region:account-id:topic-name\",\"Condition\":{\"StringEquals\":{\"AWS:SourceAccount\":\"account-id\"}}}]}", "TopicArn": "arn:aws:sns:region:account-id:topic-name", "SubscriptionsPending": "0" } }
  2. 使用 JSON 转字符串转换器,将以下语句转换为字符串。

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

    将语句转换为字符串后,如以下示例所示。

    {\"Sid\":\"PublishEventsToMyTopic\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"events.amazonaws.com\"},\"Action\":\"sns:Publish\",\"Resource\":\"arn:aws:sns:region:account-id:topic-name\"}
  3. 将您在上一步中创建的字符串添加到 "Policy" 属性中的 "Statement" 集合中。

  4. 使用 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\"],\"Resource\":\"arn:aws:sns:region:account-id:topic-name\",\"Condition\":{\"StringEquals\":{\"AWS:SourceAccount\":\"account-id\"}}}, {\"Sid\":\"PublishEventsToMyTopic\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"events.amazonaws.com\"},\"Action\":\"sns:Publish\",\"Resource\":\"arn:aws:sns:region:account-id:topic-name\"}]}"

有关更多信息,请参阅《亚马逊简单通知服务 API 参考SetTopicAttributes》中的操作

Amazon SQS 权限

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

如果 SQS 队列的策略为空,您首先需要创建一个策略,然后可以向其中添加权限语句。新 SQS 队列的策略为空。

如果 SQS 队列已有策略,您需要复制原始策略,并将其与新语句组合,向其中添加权限语句。

添加允许 EventBridge 规则调用 SQS 队列的权限
  1. 列出 SQS 队列属性。在命令提示符处,输入以下命令:

    aws sqs get-queue-attributes \ --queue-url https://sqs.region.amazonaws.com/account-id/queue-name \ --attribute-names Policy
  2. 添加以下语句。

    { "Sid": "AWSEvents_custom-eventbus-ack-sqs-rule_dlq_sqs-rule-target", "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/bus-name/rule-name" } } }
  3. 使用 JSON 转字符串转换器,将上一语句转换为字符串。在将策略转换为字符串后,如下所示。

    {\"Sid\": \"EventsToMyQueue\", \"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\": \"EventsToMyQueue\", \"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

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

EventBridge 管道细节

EventBridge 管道不支持基于资源的策略,也没有支持基于资源的策略条件的 API。

但是,如果您通过接口 VPC 终端节点配置管道访问,则该 VPC 终端节点支持资源策略,使您能够管理对 EventBridge 管道 API 的访问权限。有关更多信息,请参阅 将 Amazon EventBridge 与接口 VPC 终端节点配合使用