

# 创建 Amazon RDS 与 Amazon Redshift 的零 ETL 集成
<a name="zero-etl.creating"></a>

在创建 Amazon RDS 零 ETL 集成时，需要指定源 RDS 数据库和目标 Amazon Redshift 数据仓库。您还可以自定义加密设置和添加标签。Amazon RDS 在源数据库与其目标之间创建集成。集成激活后，您插入到源数据库中的任何数据都将复制到配置的 Amazon Redshift 目标中。

## 先决条件
<a name="zero-etl.create-prereqs"></a>

在创建零 ETL 集成之前，必须创建源数据库和目标 Amazon Redshift 数据仓库。您还必须通过将数据库添加为授权集成源来允许复制到数据仓库。

有关完成其中每个步骤的说明，请参阅[开始使用 Amazon RDS 零 ETL 集成](zero-etl.setting-up.md)。

## 所需的权限
<a name="zero-etl.create-permissions"></a>

创建零 ETL 集成需要具有某些 IAM 权限。至少您需要具有执行以下操作的权限：
+ 为源 RDS 数据库创建零 ETL 集成。
+ 查看和删除所有零 ETL 集成。
+ 在目标数据仓库中创建入站集成。

以下示例策略演示了创建和管理集成所需的[最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。如果您的用户或角色具有更广泛的权限（例如 `AdministratorAccess` 托管式策略），则可能不需要这些确切的权限。

**注意**  
Redshift Amazon 资源名称（ARN）采用以下格式。请注意，在无服务器命名空间 UUID 之前使用了正斜杠（`(/`）而不是冒号（`:`）。  
预调配集群 – `arn:aws:redshift:{region}:{account-id}:namespace:namespace-uuid`
无服务器 – `arn:aws:redshift-serverless:{region}:{account-id}:namespace/namespace-uuid`

### Redshift 目标的示例策略
<a name="zero-etl.create-sample-policy"></a>

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "CreateIntegration",
      "Effect": "Allow",
      "Action": [
        "rds:CreateIntegration"
      ],
      "Resource": [
        "arn:aws:rds:us-east-1:123456789012:db:source-db",
        "arn:aws:rds:us-east-1:123456789012:integration:*"
      ]
    },
    {
      "Sid": "DescribeIntegrationDetails",
      "Effect": "Allow",
      "Action": [
        "rds:DescribeIntegrations"
      ],
      "Resource": [
      "arn:aws:rds:us-east-1:123456789012:integration:*"
  ]
    },
    {
      "Sid": "ChangeIntegrationDetails",
      "Effect": "Allow",
      "Action": [
        "rds:DeleteIntegration",
        "rds:ModifyIntegration"
      ],
      "Resource": [
        "arn:aws:rds:us-east-1:123456789012:integration:*"
      ]
    },
    {
      "Sid": "AllowRedShiftIntegration",
      "Effect": "Allow",
      "Action": [
        "redshift:CreateInboundIntegration"
      ],
      "Resource": [
        "arn:aws:redshift:us-east-1:123456789012:namespace:namespace-uuid"
      ]
    }
  ]
}
```

------

### 在不同的账户中选择目标数据仓库
<a name="zero-etl.create-permissions-cross-account"></a>

如果您计划指定位于另一个 AWS 账户中的目标 Amazon Redshift 数据仓库，则必须创建一个角色，以允许当前账户中的用户访问目标账户中的资源。有关更多信息，请参阅[在您拥有的其他 AWS 账户中向 IAM 用户提供访问权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_aws-accounts.html)。

该角色必须具有以下权限，这些权限允许用户查看目标账户中可用的 Amazon Redshift 预调配集群和 Redshift Serverless 命名空间。

#### 必需的权限和信任策略
<a name="zero-etl.cross-account-sample-policy"></a>

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "redshift:DescribeClusters",
            "redshift-serverless:ListNamespaces"
         ],
         "Resource":[
            "*"
         ]
      }
   ]
}
```

------

该角色必须具有以下信任策略，该策略指定目标账户 ID。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

------

有关创建角色的说明，请参阅[使用自定义信任策略创建角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-custom.html)。

## 创建零 ETL 集成
<a name="zero-etl.create"></a>

您可以使用 AWS 管理控制台、AWS CLI 或 RDS API 创建零 ETL 集成。

**重要**  
零 ETL 集成不支持刷新或重新同步操作。如果在创建集成后遇到与集成相关的问题，必须删除此集成并创建一个新集成。

