

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# AWS 자체 관리형 데이터베이스 소스를 위한 제로 ETL 통합
<a name="zero-etl"></a>

AWS 제로 ETL 통합은 여러 운영 및 트랜잭션 데이터베이스 소스의 Amazon Redshift, Amazon S3 및 Amazon S3 Tables에서 트랜잭션 및 운영 데이터를 사용할 수 있도록 하는 완전관리형 솔루션입니다. 제로 ETL을 사용하면 기존 AWS Database Migration Service (AWS DMS) 소스 엔드포인트를 통해 MySQL, PostgreSQL, SQL Server 및 Oracle과 같은 자체 관리형 소스 데이터베이스에서 Amazon Redshift로 데이터를 복제할 수 있습니다. 자동 동기화는 기존 추출, 전환, 적재(ETL) 프로세스를 방지합니다. 또한 실시간 분석 및 AI 워크로드를 지원합니다. 자세한 내용은 *Amazon Redshift 관리 안내서*의 [제로 ETL 통합](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.html)을 참조하세요.

제로 ETL 통합은 다음을 제공합니다.
+  **실시간 데이터 복제 -** 지연 시간을 최소화하면서 Oracle 데이터베이스에서 Amazon Redshift로의 지속적인 데이터 동기화.
+  **복잡한 ETL 파이프라인 제거** - 사용자 지정 데이터 통합 솔루션을 구축하고 유지 관리할 필요가 없습니다.
+  **운영 오버헤드 감소** - AWS APIs 통한 자동 설정 및 관리.
+  **간소화된 데이터 통합 아키텍처** - 자체 관리형 데이터베이스와 AWS 분석 서비스 간의 원활한 통합.
+  **보안 강화** - 기본 제공 암호화 및 IAM 액세스 제어.

## 자체 관리형 데이터베이스 소스에서 제로 ETL 통합이 작동하는 방식
<a name="zero-etl.how-it-works"></a>

이전에 자체 관리형 데이터베이스에 대해 생성한 기존 AWS DMS 엔드포인트를 사용하거나 새 엔드포인트를 생성할 수 있습니다.
+  AWS Glue 콘솔 또는 [CLI](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-integrations.html)를 사용하여 AWS Glue 카탈로그에서 대상으로 Amazon Redshift와의 제로 ETL 통합을 생성합니다. 제로 ETL 통합을 생성할 때 스키마 및 테이블 필터를 지정할 수 있습니다.
+ 통합과 관련된 추가 읽기 전용 리소스는 AWS DMS 서비스 내에 자동으로 생성됩니다. 제로 ETL 엔진을 포함한 이러한 리소스는 전체 로드 및 지속적인 데이터 변경 프로세스를 시작하고 데이터를 Amazon Redshift 대상 데이터베이스와 동기화하는 데 사용됩니다.
+ 통합 소스를 생성할 때, 제로 ETL 통합을 생성할 때, Amazon Redshift 데이터 웨어하우스를 생성할 때 데이터의 암호화를 제어합니다.
+ 통합은 데이터 파이프라인의 상태를 모니터링하고 가능한 경우 문제로부터 복구합니다.
+ 동일한 유형의 소스에서 단일 Amazon Redshift 데이터 웨어하우스로 통합을 생성하여 여러 애플리케이션에 걸쳐 전체적인 인사이트를 도출할 수 있습니다.

데이터가 복제되면 Amazon Redshift의 분석 기능을 사용할 수 있습니다. 제공되는 분석 기능에는 기본 제공 기계 학습(ML), 구체화된 뷰, 데이터 공유, 여러 데이터 저장소 및 데이터 레이크에 대한 직접 액세스 등이 있습니다. 데이터 엔지니어의 경우 제로 ETL 통합을 통해 복잡한 데이터 파이프라인의 간헐적 오류로 인해 지연될 수 있는 시간에 민감한 데이터에 액세스할 수 있습니다. 트랜잭션 데이터에서 분석 쿼리와 ML 모델을 실행하여 시간에 민감한 이벤트와 비즈니스 의사 결정에 대한 시기적절한 인사이트를 도출할 수 있습니다.

