Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅
中国的 Amazon Web Services 服务入门
(PDF)。
创建 DynamoDB 的零 ETL 集成
在创建零 ETL 集成之前,请查看将零 ETL 集成与 Amazon Redshift 结合使用时的注意事项中概述的注意事项和要求。按照这个常规流程创建从 DynamoDB 到 Amazon Redshift 的零 ETL 集成
在此步骤中,您将创建 Amazon DynamoDB 与 Amazon Redshift 的零 ETL 集成。
- Amazon Redshift console
-
使用 Amazon Redshift 控制台创建 Amazon DynamoDB 与 Amazon Redshift 的零 ETL 集成
在 Amazon Redshift 控制台中,选择零 ETL 集成。在包含零 ETL 集成列表的窗格上,依次选择创建零 ETL 集成、创建 DynamoDB 集成。
在创建集成页面上,输入有关集成的信息,如下所示:
输入集成名称 - 这是一个唯一名称,可用于引用集成。
输入描述 - 描述要从源复制到目标的数据。
选择 DynamoDB 源表 - 可以选择一个 DynamoDB 表。表上必须启用时间点故障恢复(PITR)。仅显示表大小不超过 100 TiB 的表。源 DynamoDB 表必须加密。源还必须具有包含授权主体和集成源的资源策略。如果这些策略不正确,则会显示自动修复此问题选项。
选择目标 Amazon Redshift 数据仓库 - 数据仓库可以是 Amazon Redshift 预置集群或 Redshift Serverless 工作组。如果您的目标 Amazon Redshift 在同一个账户中,则可以选择目标。如果目标位于另一个账户中,则需要指定 Redshift 数据仓库 ARN。目标必须具有包含授权主体和集成源的资源策略,并将 enable_case_sensitive_identifier
参数设置为 true。如果目标上没有正确的资源策略,并且您的目标在同一个账户中,则可以选择自动修复此问题选项,以便在创建集成过程中自动应用资源策略。如果您的目标位于另一个 Amazon Web Services 账户,则需要手动在 Amazon Redshift 仓库中应用资源策略。如果您的目标 Amazon Redshift 数据仓库没有将正确的参数组选项 enable_case_sensitive_identifier
配置为 true
,则可以选择自动修复此问题选项,在创建集成过程中自动更新此参数组并重启仓库。
输入最多 50 个标签键和一个可选值 - 提供有关集成的其他元数据。有关更多信息,请参阅 在 Amazon Redshift 中为资源添加标签。
选择加密选项 - 加密集成。有关更多信息,请参阅 使用客户自主管理型密钥加密 DynamoDB 集成。
加密集成时,还可以添加其他加密上下文。有关更多信息,请参阅 加密上下文。
此时会显示一个检查页面,您可以在这个页面选择创建 DynamoDB 集成。
此时会显示一个进度页面,您可以在这个页面查看创建零 ETL 集成的各种任务的进度。
创建集成并激活后,在集成的详细信息页面上,选择连接到数据库。首次创建 Amazon Redshift 数据仓库时,也创建了一个数据库。您需要连接到目标数据仓库中的任何数据库,这样才能为集成创建另一个数据库。在连接到数据库页面中,确定是否可以使用最近的连接并选择身份验证方法。根据您的身份验证方法,输入信息以连接到目标中的现有数据库。此身份验证信息包括现有数据库名称(通常为 dev
)和使用 Amazon Redshift 数据仓库创建数据库时指定的数据库用户。
连接到数据库后,选择通过集成创建数据库,以便创建从源接收数据的数据库。创建数据库时,您需要提供集成 ID、数据仓库名称和数据库名称。
在集成状态和目标数据库变为 Active
后,数据开始从 DynamoDB 表复制到目标表。当您将数据添加到源时,数据会自动复制到目标 Amazon Redshift 数据仓库。
- Amazon CLI
-
要使用 Amazon 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"
}
以下示例使用客户管理的加密密钥来创建集成。在创建集成之前:
{
"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 集成时的 Amazon 拥有的密钥,则密钥策略必须为 Amazon Redshift 服务主体提供对 CreateGrant
操作的访问权限。此外,该策略必须让请求者账户或角色有权运行 DescribeKey
和 CreateGrant
操作。
以下示例密钥策略语句演示了策略中所需的权限。一些示例包括用于进一步缩小权限范围的上下文密钥。
以下策略语句让请求者账户或角色可以检索有关 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:*"
}
}
}
有关更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的创建密钥策略。
加密上下文
加密零 ETL 集成时,可以将键值对添加为其他加密上下文。您可能想要添加这些键值对,以便添加有关待复制数据的其他上下文信息。有关更多信息,请参阅 Amazon Key Management Service 开发人员指南中的加密内容。
除了您添加的任何加密上下文对外,Amazon Redshift 还会添加以下加密上下文对:
这会将您可以添加的加密上下文对总数从 8 减少到 6,并增加授予约束条件的总字符限制。有关更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的 Using grant constraints。