将 Amazon S3 中的数据导入到 Aurora PostgreSQL 数据库集群
您可以将已使用 Amazon Simple Storage Service 存储的数据导入到
Aurora PostgreSQL 数据库集群
上的表中。为此,您首先要安装
Aurora PostgreSQL
aws_s3
扩展。该扩展提供用于从 AmazonS3 桶导入数据的函数。
桶
是用于存储对象和文件的 Amazon S3 容器。数据可以位于逗号分隔值(CSV)文件、文本文件或压缩(gzip)文件中。接下来,您可以了解如何安装扩展以及如何将数据从 Amazon S3 导入到表中。
要从 Amazon S3 导入到 ,您的数据库必须运行 PostgreSQL 版本 10.7 或更高版本。 Aurora PostgreSQL 。
如果您没有将数据存储在 Amazon S3 上,则需要先创建桶并存储数据。有关更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的以下主题。
支持从 Amazon S3 跨账户导入。有关更多信息,请参阅《Amazon Simple Storage Service 用户指南》 中的 授予跨账户权限 。
从 S3 导入数据时,您可以使用客户托管式密钥进行加密。有关更多信息,请参阅《Amazon Simple Storage Service 用户指南》 中的 AWS KMS 中存储的 KMS 密钥 。
注意
对于 Aurora Serverless v1,不支持从 Amazon S3 导入数据。Aurora Serverless v2 支持此功能。
主题
安装 aws_s3 扩展名
在将 Amazon S3 用于
Aurora PostgreSQL 数据库集群
之前,您需要安装
aws_s3
扩展。此扩展提供从 Amazon S3 导入数据的函数。它还提供将数据从
Aurora PostgreSQL 数据库集群的实例
中导出到 Amazon S3 桶的函数。有关更多信息,请参阅
将数据从 Aurora PostgreSQL 数据库集群导出到 Amazon S3
。
aws_s3
扩展依赖于
aws_commons
扩展(需要时自动安装)中的一些帮助程序函数。
安装
aws_s3
扩展
-
使用 psql(或 pgAdmin)以具有
rds_superuser
权限的用户身份,连接到 Aurora PostgreSQL 数据库集群的写入器实例 。如果您在设置过程中保留原定设置名称,则以postgres
进行连接。psql --host=
111122223333
.aws-region
.rds.amazonaws.com --port=5432 --username=postgres --password -
要安装扩展,请运行以下命令。
postgres=>
CREATE EXTENSION aws_s3 CASCADE;NOTICE: installing required extension "aws_commons" CREATE EXTENSION
-
要验证扩展是否已安装,可以使用 psql
\dx
元命令。postgres=>
\dxList of installed extensions Name | Version | Schema | Description -------------+---------+------------+--------------------------------------------- aws_commons | 1.2 | public | Common data types across AWS services aws_s3 | 1.1 | public | AWS S3 extension for importing data from S3 plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language (3 rows)
从 Amazon S3 导入数据和将数据导出到 Amazon S3 的函数现在可供使用。
从 Amazon S3 数据导入数据概述
将 S3 数据导入到 Aurora PostgreSQL
首先,收集您需要为该函数提供的详细信息。其中包括 Aurora PostgreSQL 数据库集群的实例 上的表名称、桶名称、文件路径、文件类型以及存储 Amazon S3 数据的 AWS 区域。有关更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的 查看对象 。
注意
目前不支持从 Amazon S3 导入分段数据。
-
获取
aws_s3.table_import_from_s3
函数要向其中导入数据的表的名称。例如,以下命令创建表t1
,供在后面的步骤中使用。postgres=>
CREATE TABLE t1 (col1 varchar(80), col2 varchar(80), col3 varchar(80)); -
获取有关 Amazon S3 桶和要导入的数据的详细信息。为此,请通过以下网址打开 Amazon S3 控制台: https://console.aws.amazon.com/s3/
记下桶名称、路径、AWS 区域和文件类型。您稍后需要提供 Amazon 资源名称(ARN),以便通过 IAM 角色设置对 Amazon S3 的访问权限。有关更多信息,请参阅 设置 Amazon S3 存储桶的访问权限 。下图显示了一个示例。
-
您可以使用 AWS CLI 命令
aws s3 cp
验证 AmazonS3 桶上数据的路径。如果该信息正确无误,该命令将下载 Amazon S3 文件的副本。aws s3 cp s3://
DOC-EXAMPLE-BUCKET
/sample_file_path
./在 Aurora PostgreSQL 数据库集群 上设置权限,以允许访问 Amazon S3 桶中的文件。为此,您可以使用 AWS Identity and Access Management(IAM)角色或安全凭证。有关更多信息,请参阅 设置 Amazon S3 存储桶的访问权限 。
-
将收集的路径和其他 Amazon S3 对象详细信息(请参阅步骤 2)提供给用于构造 Amazon S3 URI 对象的
create_s3_uri
函数。要了解有关此函数的更多信息,请参阅 aws_commons.create_s3_uri 。以下是在 psql 会话期间构造此对象的示例。postgres=>
SELECT aws_commons.create_s3_uri( 'docs-lab-store-for-rpg', 'versions_and_jdks_listing.csv', 'us-west-1' ) AS s3_uri \gset在下一步中,您将此对象(
aws_commons._s3_uri_1
)传递到aws_s3.table_import_from_s3
函数,以便将数据导入表中。调用
aws_s3.table_import_from_s3
函数,以将数据从 Amazon S3 导入到您的表中。有关参考信息,请参阅 aws_s3.table_import_from_s3 。有关示例,请参阅 将数据从 Amazon S3 导入到 Aurora PostgreSQL 数据库集群 。设置 Amazon S3 存储桶的访问权限
要从 Amazon S3 文件中导入数据,请为 Aurora PostgreSQL 数据库集群 提供权限以访问包含该文件的 Amazon S3 存储桶。您可以通过两种方式提供 Amazon S3 存储桶的访问权限,如以下主题中所述。
使用 IAM 角色访问 Amazon S3 存储桶
从 Amazon S3 文件中加载数据之前,请为 Aurora PostgreSQL 数据库集群 提供权限以访问该文件所在的 Amazon S3 存储桶。这样,您无需管理其他凭证信息或在 aws_s3.table_import_from_s3 函数调用中提供该信息。
为此,请创建一个 IAM 策略以提供 Amazon S3 存储桶的访问权限。创建一个 IAM 角色并将策略附加到该角色。然后,将该 IAM 角色分配给数据库 集群 。
注意
您无法将 IAM 角色与 Aurora Serverless v1 数据库集群关联,因此以下步骤不适用。
通过 IAM 角色授予 Aurora PostgreSQL 数据库集群 访问 Amazon S3 的权限
-
创建一个 IAM 策略。
该策略提供存储桶和对象权限,以允许 Aurora PostgreSQL 数据库集群 访问 Amazon S3。
在策略中包含以下必需操作,以允许将文件从 Amazon S3 存储桶传输到 Aurora PostgreSQL :
arn:aws:s3:::
DOC-EXAMPLE-BUCKET
/*有关为 Aurora PostgreSQL 创建 IAM policy 的更多信息,请参阅 创建和使用适用于 IAM 数据库访问的 IAM 策略 。另请参阅 IAM 用户指南 中的 教程:创建和附加您的第一个客户托管式策略 。
以下 AWS CLI 命令使用这些选项创建一个名为
rds-s3-import-policy
的 IAM 策略。它授予对名为DOC-EXAMPLE-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:::
DOC-EXAMPLE-BUCKET
", "arn:aws:s3:::DOC-EXAMPLE-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:::
DOC-EXAMPLE-BUCKET
", "arn:aws:s3:::DOC-EXAMPLE-BUCKET
/*"创建一个 IAM 角色。
这样,Aurora PostgreSQL 就可以担任该 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:cluster:clustername
" }'对于 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:cluster:clustername
"将您创建的 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-cluster
的 PostgreSQL 数据库集群中。将
替换为您在上一步中记下的角色 ARN。使用your-role-arn
s3Import
作为--feature-name
选项的值。例
对于 Linux、macOS 或 Unix:
aws rds add-role-to-db-cluster \ --db-cluster-identifier
my-db-cluster
\ --feature-name s3Import \ --role-arnyour-role-arn
\ --regionyour-region
对于 Windows:
aws rds add-role-to-db-cluster ^ --db-cluster-identifier
my-db-cluster
^ --feature-name s3Import ^ --role-arnyour-role-arn
^ --regionyour-region
要使用 Amazon RDS API 为 PostgreSQL 数据库集群添加 IAM 角色,请调用 AddRoleToDBCluster 操作。
使用安全凭证访问 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 S3 导入到 Aurora PostgreSQL 数据库集群
您可以使用 aws_S3 扩展的
table_import_from_s3
函数从 Amazon S3 桶导入数据。有关参考信息,请参阅aws_s3.table_import_from_s3。注意
以下示例使用 IAM 角色方法以允许访问 Amazon S3 桶。因此,
aws_s3.table_import_from_s3
函数调用不包括凭据参数。下面显示典型示例。
postgres=>
SELECT aws_s3.table_import_from_s3( 't1', '(format csv)', :'s3_uri'下面是参数:
t1
– 将数据复制到的 PostgreSQL 数据库集群中的表的名称。''
– 数据库表中的列的可选列表。您可以使用此参数来指示哪些 S3 数据列进入哪些表列中。如果未指定任何列,则会将所有列复制到表中。有关使用列列表的示例,请参阅 导入使用自定义分隔符的 Amazon S3 文件。(format csv)
– PostgreSQL COPY 参数。复制过程使用 PostgreSQL COPY命令的参数和格式以导入数据。格式选择包括本例中所示的逗号分隔值(CSV),以及文本和二进制。原定设置为文本。 s3_uri
– 包含标识 Amazon S3 文件的信息的结构。有关使用 aws_commons.create_s3_uri 函数创建s3_uri
结构的示例,请参阅 从 Amazon S3 数据导入数据概述。有关此函数的更多信息,请参阅 aws_s3.table_import_from_s3。
aws_s3.table_import_from_s3
函数返回文本。要指定要从 Amazon S3 存储桶中导入的其他类型的文件,请参阅以下示例之一。注意
导入 0 字节文件将导致错误。
导入使用自定义分隔符的 Amazon S3 文件
以下示例说明了如何导入使用自定义分隔符的文件。它还说明如何使用
column_list
函数的 aws_s3.table_import_from_s3 参数来控制将数据放置在数据库表中的哪个位置。在此示例中,假定将以下信息组织到 Amazon S3 文件中的竖线分隔列中。
1|foo1|bar1|elephant1 2|foo2|bar2|elephant2 3|foo3|bar3|elephant3 4|foo4|bar4|elephant4
导入使用自定义分隔符的文件
-
在数据库中为导入的数据创建一个表。
postgres=>
CREATE TABLE test (a text, b text, c text, d text, e text);使用以下形式的 aws_s3.table_import_from_s3 函数从 Amazon S3 文件导入数据。
您可以在 aws_commons.create_s3_uri 函数调用中以内联方式包括
aws_s3.table_import_from_s3
函数调用来指定文件。postgres=>
SELECT aws_s3.table_import_from_s3( 'test', 'a,b,d,e', 'DELIMITER ''|''', aws_commons.create_s3_uri('DOC-EXAMPLE-BUCKET
', 'pipeDelimitedSampleFile', 'us-east-2')数据现在位于表的以下列中。
postgres=>
SELECT * FROM test;a | b | c | d | e ---+------+---+---+------+----------- 1 | foo1 | | bar1 | elephant1 2 | foo2 | | bar2 | elephant2 3 | foo3 | | bar3 | elephant3 4 | foo4 | | bar4 | elephant4
导入 Amazon S3 压缩 (gzip) 文件
以下示例说明如何从 Amazon S3 导入使用 gzip 压缩的文件。导入的文件需要具有以下 Amazon S3 元数据:
值:
gzip
如果使用 AWS Management Console 上传文件,则元数据通常由系统应用。有关使用 AWS Management Console、AWS CLI 或 API 将文件上传到 Amazon S3 的信息,请参阅《Amazon Simple Storage Service 用户指南》中的上传对象。
有关 Amazon S3 元数据的更多信息以及有关系统提供的元数据的详细信息,请参阅《Amazon Simple Storage Service 用户指南》中的在 Amazon S3 控制台中编辑对象元数据。
将 gzip 文件导入到 Aurora PostgreSQL 数据库集群,如下所示。
postgres=>
CREATE TABLE test_gzip(id int, a text, b text, c text, d text);postgres=>
SELECT aws_s3.table_import_from_s3( 'test_gzip', '', '(format csv)', 'DOC-EXAMPLE-BUCKET
', 'test-data.gz', 'us-east-2'导入编码的 Amazon S3 文件
以下示例说明如何从 Amazon S3 导入具有 Windows-1252 编码的文件。
postgres=>
SELECT aws_s3.table_import_from_s3( 'test_table', '', 'encoding ''WIN1252''', aws_commons.create_s3_uri('DOC-EXAMPLE-BUCKET
', 'SampleFile', 'us-east-2')aws_s3.table_import_from_s3
将 Amazon S3 数据导入到 Aurora PostgreSQL 表中。
aws_s3
扩展提供aws_s3.table_import_from_s3
函数。返回值为文本。必需的参数为
table_name
、column_list
和options
。这些标识数据库表并指定如何将数据复制到表中。您还可以使用以下参数:
s3_info
参数指定要导入的 Amazon S3 文件。在您使用此参数时,IAM 角色为 PostgreSQL 数据库集群提供访问 Amazon S3 的权限。aws_s3.table_import_from_s3 ( table_name text, column_list text, options text, s3_info aws_commons._s3_uri_1
credentials
参数指定凭证以访问 Amazon S3。在您使用此参数时,不使用 IAM 角色。aws_s3.table_import_from_s3 ( table_name text, column_list text, options text, s3_info aws_commons._s3_uri_1, credentials aws_commons._aws_credentials_1
- column_list
包含要将数据复制到的 PostgreSQL 数据库表列的可选列表的必需文本字符串。如果此字符串为空,将使用表的所有列。有关示例,请参阅导入使用自定义分隔符的 Amazon S3 文件。
- options
包含 PostgreSQL
COPY
命令的参数的必需文本字符串。这些参数指定如何将数据复制到 PostgreSQL 表中。有关更多详细信息,请参阅 PostgreSQL COPY 文档。 - s3_info
包含有关 S3 对象的以下信息的
aws_commons._s3_uri_1
复合类型:不使用
s3_info
参数来标识 Amazon S3 文件,而使用bucket
、file_path
和region
参数的组合。使用此形式的函数,IAM 角色在 PostgreSQL 数据库实例上提供访问 Amazon S3 的权限。aws_s3.table_import_from_s3 ( table_name text, column_list text, options text, bucket text, file_path text, region text
不使用
credentials
参数来指定 Amazon S3 访问权限,而使用access_key
、session_key
和session_token
参数的组合。aws_s3.table_import_from_s3 ( table_name text, column_list text, options text, bucket text, file_path text, region text, access_key text, secret_key text, session_token text
aws_commons.create_s3_uri
创建
aws_commons._s3_uri_1
结构来保存 Amazon S3 文件信息。在aws_commons.create_s3_uri
函数的s3_info
参数中使用 aws_s3.table_import_from_s3 函数的结果。aws_commons.create_s3_uri( bucket text, file_path text, region text
aws_commons.create_aws_credentials
在
aws_commons._aws_credentials_1
结构中设置访问密钥和私有密钥。在aws_commons.create_aws_credentials
函数的credentials
参数中使用 aws_s3.table_import_from_s3 函数的结果。aws_commons.create_aws_credentials( access_key text, secret_key text, session_token text
-
-