

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# 将文件上传到 Amazon S3 以与 COPY 结合使用
<a name="t_uploading-data-to-S3"></a>

将文本文件上载到 Amazon S3 时，可以采取以下几种方法：
+ 如果您有压缩文件，我们建议您拆分大文件，以便充分利用 Amazon Redshift 中的并行处理。
+ 另一方面，COPY 会自动拆分大型未压缩文本分隔文件数据，促进并行并有效分发大型文件中的数据。

创建一个用于存储数据文件的 Amazon S3 桶，然后将数据文件上载到该桶。有关创建桶和上载文件的信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[使用 Amazon S3 桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingBucket.html)。

**重要**  
必须在与集群相同的 AWS 区域中创建存储数据文件的 Amazon S3 桶，除非您使用 [REGION](copy-parameters-data-source-s3.md#copy-region) 选项指定 Amazon S3 桶所在的区域。

确保将 S3 IP 范围添加到您的允许列表中。要了解有关所需 S3 IP 范围的更多信息，请参阅[网络隔离](https://docs.aws.amazon.com//redshift/latest/mgmt/security-network-isolation.html#network-isolation)。

您可以通过以下方式在特定区域中创建 Amazon S3 桶：在使用 Amazon S3 控制台创建桶时选择该区域，或者在使用 Amazon S3 API 或 CLI 创建桶时指定端点。

数据加载后，确认 Amazon S3 上出现了正确的文件。

**Topics**
+ [管理数据一致性](managing-data-consistency.md)
+ [将加密的数据上载到 Amazon S3](t_uploading-encrypted-data.md)
+ [确认在桶中具有正确的文件](verifying-that-correct-files-are-present.md)

# 管理数据一致性
<a name="managing-data-consistency"></a>

Amazon S3 为所有 AWS 区域中的 Amazon S3 桶上的 COPY、UNLOAD、INSERT（外部表）、CREATE EXTERNAL TABLE AS 和 Amazon Redshift Spectrum 操作提供了强大的先写后读一致性。此外，针对 Amazon S3 Select、Amazon S3 访问控制列表、Amazon S3 对象标签和对象元数据（例如 HEAD 对象）的读取操作具有严格的一致性。有关数据一致性的更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的 [Amazon S3 数据一致性模型](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Introduction.html#ConsistencyModel)。

# 将加密的数据上载到 Amazon S3
<a name="t_uploading-encrypted-data"></a>

Amazon S3 支持服务器端加密和客户端加密。本主题将讨论服务器端加密和客户端加密的区别，并介绍将客户端加密用于 Amazon Redshift 的步骤。服务器端加密对 Amazon Redshift 是透明的。

## 服务器端加密
<a name="server-side-encryption"></a>

服务器端加密是静态数据加密，即，Amazon S3 在上载数据时对其进行加密，并在您访问时进行解密。当您使用 COPY 命令加载表时，在 Amazon S3 上从服务器端加密或解密的对象的加载方式没有不同。有关服务器端加密的更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[使用服务器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingServerSideEncryption.html)。

## 客户端加密
<a name="client-side-encryption"></a>

在客户端加密中，您的客户端应用程序管理数据的加密、加密密钥和相关的工具。您可以使用客户端加密将数据上载到 Amazon S3 桶，然后使用带有 ENCRYPTED 选项的 COPY 命令和私有加密密钥加载数据，以实现更强的安全性。

您使用信封加密来加密您的数据。借助*信封加密*，您的应用程序可专门处理所有加密。您的私有加密密钥和未加密的数据从来不会发送到 AWS，因此请您务必妥善管理好您的加密密钥。如果您丢失了加密密钥，您将无法解密数据，而且，您无法从 AWS 找回您的加密密钥。信封加密结合了快速对称加密的性能，同时保持了使用非对称密钥进行密钥管理所获得的更强的安全性。Amazon S3 加密客户端生成一次性对称密钥（信封对称密钥）来加密数据，然后由您的根密钥对其进行加密并与您的数据一起存储在 Amazon S3 中。在加载过程中，当 Amazon Redshift 访问您的数据时，将检索加密的对称密钥并使用您的实际密钥对其进行解密，然后解密数据。

要在 Amazon Redshift 中使用 Amazon S3 客户端加密数据，请按照《Amazon Simple Storage Service 用户指南》**中的[使用客户端加密保护数据](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryption.html)所列的步骤操作，并满足您使用的其它要求：
+ **对称加密 –** AWS SDK for Java `AmazonS3EncryptionClient` 类使用信封加密，如前所述，信封加密是基于对称密钥加密的。使用此类可创建要上载客户端加密数据的 Amazon S3 客户端。
+ **256 位 AES 根对称密钥 –** 根密钥将对信封密钥进行加密。您将根密钥传递给 `AmazonS3EncryptionClient` 类的实例。保存此密钥，因为您将需要用它来将数据复制到 Amazon Redshift 中。
+ **存储加密信封密钥的对象元数据 –** 预设情况下，Amazon S3 将信封密钥存储为 `AmazonS3EncryptionClient` 类的对象元数据。存储为对象元数据的加密信封密钥将在加密过程中使用。

**注意**  
首次使用加密 API 时，如果您收到密码加密错误消息，则您的 JDK 版本可能带有一个 Java Cryptography Extension (JCE) 区域策略文件，该文件将加密和解密转换的最大密钥长度限制为 128 位。有关解决此问题的信息，请转到《Amazon Simple Storage Service 用户指南》**中的[使用 AWS SDK for Java 指定客户端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryptionUpload.html)。

有关使用 COPY 命令将客户端加密的文件加载到 Amazon Redshift 表中的信息，请参阅[从 Amazon S3 中加载加密的数据文件](c_loading-encrypted-files.md)。

## 示例：上传客户端加密数据
<a name="client-side-encryption-example"></a>

有关如何使用 AWS SDK for Java 上载客户端加密数据的示例，请转到《Amazon Simple Storage Service 用户指南》**中的[使用客户端加密保护数据](https://docs.aws.amazon.com/AmazonS3/latest/userguide/encrypt-client-side-symmetric-master-key.html)。

第二个选项展示了您若要在 Amazon Redshift 中加载数据而必须在客户端加密期间做出的选择。具体来讲，该示例展示了使用对象元数据来存储加密信封密钥和 256 位 AES 根对称密钥的使用。

本示例代码使用 AWS SDK for Java 创建 256 位 AES 对称根密钥并将它保存到文件。然后，本示例使用首先加密客户端上样本数据的 S3 加密客户端将一个对象上传到 Amazon S3。示例还将下载该对象，并验证数据是否相同。

# 确认在桶中具有正确的文件
<a name="verifying-that-correct-files-are-present"></a>

将文件上载到 Amazon S3 桶之后，我们建议您列出桶的内容，以便确认所有正确文件均已存在并且不存在不需要的文件。例如，如果桶 `amzn-s3-demo-bucket` 存储了一个名为 `venue.txt.back` 的文件，则该文件可能会被以下命令意外加载：

```
COPY venue FROM 's3://amzn-s3-demo-bucket/venue' … ;
```

如果您要控制具体加载哪些文件，则可使用清单文件明确列出所需的数据文件。有关使用清单文件的更多信息，请参阅 COPY 命令的 [copy_from_s3_manifest_file](copy-parameters-data-source-s3.md#copy-manifest-file) 选项和 COPY 示例中的[使用清单指定数据文件](r_COPY_command_examples.md#copy-command-examples-manifest)。

有关列出桶内容的更多信息，请参阅《Amazon S3 开发人员指南》**中的[列出对象键](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ListingKeysUsingAPIs.html)。