设置 Amazon S3 存储桶的访问权限 - Amazon Relational Database Service

设置 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 的权限
  1. 创建一个 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/*" ] } ] }'
  2. 创建一个 IAM 角色。

    这样,Amazon RDS 就可以担任该 IAM 角色以访问您的 Amazon S3 存储桶。有关更多信息,请参阅《IAM 用户指南》中的创建向 IAM 用户委派权限的角色

    我们建议在基于资源的策略中使用 aws:SourceArnaws: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" } } } ] }'
  3. 将您创建的 IAM 策略附加到您创建的 IAM 角色。

    以下 AWS CLI 命令将上一步中创建的策略附加到一个名为 rds-s3-import-role 的角色。请将 your-policy-arn 替换为您在前面的步骤中记下的策略 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
  4. 将该 IAM 角色添加到数据库实例中。

    您可以使用 AWS Management Console 或 AWS CLI 执行该操作,如下所述。

使用控制台为 PostgreSQL 数据库实例添加 IAM 角色
  1. 登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

  2. 选择 PostgreSQL 数据库实例名称以显示其详细信息。

  3. 连接性和安全性选项卡上的管理 IAM 角色部分中,在向此实例添加 IAM 角色下选择要添加的角色。

  4. Feature (功能) 下,选择 s3Import

  5. 选择 Add role (添加角色)

使用 CLI 为 PostgreSQL 数据库实例添加 IAM 角色
  • 使用以下命令将角色添加到名为 my-db-instance 的 PostgreSQL 数据库实例中。将 your-role-arn 替换为您在上一步中记下的角色 ARN。使用 s3Import 作为 --feature-name 选项的值。

    对于 Linux、macOS 或 Unix:

    aws rds add-role-to-db-instance \ --db-instance-identifier my-db-instance \ --feature-name s3Import \ --role-arn your-role-arn \ --region your-region

    对于 Windows:

    aws rds add-role-to-db-instance ^ --db-instance-identifier my-db-instance ^ --feature-name s3Import ^ --role-arn your-role-arn ^ --region your-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 导入数据时遇到连接问题,请参阅以下内容以了解相应的建议: