

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

# 设置 Oracle Database@ 与 Amazon Redshift AWS 的集成
<a name="setting-up-zero-etl"></a>

要在您的 Oracle 数据库和 Amazon Redshift 之间设置零 ETL 集成，请完成以下步骤：

1. 在您的 ODB 网络上启用零 ETL。

1. 配置 Oracle 数据库先决条件。

1. 设置 S AWS ecrets Manager 和 AWS 密钥管理服务。

1. 配置 IAM 权限。

1. 设置 Amazon Redshift 资源政策。

1. 创建零 ETL 集成。

1. 在 Amazon Redshift 中创建目标数据库。

## 第 1 步：为您的 ODB 网络启用零 ETL
<a name="zero-etl-enable-network"></a>

您可以为与源虚拟机集群关联的 ODB 网络启用零 ETL 集成。默认情况下，此集成处于禁用状态。

### 控制台
<a name="ZETLAccess.CON"></a>

**启用零 ETL 集成**

1. 打开 Oracle Database@AWS 控制台，网址为。[https://console.aws.amazon.com/odb/](https://console.aws.amazon.com/odb/)

1. 在导航窗格中，选择 **ODB 网络**。

1. 选择要为其启用零 ETL 集成的 ODB 网络。

1. 选择 **Modify**(修改)。

1. 选择**零 ETL**。

1. 选择 “**继续**”，然后选择 “**修改”**。

### AWS CLI
<a name="ZETLAccess.CLI"></a>

要启用零 ETL 集成，请使用带参数的`update-odb-network`命令：`--zero-etl-access`

```
aws odb update-odb-network \
  --odb-network-id {{odb-network-id}} \
  --zero-etl-access ENABLED
```

要为与源虚拟机集群关联的 ODB 网络启用零 ETL 集成，请使用命令。`update-odb-network`此命令配置零 ETL 集成所需的网络基础架构。

```
aws odb update-odb-network \
  --odb-network-id {{your-odb-network-id}} \
  --zero-etl-access ENABLED
```

## 步骤 2：配置您的 Oracle 数据库
<a name="zero-etl-configure-oracle"></a>

按照[先决条件](zero-etl-prerequisites.md)中所述完成 Oracle 数据库配置：
+ 创建复制用户并授予必要的权限。
+ 启用已存档的重做日志。
+ 配置 SSL（仅限 Oracle Exadata）。
+ 如果适用，请设置 ASM 用户（仅限 Oracle Exadata）。

## 第 3 步：设置 S AWS ecrets Manager 和 AWS 密钥管理服务
<a name="zero-etl-setup-secrets"></a>

创建客户托管密钥 (CMK) 并存储您的数据库凭据。

1. 使用`create-key`命令在 AWS 密钥管理服务中创建 CMK。

   ```
   aws kms create-key \
     --description "ODB Zero-ETL Integration Key" \
     --key-usage ENCRYPT_DECRYPT \
     --key-spec SYMMETRIC_DEFAULT
   ```

1. 将您的数据库凭据存储在 S AWS ecrets Manager 中。

   ```
   aws secretsmanager create-secret \
     --name "ODBZeroETLCredentials" \
     --description "Credentials for Oracle Database@AWS Zero-ETL integration" \
     --kms-key-id {{your-cmk-key-arn}} \
     --secret-string file://secret-content.json
   ```

1. 为密钥附加资源策略以允许 Oracle Database@ 访问AWS 。

   ```
   aws secretsmanager put-resource-policy \
     --secret-id "ODBZeroETLCredentials" \
     --resource-policy file://secret-resource-policy.json
   ```

   在前面的命令中，`secret-resource-policy.json`包含以下 JSON。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "zetl.odb.amazonaws.com"
         },
         "Action": [
           "secretsmanager:GetSecretValue",
           "secretsmanager:DescribeSecret"
         ],
         "Resource": "*"
       }
     ]
   }
   ```

------

1. 将资源策略附加到 CMK。CMK 资源策略必须包括 Oracle Database@AWS 服务主体和 Amazon Redshift 服务主体的权限，才能支持加密的零 ETL 集成。

   ```
   aws kms put-key-policy \
     --key-id {{your-cmk-key-arn}} \
     --policy-name default \
     --policy file://cmk-resource-policy.json
   ```

   该`cmk-resource-policy.json`文件应包含以下政策声明。第一条语句允许 Oracle Database@AWS 服务访问，第二条语句允许 Amazon Redshift 为 KMS 密钥创建用于加密数据操作的授权。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "Allow ODB service access",
         "Effect": "Allow",
         "Principal": {
           "Service": "zetl.odb.amazonaws.com"
         },
         "Action": [
           "kms:Decrypt",
           "kms:GenerateDataKey",
           "kms:CreateGrant"
         ],
         "Resource": "*"
       },
       {
         "Sid": "Allows the Redshift service principal to add a grant to a KMS key",
         "Effect": "Allow",
         "Principal": {
           "Service": "redshift.amazonaws.com"
         },
         "Action": "kms:CreateGrant",
         "Resource": "*",
         "Condition": {
           "StringEquals": {
             "kms:EncryptionContext:{context-key}": "{context-value}"
           },
           "ForAllValues:StringEquals": {
             "kms:GrantOperations": [
               "Decrypt",
               "GenerateDataKey",
               "CreateGrant"
             ]
           }
         }
       }
     ]
   }
   ```

