

# 将 Amazon S3 中的数据导入到 RDS for PostgreSQL 数据库实例
<a name="USER_PostgreSQL.S3Import"></a>

您可以将已使用 Amazon Simple Storage Service 存储的数据导入到 RDS for PostgreSQL 数据库实例上的表中。为此，您首先要安装 RDS for PostgreSQL `aws_s3` 扩展。该扩展提供用于从 AmazonS3 桶导入数据的函数。*桶* 是用于存储对象和文件的 Amazon S3 容器。数据可以位于逗号分隔值（CSV）文件、文本文件或压缩（gzip）文件中。接下来，您可以了解如何安装扩展以及如何将数据从 Amazon S3 导入到表中。

要从 Amazon S3 导入到 RDS for PostgreSQL，您的数据库必须运行 PostgreSQL 版本 10.7 或更高版本。。

如果您没有将数据存储在 Amazon S3 上，则需要先创建桶并存储数据。有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》中的以下主题。
+ [创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html#creating-bucket)
+ [向存储桶添加对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html#uploading-an-object-bucket) 

支持从 Amazon S3 跨账户导入。有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[授予跨账户权限](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-walkthroughs-managing-access-example2.html)。

从 S3 导入数据时，您可以使用客户托管式密钥进行加密。有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的 [AWS KMS 中存储的 KMS 密钥](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html)。

**Topics**
+ [安装 aws\$1s3 扩展名](USER_PostgreSQL.S3Import.InstallExtension.md)
+ [从 Amazon S3 数据导入数据概述](USER_PostgreSQL.S3Import.Overview.md)
+ [设置 Amazon S3 存储桶的访问权限](USER_PostgreSQL.S3Import.AccessPermission.md)
+ [将数据从 Amazon S3 导入到 RDS for PostgreSQL 数据库实例](USER_PostgreSQL.S3Import.FileFormats.md)
+ [函数参考](USER_PostgreSQL.S3Import.Reference.md)

# 安装 aws\$1s3 扩展名
<a name="USER_PostgreSQL.S3Import.InstallExtension"></a>

在将 Amazon S3 用于 RDS for PostgreSQL 数据库实例之前，您需要安装 `aws_s3` 扩展。此扩展提供从 Amazon S3 导入数据的函数。它还提供将数据从 RDS for PostgreSQL 数据库实例中导出到 Amazon S3 桶的函数。有关更多信息，请参阅 [将数据从 RDS for PostgreSQL 数据库实例导出到 Amazon S3](postgresql-s3-export.md)。`aws_s3` 扩展依赖于 `aws_commons` 扩展（需要时自动安装）中的一些帮助程序函数。

**安装 `aws_s3` 扩展**

1. 使用 psql（或 pgAdmin）以具有 `rds_superuser` 权限的用户身份，连接到 RDS for PostgreSQL 数据库实例。如果您在设置过程中保留原定设置名称，则以 `postgres` 进行连接。

   ```
   psql --host=111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password
   ```

1. 要安装扩展，请运行以下命令。

   ```
   postgres=> CREATE EXTENSION aws_s3 CASCADE;
   NOTICE: installing required extension "aws_commons"
   CREATE EXTENSION
   ```

1. 要验证扩展是否已安装，可以使用 psql `\dx` 元命令。

   ```
   postgres=> \dx
          List 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 数据导入数据概述
<a name="USER_PostgreSQL.S3Import.Overview"></a>

**将 S3 数据导入到 Amazon RDS**

首先，收集您需要为该函数提供的详细信息。其中包括 RDS for PostgreSQL 数据库实例上的表名称、桶名称、文件路径、文件类型以及存储 Amazon S3 数据的 AWS 区域。有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[查看对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/OpeningAnObject.html)。
**注意**  
目前不支持从 Amazon S3 导入分段数据。

1. 获取 `aws_s3.table_import_from_s3` 函数要向其中导入数据的表的名称。例如，以下命令创建表 `t1`，供在后面的步骤中使用。

   ```
   postgres=> CREATE TABLE t1 
       (col1 varchar(80), 
       col2 varchar(80), 
       col3 varchar(80));
   ```

1. 获取有关 Amazon S3 桶和要导入的数据的详细信息。为此，请通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)，然后选择 **Buckets**（桶）。在列表中找到包含您的数据的桶。选择桶，打开其 Object overview（对象概述）页面，然后选择 Properties（属性）。

   记下桶名称、路径、AWS 区域和文件类型。您稍后需要提供 Amazon 资源名称（ARN），以便通过 IAM 角色设置对 Amazon S3 的访问权限。有关更多信息，请参阅[设置 Amazon S3 存储桶的访问权限](USER_PostgreSQL.S3Import.AccessPermission.md)。下图显示了一个示例。  
![\[Amazon S3 桶中的文件对象的图像。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/aws_s3_import-export_s3_bucket-info.png)

1. 您可以使用 AWS CLI 命令 `aws s3 cp` 验证 AmazonS3 桶上数据的路径。如果该信息正确无误，该命令将下载 Amazon S3 文件的副本。

   ```
   aws s3 cp s3://amzn-s3-demo-bucket/sample_file_path ./ 
   ```

1. 在 RDS for PostgreSQL 数据库实例上设置权限，以允许访问 Amazon S3 桶中的文件。为此，您可以使用 AWS Identity and Access Management（IAM）角色或安全凭证。有关更多信息，请参阅 [设置 Amazon S3 存储桶的访问权限](USER_PostgreSQL.S3Import.AccessPermission.md)。

1. 将收集的路径和其他 Amazon S3 对象详细信息（请参阅步骤 2）提供给用于构造 Amazon S3 URI 对象的 `create_s3_uri` 函数。要了解有关此函数的更多信息，请参阅[aws\$1commons.create\$1s3\$1uri](USER_PostgreSQL.S3Import.Reference.md#USER_PostgreSQL.S3Import.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` 函数，以便将数据导入表中。

1. 调用 `aws_s3.table_import_from_s3` 函数，以将数据从 Amazon S3 导入到您的表中。有关参考信息，请参阅[aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#aws_s3.table_import_from_s3)。有关示例，请参阅 [将数据从 Amazon S3 导入到 RDS for PostgreSQL 数据库实例](USER_PostgreSQL.S3Import.FileFormats.md)。

# 设置 Amazon S3 存储桶的访问权限
<a name="USER_PostgreSQL.S3Import.AccessPermission"></a>

要从 Amazon S3 文件中导入数据，请为 RDS for PostgreSQL 数据库实例提供权限以访问包含该文件的 Amazon S3 存储桶。您可以通过两种方式提供 Amazon S3 存储桶的访问权限，如以下主题中所述。

**Topics**
+ [使用 IAM 角色访问 Amazon S3 存储桶](#USER_PostgreSQL.S3Import.ARNRole)
+ [使用安全凭证访问 Amazon S3 存储桶](#USER_PostgreSQL.S3Import.Credentials)
+ [Amazon S3 访问故障排除](#USER_PostgreSQL.S3Import.troubleshooting)

## 使用 IAM 角色访问 Amazon S3 存储桶
<a name="USER_PostgreSQL.S3Import.ARNRole"></a>

从 Amazon S3 文件中加载数据之前，请为 RDS for PostgreSQL 数据库实例提供权限以访问该文件所在的 Amazon S3 存储桶。这样，您无需管理其他凭证信息或在 [aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#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*/\$1

   有关为 RDS for PostgreSQL 创建 IAM policy 的更多信息，请参阅[创建和使用适用于 IAM 数据库访问的 IAM 策略](UsingWithRDS.IAMDBAuth.IAMPolicy.md)。另请参阅 *IAM 用户指南*中的[教程：创建和附加您的第一个客户托管策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_managed-policies.html)。

   以下 AWS CLI 命令使用这些选项创建一个名为 `rds-s3-import-policy` 的 IAM 策略。该策略授予对名为 *amzn-s3-demo-bucket* 的存储桶的访问权限。
**注意**  
记下此命令返回的策略的 Amazon 资源名称（ARN）。在后续步骤中将策略附加到 IAM 角色时，您需要此 ARN。  
**Example**  

   对于 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/*"
            ] 
          }
        ] 
      }'
   ```

1. 创建 IAM 角色。

   这样，Amazon RDS 就可以担任该 IAM 角色以访问您的 Amazon S3 存储桶。有关更多信息，请参阅《IAM 用户指南》**中的[创建向 IAM 用户委派权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)。

   我们建议在基于资源的策略中使用 `[aws:SourceArn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn)` 和 `[aws:SourceAccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount)` 全局条件上下文键，以限制对特定资源的服务权限。这是防范[混淆代理人问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)最有效的方法。

   如果同时使用全局条件上下文键和包含账户 ID 的 `aws:SourceArn` 值，则 `aws:SourceAccount` 值和 `aws:SourceArn` 值中的账户在同一策略语句中使用时，必须使用相同的账户 ID。
   + 如果您想对单个资源进行跨服务访问，请使用 `aws:SourceArn`。
   + 如果您想允许该账户中的任何资源与跨服务使用操作相关联，请使用 `aws:SourceAccount`。

   在策略中，确保使用具有资源的完整 ARN 的 `aws:SourceArn` 全局条件上下文键。以下示例说明了如何使用 AWS CLI 命令创建一个名为 `rds-s3-import-role` 的角色来实现该目的。  
**Example**  

   对于 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"
                   }
                }
          }
        ] 
      }'
   ```

1. 将您创建的 IAM 策略附加到您创建的 IAM 角色。

   以下 AWS CLI 命令将上一步中创建的策略附加到一个名为 `rds-s3-import-role` 的角色。请将 `your-policy-arn` 替换为您在前面的步骤中记下的策略 ARN。  
**Example**  

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

1. 将该 IAM 角色添加到数据库实例中。

   您可以使用 AWS 管理控制台 或 AWS CLI 执行该操作，如下所述。

### 控制台
<a name="collapsible-section-1"></a>

**使用控制台为 PostgreSQL 数据库实例添加 IAM 角色**

1. 登录AWS 管理控制台并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

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

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

1. 在 **Feature (功能)** 下，选择 **s3Import**。

1. 选择 **Add role (添加角色)**。

### AWS CLI
<a name="collapsible-section-2"></a>

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

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

### RDS API
<a name="collapsible-section-3"></a>

要使用 Amazon RDS API 为 PostgreSQL 数据库实例添加 IAM 角色，请调用 [ AddRoleToDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_AddRoleToDBInstance.html) 操作。

## 使用安全凭证访问 Amazon S3 存储桶
<a name="USER_PostgreSQL.S3Import.Credentials"></a>

如果愿意，您可以使用安全凭证提供 Amazon S3 存储桶的访问权限，而不是使用 IAM 角色提供访问权限。这可以通过在 [aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#aws_s3.table_import_from_s3) 函数调用中指定 `credentials` 参数来实现。

`credentials` 参数是 `aws_commons._aws_credentials_1` 类型的结构，其中包含 AWS 凭证。使用 [aws\$1commons.create\$1aws\$1credentials](USER_PostgreSQL.S3Import.Reference.md#USER_PostgreSQL.S3Import.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\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#aws_s3.table_import_from_s3) 函数与 `credentials` 参数结合使用来导入数据，如下所示。

```
postgres=> SELECT aws_s3.table_import_from_s3(
   't', '', '(format csv)',
   :'s3_uri', 
   :'creds'
);
```

也可以在 [aws\$1commons.create\$1aws\$1credentials](USER_PostgreSQL.S3Import.Reference.md#USER_PostgreSQL.S3Import.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 访问故障排除
<a name="USER_PostgreSQL.S3Import.troubleshooting"></a>

如果在尝试从 Amazon S3 导入数据时遇到连接问题，请参阅以下内容以了解相应的建议：
+ [对 Amazon RDS 身份和访问权限问题进行故障排除](security_iam_troubleshoot.md)
+ *Amazon Simple Storage Service 用户指南*中的[排查 Amazon S3 的问题](https://docs.aws.amazon.com/AmazonS3/latest/userguide/troubleshooting.html)
+ *IAM 用户指南*中的[排查 Amazon S3 和 IAM 的问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_iam-s3.html)

# 将数据从 Amazon S3 导入到 RDS for PostgreSQL 数据库实例
<a name="USER_PostgreSQL.S3Import.FileFormats"></a>

您可以使用 aws\$1S3 扩展的 `table_import_from_s3` 函数从 Amazon S3 桶导入数据。有关参考信息，请参阅[aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#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 文件](#USER_PostgreSQL.S3Import.FileFormats.CustomDelimiter)。
+ `(format csv)` – PostgreSQL COPY 参数。复制过程使用 [PostgreSQL COPY](https://www.postgresql.org/docs/current/sql-copy.html) 命令的参数和格式以导入数据。格式选择包括本例中所示的逗号分隔值（CSV），以及文本和二进制。原定设置为文本。
+  `s3_uri` – 包含标识 Amazon S3 文件的信息的结构。有关使用 [aws\$1commons.create\$1s3\$1uri](USER_PostgreSQL.S3Import.Reference.md#USER_PostgreSQL.S3Import.create_s3_uri) 函数创建 `s3_uri` 结构的示例，请参阅 [从 Amazon S3 数据导入数据概述](USER_PostgreSQL.S3Import.Overview.md)。

有关此函数的更多信息，请参阅 [aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#aws_s3.table_import_from_s3)。

`aws_s3.table_import_from_s3` 函数返回文本。要指定要从 Amazon S3 存储桶中导入的其他类型的文件，请参阅以下示例之一。

**注意**  
导入 0 字节文件将导致错误。

**Topics**
+ [导入使用自定义分隔符的 Amazon S3 文件](#USER_PostgreSQL.S3Import.FileFormats.CustomDelimiter)
+ [导入 Amazon S3 压缩 (gzip) 文件](#USER_PostgreSQL.S3Import.FileFormats.gzip)
+ [导入编码的 Amazon S3 文件](#USER_PostgreSQL.S3Import.FileFormats.Encoded)

## 导入使用自定义分隔符的 Amazon S3 文件
<a name="USER_PostgreSQL.S3Import.FileFormats.CustomDelimiter"></a>

以下示例说明了如何导入使用自定义分隔符的文件。它还说明如何使用 `column_list` 函数的 [aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#aws_s3.table_import_from_s3) 参数来控制将数据放置在数据库表中的哪个位置。

在此示例中，假定将以下信息组织到 Amazon S3 文件中的竖线分隔列中。

```
1|foo1|bar1|elephant1
2|foo2|bar2|elephant2
3|foo3|bar3|elephant3
4|foo4|bar4|elephant4
...
```

**导入使用自定义分隔符的文件**

1. 在数据库中为导入的数据创建一个表。

   ```
   postgres=> CREATE TABLE test (a text, b text, c text, d text, e text);
   ```

1. 使用以下形式的 [aws\$1s3.table\$1import\$1from\$1s3](USER_PostgreSQL.S3Import.Reference.md#aws_s3.table_import_from_s3) 函数从 Amazon S3 文件导入数据。

   您可以在 [aws\$1commons.create\$1s3\$1uri](USER_PostgreSQL.S3Import.Reference.md#USER_PostgreSQL.S3Import.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('amzn-s3-demo-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) 文件
<a name="USER_PostgreSQL.S3Import.FileFormats.gzip"></a>

以下示例说明如何从 Amazon S3 导入使用 gzip 压缩的文件。导入的文件需要具有以下 Amazon S3 元数据：
+ 键：`Content-Encoding`
+ 值：`gzip`

如果使用 AWS 管理控制台 上传文件，则元数据通常由系统应用。有关使用 AWS 管理控制台、AWS CLI 或 API 将文件上传到 Amazon S3 的信息，请参阅《Amazon Simple Storage Service 用户指南**》中的[上传对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)。

有关 Amazon S3 元数据的更多信息以及有关系统提供的元数据的详细信息，请参阅《Amazon Simple Storage Service 用户指南**》中的[在 Amazon S3 控制台中编辑对象元数据](https://docs.aws.amazon.com/AmazonS3/latest/userguide/add-object-metadata.html)。

将 gzip 文件导入到 RDS for 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)',
 'amzn-s3-demo-bucket', 'test-data.gz', 'us-east-2'
);
```

## 导入编码的 Amazon S3 文件
<a name="USER_PostgreSQL.S3Import.FileFormats.Encoded"></a>

以下示例说明如何从 Amazon S3 导入具有 Windows-1252 编码的文件。

```
postgres=> SELECT aws_s3.table_import_from_s3(
 'test_table', '', 'encoding ''WIN1252''',
 aws_commons.create_s3_uri('amzn-s3-demo-bucket', 'SampleFile', 'us-east-2')
);
```

# 函数参考
<a name="USER_PostgreSQL.S3Import.Reference"></a>

**Topics**
+ [aws\$1s3.table\$1import\$1from\$1s3](#aws_s3.table_import_from_s3)
+ [aws\$1commons.create\$1s3\$1uri](#USER_PostgreSQL.S3Import.create_s3_uri)
+ [aws\$1commons.create\$1aws\$1credentials](#USER_PostgreSQL.S3Import.create_aws_credentials)

## aws\$1s3.table\$1import\$1from\$1s3
<a name="aws_s3.table_import_from_s3"></a>

将 Amazon S3 数据导入到 Amazon RDS 表中。`aws_s3` 扩展提供 `aws_s3.table_import_from_s3` 函数。返回值为文本。

### 语法
<a name="aws_s3.table_import_from_s3-syntax"></a>

必需的参数为 `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
  )
  ```

### 参数
<a name="aws_s3.table_import_from_s3-parameters"></a>

 *table\$1name*   
包含要将数据导入到的 PostgreSQL 数据库表的名称的必需文本字符串。

 *column\$1list*   
包含要将数据复制到的 PostgreSQL 数据库表列的可选列表的必需文本字符串。如果此字符串为空，将使用表的所有列。有关示例，请参阅[导入使用自定义分隔符的 Amazon S3 文件](USER_PostgreSQL.S3Import.FileFormats.md#USER_PostgreSQL.S3Import.FileFormats.CustomDelimiter)。

 *选项*   
包含 PostgreSQL `COPY` 命令的参数的必需文本字符串。这些参数指定如何将数据复制到 PostgreSQL 表中。有关更多详细信息，请参阅 [PostgreSQL COPY 文档](https://www.postgresql.org/docs/current/sql-copy.html)。

 *s3\$1info*   
包含有关 S3 对象的以下信息的 `aws_commons._s3_uri_1` 复合类型：  
+ `bucket` – 包含文件的 Amazon S3 存储桶的名称。
+ `file_path` – 包含文件路径的 Amazon S3 文件名。
+ `region` – 文件所在的AWS区域。有关 AWS 区域名称和关联值的列表，请参阅[区域、可用区和 Local Zones ](Concepts.RegionsAndAvailabilityZones.md)。

 *凭证*   
包含以下用于导入操作的凭证的 `aws_commons._aws_credentials_1` 复合类型：  
+ 访问密钥
+ 私有密钥
+ 会话令牌
有关创建 `aws_commons._aws_credentials_1` 复合结构的信息，请参阅 [aws\$1commons.create\$1aws\$1credentials](#USER_PostgreSQL.S3Import.create_aws_credentials)。

### 替代语法
<a name="aws_s3.table_import_from_s3-alternative-syntax"></a>

为帮助进行测试，您可以使用一组扩展的参数而非 `s3_info` 和 `credentials` 参数。下面是 `aws_s3.table_import_from_s3` 函数的其他语法变化。
+ 不使用 `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 
  )
  ```

### 替代参数
<a name="aws_s3.table_import_from_s3-alternative-parameters"></a>

*bucket*  
包含 Amazon S3 存储桶（其中包含文件）的名称的文本字符串。

*file\$1path*  
包含 Amazon S3 文件名（包含文件路径）的文本字符串。

*region*  
标识文件的 AWS 区域位置的文本字符串。有关 AWS 区域名称和关联值的列表，请参阅[区域、可用区和 Local Zones ](Concepts.RegionsAndAvailabilityZones.md)。

*access\$1key*  
包含用于导入操作的访问密钥的文本字符串。默认值为 NULL。

*secret\$1key*  
包含用于导入操作的私有密钥的文本字符串。默认值为 NULL。

*session\$1token*  
（可选）包含用于导入操作的会话密钥的文本字符串。默认值为 NULL。

## aws\$1commons.create\$1s3\$1uri
<a name="USER_PostgreSQL.S3Import.create_s3_uri"></a>

创建 `aws_commons._s3_uri_1` 结构来保存 Amazon S3 文件信息。在 `aws_commons.create_s3_uri` 函数的 `s3_info` 参数中使用 [aws\$1s3.table\$1import\$1from\$1s3](#aws_s3.table_import_from_s3) 函数的结果。

### 语法
<a name="USER_PostgreSQL.S3Import.create_s3_uri-syntax"></a>

```
aws_commons.create_s3_uri(
   bucket text,
   file_path text,
   region text
)
```

### 参数
<a name="USER_PostgreSQL.S3Import.create_s3_uri-parameters"></a>

*bucket*  
包含文件的 Amazon S3 存储桶名称的必需文本字符串。

*file\$1path*  
包含 Amazon S3 文件名（包含文件路径）的必填文本字符串。

*region*  
一个包含文件所在的 AWS 区域的必需文本字符串。有关 AWS 区域名称和关联值的列表，请参阅[区域、可用区和 Local Zones ](Concepts.RegionsAndAvailabilityZones.md)。

## aws\$1commons.create\$1aws\$1credentials
<a name="USER_PostgreSQL.S3Import.create_aws_credentials"></a>

在 `aws_commons._aws_credentials_1` 结构中设置访问密钥和私有密钥。在 `aws_commons.create_aws_credentials` 函数的 `credentials` 参数中使用 [aws\$1s3.table\$1import\$1from\$1s3](#aws_s3.table_import_from_s3) 函数的结果。

### 语法
<a name="USER_PostgreSQL.S3Import.create_aws_credentials-syntax"></a>

```
aws_commons.create_aws_credentials(
   access_key text,
   secret_key text,
   session_token text
)
```

### 参数
<a name="USER_PostgreSQL.S3Import.create_aws_credentials-parameters"></a>

*access\$1key*  
包含用于导入 Amazon S3 文件的访问密钥的必需文本字符串。默认值为 NULL。

*secret\$1key*  
包含用于导入 Amazon S3 文件的私有密钥的必需文本字符串。默认值为 NULL。

*session\$1token*  
包含用于导入 Amazon S3 文件的会话令牌的可选文本字符串。默认值为 NULL。如果您提供了可选的 `session_token`，则可以使用临时凭证。