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

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

使用 Amazon EventBridge 的基于资源的策略

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

您可以使用Amazon CLI将权限添加到目标。有关如何安装和配置Amazon CLI,请参阅开始设置Amazon Command Line Interface中的Amazon Command Line Interface用户指南

Amazon API Gateway 权限

要使用 EventBridge 规则调用您的 Amazon API Gateway 终端节点,可将以下权限添加到您的 API Gateway 终端节点的策略中。

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

CloudWatch Logs 权限

当 CloudWatch Logs 是规则的目标时,EventBridge 会创建日志流,而 CloudWatch Logs 将事件中的文本存储为日志条目。为了允许 EventBridge 创建日志流和日志事件,CloudWatch Logs 必须包含基于资源的策略,此策略允许 EventBridge 对 CloudWatch 日志进行写入。

如果您使用Amazon Web Services Management Console将 CloudWatch Logs 添加为规则目标,则会自动创建基于资源的策略。如果您使用Amazon CLI添加目标,而策略尚不存在,则必须创建它。

下面的示例允许 EventBridge 向名称以开头的所有日志组进行写入/aws/events/。如果您对这些类型的日志使用其他命名策略,请相应地调整示例。

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

有关更多信息,请参阅 。PutResourcePolicy中的CloudWatch Logs API 参考指南

Amazon Lambda 权限

调用Amazon 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": "InvokeLambdaFunction" }

要添加上述权限,以使 EventBridge 能够使用Amazon 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 函数的权限的详细信息,请参阅AddPermission将 Lambda 用于计划的事件中的Amazon Lambda开发人员指南

Amazon SNS 权限

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

注意

您不能使用Condition块在 Amazon SNS 主题策略 EventBridge。

添加允许 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\",\"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. 使用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. 将您在上一步中创建的字符串添加到"Statement"集合内部"Policy"属性。

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

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

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": "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" } } }
  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 SQS 策略示例中的Amazon Simple Queue Service 开发者指南