默认情况下，RDS for MySQL 会立即清除二进制日志文件。由于零 ETL 集成依赖二进制日志将数据从源复制到目标，因此源数据库的保留期必须至少为一小时。创建集成后，Amazon RDS 会立即检查所选源数据库的二进制日志文件保留期。如果当前值为 0 小时，则 Amazon RDS 会自动将其更改为 1 小时。否则，该值将保持不变。

### RDS 控制台
<a name="zero-etl.create-console"></a>

**创建零 ETL 集成**

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

1. 在左侧导航窗格中，选择**零 ETL 集成**。

1. 选择**创建零 ETL 集成**。

1. 在**集成标识符**中，输入集成的名称。该名称可包含最多 63 个字母数字字符，并且可以包含连字符。
**重要**  
目录名称的长度限制为 19 个字符。如果要将集成标识符用作目录名称，请确保它符合此要求。

1. 选择**下一步**。

1. 对于**源**，选择数据将源自其中的 RDS 数据库。
**注意**  
如果数据库参数配置不正确，RDS 会通知您。如果您收到此消息，可以选择**为我修复**，也可以手动配置它们。有关手动修复它们的说明，请参阅[步骤 1：创建自定义数据库参数组](zero-etl.setting-up.md#zero-etl.parameters)。  
修改数据库参数需要重启。在创建集成之前，必须完成重启，并且必须成功地将新的参数值应用于数据库。

1. 成功配置源数据库后，选择**下一步**。

1. 对于**目标**，执行以下操作：

   1. （可选）要为 Amazon Redshift 目标使用不同的 AWS 账户，请选择**指定其他账户**。然后，输入有权显示您数据仓库的 IAM 角色的 ARN。有关创建 IAM 角色的说明，请参阅[在不同的账户中选择目标数据仓库](#zero-etl.create-permissions-cross-account)。

   1. 对于 **Amazon Redshift 数据仓库**，选择从源数据库中复制的数据的目标。您可以选择预调配的 Amazon Redshift *集群*或 Redshift Serverless *命名空间*作为目标。
**注意**  
如果指定数据仓库的资源策略或区分大小写设置配置不正确，RDS 会通知您。如果您收到此消息，可以选择**为我修复**，也可以手动配置它们。有关手动修复这些问题的说明，请参阅《Amazon Redshift 管理指南》**中的[为您的数据仓库开启区分大小写](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.setting-up.html#zero-etl-setting-up.case-sensitivity)[和为您的数据仓库配置授权](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.setting-up.html#zero-etl-using.redshift-iam)。  
修改*预调配* Redshift 集群的区分大小写需要重启。在创建集成之前，必须完成重启，并且必须成功地将新的参数值应用于集群。  
如果您选择的源和目标位于不同的 AWS 账户，则 Amazon RDS 无法为您修复这些设置。您必须导航到另一个账户，然后在 Amazon Redshift 中手动修复这些问题。

1. 正确配置目标数据仓库后，选择**下一步**。

1. （可选）对于**标签**，向集成添加一个或多个标签。有关更多信息，请参阅 [为 Amazon RDS 资源添加标签](USER_Tagging.md)。

1. 对于**加密**，请指定您希望如何加密集成。默认情况下，RDS 会加密所有与 AWS 拥有的密钥 的集成。要改为选择客户自主管理型密钥，请启用**自定义加密设置**并选择用于加密的 KMS 密钥。有关更多信息，请参阅 [加密 Amazon RDS 资源](Overview.Encryption.md)。

   （可选）添加加密上下文。有关更多信息，请参阅 *AWS Key Management Service 开发人员指南*中的[加密内容](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)。
**注意**  
除了您添加的任何加密上下文对外，Amazon RDS 还会添加以下加密上下文对：  
`aws:redshift:integration:arn` - `IntegrationArn`
`aws:servicename:id` - `Redshift`
这会将您可以添加的加密上下文对总数从 8 减少到 6，并增加授予约束条件的总字符限制。有关更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的 [Using grant constraints](https://docs.aws.amazon.com/kms/latest/developerguide/create-grant-overview.html#grant-constraints)。

1. 选择**下一步**。

1. 查看您的集成设置并选择**创建零 ETL 集成**。

   如果创建失败，请参阅[我无法创建零 ETL 集成](zero-etl.troubleshooting.md#zero-etl.troubleshooting.creation)以了解故障排除步骤。

集成在创建时状态为 `Creating`，而目标 Amazon Redshift 数据仓库的状态为 `Modifying`。在此期间，您无法查询数据仓库或对其进行任何配置更改。

成功创建集成后，集成和目标 Amazon Redshift 数据仓库的状态都更改为 `Active`。

### AWS CLI
<a name="zero-etl.create-cli"></a>

要使用 AWS CLI 创建零 ETL 集成，请使用带有以下选项的 [create-integration](https://docs.aws.amazon.com/cli/latest/reference/rds/create-integration.html) 命令：

**注意**  
请记住，目录名称限制为 19 个字符。如果要将集成名称用作目录名称，请相应地选择集成名称。
+ `--integration-name` – 指定集成的名称。
+ `--source-arn` – 指定将作为集成源的 RDS 数据库的 ARN。
+ `--target-arn` – 指定将作为集成目标的 Amazon Redshift 数据仓库的 ARN。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws rds create-integration \
    --integration-name my-integration \
    --source-arn arn:aws:rds:{region}:{account-id}:my-db \
    --target-arn arn:aws:redshift:{region}:{account-id}:namespace:namespace-uuid
```
对于：Windows  

```
aws rds create-integration ^
    --integration-name my-integration ^
    --source-arn arn:aws:rds:{region}:{account-id}:my-db ^
    --target-arn arn:aws:redshift:{region}:{account-id}:namespace:namespace-uuid
```

### RDS API
<a name="zero-etl.create-api"></a>

要使用 Amazon RDS API 创建零 ETL 集成，请结合以下参数使用 [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateIntegration.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateIntegration.html) 操作：

**注意**  
目录名称限制为 19 个字符。如果要将 IntegrationName 参数用作目录名称，请确保它符合此要求。
+ `IntegrationName` – 指定集成的名称。
+ `SourceArn` – 指定将作为集成源的 RDS 数据库的 ARN。
+ `TargetArn` – 指定将作为集成目标的 Amazon Redshift 数据仓库的 ARN。

## 使用客户自主管理型密钥加密集成
<a name="zero-etl.create-encrypt"></a>

如果您指定自定义 KMS 密钥而不是创建集成时的 AWS 拥有的密钥，则密钥策略必须为 Amazon Redshift 服务主体提供对 `CreateGrant` 操作的访问权限。此外，它必须允许当前用户执行 `DescribeKey` 和 `CreateGrant` 操作。

以下示例策略演示了如何提供密钥策略中所需的权限。它包括用于进一步缩小权限范围的上下文键。

### 示例密钥策略
<a name="zero-etl.kms-sample-policy"></a>

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "Key policy",
    "Statement": [
        {
            "Sid": "Enables IAM user permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allows the Redshift service principal to add a grant to a KMS key",
            "Effect": "Allow",
            "Principal": {
                "Service": "redshift.amazonaws.com"
            },
            "Action": "kms:CreateGrant",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:EncryptionContext:{context-key}": "{context-value}"
                },
                "ForAllValues:StringEquals": {
                    "kms:GrantOperations": [
                        "Decrypt",
                        "GenerateDataKey",
                        "CreateGrant"
                    ]
                }
            }
        },
        {
            "Sid": "Allows the current user or role to add a grant to a KMS key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/{role-name}"
            },
            "Action": "kms:CreateGrant",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:EncryptionContext:{context-key}": "{context-value}",
                    "kms:ViaService": "rds.us-east-1.amazonaws.com"
                },
                "ForAllValues:StringEquals": {
                    "kms:GrantOperations": [
                        "Decrypt",
                        "GenerateDataKey",
                        "CreateGrant"
                    ]
                }
            }
        },
        {
            "Sid": "Allows the current uer or role to retrieve information about a KMS key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/{role-name}"
            },
            "Action": "kms:DescribeKey",
            "Resource": "*"
        }
    ]
}
```

------

有关更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[创建密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-overview.html)。

## 后续步骤
<a name="zero-etl.create-next"></a>

成功创建零 ETL 集成后，您必须在目标 Amazon Redshift 集群或工作组中创建目标数据库。然后，您可以开始向源 RDS 数据库中添加数据，并在 Amazon Redshift 中对其进行查询。有关说明，请参阅[在 Amazon Redshift 中创建目标数据库](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.creating-db.html)。