

# Oracle Database@AWS と Amazon Redshift の統合の設定
<a name="setting-up-zero-etl"></a>

Oracle データベースと Amazon Redshift 間のゼロ ETL 統合を設定するには、次の手順を実行します。

1. ODB ネットワークでゼロ ETL を有効にします。

1. Oracle データベースの前提条件を設定します。

1. AWS Secrets Manager と AWS Key Management Service をセットアップします。

1. IAM 許可を設定します。

1. Amazon Redshift リソースポリシーを設定します。

1. ゼロ ETL 統合を作成します。

1. Amazon Redshift にターゲットデータベースを作成します。

## ステップ 1: ODB ネットワークのゼロ ETL を有効にする
<a name="zero-etl-enable-network"></a>

ソース VM クラスターに関連付けられた ODB ネットワークのゼロ ETL 統合を有効にできます。デフォルトでは、この統合は無効になっています。

### コンソール
<a name="ZETLAccess.CON"></a>

**ゼロ ETL 統合を有効にするには**

1. [https://console.aws.amazon.com/odb/](https://console.aws.amazon.com/odb/) で Oracle Database@AWS コンソールを開きます。

1. ナビゲーションペインで **[ODB ネットワーク]** を選択します。

1. ゼロ ETL 統合を有効にする ODB ネットワークを選択します。

1. **[Modify]** (変更) を選択します。

1. **[ゼロ ETL]** を選択します。

1. **[続行]** を選択してから、**[修正]** を選択します。

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

ゼロ ETL 統合を有効にするには、`--zero-etl-access` パラメータを指定して `update-odb-network` コマンドを使用します。

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

ソース VM クラスターに関連付けられた 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 データベース設定を完了します。
+ レプリケーションユーザーを作成し、必要なアクセス許可を付与します。
+ アーカイブ REDO ログを有効にします。
+ SSL を設定します (Oracle Exadata のみ)。
+ 該当する場合、ASM ユーザーを設定します (Oracle Exadata のみ)。

## ステップ 3: AWS Secrets Manager と AWS Key Management Service をセットアップする
<a name="zero-etl-setup-secrets"></a>

カスタマーマネージドキー (CMK) を作成し、データベース認証情報を保存します。

1. `create-key` コマンドを使用して AWS Key Management Service で CMK を作成します。

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

1. AWS Secrets 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 にリソースポリシーをアタッチします。暗号化されたゼロ ETL 統合をサポートするには、CMK リソースポリシーに Oracle Database@AWS サービスプリンシパルと Amazon Redshift サービスプリンシパルの両方のアクセス許可を含める必要があります。

   ```
   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 サービスアクセスを許可し、2 番目のステートメントは 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: AWS Glue を使用してゼロ ETL 統合を作成する
<a name="zero-etl-create-integration"></a>

AWS Glue `create-integration` コマンドを使用してゼロ ETL 統合を作成します。このコマンドでは、ソース VM クラスターとターゲット Amazon Redshift 名前空間を指定します。

次の例では、Exadata VM クラスターで実行されている `pdb1` という名前の PDB との統合を作成します。ソース ARN で `cloud-vm-cluster` を `cloud-autonomous-vm-cluster` に置き換えることで、Autonomous VM クラスターを作成することもできます。KMS キーの指定はオプションです。キーを指定する場合、[ステップ 3: AWS Secrets Manager と AWS Key Management Service をセットアップする](#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}}
```

**重要**  
統合ごとに 1 つの PDB のみがサポートされます。データフィルターでは、`include: pdb1.*.*` のように単一の PDB を指定する必要があります。ソースは、統合が作成される 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 でレプリケーションメトリクスをモニタリングします (利用可能な場合)。