创建 DynamoDB 的零 ETL 集成 - Amazon Redshift

创建 DynamoDB 的零 ETL 集成

在创建零 ETL 集成之前,请查看将零 ETL 集成与 Amazon Redshift 结合使用时的注意事项中概述的注意事项和要求。按照这个常规流程创建从 DynamoDB 到 Amazon Redshift 的零 ETL 集成

使用零 ETL 集成将 DynamoDB 数据复制到 Amazon Redshift
  1. 确认您的登录凭证具备适当的权限,使您可以处理 Amazon Redshift 与 DynamoDB 的零 ETL 集成。有关示例 IAM 策略,请参阅与 DynamoDB 零 ETL 集成配合使用的 IAM 策略

  2. 在 DynamoDB 控制台中,配置您的 DynamoDB 表,让它具有时间点故障恢复(PITR)、资源策略、基于身份的策略和加密密钥权限,如《Amazon DynamoDB 开发人员指南》中所述。

  3. 从 Amazon Redshift 控制台:创建和配置目标 Amazon Redshift 数据仓库

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

  5. 在 Amazon Redshift 控制台中,在 Amazon Redshift 数据仓库中创建目标数据库。有关更多信息,请参阅 在 Amazon Redshift 中创建目标数据库

  6. 在 Amazon Redshift 控制台中,查询在 Amazon Redshift 数据仓库中复制的数据。有关更多信息,请参阅 在 Amazon Redshift 中查询复制的数据

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

Amazon Redshift console
使用 Amazon Redshift 控制台创建 Amazon DynamoDB 与 Amazon Redshift 的零 ETL 集成
  1. 在 Amazon Redshift 控制台中,选择零 ETL 集成。在包含零 ETL 集成列表的窗格上,依次选择创建零 ETL 集成创建 DynamoDB 集成

  2. 在创建集成页面上,输入有关集成的信息,如下所示:

    • 输入集成名称 - 这是一个唯一名称,可用于引用集成。

    • 输入描述 - 描述要从源复制到目标的数据。

    • 选择 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 中为资源添加标签

    • 选择加密选项 - 加密集成。有关更多信息,请参阅 使用客户自主管理型密钥加密 DynamoDB 集成

      加密集成时,还可以添加其他加密上下文。有关更多信息,请参阅 加密上下文

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

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

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

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

  7. 在集成状态和目标数据库变为 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:CreateGrantkms: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 策略

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

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

使用客户自主管理型密钥加密 DynamoDB 集成

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

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

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

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

以下策略语句让请求者账户或角色可以添加对 KMS 密钥的授权。kms:ViaService 条件键将 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 开发人员指南》中的创建密钥策略

加密上下文

加密零 ETL 集成时,可以将键值对添加为其他加密上下文。您可能想要添加这些键值对,以便添加有关待复制数据的其他上下文信息。有关更多信息,请参阅 AWS Key Management Service 开发人员指南中的加密内容

除了您添加的任何加密上下文对外,Amazon Redshift 还会添加以下加密上下文对:

  • aws:redshift:integration:arn - IntegrationArn

  • aws:servicename:id - Redshift

这会将您可以添加的加密上下文对总数从 8 减少到 6,并增加授予约束条件的总字符限制。有关更多信息,请参阅《AWS Key Management Service 开发人员指南》中的 Using grant constraints