

# 将 RDS for SQL Server 与 S3 集成的先决条件
<a name="Appendix.SQLServer.Options.S3-integration.preparing"></a>

在开始之前，请找到或创建要使用的 S3 存储桶。另外，添加权限，以便 RDS 数据库实例可以访问 S3 存储桶。要配置此访问权限，请同时创建 IAM 策略和 IAM 角色。

## 控制台
<a name="Appendix.SQLServer.Options.S3-integration.preparing.console"></a>

**创建用于访问 Amazon S3 的 IAM 策略**

1. 在 [IAM 管理控制台](https://console.aws.amazon.com/iam/home?#home)中，选择导航窗格中的**策略**。

1. 创建新策略，并使用 **Visual editor (可视化编辑器)** 选项卡执行以下步骤。

1. 对于 **Service (服务)**，输入 **S3**，然后选择 **S3** 服务。

1. 对于**操作**，选择以下各项以授予数据库实例所需的访问权限：
   + `ListAllMyBuckets` – 必需
   + `ListBucket` – 必需
   + `GetBucketAcl` – 必需
   + `GetBucketLocation` – 必需
   + `GetObject` – 将文件从 S3 下载到 所必需`D:\S3\`
   + `PutObject` – 将文件从 `D:\S3\` 上传到 S3 所必需
   + `ListMultipartUploadParts` – 将文件从 `D:\S3\` 上传到 S3 所必需
   + `AbortMultipartUpload` – 将文件从 `D:\S3\` 上传到 S3 所必需

1. 对于 **Resources (资源)**，显示的选项取决于您在上一步中选择的操作。您可能会看到针对 **bucket (存储桶)** 和/或 **object (对象)** 的选项。对于其中的每一个，添加适当的 Amazon Resource Name (ARN)。

   对于 **bucket (存储桶)**，为要使用的存储桶添加 ARN。例如，如果存储桶名为 *amzn-s3-demo-bucket*，请将 ARN 设置为 `arn:aws:s3:::amzn-s3-demo-bucket`。

   对于 **object (对象)**，为存储桶输入 ARN，然后选择以下各项之一：
   + 要授予对指定存储桶中所有文件的访问权限，请为 **Bucket name (存储桶名称)** 和 **Object name (对象名称)** 选择 **Any (任何)**。
   + 要授予对存储桶中特定文件或文件夹的访问权限，请提供您希望 SQL Server 访问的特定存储桶和对象的 ARN。

1. 按照控制台中的说明进行操作，直到您完成策略创建。

   前面是设置策略的简要指南。有关创建 IAM 策略的更多详细说明，请参阅 *IAM 用户指南*中的 [创建 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

**创建使用上一过程中的 IAM 策略的 IAM 角色**

1. 在 [IAM 管理控制台](https://console.aws.amazon.com/iam/home?#home)中，选择导航窗格中的**角色**。

1. 创建新的 IAM 角色，然后选择控制台中显示的以下选项：
   + **AWS 服务**
   + **RDS**
   + **RDS – Add Role to Database (将角色添加到数据库**

   然后选择底部的 **Next:Permissions (下一步: 权限)**。

1. 对于 **Attach permissions policies (附加权限策略)**，输入您之前创建的 IAM 策略的名称。然后，从列表中选择该策略。

1. 按照控制台中的说明进行操作，直到您完成角色创建。

   前面是设置角色的简要指南。如果您需要有关创建角色的更多详细说明，请参阅 *IAM 用户指南*中的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。

## AWS CLI
<a name="Appendix.SQLServer.Options.S3-integration.preparing.CLI"></a>

要授予 Amazon RDS 对 Amazon S3 存储桶的访问权限，请使用以下过程：

1. 创建向 Amazon RDS 授予对 S3 存储桶的访问权限的 IAM 策略。

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

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

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

**创建 IAM policy**

包括适当的操作以授予数据库实例所需的访问权限：
+ `ListAllMyBuckets` – 必需
+ `ListBucket` – 必需
+ `GetBucketAcl` – 必需
+ `GetBucketLocation` – 必需
+ `GetObject` – 将文件从 S3 下载到 所必需`D:\S3\`
+ `PutObject` – 将文件从 `D:\S3\` 上传到 S3 所必需
+ `ListMultipartUploadParts` – 将文件从 `D:\S3\` 上传到 S3 所必需
+ `AbortMultipartUpload` – 将文件从 `D:\S3\` 上传到 S3 所必需

1. 以下 AWS 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": [
   	            {
   	                "Effect": "Allow",
   	                "Action": "s3:ListAllMyBuckets",
   	                "Resource": "*"
   	            },
   	            {
   	                "Effect": "Allow",
   	                "Action": [
   	                    "s3:ListBucket",
   	                    "s3:GetBucketAcl",
   	                    "s3:GetBucketLocation"
   	                ],
   	                "Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
   	            },
   	            {
   	                "Effect": "Allow",
   	                "Action": [
   	                    "s3:GetObject",
   	                    "s3:PutObject",
   	                    "s3:ListMultipartUploadParts",
   	                    "s3:AbortMultipartUpload"
   	                ],
   	                "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/key_prefix/*"
   	            }
   	        ]
   	    }'
   ```

   对于：Windows

   确保将行尾更改为您的界面支持的行尾（`^` 而不是 `\`）。另外，在 Windows 中，您必须使用 `\` 来转义所有双引号。为了避免需要转义 JSON 中的引号，您可以将其保存到文件中并将该文件作为参数传入。

   首先，创建包含以下权限策略的 `policy.json` 文件：

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "s3:ListAllMyBuckets",
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:ListBucket",
                   "s3:GetBucketACL",
                   "s3:GetBucketLocation"
               ],
               "Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "s3:PutObject",
                   "s3:ListMultipartUploadParts",
                   "s3:AbortMultipartUpload"
               ],
               "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/key_prefix/*"
           }
       ]
   }
   ```

------

   然后使用以下命令创建策略：

   ```
   aws iam create-policy ^
        --policy-name rds-s3-integration-policy ^
        --policy-document file://file_path/assume_role_policy.json
   ```

1. 创建策略之后，请记下策略的 Amazon Resource Name (ARN)。后续步骤需要该 ARN。

**创建 IAM 角色**
+ 以下 AWS CLI 命令创建 `rds-s3-integration-role` IAM 角色来实现此目的。  
**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"
  	       }
  	     ]
  	   }'
  ```

  对于：Windows

  确保将行尾更改为您的界面支持的行尾（`^` 而不是 `\`）。另外，在 Windows 中，您必须使用 `\` 来转义所有双引号。为了避免需要转义 JSON 中的引号，您可以将其保存到文件中并将该文件作为参数传入。

  首先，创建包含以下策略的 `assume_role_policy.json` 文件：

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "rds.amazonaws.com"
                  ]
              },
              "Action": "sts:AssumeRole"
          }
      ]
  }
  ```

