

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 加密现有 Amazon RDS for PostgreSQL 数据库实例
<a name="encrypt-an-existing-amazon-rds-for-postgresql-db-instance"></a>

*Piyush Goyal、Shobana Raghu 和 Yaser Raja，Amazon Web Services*

## Summary
<a name="encrypt-an-existing-amazon-rds-for-postgresql-db-instance-summary"></a>

此模式说明了如何在 AWS 云中加密现有的 Amazon Relational Database Service（Amazon RDS）for PostgreSQL 数据库实例，同时最大限度地减少停机时间。此进程也适用于 Amazon RDS for MySQL 数据库实例。

您可以在创建 Amazon RDS DB 数据库实例时为其启用加密，而不能在创建数据库实例之后启用加密。但是，您可以对未加密的数据库实例添加加密，方法是创建数据库实例快照，然后创建此快照的加密副本。然后，您可以从加密快照还原数据库实例，从而获得原始数据库实例的加密副本。如果您的项目允许在此活动期间停机（至少对于写入事务来说是如此），那么这就是您所需要做的。当数据库实例的新加密副本可用时，您可将应用程序指向新数据库。但是，如果您的项目不允许此活动出现大量停机时间，则您需要一种替代方法来帮助最大限度地减少停机时间。此模式使用 AWS Database Migration Service (AWS DMS) 迁移并持续复制数据，以便可以在最短的停机时间内完成到新的加密数据库的割接。 

Amazon RDS 加密的数据库实例使用行业标准 AES-256 加密算法，对托管 Amazon RDS 数据库实例的服务器上的数据进行加密。在加密数据后，Amazon RDS 将以透明方式处理访问的身份验证和数据的解密，并且对性能产生的影响最小。您无需修改数据库客户端应用程序来使用加密。

## 先决条件和限制
<a name="encrypt-an-existing-amazon-rds-for-postgresql-db-instance-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ 未加密的 Amazon RDS for PostgreSQL 数据库实例
+ 有处理（创建、修改或停止）AWS DMS 任务的经验（请参阅 [AWS DMS 文档中的处理 AWS DMS 任务](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.html)）
+ 熟悉用于加密数据库的 AWS Key Management Service (AWS KMS)（[AWS KMS 文档](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)）