------

## 步骤 4：配置 IAM 权限
<a name="zero-etl-setup-iam"></a>

创建并附加允许零 ETL 集成操作的 IAM 策略。

```
aws iam create-policy \
  --policy-name "ODBZeroETLIntegrationPolicy" \
  --policy-document file://odb-zetl-iam-policy.json

aws iam attach-user-policy \
  --user-name {{your-iam-username}} \
  --policy-arn {{policy-arn}}
```

以下策略授予必要的权限。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "ODBGlueIntegrationAccess",
      "Effect": "Allow",
      "Action": [
        "glue:CreateIntegration",
        "glue:ModifyIntegration",
        "glue:DeleteIntegration",
        "glue:DescribeIntegrations",
        "glue:DescribeInboundIntegrations"
      ],
      "Resource": "*"
    },
    {
      "Sid": "ODBZetlOperations",
      "Effect": "Allow",
      "Action": "odb:CreateOutboundIntegration",
      "Resource": "*"
    },
    {
      "Sid": "ODBRedshiftFullAccess",
      "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": "ODBRedshiftDataAPI",
      "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": "ODBKMSAccess",
      "Effect": "Allow",
      "Action": [
        "kms:CreateKey",
        "kms:DescribeKey",
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:GenerateDataKey",
        "kms:ListKeys",
        "kms:CreateAlias",
        "kms:ListAliases"
      ],
      "Resource": "*"
    },
    {
      "Sid": "ODBSecretsManagerAccess",
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetSecretValue",
        "secretsmanager:PutSecretValue",
        "secretsmanager:CreateSecret",
        "secretsmanager:UpdateSecret",
        "secretsmanager:DeleteSecret",
        "secretsmanager:DescribeSecret",
        "secretsmanager:ListSecrets",
        "secretsmanager:GetResourcePolicy",
        "secretsmanager:PutResourcePolicy",
        "secretsmanager:ValidateResourcePolicy"
      ],
      "Resource": "*"
    }
  ]
}
```

------

## 第 5 步：配置 Amazon Redshift 资源策略
<a name="zero-etl-setup-redshift"></a>

在您的 Amazon Redshift 集群上设置资源策略以授权入站集成。

```
aws redshift put-resource-policy \
  --no-verify-ssl \
  --resource-arn "{{your-redshift-cluster-arn}}" \
  --policy '{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": {
          "Service": "redshift.amazonaws.com"
        },
        "Action": [
          "redshift:AuthorizeInboundIntegration"
        ],
        "Condition": {
          "StringEquals": {
            "aws:SourceArn": "{{your-vm-cluster-arn}}"
          }
        }
      },
      {
        "Effect": "Allow",
        "Principal": {
          "AWS": "{{your-account-id}}"
        },
        "Action": [
          "redshift:CreateInboundIntegration"
        ]
      }
    ]
  }' \
  --region us-west-2