------

  然后使用以下命令创建 IAM 角色：

  ```
  aws iam create-role ^
       --role-name rds-s3-integration-role ^
       --assume-role-policy-document file://file_path/assume_role_policy.json
  ```  
**Example 使用全局条件上下文键创建 IAM 角色**  

  我们建议在基于资源的策略中使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-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)最有效的方法。

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

  在此策略中，请务必使用 `aws:SourceArn` 全局条件上下文键和访问角色资源的完整 Amazon Resource Name (ARN)。对于 S3 集成，请确保包含数据库实例 ARN，如以下示例所示。

  对于 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:SourceArn":"arn:aws:rds:Region:my_account_ID:db:db_instance_identifier"
                      }
                  }
  	       }
  	     ]
  	   }'
  ```

  对于：Windows

  将全局条件上下文键添加至 `assume_role_policy.json`。

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "rds.amazonaws.com"
                  ]
              },
              "Action": "sts:AssumeRole",
              "Condition": {
                  "StringEquals": {
                      "aws:SourceArn":"arn:aws:rds:Region:my_account_ID:db:db_instance_identifier"
                  }
              }
          }
      ]
  }
  ```

------

**将 IAM 策略附加到 IAM 角色**
+ 以下 AWS CLI 命令将策略附加到名为 `rds-s3-integration-role` 的角色。将 `your-policy-arn` 替换为您在上一步中记下的策略 ARN。  
**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
  ```