제로 ETL 통합에 문제가 발생할 때 자동으로 알림을 받을 Amazon Redshift 이벤트 알림 구독을 생성할 수 있습니다. 통합 관련 이벤트 알림 목록을 보려면 [Amazon EventBridge를 사용한 제로 ETL 통합 이벤트 알림을](https://docs.aws.amazon.com/redshift/latest/mgmt/integration-event-notifications.html) 참조하세요. 구독을 생성하는 가장 간단한 방법은 Amazon Simple Notification Service 콘솔을 사용하는 것입니다. Amazon SNS 주제를 새로 만들어 구독하는 방법에 대한 자세한 내용은 **Amazon Simple Notification Service 개발자 안내서의 [Amazon SNS 시작하기](https://docs.aws.amazon.com/sns/latest/dg/sns-getting-started.html) 섹션을 참조하세요.

## 통합을 생성하기 전에 소스 데이터베이스 구성
<a name="zero-etl.source-database-configuration"></a>

제로 ETL 통합을 구성하기 전에 데이터베이스 엔진의 요구 사항에 따라 소스 데이터베이스를 올바르게 구성해야 합니다. 각 엔진에는 특정 구성 요구 사항 및 제한 사항이 있습니다.

SQL Server
+ 구성 요구 사항은 [Microsoft SQL Server 데이터베이스를 소스로 사용을 참조하세요 AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.SQLServer.html).
+ 변경 데이터 캡처(CDC) 요구 사항은 [SQL Server에서 지속적 복제를 위한 데이터 변경 캡처](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.SQLServer.CDC.html)를 참조하세요.

**참고**  
RDS SQL Server 및 Azure SQL Server는 자체 관리형 제로 ETL 통합의 소스로 사용할 수 없습니다.

Oracle
+ 구성 요구 사항 및 제한 사항은 [Oracle 데이터베이스를 소스로 사용을 참조하세요 AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html).

MySQL
+ 구성 요구 사항 및 제한 사항은 [ MySQL 호환 데이터베이스를 소스로 사용을 참조하세요 AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.MySQL.html).

PostgreSQL
+ 구성 요구 사항 및 제한 사항은 [ PostgreSQL 데이터베이스를 AWS DMS 소스로 사용을 참조하세요](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.PostgreSQL.html).

## 제로 ETL 통합을 위한 IAM 권한 및 암호화 설정
<a name="zero-etl.iam-setup"></a>

제로 ETL 통합을 생성하고 관리하려면 적절한 IAM 권한, AWS Key Management Service (AWS KMS) 암호화 키 및 리소스 정책을 구성해야 합니다. 이 섹션에서는 필수 보안 구성 요소 설정에 대한 지침을 제공합니다.

### 사전 조건
<a name="zero-etl.iam-setup.prerequisites"></a>

제로 ETL 통합을 생성하기 전에 다음이 있는지 확인합니다.
+ 통합을 생성하고 관리할 수 있는 적절한 권한이 있는 IAM 사용자 또는 역할
+ 자체 관리형 데이터베이스의 AWS DMS 소스 엔드포인트를 구성합니다. 자세한 내용은 [통합을 생성하기 전에 소스 데이터베이스 구성](#zero-etl.source-database-configuration) 단원을 참조하십시오.
+ Amazon Redshift 프로비저닝된 클러스터 또는 서버리스 네임스페이스를 대상으로 사용
+ VPC 서브넷 및 보안 그룹을 포함한 네트워크 구성

### KMS 키 생성
<a name="zero-etl.iam-setup.kms-key"></a>

먼저 고객 관리형 AWS KMS 키를 생성하여 제로 ETL 통합에서 데이터를 암호화합니다. 다음 예제에서는 대칭 암호화 키를 생성합니다.

```
aws kms create-key \
  --description "On-prem Zero-ETL Integration Encryption Key" \
  --key-usage ENCRYPT_DECRYPT \
  --key-spec SYMMETRIC_DEFAULT \
  --region {{region}}
```

키 정책을 구성`KeyId`하고 통합을 생성할 때 필요하므로 응답`Arn`의 및를 기록해 둡니다.

출력 예시:

```
{
    "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 및 AWS 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` 조건은 통합을 생성할 때 지정한 추가 암호화 컨텍스트와 일치해야 합니다. AWS KMS 콘솔 또는 다음 CLI 명령을 사용하여 키 정책을 업데이트할 수 있습니다.

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

### IAM 사용자 생성 및 AWS CLI 구성
<a name="zero-etl.iam-setup.user-setup"></a>

제로 ETL 통합을 관리하는 데 사용할 IAM 사용자를 생성하고 적절한 자격 증명으로 AWS CLI를 구성합니다.

1. IAM 사용자 생성:

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

1. 사용자에 대한 액세스 키를 생성합니다.

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

    AWS CLI를 구성하는 데 필요하므로 출력`SecretAccessKey`에서 `AccessKeyId` 및를 저장합니다.

### IAM 정책 생성 및 연결
<a name="zero-etl.iam-setup.iam-policy"></a>

제로 ETL 통합 작업에 대한 권한을 부여하는 IAM 정책을 생성합니다. 정책에는 AWS Glue, AWS DMS, Amazon Redshift AWS 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}}
```

### AWS CLI 프로파일 구성
<a name="zero-etl.iam-setup.cli-config"></a>

이전 단계에서 생성한 사용자 자격 증명으로 AWS 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 리소스 정책을 생성하여 AWS DMS 소스 엔드포인트가 Amazon 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}} - 리소스가 위치한 AWS 리전 
+  {{account-id}} – AWS 계정 ID 
+  {{endpoint-id}} - AWS DMS 소스 엔드포인트의 ID입니다.
+  {{namespace-id}} – Amazon Redshift 네임스페이스의 ID입니다.

### 예: 암호화를 사용한 제로 ETL 통합 생성
<a name="zero-etl.iam-setup.example"></a>

필요한 권한 및 암호화 키를 설정한 후 AWS Glue API를 사용하여 제로 ETL 통합을 생성할 수 있습니다. 다음 예제에서는 KMS 암호화를 사용하여 MySQL 소스에서 Amazon 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` - AWS DMS 소스 엔드포인트의 ARN 
+  `--target-arn` - Amazon Redshift 네임스페이스의 ARN 
+  `--integration-config` - 서브넷 IDs 및 보안 그룹을 포함한 네트워크 구성 
+  `--data-filter` - 복제할 스키마 및 테이블을 지정합니다.
+  `--kms-key-id` - 암호화를 위한 AWS KMS 키의 ARN 
+  `--additional-encryption-context` - KMS 키 정책과 일치해야 하는 암호화 컨텍스트 키-값 페어(예: `{"{{context-key}}": "{{context-value}}"}`) 
+  `--profile` - 사용할 AWS CLI 프로파일(이전에 생성된 cli-user 프로파일) 

