AWS为自管理的数据库源提供零 ETL 集成 - AWS数据库迁移服务

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

AWS为自管理的数据库源提供零 ETL 集成

AWSZero-ETL 集成是一种完全托管的解决方案,它使来自多个操作和交易数据库来源的 Amazon Redshift、Amazon S3 和 Amazon S3 表中的交易和运营数据可用。使用 Zero-ETL,您可以通过现有 () 源终端节点将自行管理的源数据库(例如 MySQL、PostgreSQL、SQL Server 和 Oracle)中的数据复制到 Amazon Redshift。AWS Database Migration Service AWS DMS自动同步避免了传统的提取、转换和加载 (ETL) 过程。它还支持实时分析和 AI 工作负载。有关更多信息,请参阅《亚马逊 Redshift 管理指南》中的零 ETL 集成

零 ETL 集成具有以下好处:

  • 实时数据复制 — 将数据从 Oracle 数据库持续同步到 Amazon Redshift,延迟最小。

  • 消除复杂的 ETL 管道 — 无需构建和维护自定义数据集成解决方案。

  • 减少运营开销 — 通过实现自动设置和管理AWSAPIs。

  • 简化的数据集成架构-在自行管理的数据库和AWS分析服务之间实现无缝集成。

  • 增强的安全性-内置加密和 IAM 访问控制。

Zero-ETL 集成如何适用于自行管理的数据库源

您可以使用先前为自管理数据库创建的现有AWS DMS终端节点,也可以创建新的终端节点。

  • 使用AWS Glue控制台或 CLI 创建零 ETL 集成,将 Amazon Redshift 作为目录中的目标。AWS Glue在创建零 ETL 集成时,您可以指定架构和表筛选器。

  • 与集成相关的其他只读资源将在AWS DMS服务中自动创建。这些资源(包括 Zero-ETL 引擎)用于启动满负荷和持续的数据更改流程,将数据与 Amazon Redshift 目标数据库同步。

  • 在创建集成源、创建零 ETL 集成以及创建 Amazon Redshift 数据仓库时,您可以控制数据的加密。

  • 该集成还会监控数据管道的运行状况,并在可能的情况下从问题中恢复。

  • 您可以创建相同类型的多个源与单个 Amazon Redshift 数据仓库的集成,从而获得跨多个应用程序的全面洞察。

复制数据后,您就可以使用 Amazon Redshift 的分析功能了。例如,内置机器学习 (ML)、实体化视图、数据共享以及直接访问多个数据存储和数据湖。对于数据工程师来说,零ETL集成提供了对时间敏感型数据的访问,否则这些数据可能会因为复杂的数据管道中的间歇性错误而延迟。您可以对事务数据运行分析查询和 ML 模型,从而为时间敏感型事件和业务决策提供及时的洞察。

您可以创建 Amazon Redshift 事件通知订阅,以便在任何零 ETL 集成出现问题时自动收到通知。要查看与集成相关的事件通知列表,请参阅与 Amazon 的零 ETL 集成事件通知。 EventBridge创建订阅的最简单方法是使用 Amazon 简单通知服务控制台。有关创建和订阅 Amazon SNS 主题的信息,请参阅《Amazon Simple Notification Service 开发人员指南》中的开始使用 Amazon SNS

为零 ETL 集成设置 IAM 权限和加密

要创建和管理零 ETL 集成,您需要配置适当的 IAM 权限、AWS Key Management Service (AWS KMS) 加密密钥和资源策略。本节提供有关设置所需安全组件的指导。

先决条件

在创建零 ETL 集成之前,请确保您具备以下条件:

  • 具有创建和管理集成的相应权限的 IAM 用户或角色

  • 您的自AWS DMS建数据库的现有源端点

  • 以 Amazon Redshift 预配置的集群或无服务器命名空间作为目标

  • 网络配置,包括 VPC 子网和安全组

创建 KMS 密钥

首先,创建客户托管AWS KMS密钥来加密零ETL集成中的数据。以下示例创建对称加密密钥:

aws kms create-key \ --description "On-prem Zero-ETL Integration Encryption Key" \ --key-usage ENCRYPT_DECRYPT \ --key-spec SYMMETRIC_DEFAULT \ --region region

请注意响应Arn中的KeyId和,因为您在配置密钥策略和创建集成时将需要它们。

输出示例:

{ "KeyMetadata": { "AWSAccountId": "account-id", "KeyId": "4e2c14f8-7abe-4aec-851a-379f6ed973a8", "Arn": "arn:aws:kms:region:account-id:key/4e2c14f8-7abe-4aec-851a-379f6ed973a8", "CreationDate": 1763155061.148, "Enabled": true, "Description": "Zero-ETL Integration Encryption Key", "KeyUsage": "ENCRYPT_DECRYPT", "KeyState": "Enabled", "Origin": "AWS_KMS", "KeyManager": "CUSTOMER", "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT", "KeySpec": "SYMMETRIC_DEFAULT", "EncryptionAlgorithms": [ "SYMMETRIC_DEFAULT" ], "MultiRegion": false } }

