设置 Amazon S3 存储桶的访问权限
要从 Amazon S3 文件中导入数据,请为 RDS for PostgreSQL 数据库实例提供权限以访问包含该文件的 Amazon S3 存储桶。您可以通过两种方式提供 Amazon S3 存储桶的访问权限,如以下主题中所述。
使用 IAM 角色访问 Amazon S3 存储桶
从 Amazon S3 文件中加载数据之前,请为 RDS for PostgreSQL 数据库实例提供权限以访问该文件所在的 Amazon S3 存储桶。这样,您无需管理其他凭证信息或在 aws_s3.table_import_from_s3 函数调用中提供该信息。
为此,请创建一个 IAM 策略以提供 Amazon S3 存储桶的访问权限。创建一个 IAM 角色并将策略附加到该角色。然后,将该 IAM 角色分配给数据库实例。
通过 IAM 角色授予 RDS for PostgreSQL 数据库实例访问 Amazon S3 的权限
-
创建一个 IAM 策略。
该策略提供存储桶和对象权限,以允许 RDS for PostgreSQL 数据库实例访问 Amazon S3。
在策略中包含以下必需操作,以允许将文件从 Amazon S3 存储桶传输到 Amazon RDS:
-
s3:GetObject
-
s3:ListBucket
在策略中包含以下资源以标识 Amazon S3 存储桶以及存储桶中的对象。这会显示用于访问 Amazon S3 的 Amazon Resource Name (ARN) 格式。
-
arn:aws:s3:::
amzn-s3-demo-bucket
-
arn:aws:s3:::
amzn-s3-demo-bucket
/*
有关为 RDS for PostgreSQL 创建 IAM policy 的更多信息,请参阅创建和使用适用于 IAM 数据库访问的 IAM 策略。另请参阅 IAM 用户指南中的教程:创建和附加您的第一个客户托管式策略。
以下 AWS CLI 命令使用这些选项创建一个名为
rds-s3-import-policy
的 IAM 策略。该策略授予对名为amzn-s3-demo-bucket
的存储桶的访问权限。注意
记下此命令返回的策略的 Amazon 资源名称(ARN)。在后续步骤中将策略附加到 IAM 角色时,您需要此 ARN。
例
对于 Linux、macOS 或 Unix:
aws iam create-policy \ --policy-name rds-s3-import-policy \ --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Sid": "s3import", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::
amzn-s3-demo-bucket
", "arn:aws:s3:::amzn-s3-demo-bucket
/*" ] } ] }'对于 Windows:
aws iam create-policy ^ --policy-name rds-s3-import-policy ^ --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Sid": "s3import", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::
amzn-s3-demo-bucket
", "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
全局条件上下文键。以下示例说明了如何使用 AWS CLI 命令创建一个名为rds-s3-import-role
的角色来实现该目的。例
对于 Linux、macOS 或 Unix:
aws iam create-role \ --role-name rds-s3-import-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-import-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 角色。
以下 AWS CLI 命令将上一步中创建的策略附加到一个名为
rds-s3-import-role
的角色。请将
替换为您在前面的步骤中记下的策略 ARN。your-policy-arn
例
对于 Linux、macOS 或 Unix:
aws iam attach-role-policy \ --policy-arn
your-policy-arn
\ --role-name rds-s3-import-role对于 Windows:
aws iam attach-role-policy ^ --policy-arn
your-policy-arn
^ --role-name rds-s3-import-role -
将该 IAM 角色添加到数据库实例中。
您可以使用 AWS Management Console 或 AWS CLI 执行该操作,如下所述。
使用控制台为 PostgreSQL 数据库实例添加 IAM 角色
登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/
。 -
选择 PostgreSQL 数据库实例名称以显示其详细信息。
-
在连接性和安全性选项卡上的管理 IAM 角色部分中,在向此实例添加 IAM 角色下选择要添加的角色。
-
在 Feature (功能) 下,选择 s3Import。
-
选择 Add role (添加角色)。
使用 CLI 为 PostgreSQL 数据库实例添加 IAM 角色
-
使用以下命令将角色添加到名为
my-db-instance
的 PostgreSQL 数据库实例中。将
替换为您在上一步中记下的角色 ARN。使用your-role-arn
s3Import
作为--feature-name
选项的值。例
对于 Linux、macOS 或 Unix:
aws rds add-role-to-db-instance \ --db-instance-identifier
my-db-instance
\ --feature-name s3Import \ --role-arnyour-role-arn
\ --regionyour-region
对于 Windows:
aws rds add-role-to-db-instance ^ --db-instance-identifier
my-db-instance
^ --feature-name s3Import ^ --role-arnyour-role-arn
^ --regionyour-region
要使用 Amazon RDS API 为 PostgreSQL 数据库实例添加 IAM 角色,请调用 AddRoleToDBInstance 操作。
使用安全凭证访问 Amazon S3 存储桶
如果愿意,您可以使用安全凭证提供 Amazon S3 存储桶的访问权限,而不是使用 IAM 角色提供访问权限。这可以通过在 aws_s3.table_import_from_s3 函数调用中指定 credentials
参数来实现。
credentials
参数是 aws_commons._aws_credentials_1
类型的结构,其中包含 AWS 凭证。使用 aws_commons.create_aws_credentials 函数设置 aws_commons._aws_credentials_1
结构中的访问密钥和私有密钥,如下所示。
postgres=>
SELECT aws_commons.create_aws_credentials( 'sample_access_key
', 'sample_secret_key
', '') AS creds \gset
在创建 aws_commons._aws_credentials_1
结构后,请将 aws_s3.table_import_from_s3 函数与 credentials
参数结合使用来导入数据,如下所示。
postgres=>
SELECT aws_s3.table_import_from_s3( 't', '', '(format csv)', :'s3_uri', :'creds' );
也可以在 aws_commons.create_aws_credentials 函数调用中以内联方式包括 aws_s3.table_import_from_s3
函数调用。
postgres=>
SELECT aws_s3.table_import_from_s3( 't', '', '(format csv)', :'s3_uri', aws_commons.create_aws_credentials('sample_access_key
', 'sample_secret_key
', '') );
Amazon S3 访问故障排除
如果在尝试从 Amazon S3 导入数据时遇到连接问题,请参阅以下内容以了解相应的建议:
-
Amazon Simple Storage Service 用户指南中的排查 Amazon S3 的问题
-
IAM 用户指南中的排查 Amazon S3 和 IAM 的问题