

# 为与 Amazon S3 集成的 RDS for Oracle 配置 IAM 权限
<a name="oracle-s3-integration.preparing"></a>

若要让 RDS for Oracle 与 Amazon S3 集成，您的数据库实例必须可以访问 Amazon S3 存储桶。数据库实例使用的 Amazon VPC 不需要提供 Amazon S3 终端节点的访问权限。

RDS for Oracle 支持在一个账户中的数据库实例与另一个账户中的 Amazon S3 存储桶之间传输文件。如果需要其他步骤，将在以下各节中说明这些步骤。

**Topics**
+ [步骤 1：为 Amazon RDS 角色创建 IAM 策略](#oracle-s3-integration.preparing.policy)
+ [步骤 2：（可选）为 Amazon S3 存储桶创建 IAM 策略](#oracle-s3-integration.preparing.policy-bucket)
+ [步骤 3：为您的数据库实例创建 IAM 角色并附加策略](#oracle-s3-integration.preparing.role)
+ [步骤 4：将您的 IAM 角色与 RDS for Oracle 数据库实例关联](#oracle-s3-integration.preparing.instance)

## 步骤 1：为 Amazon RDS 角色创建 IAM 策略
<a name="oracle-s3-integration.preparing.policy"></a>

在此步骤中，您将创建一个 Amazon Identity and Access Management（IAM）策略，该策略具有在 Amazon S3 存储桶和 RDS 数据库实例之间传输文件所需的权限。此步骤假定您已创建了 S3 桶。

创建策略前，请记下以下信息：
+ 存储桶的 Amazon 资源名称（ARN）。
+ 您的 Amazon KMS 密钥的 ARN，如果您的存储桶使用 SSE-KMS 或 SSE-S3 加密
**注意**  
RDS for Oracle 数据库实例无法访问使用 SSE-C 加密的 Amazon S3 桶。

有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[使用服务器端加密保护数据](https://docs.amazonaws.cn/AmazonS3/latest/userguide/serv-side-encryption.html)。

### 控制台
<a name="oracle-s3-integration.preparing.policy.console"></a>

**创建 IAM policy 以允许 Amazon RDS 访问 Amazon S3 桶**

1. 打开 [IAM 管理控制台](https://console.amazonaws.cn/iam/home?#home)。

1. 在 **Access management (访问管理)** 下，选择 **Policies (策略)**。

1. 选择**创建策略**。

1. 在** Visual editor (可视化编辑器)** 选项卡上，选择 **Choose a service (选择服务)**，然后选择 **S3**。

1. 对于 **Actions (操作)**，选择 **Expand all (全部展开)**，然后选择将文件从 Amazon S3 存储桶传输到 Amazon RDS 所需的存储桶权限和对象权限。例如，执行以下操作：
   + 展开 **List (列表)**，然后选择 **ListBucket**。
   + 展开 **Read (读取)**，然后选择 **GetObject**。
   + 展开**写入**，然后选择 **PutObject**、**DeleteObject**、**AbortMultipartUpload** 和 **ListMultipartUploadParts**。在将大型文件（100 MB 或更大）上传到 Amazon S3 时，需要分段上传权限。
   + 展开 **Permissions management**（权限管理），然后选择**PutObjectAcl**。如果您计划将文件上传到其他账户拥有的存储桶，并且此账户需要完全控制存储桶内容，则需要此权限。

   *对象权限*是 Amazon S3 中的对象操作的权限。您必须为存储桶中的对象而不是存储桶本身授予这些权限。有关更多信息，请参阅[对象操作权限](https://docs.amazonaws.cn/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-objects)。

1. 选择**资源**，然后执行以下操作：

   1. 选择**特定**。

   1. 对于**桶**，选择**添加 ARN**。输入桶 ARN。桶名称会自动填入。然后，选择 **Add (添加)**。

   1. 如果显示了**对象**资源，请选择**添加 ARN** 以手动添加资源，或者选择**任意**。
**注意**  
您可以将 **Amazon Resource Name (ARN)** 设置为更具体的 ARN 值，以允许 Amazon RDS 仅访问 Amazon S3 存储桶中的特定文件或文件夹。有关如何为 Amazon S3 定义访问策略的更多信息，请参阅[管理您的 Amazon S3 资源的访问权限](https://docs.amazonaws.cn/AmazonS3/latest/userguide/s3-access-control.html)。

1. （可选）选择 **Add additional permissions (添加其他权限)**，向策略中添加资源。例如，执行以下操作：

   1. 如果您的存储桶使用自定义 KMS 密钥加密，请为该服务选择 **KMS**。

   1. 对于**手动操作**，请选择以下选项：
      + **Encrypt**
      + **重新加密起点**和**重新加密终点**
      + **Decrypt**
      + **DescribeKey**
      + **GenerateDataKey**

   1. 对于**资源**，选择**特定**。

   1. 对于**密钥**，选择**添加 ARN**。输入自定义密钥的 ARN 作为资源，然后选择**添加**。

      有关更多信息，请参阅 *Amazon Simple Storage Service 用户指南*中的[使用在 Amazon Key Management Service (SSE-KMS) 中存储 KMS 密钥的服务器端加密保护数据](https://docs.amazonaws.cn/AmazonS3/latest/userguide/UsingKMSEncryption.html)。

   1. 如果想要 Amazon RDS 访问其他存储桶，请为这些存储桶添加 ARN。您也可以根据需要授予访问 Amazon S3 中所有存储桶和对象的权限。

1. 选择 **Next: Tags (下一步: 标签)**，然后选择 **Next: Review (下一步: 审核)**。

1. 对于** Name (名称)**，请为您的 IAM 策略输入名称，例如 `rds-s3-integration-policy`。在创建 IAM 角色与您的数据库实例关联时，需要使用此名称。您也可以添加可选的 **Description (描述)** 值。

1. 选择**创建策略**。

### Amazon CLI
<a name="oracle-s3-integration.preparing.policy.CLI"></a>

创建向 Amazon RDS 授予对 Amazon S3 存储桶的访问权限的 Amazon Identity and Access Management（IAM）策略。创建策略后，请记下策略的 ARN。后续步骤需要该 ARN。

根据所需的访问类型，在策略中包括适合的操作：
+ `GetObject` – 从 Amazon S3 存储桶向 Amazon RDS 传输文件所必需的。
+ `ListBucket` – 从 Amazon S3 存储桶向 Amazon RDS 传输文件所必需的。
+ `PutObject` – 从 Amazon RDS 向 Amazon S3 存储桶传输文件所必需的。
+ `AbortMultipartUpload`：当将大型文件（100 MB 或更大）从 Amazon RDS 传输到 Amazon S3 存储桶时，进行分段上传所需。
+ `ListMultipartUploadParts`：当将大型文件（100 MB 或更大）从 Amazon RDS 传输到 Amazon S3 存储桶时，进行分段上传所需。

以下 Amazon CLI 命令使用这些选项创建一个名为 `rds-s3-integration-policy` 的 IAM 策略。该策略授予对名为 `amzn-s3-demo-bucket` 的存储桶的访问权限。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws iam create-policy \
   --policy-name rds-s3-integration-policy \
   --policy-document '{
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "s3integration",
         "Action": [
           "s3:GetObject",
           "s3:ListBucket",
           "s3:PutObject",
           "s3:AbortMultipartUpload",
           "s3:ListMultipartUploadParts"
         ],
         "Effect": "Allow",
         "Resource": [
           "arn:aws:s3:::amzn-s3-demo-bucket", 
           "arn:aws:s3:::amzn-s3-demo-bucket/*"
         ]
       }
     ]
   }'
```
以下示例包含自定义 KMS 密钥的权限。  

```
aws iam create-policy \
   --policy-name rds-s3-integration-policy \
   --policy-document '{
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "s3integration",
         "Action": [
           "s3:GetObject",
           "s3:ListBucket",
           "s3:PutObject",
           "kms:Decrypt",
           "kms:Encrypt",
           "kms:ReEncrypt*",
           "kms:GenerateDataKey",
           "kms:DescribeKey",
         ],
         "Effect": "Allow",
         "Resource": [
           "arn:aws:s3:::amzn-s3-demo-bucket", 
           "arn:aws:s3:::amzn-s3-demo-bucket/*",
           "arn:aws:kms:::your-kms-arn"
         ]
       }
     ]
   }'
```
对于：Windows  

```
aws iam create-policy ^
   --policy-name rds-s3-integration-policy ^
   --policy-document '{
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "s3integration",
         "Action": [
           "s3:GetObject",
           "s3:ListBucket",
           "s3:PutObject",
           "s3:AbortMultipartUpload",
           "s3:ListMultipartUploadParts"
         ],
         "Effect": "Allow",
         "Resource": [
           "arn:aws:s3:::amzn-s3-demo-bucket", 
           "arn:aws:s3:::amzn-s3-demo-bucket/*"
         ]
       }
     ]
   }'