配置 KMS 密钥策略

创建 KMS 密钥后,将密钥策略配置为允许 Amazon Redshift 和AWS Glue服务使用该密钥进行加密和解密操作。密钥策略必须向服务委托人授予必要的权限,并包括将在集成创建期间使用的加密上下文。

以下示例显示了零 ETL 集成的关键策略:

{ "Version": "2012-10-17", "Id": "key-default-1", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::account-id:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allows the Redshift and glue service principal to add a grant to a KMS key", "Effect": "Allow", "Principal": { "Service": [ "redshift.amazonaws.com", "glue.amazonaws.com" ] }, "Action": "kms:CreateGrant", "Resource": "*", "Condition": { "StringEquals": { "kms:EncryptionContext:context-key": "context-value" }, "ForAllValues:StringEquals": { "kms:GrantOperations": [ "Decrypt", "GenerateDataKey", "CreateGrant", "GenerateDataKeyWithoutPlaintext", "ReEncryptTo" ] } } } ] }

kms:EncryptionContext条件必须与您在创建集成时指定的其他加密上下文相匹配。您可以使用AWS KMS控制台或以下 CLI 命令更新密钥策略:

aws kms put-key-policy \ --key-id key-id \ --policy-name default \ --policy file://kms-key-policy.json

创建 IAM 用户并配置 AWS CLI

创建用于管理零 ETL 集成的 IAM 用户,并使用适当的证书配置 CL AWS I。

  1. 创建一个 IAM 用户:

    aws iam create-user --user-name cli-user
  2. 为用户创建访问密钥:

    aws iam create-access-key --user-name cli-user

    保存输出SecretAccessKey中的AccessKeyId和,因为您将需要它们来配置 AWS CLI。

创建并附加 IAM 策略

创建一个 IAM 策略,授予零 ETL 集成操作的权限。该策略应包括对AWS Glue、AWS DMS、Amazon Redshift 和的权限。AWS KMS

将以下策略保存到文件中(例如,/tmp/zetl-policy.json):

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ZetlGlueIntegrationAccess", "Effect": "Allow", "Action": [ "glue:CreateIntegration", "glue:ModifyIntegration", "glue:DeleteIntegration", "glue:DescribeIntegrations", "glue:DescribeInboundIntegrations" ], "Resource": "*" }, { "Sid": "DMSIntegrationAccess", "Effect": "Allow", "Action": [ "dms:CreateOutboundIntegration", "dms:ModifyOutboundIntegration", "dms:CreateEndpoint", "dms:DescribeEndpoints", "dms:ModifyEndpoint", "dms:DeleteEndpoint", "dms:TestConnection" ], "Resource": "*" }, { "Sid": "ZetlRedshiftFullAccess", "Effect": "Allow", "Action": [ "redshift:*", "redshift-serverless:*", "ec2:DescribeAccountAttributes", "ec2:DescribeAddresses", "ec2:DescribeAvailabilityZones", "ec2:DescribeSecurityGroups", "ec2:DescribeSubnets", "ec2:DescribeVpcs", "ec2:DescribeInternetGateways", "sns:CreateTopic", "sns:Get*", "sns:List*", "cloudwatch:Describe*", "cloudwatch:Get*", "cloudwatch:List*", "cloudwatch:PutMetricAlarm", "cloudwatch:EnableAlarmActions", "cloudwatch:DisableAlarmActions", "tag:GetResources", "tag:UntagResources", "tag:GetTagValues", "tag:GetTagKeys", "tag:TagResources" ], "Resource": "*" }, { "Sid": "ZetlRedshiftDataAPI", "Effect": "Allow", "Action": [ "redshift-data:ExecuteStatement", "redshift-data:CancelStatement", "redshift-data:ListStatements", "redshift-data:GetStatementResult", "redshift-data:DescribeStatement", "redshift-data:ListDatabases", "redshift-data:ListSchemas", "redshift-data:ListTables", "redshift-data:DescribeTable" ], "Resource": "*" }, { "Sid": "ZetlKMSAccess", "Effect": "Allow", "Action": [ "kms:CreateKey", "kms:DescribeKey", "kms:Encrypt", "kms:Decrypt", "kms:GenerateDataKey", "kms:ListKeys", "kms:CreateAlias", "kms:ListAliases", "kms:CreateGrant" ], "Resource": "*" }, { "Sid": "ZetlSecretsManagerAccess", "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue", "secretsmanager:PutSecretValue", "secretsmanager:CreateSecret", "secretsmanager:UpdateSecret", "secretsmanager:DeleteSecret", "secretsmanager:DescribeSecret", "secretsmanager:ListSecrets", "secretsmanager:GetResourcePolicy", "secretsmanager:PutResourcePolicy", "secretsmanager:ValidateResourcePolicy" ], "Resource": "*" } ] }

创建策略并将其附加到 IAM 用户:

aws iam create-policy \ --policy-name ZetlCustomPolicy \ --policy-document file:///tmp/zetl-policy.json aws iam attach-user-policy \ --policy-arn arn:aws:iam::account-id:policy/ZetlCustomPolicy \ --user-name cli-user

配置 AWS CLI 配置文件

使用在前面步骤中创建的用户凭证配置 AWS CLI 配置文件:

aws configure set aws_access_key_id ACCESS_KEY_ID --profile cli-user aws configure set aws_secret_access_key SECRET_ACCESS_KEY --profile cli-user aws configure set region region --profile cli-user aws configure set output json --profile cli-user

测试配置文件配置:

aws sts get-caller-identity --profile cli-user

输出应显示用户的账户 ID、用户 ID 和 ARN,以确认配置文件配置正确。

创建 Redshift 资源策略

创建 Amazon Redshift 资源策略以授权AWS DMS源终端节点创建与您的亚马逊 Redshift 命名空间的入站集成。此政策附加到 Amazon Redshift 命名空间,用于控制哪些来源可以将数据复制到该命名空间。

以下示例说明如何为 Amazon Redshift 命名空间创建资源策略:

aws redshift put-resource-policy \ --policy '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": ["redshift.amazonaws.com"] }, "Action": ["redshift:AuthorizeInboundIntegration"], "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:dms:region:account-id:endpoint:endpoint-id" } } }, { "Effect": "Allow", "Principal": { "AWS": "account-id" }, "Action": [ "redshift:CreateInboundIntegration", "redshift:ModifyInboundIntegration" ] } ] }' \ --resource-arn arn:aws:redshift:region:account-id:namespace:namespace-id \ --region region

替换以下占位符:

  • region— 您的资源AWS所在的地区

  • account-id— 您的AWS账户 ID

  • endpoint-id— 您的AWS DMS源端点的 ID

  • namespace-id— 你的亚马逊 Redshift 命名空间的 ID

示例:创建带加密功能的零 ETL 集成

设置必要的权限和加密密钥后,您可以使用 API 创建零 ETL 集成。AWS Glue以下示例演示如何使用 KMS 加密创建从 MySQL 源到亚马逊 Redshift 目标的集成:

aws glue create-integration \ --integration-name mysql-onprem-integration \ --source-arn arn:aws:dms:region:account-id:endpoint:source-endpoint-id \ --target-arn arn:aws:redshift:region:account-id:namespace:namespace-id \ --description "MySQL to Redshift integration" \ --integration-config '{"SourceProperties":{"SubnetIds":"subnet-id1,subnet-id2,subnet-id3","VpcSecurityGroupIds":"sg-id"}}' \ --data-filter "include: mysql.*" \ --kms-key-id arn:aws:kms:region:account-id:key/key-id \ --additional-encryption-context '{"context-key": "context-value"}' \ --profile cli-user \ --region region

该命令包括以下关键参数:

  • --integration-name— 为您的集成提供一个唯一的名称

  • --source-arn— 您的AWS DMS源端点的 ARN

  • --target-arn— 你的亚马逊 Redshift 命名空间的 ARN

  • --integration-config— 网络配置,包括子网 IDs 和安全组

  • --data-filter— 指定要复制的架构和表

  • --kms-key-id— 用于加密的AWS KMS密钥的 ARN

  • --additional-encryption-context— 必须与 KMS 密钥策略匹配的加密上下文密钥值对(例如){"context-key": "context-value"}

  • --profile— 要使用的 AWS CLI 配置文件(之前创建的 CLI 用户配置文件)

成功创建后,该命令将返回集成详细信息,包括集成 ARN、状态和配置参数。输出示例:

{ "SourceArn": "arn:aws:dms:region:account-id:endpoint:endpoint-id", "TargetArn": "arn:aws:redshift:region:account-id:namespace:namespace-id", "IntegrationName": "mysql-onprem-integration", "IntegrationArn": "arn:aws:glue:region:account-id:integration:integration-id", "KmsKeyId": "arn:aws:kms:region:account-id:key/key-id", "AdditionalEncryptionContext": { "context-key": "context-value" }, "Status": "CREATED", "CreateTime": 1763234086.001, "DataFilter": "include: mysql.*", "IntegrationConfig": { "SourceProperties": { "SubnetIds": "subnet-id1,subnet-id2,subnet-id3", "VpcSecurityGroupIds": "sg-id" } } }

安全最佳实践

设置零 ETL 集成时,请遵循以下安全最佳实践:

  • 使用最低权限访问权限-仅授予创建和管理集成所需的最低权限。尽可能考虑使用资源级权限。

  • 启用加密-始终使用客户管理的AWS KMS密钥来加密集成数据。指定加密上下文以提高安全性。

  • 定期轮换证书 — 如果使用 IAM 用户访问密钥,请定期轮换证书。请考虑改为使用带有临时证书的 IAM 角色。

  • 监控访问权限-AWS CloudTrail 用于监控与集成创建和管理相关的 API 调用。

  • 限制网络访问-配置 VPC 安全组,将网络访问限制为仅限所需资源。

  • 使用资源策略 — 实施 Amazon Redshift 资源策略来控制哪些来源可以与您的数据仓库进行集成。

  • 标记资源-将标签应用于集成和相关资源,以便更好地进行组织和成本跟踪。