```

**提示**  
或者，你可以使用 AWS 控制台中的 “**为我修复**” 选项。此选项可自动配置所需的 Amazon Redshift 策略，而无需您手动配置。

## 步骤 6：使用创建零 ETL 集成 AWS Glue
<a name="zero-etl-create-integration"></a>

使用命令创建零 ETL 集成。 AWS Glue `create-integration`在此命令中，您可以指定源虚拟机集群和目标 Amazon Redshift 命名空间。

以下示例创建了与 Exadata 虚拟机群集中`pdb1`运行的名为 PDB 的集成。您也可以通过在源 ARN `cloud-autonomous-vm-cluster` 中`cloud-vm-cluster`替换为来创建自治虚拟机集群。指定 KMS 密钥是可选的。如果您指定密钥，则该密钥可能与您在中创建的密钥不同[第 3 步：设置 S AWS ecrets Manager 和 AWS 密钥管理服务](#zero-etl-setup-secrets)。

```
aws glue create-integration \
  --integration-name "MyODBZeroETLIntegration" \
  --source-arn "arn:aws:odb:{{region}}:{{account}}:cloud-vm-cluster/{{cluster-id}}" \
  --target-arn "arn:aws:redshift:{{region:account}}:namespace/{{namespace-id}}" \
  --data-filter "include: {{pdb1}}.*.*" \
  --integration-config '{
      "RefreshInterval": "10",
      "IntegrationMode": "DEFAULT",
      "SourcePropertiesMap": {
        "secret-arn": "arn:aws:secretsmanager:{{region}}:{{account}}:secret:{{secret-name}}"
      }
    }' \
  --description "Zero-ETL integration for Oracle to Amazon Redshift" \
  --kms-key-id "arn:aws:kms:{{region:account}}:key/{{key-id}}"
```

该命令返回集成 ARN 并将状态设置为。`creating`您可以使用`describe-integrations`命令监控集成状态。

```
aws glue describe-integrations \
  --integration-identifier {{integration-id}}
```

**重要**  
每个集成仅支持一个 PDB。例如，数据筛选器必须指定单个 PDB。`include: pdb1.*.*`来源必须位于创建集成的相同 AWS 区域和账户中。

## 第 7 步：在 Amazon Redshift 中创建目标数据库
<a name="zero-etl-create-target-database"></a>

集成激活后，在您的 Amazon Redshift 集群中创建目标数据库。

```
-- Connect to your Amazon Redshift cluster
psql -h {{your-redshift-endpoint}} -U {{username}} -d {{database}}

-- Create database from integration
CREATE DATABASE {{target_database_name}} 
FROM INTEGRATION '{{integration-id}}' 
DATABASE "{{source_pdb_name}}";
```

创建目标数据库后，您可以查询复制的数据。

```
-- List databases to verify creation
\l

-- Connect to the new database
\c {{target_database_name}}

-- List tables to see replicated data
\dt
```

## 验证零 ETL 集成
<a name="zero-etl-verify-setup"></a>

通过在中查询集成状态 AWS Glue 并确保您的 Oracle 更改已复制到 Amazon Redshift 来验证集成是否正常运行。

**验证您的零 ETL 集成是否正常运行**

1. 检查集成状态。

   ```
   aws glue describe-integrations \
     --integration-identifier {{integration-id}}
   ```

   状态应为`ACTIVE`或`REPLICATING`。

1. 通过在您的 Oracle 数据库中进行更改并检查更改是否显示在 Amazon Redshift 中，来验证数据复制。

1. 监控 Amazon 中的复制指标 CloudWatch （如果有）。