```
以下示例包含自定义 KMS 密钥的权限。  

```
aws iam create-policy ^
   --policy-name rds-s3-integration-policy ^
   --policy-document '{
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "s3integration",
         "Action": [
           "s3:GetObject",
           "s3:ListBucket",
           "s3:PutObject",
           "kms:Decrypt",
           "kms:Encrypt",
           "kms:ReEncrypt",
           "kms:GenerateDataKey",
           "kms:DescribeKey",
         ],
         "Effect": "Allow",
         "Resource": [
           "arn:aws:s3:::amzn-s3-demo-bucket", 
           "arn:aws:s3:::amzn-s3-demo-bucket/*",
           "arn:aws:kms:::your-kms-arn"
         ]
       }
     ]
   }'
```

## 步骤 2：（可选）为 Amazon S3 存储桶创建 IAM 策略
<a name="oracle-s3-integration.preparing.policy-bucket"></a>

只有在以下情况下才需要此步骤：
+ 您计划从一个账户（账户 A）将文件上传到 Amazon S3 存储桶，然后从另一个账户（账户 B）访问它们。
+ 账户 B 拥有该存储桶。
+ 账户 B 需要完全控制加载到存储桶中的对象。

如果上述条件不适用于您，请跳至[步骤 3：为您的数据库实例创建 IAM 角色并附加策略](#oracle-s3-integration.preparing.role)。

要创建存储桶策略，请确保您具备以下各项：
+ 账户 A 的账户 ID
+ 账户 A 的用户名
+ 账户 B 中 Amazon S3 存储桶的 ARN 值

### 控制台
<a name="oracle-s3-integration.preparing.policy-bucket.console"></a>

**创建或编辑存储桶策略**

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在 **Buckets (存储桶)** 列表中，请选择要为其创建或编辑存储桶策略的存储桶的名称。

1. 选择**权限**。

1. 在 **Bucket policy (存储桶策略)** 下，请选择 **Edit (编辑)**。这将打开编辑存储桶策略页面。

1. 在**编辑存储桶策略**页面上，探索《Amazon S3 用户指南》**中的**策略示例**，选择**策略生成器**自动生成策略，或者在**策略**部分编辑 JSON。

   如果选择 **Policy generator**（策略生成器）则 Amazon 策略生成器将在新的窗口中打开。

   1. 在 **Amazon 策略生成器**页面，在 **Select Type of Policy**（选择策略类型）中，请选择 **S3 存储桶Policy**（S3 存储桶策略）。

   1. 通过在提供的字段中输入信息来添加语句，然后选择 **Add Statement**（添加语句）。对所有您想添加的语句重复执行此操作。有关这些字段的更多信息，请参阅 *IAM 用户指南*中的 [IAM JSON 策略元素参考](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements.html)。
**注意**  
为方便起见，**Edit bucket policy**（编辑存储桶策略）页面会在 **Policy**（策略）文本字段上方显示当前存储桶的 **Bucket ARN **（Amazon 资源名称）。您可以复制此 ARN，以便在 **Amazon 策略生成器**页面上的语句中使用。

   1. 添加完语句后，请选择**生成策略**。

   1. 复制生成的策略文本，请选择 **Close**（关闭），然后返回到 Amazon S3 控制台中的 **Edit bucket policy**（编辑存储桶策略）页面。

1. 在 **Policy**（策略）框中，编辑现有策略或从策略生成器粘贴存储桶策略。确保在保存策略之前解决安全警告、错误、一般警告和建议。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "ExamplePermissions",
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::123456789012:user/account-A-user"
         },
         "Action": [
           "s3:PutObject",
           "s3:PutObjectAcl"
         ],
         "Resource": [
           "arn:aws:s3:::amzn-s3-demo-destination-bucket",
           "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
         ]
       }
     ]
   }
   ```