성공적으로 생성되면 명령은 통합 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 통합을 설정할 때 다음 보안 모범 사례를 따르세요.
+  **최소 권한 액세스 사용 **- 통합을 생성하고 관리하는 데 필요한 최소 권한만 부여합니다. 가능하면 리소스 수준 권한을 사용하는 것이 좋습니다.
+  **암호화 활성화** - 항상 고객 관리형 AWS KMS 키를 사용하여 통합 데이터를 암호화합니다. 추가 보안을 위해 암호화 컨텍스트를 지정합니다.
+  자격 **증명 정기적으로 교체** - IAM 사용자 액세스 키를 사용하는 경우 정기적으로 교체합니다. 대신 임시 자격 증명과 함께 IAM 역할을 사용하는 것이 좋습니다.
+  **액세스 모니터링** - AWS CloudTrail 를 사용하여 통합 생성 및 관리와 관련된 API 호출을 모니터링합니다.
+  **네트워크 액세스 제한** - 네트워크 액세스를 필요한 리소스로만 제한하도록 VPC 보안 그룹을 구성합니다.
+  **리소스 정책 사용** - Amazon Redshift 리소스 정책을 구현하여 데이터 웨어하우스와의 통합을 생성할 수 있는 소스를 제어합니다.
+  **리소스 태그 지정** - 통합 및 관련 리소스에 태그를 적용하여 조직 및 비용 추적을 개선합니다.