

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

# Amazon 为自管理的数据库源提供零 ETL 集成
<a name="zero-etl"></a>

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

零 ETL 集成具有以下好处：
+  **实时数据复制** — 将数据从 Oracle 数据库持续同步到 Amazon Redshift，延迟最小。
+  **消除复杂的 ETL 管道** — 无需构建和维护自定义数据集成解决方案。
+  **减少运营开销** — 通过实现自动设置和管理 Amazon APIs。
+  **简化的数据集成架构**-在自行管理的数据库和 Amazon 分析服务之间实现无缝集成。
+  **增强的安全性**-内置加密和 IAM 访问控制。

## Zero-ETL 集成如何适用于自行管理的数据库源
<a name="zero-etl.how-it-works"></a>

您可以使用先前为自管理数据库创建的现有 Amazon DMS 终端节点，也可以创建新的终端节点。
+ 使用 Amazon Glue 控制台或 [CLI](https://docs.amazonaws.cn/glue/latest/dg/aws-glue-api-integrations.html) 创建零 ETL 集成，将 Amazon Redshift 作为目录中的目标。 Amazon Glue 在创建零 ETL 集成时，您可以指定架构和表筛选器。
+ 与集成相关的其他只读资源将在 Amazon DMS 服务中自动创建。这些资源（包括 Zero-ETL 引擎）用于启动满负荷和持续的数据更改流程，将数据与 Amazon Redshift 目标数据库同步。
+ 在创建集成源、创建零 ETL 集成以及创建 Amazon Redshift 数据仓库时，您可以控制数据的加密。
+ 该集成还会监控数据管道的运行状况，并在可能的情况下从问题中恢复。
+ 您可以创建相同类型的多个源与单个 Amazon Redshift 数据仓库的集成，从而获得跨多个应用程序的全面洞察。

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

您可以创建 Amazon Redshift 事件通知订阅，以便在任何零 ETL 集成出现问题时自动收到通知。要查看与集成相关的事件通知列表，请参阅与 Amazon 的[零 ETL 集成事件通知](https://docs.amazonaws.cn/redshift/latest/mgmt/integration-event-notifications.html)。 EventBridge创建订阅的最简单方法是使用 Amazon 简单通知服务控制台。有关创建和订阅 Amazon SNS 主题的信息，请参阅《Amazon Simple Notification Service 开发人员指南》**中的[开始使用 Amazon SNS](https://docs.amazonaws.cn/sns/latest/dg/sns-getting-started.html)。

## 创建集成之前的源数据库配置
<a name="zero-etl.source-database-configuration"></a>

在配置 Zero-ETL 集成之前，必须根据数据库引擎的要求正确配置源数据库。每个引擎都有特定的配置要求和限制。

SQL Server
+ 有关配置要求，请参阅[使用 Microsoft SQL Server 数据库作为来源 Amazon DMS](https://docs.amazonaws.cn/dms/latest/userguide/CHAP_Source.SQLServer.html)。
+ 有关变更数据捕获 (CDC) 的要求，请参阅[捕获数据更改以便从 SQL Server 进行持续复制](https://docs.amazonaws.cn/dms/latest/userguide/CHAP_Source.SQLServer.CDC.html)。

**注意**  
RDS SQL Server 和 Azure SQL Server 不能用作自我管理的零 ETL 集成的来源。

Oracle
+ 有关配置要求和限制，请参阅[使用 Oracle 数据库作为源 Amazon DMS](https://docs.amazonaws.cn/dms/latest/userguide/CHAP_Source.Oracle.html)。

MySQL
+ 有关配置要求和限制，请参阅[使用与 MySQL 兼容的数据库作为源。 Amazon DMS](https://docs.amazonaws.cn/dms/latest/userguide/CHAP_Source.MySQL.html)

PostgreSQL
+ 有关配置要求和限制，请参阅[使用 PostgreSQL 数据库作为源](https://docs.amazonaws.cn/dms/latest/userguide/CHAP_Source.PostgreSQL.html)。 Amazon DMS 
+ 当使用自我管理的 PostgreSQL 数据库作为源时，以下限制适用：
  + 对于自行管理的 PostgreSQL 源，在创建源端点时，必须`false`在 PostgreSQL 终端节点设置中`CaptureDdls`将其设置为。要设置此参数，请在创建源端点时使用以下内容：

    ```
    --postgre-sql-settings '{"CaptureDdls": false}'
    ```

     如果未设置 CaptureDdls 为 false，则任务可能无法成功启动。
  + 如果设置`CaptureDdls`为`false`，则不会捕获复制期间对源数据库执行的 DDL 操作（例如创建表、更改表和删除表），也不会被捕获或复制到目标数据库。

## 为零 ETL 集成设置 IAM 权限和加密
<a name="zero-etl.iam-setup"></a>

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

### 先决条件
<a name="zero-etl.iam-setup.prerequisites"></a>

在创建零 ETL 集成之前，请确保具备以下条件：
+ 具有创建和管理集成的相应权限的 IAM 用户或角色
+ 为自建数据库配置 Amazon DMS 源端点。有关更多信息，请参阅 [创建集成之前的源数据库配置](#zero-etl.source-database-configuration)。
+ 以 Amazon Redshift 预配置的集群或无服务器命名空间作为目标
+ 网络配置，包括 VPC 子网和安全组

### 创建 KMS 密钥
<a name="zero-etl.iam-setup.kms-key"></a>

首先，创建客户托管 Amazon 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 密钥策略
<a name="zero-etl.iam-setup.kms-policy"></a>

创建 KMS 密钥后，将密钥策略配置为允许 Amazon Redshift 和 Amazon 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`条件必须与您在创建集成时指定的其他加密上下文相匹配。您可以使用 Amazon KMS 控制台或以下 CLI 命令更新密钥策略：

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

### 创建 IAM 用户并配置 Amazon CLI
<a name="zero-etl.iam-setup.user-setup"></a>

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

1. 创建一个 IAM 用户：

   ```
   aws iam create-user --user-name cli-user
   ```

1. 为用户创建访问密钥：

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

   保存输出`SecretAccessKey`中的`AccessKeyId`和，因为您需要它们来配置 Amazon CLI。

### 创建并附加 IAM 策略
<a name="zero-etl.iam-setup.iam-policy"></a>

创建一个 IAM 策略，授予零 ETL 集成操作的权限。该策略应包括对 Amazon Glue、 Amazon DMS、Amazon Redshift 和的权限。 Amazon 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
```

### 配置 Amazon CLI 配置文件
<a name="zero-etl.iam-setup.cli-config"></a>

使用在前面步骤中创建的用户凭证配置 Amazon 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 资源策略
<a name="zero-etl.iam-setup.resource-policy"></a>

创建 Amazon Redshift 资源策略以授权 Amazon 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*— 您的资源 Amazon 所在的地区 
+  *account-id*— 您的 Amazon 账户 ID 
+  *endpoint-id*— 您的 Amazon DMS 源端点的 ID 
+  *namespace-id*— 你的亚马逊 Redshift 命名空间的 ID 

### 示例：创建带加密功能的零 ETL 集成
<a name="zero-etl.iam-setup.example"></a>

设置必要的权限和加密密钥后，您可以使用 API 创建零 ETL 集成。 Amazon 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`— 您的 Amazon DMS 源端点的 ARN 
+  `--target-arn`— 你的亚马逊 Redshift 命名空间的 ARN 
+  `--integration-config`— 网络配置，包括子网 IDs 和安全组 
+  `--data-filter`— 指定要复制的架构和表 
+  `--kms-key-id`— 用于加密的 Amazon KMS 密钥的 ARN 
+  `--additional-encryption-context`— 必须与 KMS 密钥策略匹配的加密上下文密钥值对（例如）`{"context-key": "context-value"}` 
+  `--profile`— 要使用的 Amazon 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"
        }
    }
}
```

### 安全最佳实践
<a name="zero-etl.iam-setup.best-practices"></a>

设置零 ETL 集成时，请遵循以下安全最佳实践：
+  **使用最低权限访问**权限-仅授予创建和管理集成所需的最低权限。尽可能考虑使用资源级权限。
+  **启用加密**-始终使用客户管理的 Amazon KMS 密钥来加密集成数据。指定加密上下文以提高安全性。
+  **定期轮换证书** — 如果使用 IAM 用户访问密钥，请定期轮换证书。请考虑改用带有临时证书的 IAM 角色。
+  **监控访问权限**- Amazon CloudTrail 用于监控与集成创建和管理相关的 API 调用。
+  **限制网络访问**-配置 VPC 安全组，将网络访问限制为仅限所需资源。
+  **使用资源策略** — 实施 Amazon Redshift 资源策略来控制哪些来源可以与您的数据仓库进行集成。
+  **标记资源**-将标签应用于集成和相关资源，以便更好地进行组织和成本跟踪。