

 Amazon Redshift は、パッチ 198 以降、新しい Python UDF の作成をサポートしなくなります。既存の Python UDF は、2026 年 6 月 30 日まで引き続き機能します。詳細については、[ブログ記事](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)を参照してください。

# DynamoDB のゼロ ETL 統合を作成する
<a name="zero-etl-setting-up.create-integration-ddb"></a>

ゼロ ETL 統合を作成する前に、「[でゼロ ETL 統合を使用する場合の考慮事項](zero-etl.reqs-lims.md)」で概説されている考慮事項と要件を確認してください。この一般的なフローに従って、DynamoDB から Amazon Redshift へのゼロ ETL 統合を作成します。

**ゼロ ETL 統合で DynamoDB のデータを Amazon Redshift にレプリケーションするには**

1. サインイン認証情報で、Amazon Redshift と DynamoDB とのゼロ ETL 統合を実行するアクセス許可が付与されていることを確認します。IAM ポリシーの例については、「[DynamoDB ゼロ ETL 統合と連携する IAM ポリシー](#zero-etl-signin-iam-policy)」を参照してください。

1. 「*Amazon DynamoDB デベロッパーガイド*」で説明されているように、DynamoDB コンソールから、ポイントインタイムリカバリ (PITR)、リソースポリシー、ID ベースのポリシー、暗号化キーのアクセス許可を持つ [DynamoDB テーブルを設定](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/RedshiftforDynamoDB-zero-etl.html#RedshiftforDynamoDB-zero-etl-prereqs)します。

1. Amazon Redshift コンソール: [ターゲット Amazon Redshift データウェアハウスを作成して設定する](zero-etl-setting-up.rs-data-warehouse.md).
   + AWS CLI または Amazon Redshift コンソール: [データウェアハウスの大文字と小文字の区別を有効にする](zero-etl-setting-up.case-sensitivity.md).
   + Amazon Redshift コンソール: [Amazon Redshift データウェアハウスの認可を設定する](zero-etl-using.redshift-iam.md).

1. Amazon Redshift コンソールから、このトピックで後述するゼロ ETL 統合を作成します。

1. Amazon Redshift コンソールから、Amazon Redshift データウェアハウスに送信先データベースを作成します。詳細については、「[Amazon Redshift でのデスティネーションデータベースの作成](zero-etl-using.creating-db.md)」を参照してください。

1. Amazon Redshift コンソールから、Amazon Redshift データウェアハウスでレプリケートされたデータをクエリします。詳細については、「[Amazon Redshift でのレプリケートしたデータのクエリ](zero-etl-using.querying-and-creating-materialized-views.md)」を参照してください。

このステップでは、Amazon Redshift との Amazon DynamoDB ゼロ ETL 統合を作成します。

------
#### [ Amazon Redshift console ]

**Amazon Redshift コンソールを使用して Amazon DynamoDB ゼロ ETL 統合を作成するには**

1. Amazon Redshift コンソールから、**[ゼロ ETL 統合]**を選択します。ゼロ ETL 統合のリストが表示されているペインで、**[ゼロ ETL 統合の作成]**、**[DynamoDB 統合の作成]** を選択します。

1. 統合を作成するページで、統合に関する情報を次のように入力します。
   + **[統合名]** を入力します - 統合を参照するために使用できる一意の名前となります。
   + **[説明]** を入力します - ソースからターゲットにレプリケートするデータを示します。
   + DynamoDB の **[ソーステーブル]** を選択します - 1 つの DynamoDB テーブルを選択できます。テーブルで、ポイントインタイムリカバリ (PITR) を有効化する必要があります。最大 100 テビバイト (TiB) のテーブルサイズのみが表示されます。ソース DynamoDB テーブルは暗号化する必要があります。ソースには、承認されたプリンシパルと統合ソースを含むリソースポリシーも必要です。これらのポリシーが正しくない場合は、**[修正する]** オプションが表示されます。
   + ターゲットの **[Amazon Redshift データウェアハウス]** を選択します - データウェアハウスは、Amazon Redshift でプロビジョニングされたクラスターまたは Redshift Serverless ワークグループのどちらでもかまいません。ターゲット Amazon Redshift が同じアカウントにある場合は、ターゲットを選択できます。ターゲットが別のアカウントにある場合は、**[Redshift データウェアハウス ARN]** を指定します。ターゲットには、承認されたプリンシパルと統合ソース、および `enable_case_sensitive_identifier` パラメータが true に設定されているリソースポリシーが必要です。ターゲットに正しいリソースポリシーがなく、かつターゲットが同じアカウントにある場合は、**[修正する]** オプションを選択して、統合の作成プロセス中にリソースポリシーを自動的に適用できます。ターゲットが別の AWS アカウント にある場合は、Amazon Redshift ウェアハウスにリソースポリシーを手動で適用する必要があります。ターゲットの Amazon Redshift データウェアハウスに `true` として設定されている正しいパラメータグループオプション `enable_case_sensitive_identifier` がない場合は、**[修正する]** オプションを選択して、このパラメータグループを自動的に更新し、統合の作成プロセス中にウェアハウスを再起動できます。
   + 最大 50 個のタグ **[キー]** とオプションの **[値]** を入力します。これは、統合に関する追加のメタデータを提供します。詳細については、「[Amazon Redshift のリソースのタグ付け](amazon-redshift-tagging.md)」を参照してください。
   + **[暗号化]** オプションを選択します - 統合を暗号化します。詳細については、「[カスタマーマネージドキーでの DynamoDB 統合の暗号化](#zero-etl.create-encrypt)」を参照してください。

     また、統合を暗号化する際に、**[追加の暗号化コンテキスト]** を追加することもできます。詳細については、「[暗号化コンテキスト](#zero-etl.add-encryption-context)」を参照してください。

1. **[DynamoDB 統合の作成]** を選択できるレビューページが表示されます。

1. 進行状況ページが表示され、ゼロ ETL 統合を作成するための各種タスクの進捗状況を確認できます。

1. 統合が作成され、有効化されたら、統合の詳細ページで **[データベースに接続]** を選択します。Amazon Redshift データウェアハウスが最初に作成された際に、データベースも作成されました。統合用に別のデータベースを作成するには、ターゲットのデータウェアハウス内にある任意のデータベースに接続する必要があります。**[データベースに接続]** ページで、最近の接続を使用できるかどうかを判断し、**[認証]** 方法を選択します。認証方法に応じて、ターゲットの既存のデータベースに接続する情報を入力します。この認証情報には、既存の **[データベース名]** (通常は `dev`) と、Amazon Redshift データウェアハウスでデータベースが作成された際に指定された **[データベースユーザー]** を含めることができます。

1. データベースに接続したら、**[統合からデータベースを作成]** を選択して、ソースからデータを受け取るデータベースを作成します。データベースを作成する場合は、**[統合 ID]**、**[データウェアハウス名]**、および **[データベース名]** を指定します。

1. 統合ステータスと送信先データベースが `Active` になると、データは DynamoDB テーブルからターゲットテーブルへのレプリケートを開始します。データをソースに追加すると、ターゲットの Amazon Redshift データウェアハウスに自動的にレプリケートされます。

------
#### [ AWS CLI ]

AWS CLI を使用して Amazon Redshift と Amazon DynamoDB のゼロ 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"
}
```

次の例では、暗号化にカスタマーマネージドキーを使用して統合を作成します。統合を作成する前に:
+ ソース DynamoDB テーブルで、同じアカウント (例では「AccountA」) にカスタマーマネージドキー (例では「CMCMK」) を作成します。
+ ユーザー/ロール (例では「RoleA」) を使用して統合が作成され、この KMS キーに対する `kms:CreateGrant` および `kms:DescribeKey` のアクセス許可があることを確認します。
+ キーポリシーに、以下の内容を追加します。

```
{
    "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 ポリシー
<a name="zero-etl-signin-iam-policy"></a>

ゼロ ETL 統合を作成する場合、サインイン認証情報には、DynamoDB アクションと Amazon Redshift アクションの両方、および統合のソースとターゲットとして関係するリソースに対するアクセス許可が必要です。以下は、必要な最小限のアクセス許可を示す例です。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:ListTables"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetResourcePolicy",
                "dynamodb:PutResourcePolicy",
                "dynamodb:UpdateContinuousBackups"
            ],
            "Resource": [
            "arn:aws:dynamodb:us-east-1:111122223333:table/my-ddb-table"
            ]
        },
        {
            "Sid": "AllowRedshiftDescribeIntegration",
            "Effect": "Allow",
            "Action": [
                "redshift:DescribeIntegrations"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowRedshiftCreateIntegration",
            "Effect": "Allow",
            "Action": "redshift:CreateIntegration",
            "Resource": "arn:aws:redshift:us-east-1:111122223333:integration:*"
        },
        {
            "Sid": "AllowRedshiftModifyDeleteIntegration",
            "Effect": "Allow",
            "Action": [
                "redshift:ModifyIntegration",
                "redshift:DeleteIntegration"
            ],
            "Resource": "arn:aws:redshift:us-east-1:111122223333:integration:<uuid>"
        },
        {
            "Sid": "AllowRedshiftCreateInboundIntegration",
            "Effect": "Allow",
            "Action": "redshift:CreateInboundIntegration",
            "Resource": "arn:aws:redshift:us-east-1:111122223333:namespace:<uuid>"
        }
    ]
}
```

------

## カスタマーマネージドキーでの DynamoDB 統合の暗号化
<a name="zero-etl.create-encrypt"></a>

DynamoDB ゼロ ETL 統合の作成時に AWS 所有のキー ではなくカスタム KMS キーを指定する場合、キーポリシーは Amazon Redshift サービスプリンシパルに `CreateGrant` アクションへのアクセスを提供する必要があります。さらに、リクエスタアカウントまたはロールが `DescribeKey` および `CreateGrant` アクションを実行するアクセス許可が付与されている必要があります。

次のキーポリシーステートメントの例は、ポリシーに必要なアクセス許可を示しています。例として、アクセス許可の範囲をさらに縮小するためのコンテキストキーなどがあります。

### キーポリシーステートメントの例
<a name="zero-etl.kms-sample-policy"></a>

次のポリシーステートメントでは、リクエスタアカウントまたはロールが KMS キーに関する情報を取得することを許可します。

```
{
   "Effect":"Allow",
   "Principal":{
      "AWS":"arn:aws:iam::{account-ID}:role/{role-name}"
   },
   "Action":"kms:DescribeKey",
   "Resource":"*"
}
```

次のポリシーステートメントは、リクエスタアカウントまたはロールが KMS キーに許可を追加することを許可します。[https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-via-service](https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-via-service) 条件キーは、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:*"
      }
   }
}
```

詳細については、「*AWS Key Management Service デベロッパーガイド*」の「[キーポリシーの作成](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-overview.html)」を参照してください。

## 暗号化コンテキスト
<a name="zero-etl.add-encryption-context"></a>

ゼロ ETL 統合を暗号化する場合は、キーと値のペアを**[追加の暗号化コンテキスト]** として追加できます。また、これらのキーと値のペアを追加して、レプリケートされるデータに関するコンテキスト情報を追加できます。詳しくは、*AWS Key Management Service デベロッパーガイド*の [Encryption context](https://docs.aws.amazon.com//kms/latest/developerguide/encrypt_context.html) を参照してください。

Amazon Redshift は、ユーザーが追加したペアに加えて、以下の暗号化コンテキストのペアを追加します。
+ `aws:redshift:integration:arn` - `IntegrationArn`
+ `aws:servicename:id` - `Redshift`

これにより、追加できるペアの総数が 8 から 6 に減り、許可の制約の全体的な文字数制限に影響します。詳細については、「AWS Key Management Service デベロッパーガイド**」の「[Using grant constraints](https://docs.aws.amazon.com/kms/latest/developerguide/create-grant-overview.html#grant-constraints)」を参照してください。