**限制**
+ 您只能在创建 Amazon RDS 数据库实例时而不是创建该数据库实例之后启用对该数据库实例的加密。
+ [未记录表](https://www.postgresql.org/docs/current/sql-createtable.html)中的数据不会使用快照进行恢复。有关更多信息，请参阅 [PostgreSQL 最佳实践](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_BestPractices.html#CHAP_BestPractices.PostgreSQL)。
+ 您无法拥有未加密数据库实例的加密只读副本或加密数据库实例的未加密只读副本。
+ 您不能将未加密的备份或快照还原到加密的数据库实例。
+ AWS DMS 不会自动传输序列，因此需要采取额外的步骤来处理此问题。

有关更多信息，请参阅 Amazon RDS 文档中的 [Amazon RDS 加密数据库实例限制](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.Encryption.html#Overview.Encryption.Limitations)。

## 架构
<a name="encrypt-an-existing-amazon-rds-for-postgresql-db-instance-architecture"></a>

**源架构**
+ 未加密的 RDS 数据库实例

**目标架构 **
+ 加密的 RDS 数据库实例
  + 目标 RDS 数据库实例是通过恢复源 RDS 数据库实例的数据库快照副本来创建的。
  + 还原快照时使用 AWS KMS 密钥加密。
  + AWS DMS 复制任务可用于迁移数据。

![该流程使用 AWS DMS 加密现有的 Amazon RDS for PostgreSQL 数据库实例，并将其转换为新数据库。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/820d17c0-0eed-4ed9-9f43-cbada081d924/images/44dd8420-d89d-466e-b7fb-1bdafab8f7f9.png)


## 工具
<a name="encrypt-an-existing-amazon-rds-for-postgresql-db-instance-tools"></a>

**用于启用加密的工具：**
+ 用于加密的 AWS KMS 密钥 - 创建加密数据库实例时，您可为 Amazon RDS 选择客户托管密钥或适用于 Amazon RDS 的 AWS 托管式密钥 来加密您的数据库实例。如果您没有为客户托管密钥指定密钥标识符，则 Amazon RDS 会将 AWS 托管式密钥用于您的新数据库实例。Amazon RDS 为您的 Amazon Web Services account 创建用于 Amazon RDS 的 AWS 托管式密钥。您的 Amazon Web Services account 对每个 AWS 区域都有不同的用于 Amazon RDS 的 AWS 托管式密钥。有关使用 KMS 密钥进行 Amazon RDS 加密的更多信息，请参阅[加密 Amazon RDS 资源](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.Encryption.html)。

**用于持续复制的工具**：
+ AWS DMS — 您可使用 AWS Database Migration Service (AWS DMS) 将更改从源数据库复制到目标数据库。保持源数据库和目标数据库同步，最大限度地减少停机时间，这一点很重要。有关设置 AWS DMS 和创建任务的信息，请参阅 [AWS DMS 文档](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html)。

## 操作说明
<a name="encrypt-an-existing-amazon-rds-for-postgresql-db-instance-epics"></a>

### 创建源数据库实例快照并加密
<a name="create-a-snapshot-of-the-source-db-instance-and-encrypt-it"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 查看源 PostgreSQL 数据库实例详细信息。 | 在 Amazon RDS 控制台，选择源 PostgreSQL 数据库实例。在**配置**选项卡，确保未为实例启用加密。有关屏幕插图，请参阅[其他信息](#encrypt-an-existing-amazon-rds-for-postgresql-db-instance-additional)部分。 | 数据库管理员 | 
| 创建数据库快照。 | 为待加密的实例创建数据库快照。创建快照所用时间因数据库大小而异。有关说明，请参阅 Amazon RDS 文档中的[创建数据库快照](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateSnapshot.html)。 | 数据库管理员 | 
| 加密快照。 | 在 Amazon RDS 控制台导航窗格，选择**快照**，然后选择您创建的数据库快照。对于 **Actions (操作)**，选择 **Copy Snapshot (复制快照)**。在相应的字段中提供目标 AWS 区域和数据库快照副本的名称。选中**启用加密**复选框。对于 **Master Key**，指定用于加密数据库快照副本的 KMS 密钥标识符。选择**复制快照**。有关更多信息，请参阅 Amazon RDS 文档中的[复制快照](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CopySnapshot.html)。 | 数据库管理员 | 

### 准备目标数据库实例
<a name="prepare-the-target-db-instance"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 还原数据库快照。 | 在 Amazon RDS 控制台中，选择**快照**。选择您创建的加密快照。对于**操作**，选择**还原快照**。对于**数据库实例标识符**，请为新数据库实例提供一个唯一名称。查看实例详细信息，然后选择**还原数据库实例**。将根据您的快照创建新的加密数据库实例。有关更多信息，请参阅 Amazon RDS 文档中[从数据库快照还原](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_RestoreFromSnapshot.html)。 | 数据库管理员 | 
| 使用 AWS DMS 迁移数据。 | 在 AWS DMS 控制台，创建 AWS DMS 任务。对于**迁移类型**，请选择**迁移现有数据并复制正在进行的更改**。在**任务设置**，对于**目标表格准备模式**，选择**截断**。有关更多信息，请参阅 AWS DMS 文档中的[创建任务](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.Creating.html)。 | 数据库管理员 | 
| 启用数据验证。 | 在**任务设置**中，选择**启用验证**。这使您能够将源数据与目标数据进行比较，以验证数据是否已准确迁移。  | 数据库管理员 | 
| 禁用目标数据库实例限制。 | 在目标数据库实例的[禁用所有触发器和外键约束](https://www.postgresql.org/docs/current/sql-altertable.html)，然后启动 AWS DMS 任务。有关禁用触发器和外键约束的更多信息，请参见 [AWS DMS 文档](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.PostgreSQL.html)。 | 数据库管理员 | 
| 验证数据。 | 满载完成后，验证目标数据库实例数据，以查看其是否与源数据匹配。有关更多信息，请参阅 AWS DMS 文档中的[ AWS DMS 数据验证](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Validating.html)。 | 数据库管理员 | 

### 割接到目标数据库实例
<a name="cut-over-to-the-target-db-instance"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 停止对源数据库实例的写入操作。 | 停止对源数据库实例的写入操作，以应用程序可以开始停机。验证 AWS DMS 是否已完成对管道数据的复制。启用目标数据库实例的触发器与外键。 | 数据库管理员 | 
| 更新数据库序列 | 如果源数据库包含任何序列号，则验证并更新目标数据库中的序列。 | 数据库管理员 | 
| 配置应用程序端点。 | 配置您的应用程序连接，以使用新 Amazon RDS 数据库实例端点。已加密数据库实例。 | 数据库管理员，应用程序所有者 | 

## 相关资源
<a name="encrypt-an-existing-amazon-rds-for-postgresql-db-instance-resources"></a>
+ [创建 AWS DMS 任务](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.Creating.html) 
+ [使用 Amazon 监控复制任务 CloudWatch](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Monitoring.html#CHAP_Monitoring.CloudWatch)
+ [监控 AWS DMS 任务](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Monitoring.html)
+ [更新 Amazon RDS 加密密钥](https://aws.amazon.com/premiumsupport/knowledge-center/update-encryption-key-rds/)

## 附加信息
<a name="encrypt-an-existing-amazon-rds-for-postgresql-db-instance-additional"></a>

检查源 PostgreSQL 数据库实例的加密：

![源 PostgreSQL 数据库实例的摘要页面会显示存储未启用加密。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/820d17c0-0eed-4ed9-9f43-cbada081d924/images/d53d1dab-b5c2-452d-b823-ba3d6508ad15.png)


此示例的其他注意事项：
+ 通过将 `rds.logical_replication` 参数设置为 1，在 PostgreSQL 上启用复制。

**重要说明：**复制槽会保留预写日志 (WAL) 文件，直到 `pg_recvlogical` 文件被外部使用，例如，通过提取、转换、加载（ETL）作业；或由 AWS DMS 使用。当您将 `rds.logical_replication` 参数值设置为 1 时，AWS DMS 会设置 `wal_level`、`max_wal_senders`、`max_replication_slots` 和 `max_connections` 参数。如果存在逻辑复制槽，但复制槽保留的 WAL 文件没有使用者，您可能会看到事务日志磁盘使用量增加，而可用存储空间不断减少。有关解决此问题的更多信息和步骤，请参阅文章[如何确定是什么原因导致 Amazon RDS for PostgreSQL 上出现 “设备上没有剩余空间” 或 “” 错误](https://aws.amazon.com/premiumsupport/knowledge-center/diskfull-error-rds-postgresql/)？DiskFull 在 AWS Support 知识中心中。
+ 创建数据库快照后对源数据库实例所做的任何架构更改，都不会出现在目标数据库实例上。
+ 创建加密的数据库实例后，您无法更改该数据库实例使用的 KMS 密钥。请确保先确定您的 KMS 密钥要求，然后再创建加密的数据库实例。
+ 运行 AWS DMS 任务之前，您必须在目标数据库实例上禁用触发器和外键。任务完成后，您可将它们重新启用。