

 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 통합을 생성하기 전에 [Amazon Redshift와 제로 ETL 통합을 사용할 때 고려할 사항](zero-etl.reqs-lims.md)에 설명된 고려 사항 및 요구 사항을 검토하세요. 이 일반적인 흐름에 따라 DynamoDB에서 Amazon Redshift로의 제로 ETL 통합을 생성합니다.

**제로 ETL 통합이 구성된 Amazon Redshift로 DynamoDB 데이터를 복제하려면**

1. 로그인 자격 증명이 Amazon Redshift 및 DynamoDB와의 제로 ETL 통합으로 작업할 수 있는 권한을 허용하는지 확인합니다. IAM 정책 예제는 [DynamoDB 제로 ETL 통합을 사용하는 IAM 정책](#zero-etl-signin-iam-policy) 섹션을 참조하세요.

1. DynamoDB 콘솔에서 *Amazon DynamoDB 개발자 안내서*에 설명된 대로 시점 복구(PITR), 리소스 정책, 자격 증명 기반 정책 및 암호화 키 권한을 갖도록 [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 Redshift와의 Amazon DynamoDB 제로 ETL 통합을 생성하려면**

1. Amazon Redshift 콘솔에서 **제로 ETL 통합**을 선택합니다. 제로 ETL 통합 목록이 있는 창에서 **제로 ETL 통합 생성**, **DynamoDB 통합 생성**을 선택합니다.

1. 통합을 생성할 페이지에서 다음과 같이 통합에 대한 정보를 입력합니다.
   + **통합 이름** 입력 - 통합을 참조하는 데 사용할 수 있는 고유한 이름입니다.
   + **설명** 입력 - 소스에서 대상으로 복제할 데이터를 설명합니다.
   + DynamoDB **소스 테이블** 선택 - 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) 조건 키는 Amazon Redshift로부터의 요청으로 KMS 키의 사용을 제한합니다.

```
{
   "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 개발자 가이드*에서 [암호화 컨텍스트](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 개발자 안내서에서 [권한 부여 제약 사용](https://docs.aws.amazon.com/kms/latest/developerguide/create-grant-overview.html#grant-constraints)을 참조하세요.