将 RDS for SQL Server 与 S3 集成的先决条件 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

将 RDS for SQL Server 与 S3 集成的先决条件

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

创建用于访问 Amazon S3 的 IAM 策略
  1. IAM 管理控制台中,选择导航窗格中的策略

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

  3. 对于 Service (服务),输入 S3,然后选择 S3 服务。

  4. 对于操作,选择以下各项以授予数据库实例所需的访问权限:

    • ListAllMyBuckets – 必需

    • ListBucket – 必需

    • GetBucketACL – 必需

    • GetBucketLocation – 必需

    • GetObject – 将文件从 S3 下载到 所必需D:\S3\

    • PutObject – 将文件从 D:\S3\ 上传到 S3 所必需

    • ListMultipartUploadParts – 将文件从 D:\S3\ 上传到 S3 所必需

    • AbortMultipartUpload – 将文件从 D:\S3\ 上传到 S3 所必需

  5. 对于 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。

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

    前面是设置策略的简要指南。有关创建 IAM 策略的更多详细说明,请参阅 IAM 用户指南中的 创建 IAM 策略

创建使用上一过程中的 IAM 策略的 IAM 角色
  1. IAM 管理控制台中,选择导航窗格中的角色

  2. 创建新的 IAM 角色,然后选择控制台中显示的以下选项:

    • Amazon 服务

    • RDS

    • RDS – Add Role to Database (将角色添加到数据库)

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

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

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

    前面是设置角色的简要指南。如果您需要有关创建角色的更多详细说明,请参阅 IAM 用户指南中的 IAM 角色

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

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

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

    有关更多信息,请参阅《IAM 用户指南》中的创建向 IAM 用户委派权限的角色

  3. 将您创建的 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. 以下 Amazon CLI 命令使用这些选项创建一个名为 rds-s3-integration-policy 的 IAM 策略。该策略授予对名为 amzn-s3-demo-bucket 的存储桶的访问权限。

    对于 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 文件:

    { "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
  2. 创建策略之后,请记下策略的 Amazon Resource Name (ARN)。后续步骤需要该 ARN。

创建 IAM 角色
  • 以下 Amazon CLI 命令创建 rds-s3-integration-role IAM 角色来实现此目的。

    对于 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 文件:

    { "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
    例 使用全局条件上下文键创建 IAM 角色

    我们建议在基于资源的策略中使用 aws:SourceArnaws:SourceAccount 全局条件上下文键,以此限制服务对特定资源的权限。这是防范混淆代理问题最有效的方法。

    您可以使用这两个全局条件上下文键并让 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

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

    对于 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