------

1. 请选择 **Save changes**（保存更改），此操作将让您返回到存储桶权限页面。

## 步骤 3：为您的数据库实例创建 IAM 角色并附加策略
<a name="oracle-s3-integration.preparing.role"></a>

此步骤假定您已在[步骤 1：为 Amazon RDS 角色创建 IAM 策略](#oracle-s3-integration.preparing.policy)中创建了 IAM 策略。在此步骤中，您将为 RDS for Oracle 数据库实例创建一个角色，然后将策略附加到该角色。

### 控制台
<a name="oracle-s3-integration.preparing.role.console"></a>

**创建 IAM 角色以允许 Amazon RDS 访问 Amazon S3 桶**

1. 打开 [IAM 管理控制台](https://console.amazonaws.cn/iam/home?#home)。

1. 在导航窗格中，选择**角色**。

1. 选择**创建角色**。

1. 选择 **Amazon 服务**。

1. 对于**其他 Amazon 服务的使用案例：**，选择 **RDS**，然后选择 **RDS – 向数据库添加角色**。然后选择**下一步**。

1. 对于**权限策略**下面的**搜索**，请输入您在[步骤 1：为 Amazon RDS 角色创建 IAM 策略](#oracle-s3-integration.preparing.policy)中创建的 IAM policy 的名称，然后当策略在列表中显示时选择该策略。然后选择**下一步**。

1. 对于**角色名称**，输入 IAM 角色的名称，例如 `rds-s3-integration-role`。您也可以添加可选的**描述**值。

1. 选择**创建角色**。

### Amazon CLI
<a name="integration.preparing.role.CLI"></a>

**创建一个角色并向该角色附加策略**

1. 创建一个让 Amazon RDS 可代表您访问 Amazon S3 存储桶的 IAM 角色。

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

   您可以使用这两个全局条件上下文键并让 `aws:SourceArn` 值包含账户 ID。在这种情况下，当 `aws:SourceAccount` 值和 `aws:SourceArn` 值中的账户使用相同策略语句时，确保二者使用相同的账户 ID。
   + 如果您想对单个资源进行跨服务访问，请使用 `aws:SourceArn`。
   + 如果您想允许该账户中的任何资源与跨服务使用操作相关联，请使用 `aws:SourceAccount`。

   在信任关系中，请务必使用 `aws:SourceArn` 全局条件上下文键和访问角色资源的完整 Amazon Resource Name (ARN)。

   以下 Amazon CLI 命令会创建名为 `rds-s3-integration-role` 的角色来实现此目的。  
**Example**  

   对于 Linux、macOS 或 Unix：

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

   对于：Windows

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

   有关更多信息，请参阅 *IAM 用户指南* 中的[创建向 IAM 用户委派权限的角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_create_for-user.html)。

1. 创建角色之后，记下该角色的 ARN。后续步骤需要该 ARN。

1. 将您创建的策略附在您创建的角色上。

   以下 Amazon CLI 命令将策略附加到名为 `rds-s3-integration-role` 的角色。  
**Example**  

   对于 Linux、macOS 或 Unix：

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

   对于：Windows

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

   将 `your-policy-arn` 替换为您在上一步中记下的策略 ARN。

## 步骤 4：将您的 IAM 角色与 RDS for Oracle 数据库实例关联
<a name="oracle-s3-integration.preparing.instance"></a>

配置进行 Amazon S3 集成的权限的最后一步是将您的 IAM 角色与数据库实例相关联。请注意以下要求：
+ 您必须具有访问 IAM 角色的权限，并向此角色附加所需的 Amazon S3 权限策略。
+ 您一次只能将一个 IAM 角色与 RDS for Oracle 数据库实例关联。
+ 数据库实例必须处于**可用**状态。

### 控制台
<a name="oracle-s3-integration.preparing.instance.console"></a>

**将您的 IAM 角色与 RDS for Oracle 数据库实例关联**

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

1. 从导航窗格中选择 **Databases (数据库)**。

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

1. 在 **Connectivity & security**（连接性和安全性）选项卡上，向下滚动到页面底部的 **Manage IAM roles**（管理 IAM 角色）部分。

1. 对于**向此实例添加 IAM 角色**，选择您在[步骤 3：为您的数据库实例创建 IAM 角色并附加策略](#oracle-s3-integration.preparing.role)中创建的角色。

1. 对于 **Feature (功能)**，选择 **S3\$1INTEGRATION**。  
![\[添加 S3_INTEGRATION 角色\]](http://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/images/ora-s3-integration-role.png)

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

### Amazon CLI
<a name="oracle-s3-integration.preparing.instance.CLI"></a>

以下 Amazon CLI 命令将角色添加到名为 `mydbinstance` 的 Oracle 数据库实例。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws rds add-role-to-db-instance \
   --db-instance-identifier mydbinstance \
   --feature-name S3_INTEGRATION \
   --role-arn your-role-arn
```
对于：Windows  

```
aws rds add-role-to-db-instance ^
   --db-instance-identifier mydbinstance ^
   --feature-name S3_INTEGRATION ^
   --role-arn your-role-arn
```

将 `your-role-arn` 替换为您在上一步中记下的角色 ARN。必须为 `S3_INTEGRATION` 选项指定 `--feature-name`。