

# 授予将事件通知消息发布到目标的权限
<a name="grant-destinations-permissions-to-s3"></a>

您必须向 Amazon S3 主体授予调用相关 API 的必要权限，以将消息发布到 SNS 主题、SQS 队列或 Lambda 函数。这是为了让 Amazon S3 能够将事件通知消息发布到目标。

要解决向目标发布事件通知消息的问题，请参阅[将 Amazon S3 事件通知发布到 Amazon Simple Notification Service 主题的疑难解答](https://repost.aws/knowledge-center/sns-not-receiving-s3-event-notifications)。

**Topics**
+ [授予调用 AWS Lambda 函数的权限](#grant-lambda-invoke-permission-to-s3)
+ [授予将消息发布到 SNS 主题或 SQS 队列的权限](#grant-sns-sqs-permission-for-s3)

## 授予调用 AWS Lambda 函数的权限
<a name="grant-lambda-invoke-permission-to-s3"></a>

Amazon S3 通过调用 Lambda 函数并提供事件消息作为参数来将事件消息发布到 AWS Lambda。

使用 Amazon S3 控制台在 Amazon S3 存储桶上为 Lambda 函数配置事件通知时，控制台将在 Lambda 函数上设置必要的权限。这是为了让 Amazon S3 有权从存储桶调用函数。有关更多信息，请参阅 [使用 Amazon S3 控制台启用和配置事件通知](enable-event-notifications.md)。

您还可以从 AWS Lambda 向 Amazon S3 授予调用 Lambda 函数的权限。有关更多信息，请参阅 *AWS Lambda 开发人员指南*中的[教程：将 AWS Lambda 与 Amazon S3 结合使用](https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html)。

## 授予将消息发布到 SNS 主题或 SQS 队列的权限
<a name="grant-sns-sqs-permission-for-s3"></a>

要授予 Amazon S3 权限以将消息发布到 SNS 主题或 SQS 队列，请将 AWS Identity and Access Management（IAM）策略附加到目标 SNS 主题或 SQS 队列。

有关如何将策略附加到 SNS 主题或 SQS 队列的示例，请参阅 [演练：为存储桶配置通知（SNS 主题或 SQS 队列）](ways-to-add-notification-config-to-bucket.md)。有关权限的更多信息，请参阅以下主题：
+ *Amazon Simple Notification Service 开发人员指南*中的 [Amazon SNS 访问控制示例案例](https://docs.aws.amazon.com/sns/latest/dg/AccessPolicyLanguage_UseCases_Sns.html)
+ *Amazon Simple Queue Service 开发人员指南*中的 [Amazon SQS 中的 Identity and Access Management](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/UsingIAM.html)

### 目标 SNS 主题的 IAM 策略
<a name="sns-topic-policy"></a>

以下是您附加到目标 SNS 主题的 AWS Identity and Access Management（IAM）策略示例。有关如何使用此策略为事件通知设置目标 Amazon SNS 主题的说明，请参阅 [演练：为存储桶配置通知（SNS 主题或 SQS 队列）](ways-to-add-notification-config-to-bucket.md)。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "example-ID",
    "Statement": [
        {
            "Sid": "Example SNS topic policy",
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": [
                "SNS:Publish"
            ],
            "Resource": "arn:aws:sns:us-east-1:111122223333:example-sns-topic",
            "Condition": {
                "ArnEquals": {
                    "aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-bucket"
                },
                "StringEquals": {
                    "aws:SourceAccount": "bucket-owner-123456789012"
                }
            }
        }
    ]
}
```

------

### 目标 SQS 队列的 IAM 策略
<a name="sqs-queue-policy"></a>

以下是您附加到目标 SQS 队列的 IAM 策略示例。有关如何使用此策略为事件通知设置目标 Amazon SQS 队列的说明，请参阅 [演练：为存储桶配置通知（SNS 主题或 SQS 队列）](ways-to-add-notification-config-to-bucket.md)。

要使用此策略，您必须更新 Amazon SQS 队列 ARN、存储桶名称和存储桶拥有者的 AWS 账户 ID。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "example-ID",
    "Statement": [
        {
            "Sid": "example-statement-ID",
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": [
                "SQS:SendMessage"
            ],
            "Resource": "arn:aws:sqs:us-east-1:111122223333:queue-name",
            "Condition": {
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:s3:*:*:amzn-s3-demo-bucket"
                },
                "StringEquals": {
                    "aws:SourceAccount": "bucket-owner-123456789012"
                }
            }
        }
    ]
}
```

------

对于 Amazon SNS 和 Amazon SQS IAM 策略，您可以在策略中指定 `StringLike` 条件而不是 `ArnLike` 条件。

使用 `ArnLike` 时，ARN 的分区、服务、账户 ID、资源类型和部分资源 ID 等部分必须与请求上下文中的 ARN 完全匹配。只有区域和资源路径支持部分匹配。

 当使用 `StringLike` 而不是 `ArnLike` 时，无论哪个部分用通配符来替代，匹配都会忽略 ARN 结构并支持部分匹配。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM JSON 策略元素](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)。

```
"Condition": {         
  "StringLike": { "aws:SourceArn": "arn:aws:s3:*:*:amzn-s3-demo-bucket" }
  }
```

### AWS KMS 密钥政策
<a name="key-policy-sns-sqs"></a>

如果 SQS 队列或 SNS 主题使用 AWS Key Management Service（AWS KMS）客户托管密钥进行加密，则必须向 Amazon S3 服务主体授予处理加密主题和/或队列的权限。要向 Amazon S3 服务主体授予权限，请将以下语句添加到客户托管密钥策略中。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "example-ID",
    "Statement": [
        {
            "Sid": "example-statement-ID",
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": [
                "kms:GenerateDataKey",
                "kms:Decrypt"
            ],
            "Resource": "*"
        }
    ]
}
```

------

有关 AWS KMS 密钥策略的更多信息，请参阅 *AWS Key Management Service 开发人员指南*中的[使用 AWS KMS 中的密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)。

有关将服务器端加密与适用于 Amazon SQS 和 Amazon SNS 的 AWS KMS 结合使用的更多信息，请参阅以下内容：
+ *mazon Simple Notification Service 开发人员指南*中的[密钥管理](https://docs.aws.amazon.com/sns/latest/dg/sns-key-management.html)。
+ *Amazon Simple Queue Service 开发人员指南*中的[密钥管理](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-key-management.html)。
+ *AWS 计算博客*中的[利用 AWS KMS 加密发布到 Amazon SNS 的消息](https://aws.amazon.com/blogs/compute/encrypting-messages-published-to-amazon-sns-with-aws-kms/)。