

# 设置 Amazon S3 存储桶的访问权限
<a name="postgresql-s3-export-access-bucket"></a>

要将数据导出到 Amazon S3，请为 PostgreSQL 数据库实例提供权限以访问文件将保存到的 Amazon S3 存储桶。

为此，请使用以下过程。

**通过 IAM 角色向 PostgreSQL 数据库实例授予访问 Amazon S3 的权限**

1. 创建一个 IAM 策略。

   该策略提供存储桶和对象权限，以允许 PostgreSQL 数据库实例访问 Amazon S3。

   在创建此策略的过程中，请执行以下步骤：

   1. 在策略中包含以下必需操作，以允许将文件从 PostgreSQL 数据库实例传输到 Amazon S3 存储桶：
      + `s3:PutObject`
      + `s3:AbortMultipartUpload`

   1. 包含用于标识 Amazon S3 存储桶以及其中的对象的 Amazon Resource Name (ARN)。用于访问 Amazon S3 的 ARN 格式为：`arn:aws:s3:::amzn-s3-demo-bucket/*`

   有关为 Amazon RDS for PostgreSQL 创建 IAM 策略的更多信息，请参阅 [创建和使用适用于 IAM 数据库访问的 IAM 策略](UsingWithRDS.IAMDBAuth.IAMPolicy.md)。另请参阅 *IAM 用户指南*中的[教程：创建和附加您的第一个客户托管式策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_managed-policies.html)。

   以下 AWS CLI 命令使用这些选项创建一个名为 `rds-s3-export-policy` 的 IAM 策略。该策略授予对名为 *amzn-s3-demo-bucket* 的存储桶的访问权限。
**警告**  
我们建议您在一个私有 VPC 中设置数据库，该 VPC 配置了用于访问特定存储桶的端点策略。有关更多信息，请参阅 Amazon VPC 用户指南 中的[对 Amazon S3 使用端点策略](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-s3.html#vpc-endpoints-policies-s3)。  
强烈建议您不要创建具有所有资源访问权限的策略。此访问权限可能会对数据安全造成威胁。如果您使用 `S3:PutObject` 创建一个向 `"Resource":"*"` 授予对所有资源的访问权限的策略，则具有导出特权的用户可以将数据导出到您账户中的所有存储桶。此外，用户可以将数据导出到 *AWS 区域内的任何可公开写入的存储桶*。

   在您创建策略之后，请记下策略的 Amazon Resource Name (ARN)。在将策略附加到 IAM 角色时，您在后面的步骤中需要使用 ARN。

   ```
   aws iam create-policy  --policy-name rds-s3-export-policy  --policy-document '{
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Sid": "s3export",
            "Action": [
              "s3:PutObject*",
              "s3:ListBucket",
              "s3:GetObject*",
              "s3:DeleteObject*",
              "s3:GetBucketLocation",
              "s3:AbortMultipartUpload"
            ],
            "Effect": "Allow",
            "Resource": [
              "arn:aws:s3:::amzn-s3-demo-bucket/*"
            ] 
          }
        ] 
      }'
   ```

1. 创建一个 IAM 角色。

   这样，Amazon RDS 就可以担任该 IAM 角色以代表您访问 Amazon S3 存储桶。有关更多信息，请参阅 *IAM 用户指南*中的[创建向 IAM 用户委派权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)。

   我们建议在基于资源的策略中使用 `[aws:SourceArn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn)` 和 `[aws:SourceAccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount)` 全局条件上下文键，以限制对特定资源的服务权限。这是防范[混淆代理人问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)最有效的方法。

   如果同时使用全局条件上下文键和包含账户 ID 的 `aws:SourceArn` 值，则 `aws:SourceAccount` 值和 `aws:SourceArn` 值中的账户在同一策略语句中使用时，必须使用相同的账户 ID。
   + 如果您想对单个资源进行跨服务访问，请使用 `aws:SourceArn`。
   + 如果您想允许该账户中的任何资源与跨服务使用操作相关联，请使用 `aws:SourceAccount`。

    在策略中，确保使用具有资源的完整 ARN 的 `aws:SourceArn` 全局条件上下文键。以下示例说明了如何使用 AWS CLI 命令创建一个名为 `rds-s3-export-role` 的角色来实现该目的。  
**Example**  

   对于 Linux、macOS 或 Unix：

   ```
   aws iam create-role  \
       --role-name rds-s3-export-role  \
       --assume-role-policy-document '{
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
               "Service": "rds.amazonaws.com"
             },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                   "aws:SourceAccount": "111122223333",
                   "aws:SourceArn": "arn:aws:rds:us-east-1:111122223333:db:dbname"
                   }
                }
          }
        ] 
      }'
   ```

   对于：Windows

   ```
   aws iam create-role  ^
       --role-name rds-s3-export-role  ^
       --assume-role-policy-document '{
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
               "Service": "rds.amazonaws.com"
             },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                   "aws:SourceAccount": "111122223333",
                   "aws:SourceArn": "arn:aws:rds:us-east-1:111122223333:db:dbname"
                   }
                }
          }
        ] 
      }'
   ```

1. 将您创建的 IAM 策略附加到您创建的 IAM 角色。

   以下 AWS CLI 命令将以前创建的策略附加到一个名为 `rds-s3-export-role.` 的角色。请将 `your-policy-arn` 替换为您在前面的步骤中记下的策略 ARN。

   ```
   aws iam attach-role-policy  --policy-arn your-policy-arn  --role-name rds-s3-export-role  
   ```

1. 将该 IAM 角色添加到数据库实例中。您可以使用 AWS 管理控制台 或 AWS CLI 执行该操作，如下所述。

## 控制台
<a name="collapsible-section-1"></a>

**使用控制台为 PostgreSQL 数据库实例添加 IAM 角色**

1. 登录AWS 管理控制台并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 选择 PostgreSQL 数据库实例名称以显示其详细信息。

1. 在 **Connectivity & security (连接性和安全性)** 选项卡上的 **Manage IAM roles (管理 IAM 角色)** 部分中，在 **Add IAM roles to this instance (向此实例添加 IAM 角色)** 下选择要添加的角色。

1. 在 **Feature (功能)** 下，选择 **s3Export**。

1. 选择 **Add role (添加角色)**。

## AWS CLI
<a name="collapsible-section-2"></a>

**使用 CLI 为 PostgreSQL 数据库实例添加 IAM 角色**
+ 使用以下命令将角色添加到名为 `my-db-instance` 的 PostgreSQL 数据库实例中。将 *`your-role-arn`* 替换为您在上一步中记下的角色 ARN。使用 `s3Export` 作为 `--feature-name` 选项的值。  
**Example**  

  对于 Linux、macOS 或 Unix：

  ```
  aws rds add-role-to-db-instance \
     --db-instance-identifier my-db-instance \
     --feature-name s3Export \
     --role-arn your-role-arn   \
     --region your-region
  ```

  对于：Windows

  ```
  aws rds add-role-to-db-instance ^
     --db-instance-identifier my-db-instance ^
     --feature-name s3Export ^
     --role-arn your-role-arn ^
     --region your-region
  ```