设置 Amazon S3 存储桶的访问权限
要将数据导出到 Amazon S3,请为 PostgreSQL 数据库实例提供权限以访问文件将保存到的 Amazon S3 存储桶。
为此,请使用以下过程。
通过 IAM 角色向 PostgreSQL 数据库实例授予访问 Amazon S3 的权限
-
创建一个 IAM 策略。
该策略提供存储桶和对象权限,以允许 PostgreSQL 数据库实例访问 Amazon S3。
在创建此策略的过程中,请执行以下步骤:
-
在策略中包含以下必需操作,以允许将文件从 PostgreSQL 数据库实例传输到 Amazon S3 存储桶:
-
s3:PutObject
-
s3:AbortMultipartUpload
-
-
包含用于标识 Amazon S3 存储桶以及其中的对象的 Amazon Resource Name (ARN)。用于访问 Amazon S3 的 ARN 格式为:
arn:aws:s3:::
amzn-s3-demo-bucket
/*
有关为 Amazon RDS for PostgreSQL 创建 IAM 策略的更多信息,请参阅 创建和使用适用于 IAM 数据库访问的 IAM 策略。另请参阅 IAM 用户指南中的教程:创建和附加您的第一个客户托管式策略。
以下 Amazon CLI 命令使用这些选项创建一个名为
rds-s3-export-policy
的 IAM 策略。该策略授予对名为amzn-s3-demo-bucket
的存储桶的访问权限。警告
我们建议您在一个私有 VPC 中设置数据库,该 VPC 配置了用于访问特定存储桶的端点策略。有关更多信息,请参阅 Amazon VPC 用户指南 中的对 Amazon S3 使用端点策略。
强烈建议您不要创建具有所有资源访问权限的策略。此访问权限可能会对数据安全造成威胁。如果您使用
S3:PutObject
创建一个向"Resource":"*"
授予对所有资源的访问权限的策略,则具有导出特权的用户可以将数据导出到您账户中的所有存储桶。此外,用户可以将数据导出到 Amazon 区域内的任何可公开写入的存储桶。在您创建策略之后,请记下策略的 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
/*" ] } ] }' -
-
创建一个 IAM 角色。
这样,Amazon RDS 就可以担任该 IAM 角色以代表您访问 Amazon S3 存储桶。有关更多信息,请参阅 IAM 用户指南中的创建向 IAM 用户委派权限的角色。
我们建议在基于资源的策略中使用
aws:SourceArn
和aws:SourceAccount
全局条件上下文键,以限制对特定资源的服务权限。这是防范混淆代理人问题最有效的方法。如果同时使用全局条件上下文键和包含账户 ID 的
aws:SourceArn
值,则aws:SourceAccount
值和aws:SourceArn
值中的账户在同一策略语句中使用时,必须使用相同的账户 ID。如果您想对单个资源进行跨服务访问,请使用
aws:SourceArn
。-
如果您想允许该账户中的任何资源与跨服务使用操作相关联,请使用
aws:SourceAccount
。
在策略中,确保使用具有资源的完整 ARN 的
aws:SourceArn
全局条件上下文键。以下示例说明了如何使用 Amazon CLI 命令创建一个名为rds-s3-export-role
的角色来实现该目的。例
对于 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
" } } } ] }' -
将您创建的 IAM 策略附加到您创建的 IAM 角色。
以下 Amazon CLI 命令将以前创建的策略附加到一个名为
rds-s3-export-role.
的角色。请将
替换为您在前面的步骤中记下的策略 ARN。your-policy-arn
aws iam attach-role-policy --policy-arn
your-policy-arn
--role-name rds-s3-export-role -
将该 IAM 角色添加到数据库实例中。您可以使用 Amazon Web Services Management Console 或 Amazon CLI 执行该操作,如下所述。
使用控制台为 PostgreSQL 数据库实例添加 IAM 角色
登录 Amazon Web Services Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/
。 -
选择 PostgreSQL 数据库实例名称以显示其详细信息。
-
在 Connectivity & security (连接性和安全性) 选项卡上的 Manage IAM roles (管理 IAM 角色) 部分中,在 Add IAM roles to this instance (向此实例添加 IAM 角色) 下选择要添加的角色。
-
在 Feature (功能) 下,选择 s3Export。
-
选择 Add role (添加角色)。
使用 CLI 为 PostgreSQL 数据库实例添加 IAM 角色
-
使用以下命令将角色添加到名为
my-db-instance
的 PostgreSQL 数据库实例中。将
替换为您在上一步中记下的角色 ARN。使用your-role-arn
s3Export
作为--feature-name
选项的值。例
对于 Linux、macOS 或 Unix:
aws rds add-role-to-db-instance \ --db-instance-identifier
my-db-instance
\ --feature-name s3Export \ --role-arnyour-role-arn
\ --regionyour-region
对于 Windows:
aws rds add-role-to-db-instance ^ --db-instance-identifier
my-db-instance
^ --feature-name s3Export ^ --role-arnyour-role-arn
^ --regionyour-region