

 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/)을 참조하세요.

# 구체화된 뷰로 스트리밍 모으기
<a name="materialized-view-streaming-ingestion"></a>

이 주제에서는 스트리밍 데이터에 빠르게 액세스하기 위해 구체화된 뷰를 사용하는 방법을 설명합니다.

 스트리밍 모으기를 사용하면 지연 시간이 짧고 빠른 속도로 [Amazon Kinesis Data Streams](https://aws.amazon.com//kinesis/data-streams/) 또는 [Amazon Managed Streaming for Apache Kafka](https://aws.amazon.com//msk/)에서 Amazon Redshift 프로비저닝된 또는 Redshift Serverless 데이터베이스로 스트림 데이터를 모을 수 있습니다. 데이터는 용도에 맞게 구성된 Redshift 구체화된 뷰에 배치됩니다. 따라서 외부 데이터에 빠르게 액세스할 수 있습니다. 스트리밍 모으기는 데이터 액세스 시간을 단축하고 스토리지 비용을 절감합니다. 소수의 SQL 명령 모음을 사용하여 Amazon Redshift 클러스터 또는 Amazon Redshift Serverless 작업 그룹에 대해 구성할 수 있습니다. 그런 다음 매번 구체화된 뷰 새로 고침을 사용하여 초당 수백 메가바이트의 데이터를 모을 수 있습니다.

## 스트리밍 서비스에서 Redshift로 데이터가 이동하는 방법
<a name="materialized-view-streaming-ingestion-data-flow"></a>

 스트리밍 모으기의 작동 방식과 프로세스에서 사용되는 데이터베이스 객체를 이해하는 데 도움이 됩니다. 데이터는 데이터 스트림 제공업체에서 Amazon Redshift 프로비저닝된 클러스터 또는 Amazon Redshift Serverless 작업 그룹으로 직접 이동합니다. Amazon S3 버킷과 같은 임시 랜딩 영역이 없습니다. 프로비저닝된 클러스터 또는 작업 그룹은 스트림 소비자입니다. Redshift 데이터베이스에서는 스트림에서 읽은 데이터가 구체화된 뷰에 표시됩니다. 데이터는 도착하는 대로 처리됩니다. 예를 들어 SQL을 통해 JSON 값을 사용하고 구체화된 뷰의 데이터 열에 매핑할 수 있습니다. 구체화된 뷰가 새로 고쳐지면 Redshift는 뷰가 스트림과 함께 최신 상태로 유지될 때까지 할당된 Kinesis 데이터 샤드 또는 Kafka 파티션의 데이터를 사용합니다.

 Amazon Redshift 스트리밍 모으기의 사용 사례에는 지속적으로 생성되고 시작 시점에서 짧은 기간(**지연 시간) 내에 처리되어야 하는 데이터가 포함됩니다. 이를 **실시간에 가까운 분석이라고 합니다. 소스에는 IT 디바이스, 시스템 텔레메트리 디바이스 및 사용량이 많은 웹 사이트 또는 애플리케이션의 클릭 스트림 데이터가 포함될 수 있습니다.

## 성능 향상을 위한 데이터 구문 분석 모범 사례
<a name="materialized-view-streaming-recommendations"></a>

스트리밍 모으기를 구성할 때 들어오는 데이터를 구문 분석하는 여러 가지 방법이 있습니다. 관행에는 데이터가 도착할 때 비즈니스 로직을 수행하거나 형식을 지정하는 것이 포함될 수 있습니다. 오류 또는 데이터 손실을 방지하기 위해 다음과 같은 모범 사례를 따르는 것이 좋습니다. 이는 내부 테스트를 통해 도출되었으며 고객이 구성 및 구문 분석 문제를 해결하는 데 도움이 됩니다.
+ **스트리밍된 데이터에서 값 추출** - 구체화된 뷰 정의에서 [JSON\$1EXTRACT\$1PATH\$1TEXT](https://docs.aws.amazon.com/redshift/latest/dg/JSON_EXTRACT_PATH_TEXT.html) 함수를 사용하여 스트리밍되는 JSON을 구문 분석하거나 **나누는 경우 성능과 지연 시간에 큰 영향을 미칠 수 있습니다. 설명하자면, JSON\$1EXTRACT\$1PATH\$1TEXT를 사용하여 추출한 각 열에 대해 수신되는 JSON이 다시 구문 분석됩니다. 그 후에는 데이터 형식 변환, 필터링, 비즈니스 로직 계산이 발생합니다. 즉, 예를 들어 JSON 데이터에서 10개의 열을 추출하면 각 JSON 레코드가 10번 구문 분석되며 여기에는 추가 로직이 포함됩니다. 이에 따라 수집 지연 시간이 길어집니다. 또한 [JSON\$1PARSE 함수](https://docs.aws.amazon.com/redshift/latest/dg/JSON_PARSE.html)를 사용하여 JSON 레코드를 Redshift의 SUPER 데이터 형식으로 변환하는 대안적인 접근 방식도 권장합니다. 스트리밍된 데이터가 구체화된 뷰에 도착한 후 PartiQL을 사용하여 SUPER의 JSON 데이터 표현에서 개별 문자열을 추출합니다. 자세한 내용은 [반정형 데이터 쿼리](https://docs.aws.amazon.com/redshift/latest/dg/query-super.html)를 참조하세요.

   또한 JSON\$1EXTRACT\$1PATH\$1TEXT의 최대 데이터 크기는 64KB입니다. 따라서 JSON 레코드가 64KB보다 큰 경우 JSON\$1EXTRACT\$1PATH\$1TEXT로 처리 시 오류가 발생합니다.
+  **Amazon Kinesis Data Streams 스트림 또는 Amazon MSK 주제를 여러 구체화된 뷰에 매핑** - 단일 스트림 또는 주제에서 데이터를 모으기 위해 구체화된 뷰를 여러 개 생성하지 않는 것이 좋습니다. 각각의 구체화된 뷰가 Kinesis Data Streams 스트림 또는 Kafka 주제의 파티션에 있는 각 샤드에 대한 소비자를 생성하기 때문입니다. 이로 인해 스트림 또는 주제의 처리량이 제한되거나 초과될 수 있습니다. 또한 동일한 데이터를 여러 번 모으므로 비용이 더 많이 들 수도 있습니다. 스트리밍 모으기를 구성할 때는 각 스트림 또는 주제에 대해 하나의 구체화된 뷰를 생성하는 것이 좋습니다.

  사용 사례에서 하나의 KDS 스트림 또는 MSK 주제의 데이터를 여러 구체화된 뷰에 모아야 하는 경우 그렇게 하기 전에 [AWS 빅 데이터 블로그](https://aws.amazon.com/blogs/big-data/), 특히 [Amazon MSK에서 Amazon Redshift 스트리밍 모으기를 사용하여 거의 실시간 분석을 구현하는 모범 사례](https://aws.amazon.com/blogs/big-data/best-practices-to-implement-near-real-time-analytics-using-amazon-redshift-streaming-ingestion-with-amazon-msk/)를 참조하세요.

## 스트리밍 모으기 동작 및 데이터 유형
<a name="materialized-view-streaming-ingestion-limitations"></a>

다음 표에는 다양한 데이터 유형에 대한 기술적 동작 세부 정보 및 크기 제한이 설명되어 있습니다. 스트리밍 모으기를 위한 구체화된 뷰를 구성하기 전에 이러한 내용을 숙지하는 것이 좋습니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/materialized-view-streaming-ingestion.html)

# Amazon Kinesis Data Streams Streams에서 수집 시작
<a name="materialized-view-streaming-ingestion-getting-started"></a>

이 주제에서는 구체화된 뷰를 사용하여 Kinesis Data Streams의 스트리밍 데이터를 사용하는 방법을 설명합니다.

 Amazon Redshift 스트리밍 수집을 설정하려면 스트리밍 데이터 원본에 매핑되는 외부 스키마를 생성하고 외부 스키마를 참조하는 구체화된 보기를 생성해야 합니다. Amazon Redshift 스트리밍 수집은 Kinesis Data Streams 지원을 소스로 제공합니다. 따라서 스트리밍 수집을 구성하기 전에 Kinesis Data Streams 소스를 사용할 수 있어야 합니다. 소스가 없는 경우 Kinesis 설명서의 [Amazon Kinesis Data Streams 시작하기](https://docs.aws.amazon.com/streams/latest/dev/getting-started.html) 지침을 따르거나 [AWS 관리 콘솔을 통해 스트림 생성](https://docs.aws.amazon.com/streams/latest/dev/how-do-i-create-a-stream.html) 지침을 사용하여 콘솔에 만듭니다.

 Amazon Redshift 스트리밍 수집은 구체화된 보기를 사용합니다. 이 보기는 `REFRESH` 실행 중에 스트림에서 직접 업데이트됩니다. 구체화된 보기는 스트림 데이터 원본에 매핑됩니다. 구체화된 보기 정의의 일부로 스트림 데이터에 대한 필터링 및 집계를 수행할 수 있습니다. 스트리밍 수집 구체화된 보기(*기본*구체화된 보기)는 하나의 스트림만 참조할 수 있지만 기본 구체화된 보기 및 기타 구체화된 보기 또는 테이블과 조인하는 구체화된 보기를 추가로 생성할 수 있습니다.

**참고**  
*스트리밍 수집 및 Amazon Redshift Serverless* -이 주제의 구성 단계는 프로비저닝된 Amazon Redshift 클러스터와 Amazon Redshift Serverless 모두에 적용됩니다. 자세한 내용은 [스트리밍 모으기 동작 및 데이터 유형](materialized-view-streaming-ingestion.md#materialized-view-streaming-ingestion-limitations) 섹션을 참조하세요.

Kinesis Data Streams 스트림을 사용할 수 있다고 가정하면 첫 번째 단계는 `CREATE EXTERNAL SCHEMA`를 사용하여 Amazon Redshift Redshift에서 스키마를 정의하고 Kinesis Data Streams 리소스를 참조하는 것입니다. 그런 다음 스트림의 데이터에 액세스하려면 구체화된 보기에서 `STREAM`을 정의합니다. 반정형 `SUPER` 형식에 스트림 레코드를 저장하거나 Redshift 데이터 유형으로 변환되는 데이터를 생성하는 스키마를 정의할 수 있습니다. 구체화된 보기를 쿼리할 때 반환된 레코드는 스트림의 특정 시점 보기입니다.

1. Amazon Redshift 클러스터 또는 Amazon Redshift Serverless 작업 그룹이 이 역할을 수임하도록 허용하는 신뢰 정책으로 IAM 역할을 생성합니다. IAM 역할에 대한 신뢰 정책을 구성하는 방법에 대한 자세한 내용은 [Amazon Redshift가 사용자를 대신하여 다른 AWS 서비스에 액세스할 수 있도록 권한 부여](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html) 섹션을 참조하세요. 역할이 생성된 후에는 Amazon Kinesis 데이터 스트림과의 통신 권한을 제공하는 다음 IAM 정책이 있어야 합니다.

   **Kinesis 데이터 스트림의 암호화되지 않은 스트림에 대한 IAM 정책**

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ReadStream",
               "Effect": "Allow",
               "Action": [
                   "kinesis:DescribeStreamSummary",
                   "kinesis:GetShardIterator",
                   "kinesis:GetRecords",
                   "kinesis:ListShards",
                   "kinesis:DescribeStream"
               ],
               "Resource": "arn:aws:kinesis:*:111122223333:stream/*"
           },
           {
               "Sid": "ListStream",
               "Effect": "Allow",
               "Action": "kinesis:ListStreams",
               "Resource": "*"
           }
       ]
   }
   ```

------

   **Kinesis 데이터 스트림의 암호화된 스트림에 대한 IAM 정책**

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ReadStream",
               "Effect": "Allow",
               "Action": [
                   "kinesis:DescribeStreamSummary",
                   "kinesis:GetShardIterator",
                   "kinesis:GetRecords",
                   "kinesis:ListShards",
                   "kinesis:DescribeStream"
               ],
               "Resource": "arn:aws:kinesis:*:111122223333:stream/*"
           },
           {
               "Sid": "DecryptStream",
               "Effect": "Allow",
               "Action": [
                   "kms:Decrypt"
               ],
               "Resource": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
           },
           {
               "Sid": "ListStream",
               "Effect": "Allow",
               "Action": "kinesis:ListStreams",
               "Resource": "*"
           }
       ]
   }
   ```

------

1. VPC를 확인하고 Amazon Redshift 클러스터 또는 Amazon Redshift Serverless에 NAT 게이트웨이 또는 인터넷 게이트웨이를 사용하여 인터넷을 통해 Kinesis Data Streams 엔드포인트에 도달하는 경로가 있는지 확인하세요. Redshift와 Kinesis Data Streams 간의 트래픽을 AWS 네트워크 내에 유지하려면 Kinesis 인터페이스 VPC 엔드포인트를 사용하는 것이 좋습니다. 자세한 내용은 [인터페이스 VPC 엔드포인트와 함께 Amazon Kinesis Data Streams Kinesis Data Streams 사용](https://docs.aws.amazon.com/streams/latest/dev/vpc.html) 섹션을 참조하세요.

1. Amazon Redshift에서 외부 스키마를 생성하여 Kinesis의 데이터를 스키마에 매핑합니다.

   ```
   CREATE EXTERNAL SCHEMA kds
   FROM KINESIS
   IAM_ROLE { default | 'iam-role-arn' };
   ```

    Kinesis Data Streams의 스트리밍 수집에는 인증 유형이 필요하지 않습니다. `CREATE EXTERNAL SCHEMA` 명령문에 정의된 IAM 역할을 사용하여 Kinesis Data Streams 요청을 수행합니다.

    선택 사항: REGION 키워드를 사용하여 Amazon Kinesis Data Streams 또는 Amazon MSK 스트림이 있는 리전을 지정합니다.

   ```
   CREATE EXTERNAL SCHEMA kds
   FROM KINESIS
   REGION 'us-west-2'
   IAM_ROLE { default | 'iam-role-arn' };
   ```

   이 샘플에서 리전은 소스 스트림의 위치를 지정합니다. IAM\$1ROLE은 샘플입니다.

1. 스트림 데이터를 소비할 구체화된 보기를 생성합니다. 다음과 같은 명령문을 사용하면 레코드를 구문 분석할 수 없는 경우 오류가 발생합니다. 오류 레코드를 건너뛰지 않으려면 다음과 같은 명령을 사용하세요.

   ```
   CREATE MATERIALIZED VIEW my_view AUTO REFRESH YES AS
   SELECT *
   FROM kds.my_stream_name;
   ```

   Kinesis Stream 이름은 대/소문자를 구분하며 대문자와 소문자가 모두 포함될 수 있습니다. 대문자 이름을 가진 스트림에서 수집하려면 데이터베이스 수준에서 `enable_case_sensitive_identifier` 구성을 `true`로 설정하면 됩니다. 자세한 내용은 [이름 및 식별자](https://docs.aws.amazon.com/redshift/latest/dg/r_names.html) 및 [enable\$1case\$1sensitive\$1identifier](https://docs.aws.amazon.com/redshift/latest/dg/r_enable_case_sensitive_identifier.html) 섹션을 참조하세요.

   자동 새로 고침을 켜려면 `AUTO REFRESH YES`를 사용합니다. 기본 동작은 수동 새로 고침입니다. 참고로 CAN\$1JSON\$1PARSE를 사용하면 구문 분석할 수 없는 레코드는 건너뛸 수 있습니다.

   메타데이터 열에는 다음이 포함됩니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/materialized-view-streaming-ingestion-getting-started.html)

   구체화된 뷰 정의에 비즈니스 로직이 있는 경우 비즈니스 로직 오류로 인해 경우에 따라 스트리밍 수집이 차단될 수 있다는 점에 유의해야 합니다. 이로 인해 구체화된 뷰를 삭제하고 다시 생성해야 할 수도 있습니다. 이를 방지하려면 로직을 가능한 한 단순하게 유지하고 수집 후 데이터에 대한 대부분의 비즈니스 로직 검사를 수행하는 것이 좋습니다.

1. 뷰를 새로 고치면 Redshift Redshift가 스트림에서 읽고 데이터를 구체화된 뷰로 로드하도록 호출합니다.

   ```
   REFRESH MATERIALIZED VIEW my_view;
   ```

1. 구체화된 보기의 데이터를 쿼리합니다.

   ```
   select * from my_view;
   ```

# Apache Kafka 소스에서 스트리밍 수집 시작하기
<a name="materialized-view-streaming-ingestion-getting-started-MSK"></a>

이 주제에서는 구체화된 뷰를 사용하여 Amazon MSK, Apache Kafka 또는 Confluent Cloud의 스트리밍 데이터를 사용하는 방법을 설명합니다.

 Amazon Redshift 스트리밍 수집의 목적은 스트리밍 서비스에서 Amazon Redshift 또는 Amazon Redshift Serverless로 스트림 데이터를 직접 수집하는 프로세스를 단순화하는 것입니다. 이는 Amazon MSK Provisioned 및 Amazon MSK Serverless, 오픈 소스 Apache Kafka 및 Confluent Cloud에서 작동합니다. Amazon Redshift 스트리밍 수집을 사용하면 Redshift로 스트림 데이터를 수집하기 전에 Amazon S3에서 Apache Kafka 주제를 준비할 필요가 없습니다.

 기술적인 수준에서 스트리밍 수집은 짧은 지연 시간의 고속 수집으로 스트림 또는 주제 데이터를 Amazon Redshift 구체화된 뷰에 제공합니다. 설정 후 구체화된 뷰 새로 고침을 사용하여 대용량 데이터를 가져올 수 있습니다.

Amazon Redshift 스트리밍 수집을 구성하려면 먼저 Apache Kafka 소스를 사용할 수 있어야 합니다. 소스가 없는 경우 다음 지침에 따라 소스를 만듭니다.
+ **Amazon MSK** - [Getting Started Using Amazon MSK](https://docs.aws.amazon.com/msk/latest/developerguide/getting-started.html)
+ **Apache Kafka** - [Apache Kafka Quickstart](https://kafka.apache.org/quickstart)
+ **Confluent Cloud** - [Quick Start for Confluent Cloud](https://docs.confluent.io/cloud/current/get-started/index.html)

## Kafka에서 스트리밍 수집 설정
<a name="materialized-view-streaming-ingestion-getting-started-MSK-setup"></a>

다음 절차에 따라 AWS 관리형이 아닌 Apache Kafka 소스(Apache Kafka 및 Confluent Cloud)에서 Amazon Redshift로 스트리밍 수집을 설정합니다.

**Topics**
+ [인증 설정](#materialized-view-streaming-ingestion-getting-started-MSK-setup-auth)
+ [VPC 설정](#materialized-view-streaming-ingestion-getting-started-MSK-Setup-VPC)
+ [구체화된 뷰 만들기](#materialized-view-streaming-ingestion-getting-started-MSK-setup-materialized-view)

### 인증 설정
<a name="materialized-view-streaming-ingestion-getting-started-MSK-setup-auth"></a>

이 섹션에서는 Amazon Redshift 애플리케이션이 Amazon MSK 소스에 액세스하도록 허용하는 인증 설정을 설명합니다.

애플리케이션의 역할을 생성한 후 다음 정책 중 하나를 연결하여 Amazon MSK, Apache Kafka 또는 Confluent Cloud 클러스터에 대한 액세스를 허용합니다. mTLS 인증의 경우 Amazon Redshift가 사용하는 인증서를 ACM 또는 Secrets Manager에 저장할 수 있으므로 인증서가 저장되는 위치와 일치하는 정책을 선택해야 합니다.

지원되는 Apache Kafka 스트리밍 소스를 사용하여 Amazon Redshift로 직접 스트리밍 수집을 수행할 경우, 자체 서명된 인증서는 인증 또는 전송 중인 데이터에 대해 지원되지 않습니다. 여기에는 Amazon MSK, Apache Kafka 및 Confluent Cloud가 포함됩니다. AWS Certificate Manager 또는 기타 공개적으로 신뢰할 수 있는 인증 기관을 통해 생성된 인증서를 사용하는 것이 좋습니다.

MSK를 사용한 Amazon Redshift IAM 인증은 Kafka 버전 2.7.1 이상에서만 지원됩니다.

**AUTHENTICATION IAM(Amazon MSK만 해당):**

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "MSKIAMpolicy",
            "Effect": "Allow",
            "Action": [
                "kafka-cluster:ReadData",
                "kafka-cluster:DescribeTopic",
                "kafka-cluster:Connect"
            ],
            "Resource": [
                "arn:aws:kafka:*:111122223333:cluster/MyTestCluster/*",
                "arn:aws:kafka:*:111122223333:topic/MyTestCluster/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "kafka-cluster:AlterGroup",
                "kafka-cluster:DescribeGroup"
            ],
            "Resource": [
                "arn:aws:kafka:*:111122223333:group/MyTestCluster/*"
            ]
        }
    ]
}
```

------

**AUTHENTICATION MTLS: AWS Certificate Manager에 저장된 인증서 사용**

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "MSKmTLSACMpolicy",
            "Effect": "Allow",
            "Action": [
                "acm:ExportCertificate" 
            ],
            "Resource": [
                "arn:aws:acm:us-east-1:444455556666:certificate/certificate_ID"
            ]
        }
    ]
}
```

------

**AUTHENTICATION MTLS: AWS Secrets Manager에 저장된 인증서 사용**

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "MSKmTLSSecretsManagerpolicy",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue" 
            ],
            "Resource": [
                "arn:aws:secretsmanager:us-east-1:444455556666:secret:secret_ID"
            ]
        }
    ]
}
```

------

------
#### [ Amazon MSK ]

AUTHENTICATION NONE을 사용하여 Amazon MSK 소스에 연결할 경우 IAM 역할이 필요하지 않습니다. 그러나 AUTHENTICATION IAM 또는 MTLS를 사용하여 Amazon MSK 클러스터로 인증하는 경우 Amazon Redshift 클러스터 또는 Amazon Redshift Serverless 네임스페이스에 적절한 권한을 갖추고 연결된 IAM 역할이 있어야 합니다. Amazon Redshift 클러스터 또는 Amazon Redshift Serverless 네임스페이스에서 이 역할을 수임하도록 허용하는 신뢰 정책을 포함하여 IAM 역할을 만듭니다. 역할을 만든 후 다음 권한 중 하나를 추가하여 IAM 또는 MTLS를 지원합니다. mTLS 인증의 경우 Amazon Redshift가 사용하는 인증서는 AWS Certificate Manager 또는 AWS Secrets Manager에 저장할 수 있으므로 인증서가 저장되는 위치와 일치하는 정책을 선택해야 합니다. Amazon Redshift 프로비저닝 클러스터 또는 Redshift Serverless 네임스페이스에 대한 역할을 연결합니다. IAM 역할에 대한 신뢰 정책을 구성하는 방법에 대한 자세한 내용은 [Amazon Redshift가 사용자를 대신하여 다른 AWS 서비스에 액세스할 수 있도록 권한 부여](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html) 섹션을 참조하세요.

다음 테이블에는 Amazon MSK에서 스트리밍 수집을 위해 설정할 수 있는 무료 구성 옵션이 나와 있습니다.


| Amazon Redshift 구성 | Amazon MSK 구성 | Redshift와 Amazon MSK 간에 열 포트 | 
| --- | --- | --- | 
|  AUTHENTICATION NONE  |  TLS 전송 비활성화됨  | 9092 | 
|  AUTHENTICATION NONE  |  TLS 전송 활성화됨  | 9094 | 
|  AUTHENTICATION IAM  |  IAM  | 9098/9198 | 
|  AUTHENTICATION MTLS  |  TLS 전송 활성화됨  | 9094 | 

Amazon Redshift 인증은 CREATE EXTERNAL SCHEMA 문에서 설정합니다.

**참고**  
Amazon MSK 클러스터에 mTLS(상호 전송 계층 보안) 인증이 활성화되어 있는 경우, 인증 없음을 사용하도록 Amazon Redshift를 구성하면 인증되지 않은 액세스를 위해 포트 9094를 사용하도록 지시합니다. 그러나 이 포트는 mTLS 인증에서 사용 중이므로 실패합니다. 따라서 mTLS를 사용할 경우 AUTHENTICATION MTLS로 전환하는 것이 좋습니다.

------
#### [ Apache Kafka or Confluent Cloud ]

Apache Kafka 및 Confluent Cloud의 경우 Amazon Redshift는 다음 연결 프로토콜을 지원합니다.
+ Apache Kafka에 연결할 때 인증에 TLS 전송과 함께 mTLS 또는 일반 텍스트를 사용할 수 있습니다.
+ Confluent Cloud에 연결할 때는 인증에 mTLS만 사용할 수 있습니다.

Amazon Redshift는 Apache Kafka 또는 Confluent Cloud에 연결하기 위해 다음과 같은 암호화 프로토콜을 지원합니다.

**Apache Kafka 및 Confluent Cloud에 지원되는 인증 방법**


| Amazon Redshift | Kafka 보안 프로토콜 | Apache Kafka 지원 | Confluent 클라우드 지원 | 
| --- | --- | --- | --- | 
| AUTHENTICATION NONE | PLAINTEXT | 아니요 | 아니요 | 
| AUTHENTICATION NONE | SSL | 예 | 아니요 | 
| AUTHENTICATION IAM | SASL\$1SSL | 아니요 | 아니요 | 
| AUTHENTICATION MTLS | SSL | 예(인증서 포함) | 예(인증서 포함) | 

Amazon Redshift는 SASL/SCRAM 또는 SASL/PLAINTEXT를 지원하지 않습니다.

------

### VPC 설정
<a name="materialized-view-streaming-ingestion-getting-started-MSK-Setup-VPC"></a>

인증 리소스를 만든 후 VPC를 확인하고 Amazon Redshift 클러스터 또는 Amazon Redshift Serverless 작업 그룹에 Apache Kafka 소스로 이동하는 경로가 있는지 확인합니다.

**참고**  
Amazon MSK의 경우 Amazon MSK 클러스터에 대한 인바운드 보안 그룹 규칙은 Amazon Redshift 클러스터 또는 Redshift Serverless 작업 그룹의 보안 그룹을 허용해야 합니다. 지정 포트는 Amazon MSK 클러스터에서 구성된 인증 방법에 따라 다릅니다. 자세한 내용은 [포트 정보](https://docs.aws.amazon.com/msk/latest/developerguide/port-info.html) 및 [AWS 내에서 그러나 VPC 외부에서 액세스](https://docs.aws.amazon.com/msk/latest/developerguide/aws-access.html)를 참조하세요.

다음으로, Amazon Redshift 클러스터 또는 Amazon Redshift Serverless 작업 그룹에서 향상된 VPC 라우팅을 사용하도록 설정합니다. 자세한 내용은 [향상된 VPC 라우팅](https://docs.aws.amazon.com/redshift/latest/mgmt/enhanced-vpc-enabling-cluster.html)을 참조하세요.

### 구체화된 뷰 만들기
<a name="materialized-view-streaming-ingestion-getting-started-MSK-setup-materialized-view"></a>

이 섹션에서는 Amazon Redshift가 Apache Kafka 스트리밍 데이터에 액세스하는 데 사용하는 구체화된 뷰를 설정합니다.

사용 가능한 Apache Kafka 클러스터가 있다고 가정하고 첫 번째 단계는 `CREATE EXTERNAL SCHEMA`를 사용하여 Redshift에서 스키마를 정의하고 클러스터를 데이터 소스로 참조하는 것입니다. 그런 다음 주제의 데이터에 액세스하려면 구체화된 뷰에서 `STREAM`을 정의합니다. 기본값 Amazon Redshift VARBYTE 데이터 유형을 사용하여 주제에서 레코드를 저장하거나, 반정형 `SUPER` 형식에 데이터를 변환하는 스키마를 정의할 수 있습니다. 구체화된 뷰를 쿼리할 때 반환된 레코드는 주제의 특정 시점 보기입니다.

1. Amazon Redshift에서 Apacke Kafka 클러스터에 매핑할 외부 스키마를 만듭니다. 구문은 다음과 같습니다.

   ```
   CREATE EXTERNAL SCHEMA MySchema
   FROM KAFKA
   [ IAM_ROLE [ default | 'iam-role-arn' ] ]
   AUTHENTICATION [ none | iam | mtls ]
   {AUTHENTICATION_ARN 'acm-certificate-arn' |  SECRET_ARN 'asm-secret-arn'};
   ```

   `FROM` 절에서 `KAFKA`는 스키마가 Apache Kafka 소스의 데이터를 매핑함을 나타냅니다.

    `AUTHENTICATION`은 스트리밍 수집을 위한 인증 유형을 나타냅니다. 사용 가능한 3가지 유형은 다음과 같습니다.
   + **none** - 필요한 인증이 없다고 지정합니다. 이는 MSK에 대해 인증되지 않은 액세스에 해당합니다. 이는 Apache Kafka의 SSL 인증에 해당합니다. 이 인증 방법은 Confluent Cloud에서 지원되지 않습니다.
   + **iam** - IAM 인증을 지정합니다. Amazon MSK에서는 IAM 인증만 사용할 수 있습니다. 이 항목을 선택할 때는 IAM 역할에 IAM 인증 권한이 있는지 확인해야 합니다. 필수 IAM 정책 설정에 관한 자세한 내용은 [Kafka에서 스트리밍 수집 설정](#materialized-view-streaming-ingestion-getting-started-MSK-setup) 섹션을 참조하시기 바랍니다.
   + **mtls** - 클라이언트와 서버 간의 인증을 용이하게 하여 상호 전송 계층 보안을 통해 안전한 통신을 제공하도록 지정합니다. 이 경우 클라이언트는 Redshift이고 서버는 Apache Kafka입니다. mTLS를 사용하여 스트리밍 수집 구성에 관한 자세한 내용은 [Apache Kafka 소스에서 Redshift 스트리밍 수집을 위한 mTLS 인증](materialized-view-streaming-ingestion-mtls.md) 섹션을 참조하시기 바랍니다.

   사용자 이름과 암호를 사용한 Amazon MSK 인증은 스트리밍 수집에서 지원되지 않으니 참고합니다.

   `AUTHENTICATION_ARN` 파라미터는 암호화된 연결을 설정하는 데 사용하는 ACM 상호 전송 계층 보안(mTLS) 인증서의 ARN을 지정합니다.

   `SECRET_ARN` 파라미터는 Amazon Redshift에서 mTLS에 사용할 인증서가 포함된 AWS Secrets Manager 보안 암호의 ARN을 지정합니다.

   다음 예시는 외부 스키마를 만들 경우 Amazon MSK 클러스터에 대한 브로커 URI를 설정하는 방법을 보여줍니다.

   **IAM 인증 사용:**

   ```
   CREATE EXTERNAL SCHEMA my_schema
   FROM KAFKA
   IAM_ROLE 'arn:aws:iam::012345678901:role/my_role'
   AUTHENTICATION IAM
   URI 'b-1.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9098,b-2.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9098'
   ```

   **인증 없음 사용**

   ```
   CREATE EXTERNAL SCHEMA my_schema
   FROM KAFKA 
   AUTHENTICATION none
   URI 'b-1.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9092,b-2.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9092'
   ```

   **mTLS 사용:**

   ```
   CREATE EXTERNAL SCHEMA my_schema
   FROM KAFKA
   IAM_ROLE 'arn:aws:iam::012345678901:role/my_role'
   AUTHENTICATION MTLS
   URI 'b-1.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9094,b- 2.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9094'
   {AUTHENTICATION_ARN 'acm-certificate-arn' |  SECRET_ARN 'asm-secret-arn'}
   ```

   외부 스키마 생성에 대한 자세한 내용은 [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)를 참조하세요.

1. 스트림 데이터를 소비할 구체화된 뷰를 생성합니다. 다음과 샘플과 같은 SQL 명령을 사용합니다.

   ```
   CREATE MATERIALIZED VIEW MyView AUTO REFRESH YES AS
   SELECT *
   FROM MySchema."mytopic";
   ```

   Kafka 주제 이름은 대소문자를 구분하며 대문자와 소문자를 모두 포함할 수 있습니다. 대문자 이름을 가진 주제에서 수집하려면 세션 또는 데이터베이스 수준에서 `enable_case_sensitive_identifier` 구성을 `true`로 설정하면 됩니다. 자세한 내용은 [이름 및 식별자](https://docs.aws.amazon.com/redshift/latest/dg/r_names.html) 및 [enable\$1case\$1sensitive\$1identifier](https://docs.aws.amazon.com/redshift/latest/dg/r_enable_case_sensitive_identifier.html) 섹션을 참조하세요.

   자동 새로 고침을 켜려면 `AUTO REFRESH YES`를 사용합니다. 기본 동작은 수동 새로 고침입니다.

1. 메타데이터 열에는 다음이 포함됩니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/materialized-view-streaming-ingestion-getting-started-MSK.html)

   중요한 것은 구체화된 뷰 정의에 비즈니스 로직이 있는 경우 비즈니스 로직 오류로 인해 경우에 따라 스트리밍 수집이 실패할 수 있다는 것입니다. 이로 인해 구체화된 뷰를 삭제하고 다시 생성해야 할 수도 있습니다. 이를 방지하려면 비즈니스 로직을 단순하게 유지하고 수집 후 데이터에 대한 추가 로직을 실행하는 것이 좋습니다.

1. 뷰를 새로 고치면 Amazon Redshift Redshift가 주제에서 읽고 데이터를 구체화된 뷰로 로드하도록 트리거합니다.

   ```
   REFRESH MATERIALIZED VIEW MyView;
   ```

1. 구체화된 보기의 데이터를 쿼리합니다.

   ```
   select * from MyView;
   ```

   구체화된 뷰는 `REFRESH` 실행 시 주제에서 직접 업데이트됩니다. Kafka 주제 데이터 소스에 매핑되는 구체화된 뷰를 생성합니다. 구체화된 뷰 정의의 일부로 데이터에 대한 필터링 및 합계를 수행할 수 있습니다. 스트리밍 수집 구체화된 뷰(기본 구체화된 뷰)는 하나의 Kafka 주제만 참조할 수 있지만 기본 구체화된 뷰 및 기타 구체화된 뷰 또는 테이블과 조인하는 구체화된 뷰를 추가로 생성할 수 있습니다.

스트리밍 수집 제한 사항에 대한 자세한 내용은 [스트리밍 모으기 동작 및 데이터 유형](materialized-view-streaming-ingestion.md#materialized-view-streaming-ingestion-limitations) 섹션을 참조하세요.

# Apache Kafka 소스에서 Redshift 스트리밍 수집을 위한 mTLS 인증
<a name="materialized-view-streaming-ingestion-mtls"></a>

상호 전송 계층 보안(mTLS)에서는 서버가 정보를 보내는 클라이언트를 인증하고 클라이언트가 서버를 인증할 수 있는 수단을 제공합니다. mTLS 사용의 이점은 여러 산업의 수직적 애플리케이션의 다양한 사용 사례에서 신뢰할 수 있는 인증을 사용할 수 있다는 것입니다. 여기에는 금융, 소매, 기관 및 의료 산업의 사용 사례가 포함됩니다. Redshift로 스트리밍 수집을 하는 경우 인증이 서버 간에 이뤄집니다. 이는 Amazon MSK, Apache Kafka 또는 Confluent Cloud와 Amazon Redshift 프로비저닝된 클러스터 또는 Amazon Redshift Serverless 작업 그룹일 수 있습니다.

이 주제에서는 mTLS를 사용하여 Redshift 클라이언트와 Apache Kafka 서버 간에 인증하는 외부 스키마를 만드는 방법을 보여주는 절차 및 SQL 명령 예시를 제공합니다. 이 주제에서는 Apache Kafka 소스에서 스트리밍 수집을 설정하는 전체 단계를 단계별로 보완해 줍니다. 자세한 내용은 [Apache Kafka 소스에서 스트리밍 수집 시작하기](materialized-view-streaming-ingestion-getting-started-MSK.md) 섹션을 참조하세요.

## 스트리밍 수집에서 mTLS를 사용하기 위한 사전 조건
<a name="materialized-view-streaming-ingestion-mtls-prerequisites"></a>

이 섹션에서는 AWS Certificate Manager 또는 AWS Secrets Manager를 사용하여 스트리밍 수집에 mTLS를 사용하기 위한 사전 조건 단계를 제공합니다.

예비 단계로, 다른 기능 중에서 보안 통신 채널을 통해 보안 통신을 사용하는 인증서를 발급하는 데 사용할 수 있는 프라이빗 인증 기관(PCA)을 보유하거나 만들어야 합니다. AWS Private Certificate Authority (프라이빗 CA)는 이 함수를 수행하는 사용 가능한 서비스입니다. 자세한 내용은 *AWS Private Certificate Authority 사용 설명서*에 나와 있는 [프라이빗 CA 생성](https://docs.aws.amazon.com/privateca/latest/userguide/create-CA.html)을 참조하시기 바랍니다. 프라이빗 CA를 만든 후 루트 CA 인증서를 내보내고 확장명을 .pem으로 하여 파일에 저장합니다.

CA 인증서를 사용하는 클러스터를 만들려면 다음을 수행합니다.

------
#### [ Amazon MSK ]

1. mtls 클라이언트 인증을 지원하는 Amazon MSK 클러스터를 만듭니다. Amazon MSK 클러스터 구성에 관한 자세한 내용은 *Amazon Managed Streaming for Apache Kafka Developer Guide*에 나와 있는 [Mutual TLS client authentication for Amazon MSK](https://docs.aws.amazon.com/msk/latest/developerguide/msk-authentication.html#msk-authentication-cluster) 섹션을 참조하시기 바랍니다.

1. Amazon MSK 클러스터의 보안 설정을 편집하고 AWS Certificate Manager(ACM)을 사용하여 TLS 클라이언트 인증을 켜고 이전에 만든 AWS Private CA(PCA)를 선택합니다. 자세한 내용은 **Amazon Managed Streaming for Apache Kafka 개발자 안내서에 나와 있는 [클러스터의 보안 설정 업데이트](https://docs.aws.amazon.com/msk/latest/developerguide/msk-update-security.html)를 참조하시기 바랍니다.

------
#### [ Confluent Cloud ]

1. 전용 Confluent Cloud 클러스터를 만듭니다. 가급적이면 Amazon Redshift 클러스터와 동일한 AWS 리전에 만드는 것이 좋습니다. Confluent Cloud 클러스터 만들기에 대한 자세한 내용은 [Create a Kafka cluster in Confluent Cloud](https://docs.confluent.io/cloud/current/get-started/index.html#step-1-create-a-ak-cluster-in-ccloud)를 참조하세요.

1. 앞서 만들어 내보낸 AWS Private CA 루트 CA 인증서 pem 파일을 업로드합니다. 자세한 내용은 [Manage certificate authority for mTLS authentication for Confluent Cloud](https://docs.confluent.io/cloud/current/security/authenticate/workload-identities/identity-providers/mtls/certificate-authority.html)를 참조하세요. Confluent Cloud는 이 인증서를 사용하여 Amazon Redshift 클라이언트 인증서를 확인합니다.

------

## AWS Certificate Manager으로 스트리밍 수집 시 mTLS 사용
<a name="materialized-view-streaming-ingestion-mtls-acm"></a>

다음 절차에서는 인증서 스토리지 및 관리용 AWS Certificate Manager(ACM)를 활용하여 Redshift 스트리밍 수집 시 mTLS를 구성하는 방법을 보여줍니다.

1. ACM을 통해 프라이빗 인증서를 요청합니다. 이렇게 할 때 사전 조건 섹션에서 만든 PCA를 인증 기관으로 선택합니다. ACM은 보안 통신 용도로 서명된 인증서와 연결된 프라이빗 키를 저장합니다. 자세한 내용은 **AWS Certificate Manager 사용 설명서에 나와 있는 [인증서 발급 및 관리](https://docs.aws.amazon.com/acm/latest/userguide/gs.html)를 참조하시기 바랍니다.

1. Redshift 클러스터 또는 Amazon Redshift Serverless 작업 그룹을 관리하는 데 사용하는 IAM 역할의 경우 **acm:ExportCertificate** 인증서를 내보낼 수 있는 권한을 연결합니다. 스트리밍 수집 시 필요한 IAM 리소스 설정에 관한 자세한 내용은 [Kafka에서 스트리밍 수집 설정](materialized-view-streaming-ingestion-getting-started-MSK.md#materialized-view-streaming-ingestion-getting-started-MSK-setup) 섹션을 참조하시기 바랍니다. 다음 단계에서 동일한 IAM 역할을 지정하여 외부 스키마를 만듭니다.
**참고**  
AWS Certificate Manager에 대한 요청에는 VPC에서 인터넷 게이트웨이(IGW) 또는 NAT 게이트웨이(NGW)가 필요합니다. VPC에 IGW 또는 NGW가 없는 경우 다음을 수행합니다.  
ACM 대신 Secrets Manager를 사용하여 인증서를 저장합니다.
Secrets Manager VPC 엔드포인트를 VPC에 연결합니다.
스트리밍 수집에 mTLS와 함께 Secrets Manager를 사용하는 방법에 대한 자세한 내용은 다음 [AWS Secrets Manager으로 스트리밍 수집 시 mTLS 사용](#materialized-view-streaming-ingestion-mtls-secrets-manager) 섹션을 참조하세요.

1. Amazon MSK, Apache Kafka 또는 Confluent Cloud 클러스터에 대한 부트스트랩 브로커 URI를 가져옵니다. Amazon MSK용 부트스트랩 브로커 URI 가져오기에 대한 자세한 내용은 *Amazon Managed Streaming for Apache Kafka Developer Guide*의 [Getting the bootstrap brokers for an Amazon MSK cluster](https://docs.aws.amazon.com/msk/latest/developerguide/msk-get-bootstrap-brokers.html) 섹션을 참조하세요.

1.  다음 예시와 같은 SQL 명령을 실행하여 `mtls`를 사용하여 클러스터를 Redshift 외부 스키마에 매핑하는 외부 스키마를 만듭니다.

------
#### [ Amazon MSK ]

   ```
   CREATE EXTERNAL SCHEMA my_schema
   FROM KAFKA
   IAM_ROLE 'arn:aws:iam::012345678901:role/my_role'
   AUTHENTICATION mtls
   URI 'b-1.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9094,b-2.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9094'
   AUTHENTICATION_ARN 'arn:aws:acm:Region:444455556666:certificate/certificate_ID';
   ```

------
#### [ Apache Kafka or Confluent Cloud ]

   ```
   CREATE EXTERNAL SCHEMA my_schema
   FROM KAFKA
   IAM_ROLE 'arn:aws:iam::012345678901:role/my_role'
   AUTHENTICATION mtls
   URI 'lkc-2v531.domz6wj0p.us-west-1.aws.confluent.cloud:9092'
   AUTHENTICATION_ARN 'arn:aws:acm:region:444455556666:certificate/certificate_ID';
   ```

------

   중요한 파라미터:
   + IAM\$1ROLE - 스트리밍 수집 시 클러스터와 연결된 IAM 역할입니다.
   + URI - 클러스터에 대한 부트스트랩 브로커 URI입니다. Amazon MSK의 경우 포트 9094는 TLS 암호화를 위해 브로커와 통신하도록 지정되어 있으니 참고하시기 바랍니다.
   + AUTHENTICATION\$1ARN – ACM 인증서의 ARN입니다. ARN은 발급된 인증서를 선택하면 ACM 콘솔에서 사용할 수 있습니다.

이러한 구성 단계를 수행한 후 샘플에 정의된 스키마를 참조하는 Redshift 구체화된 뷰를 생성한 다음, REFRESH MATERIALIZED VIEW를 사용하여 데이터를 스트리밍할 수 있습니다. 자세한 내용은 [Apache Kafka 소스에서 스트리밍 수집 시작하기](materialized-view-streaming-ingestion-getting-started-MSK.md) 섹션을 참조하세요.

## AWS Secrets Manager으로 스트리밍 수집 시 mTLS 사용
<a name="materialized-view-streaming-ingestion-mtls-secrets-manager"></a>

AWS Certificate Manager에서 인증서를 참조하지 않으려면 인증서 관리용으로 AWS Secrets Manager를 사용하여 Redshift 스트리밍 수집을 위해 mTLS를 구성할 수 있습니다. 다음 단계에서는 Secrets Manager를 사용하여 mTLS를 구성하는 방법을 설명합니다.

1. 원하는 도구를 사용하여 인증서 서명 요청 및 프라이빗 키를 만듭니다. 그런 다음 클러스터에 대한 인증서를 만드는 데 사용한 것과 동일한 AWS 프라이빗 CA(PCA)를 사용하여 서명 요청을 사용해 서명된 인증서를 생성합니다. 인증서 발급에 관한 자세한 내용은 *AWS Private Certificate Authority API 참조*의 [IssueCertificate](https://docs.aws.amazon.com/privateca/latest/APIReference/API_IssueCertificate.html)를 참조하시기 바랍니다.

1. AWS Private Certificate Authority을 사용하여 인증서를 추출합니다. 자세한 내용은 *AWS Private Certificate Authority 사용 설명서*의 [Retrieve a private certificate](https://docs.aws.amazon.com/privateca/latest/userguide/PcaGetCert.html) 섹션을 참조하시기 바랍니다.

1. AWS Secrets Manager의 이전 단계에서 만든 인증서와 프라이빗 키를 저장합니다. `Other type of secret`을 선택하고 일반 텍스트 형식을 사용합니다. 키-값 페어는 다음 예제처럼 `{"certificate":"<cert value>","privateKey":"<pkey value>"}` 형식과 일치해야 합니다. AWS Secrets Manager에서 보안 암호 생성에 관한 자세한 내용은 *AWS Secrets Manager 사용 설명서*의 [AWS Secrets Manager으로 암호 생성 및 관리](https://docs.aws.amazon.com/secretsmanager/latest/userguide/managing-secrets.html)를 참조하시기 바랍니다.

   ```
   {"certificate":"-----BEGIN CERTIFICATE-----
   klhdslkfjahksgdfkgioeuyihbflahabhbdslv6akybeoiwv1hoaiusdhbahsbdi 
   H4hAX8/eE96qCcjkpfT84EdvHzp6fC+/WwM0oXlwUEWlvfMCXNaG5D8SqRq3qA==
   -----END CERTIFICATE-----
   -----BEGIN CERTIFICATE-----
   klhdslkfjahksgdfkgioeuyihbflahabhbdslv6akybeoiwv1hoaiusdhbahsbdi 
   wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   -----END CERTIFICATE-----",
   "privateKey":"-----BEGIN PRIVATE KEY-----
   klhdslkfjahksgdfkgioeuyihbflahabhbdslv6akybeoiwv1hoaiusdhbahsbdi
   7OD4m1dBEs3Fj++hDMH9rYRp99RqtCOf0EWOUe139KOilOsW+cyhAoc9Ci2+Jo/k
   17u2N1iGILMQEZuCRtnJOkFYkw==
   -----END PRIVATE KEY-----"}
   ```

1. 권한 정책을 연결하여 Amazon Redshift 클러스터 또는 Amazon Redshift Serverless 작업 그룹을 관리하는 데 사용하는 IAM 역할에 대한 보안 암호를 검색합니다. 이 권한은 `secretsmanager:GetSecretValue`입니다. 자세한 내용은 [인증 설정](materialized-view-streaming-ingestion-getting-started-MSK.md#materialized-view-streaming-ingestion-getting-started-MSK-setup-auth) 섹션을 참조하세요. IAM 정책 관리에 대한 자세한 내용은 [IAM 정책 편집](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-edit.html)을 참조하세요. 다음 단계에서 동일한 IAM 역할을 지정하여 외부 스키마를 만듭니다.

1. Redshift에서 SQL을 실행하여 외부 스키마를 만듭니다. AUTHENTICATION 유형(`mtls`)을 사용합니다. 또한 AWS Secrets Manager에서 클러스터의 URI와 보안 암호 ARN을 지정합니다.

   ```
   CREATE EXTERNAL SCHEMA my_schema
   FROM KAFKA
   IAM_ROLE 'arn:aws:iam::012345678901:role/my_role'
   AUTHENTICATION mtls
   URI 'b-1.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9094,b-2.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9094'
   SECRET_ARN 'arn:aws:secretsmanager:us-east-1:012345678910:secret:myMTLSSecret';
   ```

중요한 파라미터:
+ IAM\$1ROLE - 스트리밍 수집 시 클러스터와 연결된 IAM 역할입니다.
+ URI - 클러스터에 대한 부트스트랩 브로커 URI입니다. Amazon MSK의 경우 포트 9094는 TLS 암호화를 위해 브로커와 통신하도록 지정되어 있으니 참고하시기 바랍니다.
+ SECRET\$1ARN - mTLS에 사용할 인증서를 포함하는 Secrets Manager의 보안 암호 ARN입니다.

## 기존 외부 스키마에 대한 mTLS 인증 사용
<a name="materialized-view-streaming-ingestion-mtls-alter"></a>

스트리밍 수집 시 사용하는 기존 외부 스키마가 있고 인증을 위해 상호 TLS를 구현하려는 경우 ACM에서 mTLS 인증 및 ACM 인증서 ARN을 지정하는 다음과 같은 명령을 실행할 수 있습니다.

```
ALTER EXTERNAL SCHEMA schema_name 
AUTHENTICATION mtls
AUTHENTICATION_ARN 'arn:aws:acm:Region:444455556666:certificate/certificate_ID';
```

또는 AWS Secrets Manager의 보안 암호 ARN을 참조하여 mTLS 인증을 지정할 수 있습니다.

```
ALTER EXTERNAL SCHEMA schema_name 
AUTHENTICATION mtls
SECRET_ARN 'arn:aws:secretsmanager:us-east-1:012345678910:secret:myMTLSSecret';
```

ALTER EXTERNAL SCHEMA 명령에 대한 자세한 내용은 [ALTER EXTERNAL SCHEMA](r_ALTER_EXTERNAL_SCHEMA.md) 섹션을 참조하세요.

# Kinesis를 사용한 스트리밍 데이터 수집
<a name="materialized-view-streaming-ingestion-example-station-data"></a>

다음 절차는 *ev\$1station\$1data*로 명명된 Kinesis 스트림에서 데이터를 수집하는 방법을 보여줍니다. 이 데이터는 다양한 EV 충전 스테이션의 소비 데이터를 JSON 형식으로 포함합니다. 스키마가 잘 정의되어 있습니다. 이 예에서는 데이터를 원시 JSON으로 저장하는 방법과 수집될 때 JSON 데이터를 Amazon Redshift 데이터 유형으로 변환하는 방법을 보여 줍니다.

**생산자 설정**

1. Amazon Kinesis Data Streams 사용하여 다음 단계에 따라 `ev_station_data`라는 이름의 스트림을 생성합니다. **용량 모드(Capacity mode)**에 **온디맨드(On-demand)**를 선택합니다. 자세한 내용은 [AWS 관리 콘솔을 통해 스트림 생성](https://docs.aws.amazon.com/streams/latest/dev/how-do-i-create-a-stream.html)을 참조하세요.

1. 이 [Amazon Kinesis 데이터 생성기](https://awslabs.github.io/amazon-kinesis-data-generator/web/producer.html?)는 스트림에 사용할 테스트 데이터를 생성하는 데 도움이 됩니다. 시작하려면 도구에 설명된 단계에 따라 다음 데이터 템플릿을 사용하여 데이터를 생성합니다.

   ```
   {
       
      "_id" : "{{random.uuid}}",
      "clusterID": "{{random.number(
           {   "min":1,
               "max":50
           }
       )}}", 
       "connectionTime": "{{date.now("YYYY-MM-DD HH:mm:ss")}}",
       "kWhDelivered": "{{commerce.price}}",
       "stationID": "{{random.number(
           {   "min":1,
               "max":467
           }
       )}}",
         "spaceID": "{{random.word}}-{{random.number(
           {   "min":1,
               "max":20
           }
       )}}",
    
      "timezone": "America/Los_Angeles",
      "userID": "{{random.number(
           {   "min":1000,
               "max":500000
           }
       )}}"
   }
   ```

    스트림 데이터의 각 JSON 객체에는 다음과 같은 속성이 있습니다.

   ```
   {
       "_id": "12084f2f-fc41-41fb-a218-8cc1ac6146eb",
       "clusterID": "49",
       "connectionTime": "2022-01-31 13:17:15",
       "kWhDelivered": "74.00",
       "stationID": "421",
       "spaceID": "technologies-2",
       "timezone": "America/Los_Angeles",
       "userID": "482329"
   }
   ```

**Amazon Redshift 설정**

다음 단계는 데이터를 수집하도록 구체화된 보기를 구성하는 방법을 보여줍니다.

1. 외부 스키마를 만들어 Kinesis 데이터를 Redshift 객체로 매핑합니다.

   ```
   CREATE EXTERNAL SCHEMA evdata FROM KINESIS
   IAM_ROLE 'arn:aws:iam::0123456789:role/redshift-streaming-role';
   ```

   IAM 역할을 구성하는 방법에 대한 자세한 내용은 [Amazon Kinesis Data Streams Streams에서 수집 시작](materialized-view-streaming-ingestion-getting-started.md) 섹션을 참조하세요.

1. 스트림 데이터를 소비할 구체화된 보기를 생성합니다. 다음 예제에서는 구체화된 뷰를 정의하여 Kinesis 스트림에서 JSON 형식의 데이터를 수집하는 방법을 보여줍니다.

   먼저 스트림 레코드를 반정형 SUPER 형식으로 저장합니다. 이 예에서 JSON 소스는 Redshift 유형으로 변환하지 않고 Redshift에 저장됩니다.

   ```
   CREATE MATERIALIZED VIEW ev_station_data AS
       SELECT approximate_arrival_timestamp,
       partition_key,
       shard_id,
       sequence_number,
       case when can_json_parse(kinesis_data) then json_parse(kinesis_data) else null end as payload,
       case when not can_json_parse(kinesis_data) then kinesis_data else null end as failed_payload
       FROM evdata."ev_station_data" ;
   ```

**스트림 쿼리**

1. 아래 명령을 사용하여 대소문자를 구분하는 SUPER 속성을 활성화합니다. Amazon Redshift는 기본적으로 대소문자를 구분하지 않으므로 대소문자를 구분하는 SUPER 속성에 액세스하려면 이 기능을 활성화해야 합니다.

   ```
   SET enable_case_sensitive_super_attribute to TRUE;
   ```

1. 스트림에서 데이터를 가져오려면 다음 명령을 사용하여 구체화된 뷰를 새로 고칩니다.

   ```
   REFRESH MATERIALIZED VIEW ev_station_data;
   ```

1. 새로 고쳐진 구체화된 보기를 쿼리하여 사용량 통계를 가져옵니다.

   ```
   SELECT e.payload.connectionTime::date as connectiontime
   ,SUM(e.payload.kWhDelivered::decimal(10,2)) AS Energy_Consumed
   ,count(distinct e.payload.userID) AS #Users
   from ev_station_data as e
   group by connectiontime
   order by 1 desc;
   ```

1. 결과 보기.

   ```
   connectiontime        energy_consumed    #users
   2022-02-08                 4139          10
   2022-02-09                 5571          10
   2022-02-10                 8697          20
   2022-02-11                 4408          10
   2022-02-12                 4257          10
   2022-02-23                 6861          10
   ```