

 从补丁 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/)。

# 创建 DynamoDB 的零 ETL 集成
<a name="zero-etl-setting-up.create-integration-ddb"></a>

在创建零 ETL 集成之前，请查看[将零 ETL 集成与 Amazon Redshift 结合使用时的注意事项](zero-etl.reqs-lims.md)中概述的注意事项和要求。按照这个常规流程创建从 DynamoDB 到 Amazon Redshift 的零 ETL 集成

**使用零 ETL 集成将 DynamoDB 数据复制到 Amazon Redshift**

1. 确认您的登录凭证具备适当的权限，使您可以处理 Amazon Redshift 与 DynamoDB 的零 ETL 集成。有关示例 IAM 策略，请参阅[与 DynamoDB 零 ETL 集成配合使用的 IAM 策略](#zero-etl-signin-iam-policy)。

1. 在 DynamoDB 控制台中，[配置您的 DynamoDB 表](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/RedshiftforDynamoDB-zero-etl.html#RedshiftforDynamoDB-zero-etl-prereqs)，让它具有时间点故障恢复（PITR）、资源策略、基于身份的策略和加密密钥权限，如《Amazon DynamoDB 开发人员指南》**中所述。

1. 从 Amazon Redshift 控制台：[创建和配置目标 Amazon Redshift 数据仓库](zero-etl-setting-up.rs-data-warehouse.md)。
   + 从 AWS CLI 或 Amazon Redshift 控制台：[为您的数据仓库开启区分大小写](zero-etl-setting-up.case-sensitivity.md)。
   + 从 Amazon Redshift 控制台：[为您的 Amazon Redshift 数据仓库配置授权](zero-etl-using.redshift-iam.md)。

1. 在 Amazon Redshift 控制台中，创建零 ETL 集成，如本主题后面所述。

1. 在 Amazon Redshift 控制台中，在 Amazon Redshift 数据仓库中创建目标数据库。有关更多信息，请参阅 [在 Amazon Redshift 中创建目标数据库](zero-etl-using.creating-db.md)。

1. 在 Amazon Redshift 控制台中，查询在 Amazon Redshift 数据仓库中复制的数据。有关更多信息，请参阅 [在 Amazon Redshift 中查询复制的数据](zero-etl-using.querying-and-creating-materialized-views.md)。

在此步骤中，您将创建 Amazon DynamoDB 与 Amazon Redshift 的零 ETL 集成。

------
#### [ Amazon Redshift console ]

**使用 Amazon Redshift 控制台创建 Amazon DynamoDB 与 Amazon Redshift 的零 ETL 集成**

1. 在 Amazon Redshift 控制台中，选择**零 ETL 集成**。在包含零 ETL 集成列表的窗格上，依次选择**创建零 ETL 集成**、**创建 DynamoDB 集成**。

1. 在创建集成页面上，输入有关集成的信息，如下所示：
   + 输入**集成名称** - 这是一个唯一名称，可用于引用集成。
   + 输入**描述** - 描述要从源复制到目标的数据。
   + 选择 DynamoDB **源表** - 可以选择一个 DynamoDB 表。表上必须启用时间点故障恢复（PITR）。仅显示表大小不超过 100 TiB 的表。源 DynamoDB 表必须加密。源还必须具有包含授权主体和集成源的资源策略。如果这些策略不正确，则会显示**自动修复此问题**选项。
   + 选择目标 **Amazon Redshift 数据仓库** - 数据仓库可以是 Amazon Redshift 预置集群或 Redshift Serverless 工作组。如果您的目标 Amazon Redshift 在同一个账户中，则可以选择目标。如果目标位于另一个账户中，则需要指定 **Redshift 数据仓库 ARN**。目标必须具有包含授权主体和集成源的资源策略，并将 `enable_case_sensitive_identifier` 参数设置为 true。如果目标上没有正确的资源策略，并且您的目标在同一个账户中，则可以选择**自动修复此问题**选项，以便在创建集成过程中自动应用资源策略。如果您的目标位于另一个 AWS 账户，则需要手动在 Amazon Redshift 仓库中应用资源策略。如果您的目标 Amazon Redshift 数据仓库没有将正确的参数组选项 `enable_case_sensitive_identifier` 配置为 `true`，则可以选择**自动修复此问题**选项，在创建集成过程中自动更新此参数组并重启仓库。
   + 输入最多 50 个标签**键**和一个可选**值** - 提供有关集成的其他元数据。有关更多信息，请参阅 [在 Amazon Redshift 中为资源添加标签](amazon-redshift-tagging.md)。
   + 选择**加密**选项 - 加密集成。有关更多信息，请参阅 [使用客户自主管理型密钥加密 DynamoDB 集成](#zero-etl.create-encrypt)。

     加密集成时，还可以添加**其他加密上下文**。有关更多信息，请参阅 [加密上下文](#zero-etl.add-encryption-context)。

1. 此时会显示一个检查页面，您可以在这个页面选择**创建 DynamoDB 集成**。

1. 此时会显示一个进度页面，您可以在这个页面查看创建零 ETL 集成的各种任务的进度。

1. 创建集成并激活后，在集成的详细信息页面上，选择**连接到数据库**。首次创建 Amazon Redshift 数据仓库时，也创建了一个数据库。您需要连接到目标数据仓库中的任何数据库，这样才能为集成创建另一个数据库。在**连接到数据库**页面中，确定是否可以使用最近的连接并选择**身份验证**方法。根据您的身份验证方法，输入信息以连接到目标中的现有数据库。此身份验证信息包括现有**数据库名称**（通常为 `dev`）和使用 Amazon Redshift 数据仓库创建数据库时指定的**数据库用户**。

1. 连接到数据库后，选择**通过集成创建数据库**，以便创建从源接收数据的数据库。创建数据库时，您需要提供**集成 ID**、**数据仓库名称**和**数据库名称**。

1. 在集成状态和目标数据库变为 `Active` 后，数据开始从 DynamoDB 表复制到目标表。当您将数据添加到源时，数据会自动复制到目标 Amazon Redshift 数据仓库。

------
#### [ AWS CLI ]

要使用 AWS CLI 创建 Amazon DynamoDB 与 Amazon Redshift 的零 ETL 集成，请使用带有以下选项的 `create-integration` 命令：
+ `integration-name` – 指定集成的名称。
+ `source-arn` - 指定 DynamoDB 源的 ARN。
+ `target-arn` - 指定 Amazon Redshift 预置集群或 Redshift Serverless 工作组目标的命名空间 ARN。

以下示例通过提供集成名称、源 ARN 和目标 ARN 来创建集成。集成未加密。

```
aws redshift create-integration \
--integration-name ddb-integration \
--source-arn arn:aws:dynamodb:us-east-1:123456789012:table/books \
--target-arn arn:aws:redshift:us-east-1:123456789012:namespace:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222
          
{
    "Status": "creating",
    "IntegrationArn": "arn:aws:redshift:us-east-1:123456789012:integration:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
    "Errors": [],
    "ResponseMetadata": {
        "RetryAttempts": 0,
        "HTTPStatusCode": 200,
        "RequestId": "132cbe27-fd10-4f0a-aacb-b68f10bb2bfb",
        "HTTPHeaders": {
            "x-amzn-requestid": "132cbe27-fd10-4f0a-aacb-b68f10bb2bfb",
            "date": "Sat, 24 Aug 2024 05:44:08 GMT",
            "content-length": "934",
            "content-type": "text/xml"
        }
    },
    "Tags": [],
    "CreateTime": "2024-08-24T05:44:08.573Z",
    "KMSKeyId": "arn:aws:kms:us-east-1:123456789012:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE33333",
    "AdditionalEncryptionContext": {},
    "TargetArn": "arn:aws:redshift:us-east-1:123456789012:namespace:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
    "IntegrationName": "ddb-integration",
    "SourceArn": "arn:aws:dynamodb:us-east-1:123456789012:table/books"
}
```

以下示例使用客户管理的加密密钥来创建集成。在创建集成之前：
+ 在源 DynamoDB 表的同一个账户（在示例中名为“AccountA”）中创建客户管理的密钥（在示例中名为“CMCMK”）。
+ 确保使用用户/角色（在示例中名为“RoleA”）来创建对此 KMS 密钥具有 `kms:CreateGrant` 和 `kms:DescribeKey` 权限的集成。
+ 将以下项添加到密钥策略中。

```
{
    "Sid": "Enable RoleA to create grants with key",
    "Effect": "Allow",
    "Principal": {
        "AWS": "RoleA-ARN"
    },
    "Action": "kms:CreateGrant",
    "Resource": "*",
    "Condition": {
        // Add "StringEquals" condition if you plan to provide additional encryption context
        // for the zero-ETL integration. Ensure that the key-value pairs added here match
        // the key-value pair you plan to use while creating the integration.
        // Remove this if you don't plan to use additional encryption context
        "StringEquals": {
            "kms:EncryptionContext:context-key1": "context-value1"
        },
        "ForAllValues:StringEquals": {
            "kms:GrantOperations": [
                "Decrypt",
                "GenerateDataKey",
                "CreateGrant"
            ]
        }
    }
},
{
    "Sid": "Enable RoleA to describe key",
    "Effect": "Allow",
    "Principal": {
        "AWS": "RoleA-ARN"
    },
    "Action": "kms:DescribeKey",
    "Resource": "*"
},
{
    "Sid": "Allow use by RS SP",
    "Effect": "Allow",
    "Principal": {
        "Service": "redshift.amazonaws.com" 
           },
    "Action": "kms:CreateGrant",
    "Resource": "*"
}
```

```
aws redshift create-integration \
--integration-name ddb-integration \
--source-arn arn:aws:dynamodb:us-east-1:123456789012:table/books \
--target-arn arn:aws:redshift:us-east-1:123456789012:namespace:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222 \
--kms-key-id arn:aws:kms:us-east-1:123456789012:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE33333 \
--additional-encryption-context key33=value33  // This matches the condition in the key policy.
          {
    "IntegrationArn": "arn:aws:redshift:us-east-1:123456789012:integration:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
    "IntegrationName": "ddb-integration",
    "SourceArn": "arn:aws:dynamodb:us-east-1:123456789012:table/books",
    "SourceType": "dynamodb",
    "TargetArn": "arn:aws:redshift:us-east-1:123456789012:namespace:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
    "Status": "creating",
    "Errors": [],
    "CreateTime": "2024-10-02T18:29:26.710Z",
    "KMSKeyId": "arn:aws:kms:us-east-1:123456789012:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE33333",
    "AdditionalEncryptionContext": {
        "key33": "value33"
    },
    "Tags": []
}
```

------

## 与 DynamoDB 零 ETL 集成配合使用的 IAM 策略
<a name="zero-etl-signin-iam-policy"></a>

在创建零 ETL 集成时，您的登录凭证必须同时拥有 DynamoDB 和 Amazon Redshift 操作的权限，以及拥有集成源和目标的相关资源的权限。以下是演示所需最低权限的示例。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:ListTables"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetResourcePolicy",
                "dynamodb:PutResourcePolicy",
                "dynamodb:UpdateContinuousBackups"
            ],
            "Resource": [
            "arn:aws:dynamodb:us-east-1:111122223333:table/my-ddb-table"
            ]
        },
        {
            "Sid": "AllowRedshiftDescribeIntegration",
            "Effect": "Allow",
            "Action": [
                "redshift:DescribeIntegrations"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowRedshiftCreateIntegration",
            "Effect": "Allow",
            "Action": "redshift:CreateIntegration",
            "Resource": "arn:aws:redshift:us-east-1:111122223333:integration:*"
        },
        {
            "Sid": "AllowRedshiftModifyDeleteIntegration",
            "Effect": "Allow",
            "Action": [
                "redshift:ModifyIntegration",
                "redshift:DeleteIntegration"
            ],
            "Resource": "arn:aws:redshift:us-east-1:111122223333:integration:<uuid>"
        },
        {
            "Sid": "AllowRedshiftCreateInboundIntegration",
            "Effect": "Allow",
            "Action": "redshift:CreateInboundIntegration",
            "Resource": "arn:aws:redshift:us-east-1:111122223333:namespace:<uuid>"
        }
    ]
}
```

------

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

如果您指定自定义 KMS 密钥而不是创建 DynamoDB 零 ETL 集成时的 AWS 拥有的密钥，则密钥策略必须为 Amazon Redshift 服务主体提供对 `CreateGrant` 操作的访问权限。此外，该策略必须让请求者账户或角色有权运行 `DescribeKey` 和 `CreateGrant` 操作。

以下示例密钥策略语句演示了策略中所需的权限。一些示例包括用于进一步缩小权限范围的上下文密钥。

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

以下策略语句让请求者账户或角色可以检索有关 KMS 密钥的信息。

```
{
   "Effect":"Allow",
   "Principal":{
      "AWS":"arn:aws:iam::{account-ID}:role/{role-name}"
   },
   "Action":"kms:DescribeKey",
   "Resource":"*"
}
```

以下策略语句让请求者账户或角色可以添加对 KMS 密钥的授权。[https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-via-service](https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-via-service) 条件键将 KMS 密钥的使用限制为来自 Amazon Redshift 的请求。

```
{
   "Effect":"Allow",
   "Principal":{
      "AWS":"arn:aws:iam::{account-ID}:role/{role-name}"
   },
   "Action":"kms:CreateGrant",
   "Resource":"*",
   "Condition":{
      "StringEquals":{
         "kms:EncryptionContext:{context-key}":"{context-value}",
         "kms:ViaService":"redshift.{region}.amazonaws.com"
      },
      "ForAllValues:StringEquals":{
         "kms:GrantOperations":[
            "Decrypt",
            "GenerateDataKey",
            "CreateGrant"
         ]
      }
   }
}
```

以下策略语句可让 Amazon Redshift 服务主体添加对 KMS 密钥的授权。

```
{
   "Effect":"Allow",
   "Principal":{
      "Service":"redshift.amazonaws.com"
   },
   "Action":"kms:CreateGrant",
   "Resource":"*",
   "Condition":{
      "StringEquals":{
         "kms:EncryptionContext:{context-key}":"{context-value}",
         "aws:SourceAccount":"{account-ID}"
      },
      "ForAllValues:StringEquals":{
         "kms:GrantOperations":[
            "Decrypt",
            "GenerateDataKey",
            "CreateGrant"
         ]
      },
      "ArnLike":{
         "aws:SourceArn":"arn:aws:*:{region}:{account-ID}:integration:*"
      }
   }
}
```

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

## 加密上下文
<a name="zero-etl.add-encryption-context"></a>

加密零 ETL 集成时，可以将键值对添加为**其他加密上下文**。您可能想要添加这些键值对，以便添加有关待复制数据的其他上下文信息。有关更多信息，请参阅 *AWS Key Management Service 开发人员指南*中的[加密内容](https://docs.aws.amazon.com//kms/latest/developerguide/encrypt_context.html)。

除了您添加的任何加密上下文对外，Amazon Redshift 还会添加以下加密上下文对：
+ `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)。