

# Amazon Athena MSK 커넥터
<a name="connectors-msk"></a>

[Amazon MSK](https://aws.amazon.com/msk/)용 Amazon Athena 커넥터를 사용하면 Amazon Athena가 Apache Kafka 주제에 대해 SQL 쿼리를 실행할 수 있습니다. 이 커넥터를 사용하여 Athena에서 [Apache Kafka](https://kafka.apache.org/) 주제를 테이블로, 메시지를 행으로 볼 수 있습니다. 자세한 내용은 AWS 빅 데이터 블로그에서 [Amazon Athena를 사용하여 Amazon MSK에서 실시간 스트리밍 데이터 분석](https://aws.amazon.com/blogs/big-data/analyze-real-time-streaming-data-in-amazon-msk-with-amazon-athena/)을 참조하세요.

이 커넥터는 Glue Connections를 사용하여 Glue의 구성 속성을 중앙 집중화하지 않습니다. 연결 구성은 Lambda를 통해 수행됩니다.

## 사전 조건
<a name="connectors-msk-prerequisites"></a>

Athena 콘솔 또는 AWS Serverless Application Repository를 사용하여 AWS 계정에 커넥터를 배포합니다. 자세한 내용은 [데이터 소스 연결 생성](connect-to-a-data-source.md) 또는 [AWS Serverless Application Repository을 사용하여 데이터 소스 커넥터 배포](connect-data-source-serverless-app-repo.md) 섹션을 참조하세요.

## 제한 사항
<a name="connectors-msk-limitations"></a>
+ DDL 쓰기 작업은 지원되지 않습니다.
+ 모든 관련 Lambda 제한. 자세한 내용은 *AWS Lambda 개발자 안내서*에서 [Lambda 할당량](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)을 참조하세요.
+ 필터 조건의 날짜 및 타임스탬프 데이터 형식을 적절한 데이터 형식으로 캐스팅해야 합니다.
+ 날짜 및 타임스탬프 데이터 형식은 CSV 파일 형식에 지원되지 않으며 varchar 값으로 처리됩니다.
+ 중첩된 JSON 필드로의 매핑은 지원되지 않습니다. 커넥터는 최상위 필드만 매핑합니다.
+ 커넥터는 복합 유형을 지원하지 않습니다. 복합 형식은 문자열로 해석됩니다.
+ 복잡한 JSON 값을 추출하거나 사용하려면 Athena에서 제공되는 JSON 관련 함수를 사용하세요. 자세한 내용은 [문자열에서 JSON 데이터 추출](extracting-data-from-JSON.md) 섹션을 참조하세요.
+ 커넥터는 Kafka 메시지 메타데이터에 대한 액세스를 지원하지 않습니다.

## 용어
<a name="connectors-msk-terms"></a>
+ **메타데이터 핸들러** - 데이터베이스 인스턴스에서 메타데이터를 검색하는 Lambda 핸들러.
+ **레코드 핸들러** - 데이터베이스 인스턴스에서 데이터 레코드를 검색하는 Lambda 핸들러.
+ **복합 핸들러** - 데이터베이스 인스턴스에서 메타데이터와 데이터 레코드를 모두 검색하는 Lambda 핸들러.
+ **Kafka 엔드포인트** - Kafka 인스턴스에 연결하는 텍스트 문자열입니다.

## 클러스터 호환성
<a name="connectors-msk-cluster-compatibility"></a>

MSK 커넥터는 다음과 같은 클러스터 유형과 함께 사용할 수 있습니다.
+ **MSK 프로비저닝 클러스터** - 클러스터 용량을 수동으로 지정, 모니터링 및 조정합니다.
+ **MSK 서버리스 클러스터** - 애플리케이션 I/O가 확장되면 자동으로 확장되는 온디맨드 용량을 제공합니다.
+ **독립 실행형 Kafka** - Kafka에 대한 직접 연결(인증된 연결 또는 인증되지 않은 연결)입니다.

## 지원되는 인증 방법
<a name="connectors-msk-supported-authentication-methods"></a>

커넥터에서 지원되는 인증 방법은 다음과 같습니다.
+ [SAL/IAM](https://docs.aws.amazon.com/msk/latest/developerguide/iam-access-control.html) 
+ [SSL](https://docs.aws.amazon.com/msk/latest/developerguide/msk-authentication.html)
+ [SASL/SCRAM](https://docs.aws.amazon.com/msk/latest/developerguide/msk-password.html)
+ SASL/PLAIN
+ SASL/PLAINTEXT
+ NO\$1AUTH

  자세한 내용은 [Athena MSK 커넥터에 대한 인증 구성](#connectors-msk-setup-configuring-authentication) 섹션을 참조하세요.

## 지원되는 입력 데이터 형식
<a name="connectors-msk-supported-input-data-formats"></a>

커넥터에서 지원되는 입력 데이터 형식은 다음과 같습니다.
+ JSON
+ CSV

## 파라미터
<a name="connectors-msk-parameters"></a>

이 섹션의 파라미터를 사용하여 Athena MSK 커넥터를 구성합니다.
+ **auth\$1type** - 클러스터의 인증 유형을 지정합니다. 커넥터에서 지원되는 인증 유형은 다음과 같습니다.
  + **NO\$1AUTH** - 인증 없이 Kafka에 직접 연결합니다. 예를 들어 인증을 사용하지 않는 EC2 인스턴스를 통해 배포되는 Kafka 클러스터에 연결합니다.
  + **SASL\$1SSL\$1PLAIN** - 이 메서드는 `SASL_SSL` 보안 프로토콜과 `PLAIN` SASL 메커니즘을 사용합니다.
  + **SASL\$1PLAINTEXT\$1PLAIN** - 이 메서드는 `SASL_PLAINTEXT` 보안 프로토콜과 `PLAIN` SASL 메커니즘을 사용합니다.
**참고**  
`SASL_SSL_PLAIN` 및 `SASL_PLAINTEXT_PLAIN` 인증 유형은 Apache Kafka에서 지원되지만 Amazon MSK에서는 지원되지 않습니다.
  + **SASL\$1SSL\$1AWS\$1MSK\$1IAM** - Amazon MSK용 IAM 액세스 제어를 사용하여 MSK 클러스터에 대한 인증과 권한 부여를 모두 처리할 수 있습니다. 사용자 AWS 보안 인증(비밀 키 및 액세스 키)은 클러스터에 연결하는 데 사용됩니다. 자세한 내용은 Amazon Managed Streaming for Apache Kafka 개발자 안내서의 [IAM 액세스 제어](https://docs.aws.amazon.com/msk/latest/developerguide/iam-access-control.html)를 참조하세요.
  + **SASL\$1SSL\$1SCRAM\$1SHA512** - 이 인증 유형을 사용하여 Amazon MSK 클러스터에 대한 액세스를 제어할 수 있습니다. 이 메서드는 사용자 이름과 암호를 AWS Secrets Manager에 저장합니다. 보안 암호를 Amazon MSK 클러스터와 연결해야 합니다. 자세한 내용은 Amazon Managed Streaming for Apache Kafka 개발자 안내서의 [Amazon MSK 클러스터에 대한 SASL/SCRAM 인증 설정](https://docs.aws.amazon.com/msk/latest/developerguide/msk-password.html#msk-password-tutorial)을 참조하세요.
  + **SSL** - SSL 인증은 키 스토어 및 트러스트 스토어 파일을 사용하여 Amazon MSK 클러스터와 연결합니다. 트러스트 스토어 파일과 키 스토어 파일을 생성하여 Amazon S3 버킷에 업로드하고 커넥터를 배포할 때 Amazon S3에 대한 참조를 제공해야 합니다. 키 스토어, 트러스트 스토어 및 SSL 키는 AWS Secrets Manager에 저장됩니다. 커넥터가 배포될 때 클라이언트가 AWS 보안 암호 키를 제공해야 합니다. 자세한 내용은 Amazon Managed Streaming for Apache Kafka 개발자 안내서의 [상호 TLS 인증](https://docs.aws.amazon.com/msk/latest/developerguide/msk-authentication.html)을 참조하세요.

    자세한 내용은 [Athena MSK 커넥터에 대한 인증 구성](#connectors-msk-setup-configuring-authentication) 섹션을 참조하세요.
+ **certificates\$1s3\$1reference** - 인증서(키 스토어 및 트러스트 스토어 파일)가 들어 있는 Amazon S3 위치입니다.
+ **disable\$1spill\$1encryption** – (선택 사항) `True`로 설정하면 유출 암호화가 비활성화됩니다. S3로 유출되는 데이터가 AES-GCM을 사용하여 암호화되도록 기본값은 `False`입니다(임의로 생성된 키 또는 KMS를 사용하여 키 생성). 유출 암호화를 비활성화하면 특히 유출 위치가 [서버 측 암호화](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)를 사용하는 경우 성능이 향상될 수 있습니다.
+ **kafka\$1endpoint** - Kafka에 제공할 엔드포인트 세부 정보입니다. 예를 들어 Amazon MSK 클러스터의 경우 클러스터의 [부트스트랩 URL](https://docs.aws.amazon.com/msk/latest/developerguide/msk-get-bootstrap-brokers.html)을 제공합니다.
+ **secrets\$1manager\$1secret** - 보안 인증이 저장되는 AWS 보안 암호의 이름입니다. IAM 인증에는 이 파라미터가 필요하지 않습니다.
+ **유출 파라미터** - Lambda 함수는 메모리에 맞지 않는 데이터를 Amazon S3에 임시로 저장(“유출”)합니다. 동일한 Lambda 함수에서 액세스하는 모든 데이터베이스 인스턴스는 동일한 위치로 유출됩니다. 다음 표의 파라미터를 사용하여 유출 위치를 지정합니다.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/connectors-msk.html)

## 데이터 형식 지원
<a name="connectors-msk-data-type-support"></a>

다음 표에 Kafka와 Apache Arrow에 대해 지원되는 해당 데이터 형식이 나와 있습니다.


****  

| Kafka | 화살표 | 
| --- | --- | 
| CHAR | VARCHAR | 
| VARCHAR | VARCHAR | 
| TIMESTAMP | MILLISECOND | 
| DATE | DAY | 
| BOOLEAN | BOOL | 
| SMALLINT | SMALLINT | 
| INTEGER | INT | 
| BIGINT | BIGINT | 
| DECIMAL | FLOAT8 | 
| DOUBLE | FLOAT8 | 

## 파티션 및 분할
<a name="connectors-msk-partitions-and-splits"></a>

Kafka 주제는 파티션으로 분할됩니다. 각 파티션은 순서대로 정렬됩니다. 파티션의 각 메시지에는 offset이라는 증분 ID가 있습니다.** 각 Kafka 파티션은 병렬 처리를 위해 다시 여러 영역으로 분할됩니다. 데이터는 Kafka 클러스터에 구성된 보존 기간 동안 사용할 수 있습니다.

## 모범 사례
<a name="connectors-msk-best-practices"></a>

다음 예와 같이 Athena를 쿼리할 때 조건자 푸시다운을 사용하는 것이 좋습니다.

```
SELECT * 
FROM "msk_catalog_name"."glue_schema_registry_name"."glue_schema_name" 
WHERE integercol = 2147483647
```

```
SELECT * 
FROM "msk_catalog_name"."glue_schema_registry_name"."glue_schema_name" 
WHERE timestampcol >= TIMESTAMP '2018-03-25 07:30:58.878'
```

## MSK 커넥터 설정
<a name="connectors-msk-setup"></a>

커넥터를 사용하려면 먼저 Amazon MSK 클러스터를 설정하고, [AWS Glue 스키마 레지스트리](https://docs.aws.amazon.com/glue/latest/dg/schema-registry.html)를 사용하여 스키마를 정의하고, 커넥터에 대한 인증을 구성해야 합니다.

**참고**  
프라이빗 리소스에 액세스하기 위해 커넥터를 VPC에 배포하고 Confluent와 같이 공개적으로 액세스 가능한 서비스에도 연결하려는 경우 커넥터를 NAT 게이트웨이가 있는 프라이빗 서브넷과 연결해야 합니다. 자세한 정보는 Amazon VPC 사용 설명서의 [NAT 게이트웨이](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)를 참조하세요.

AWS Glue Schema Registry에서 작업할 경우 다음 사항에 유의하세요.
+ AWS Glue Schema Registry의 **Description**(설명) 필드에 있는 텍스트에 `{AthenaFederationMSK}` 문자열이 포함되어 있는지 확인합니다. 이 마커 문자열은 Amazon Athena MSK 커넥터와 함께 사용하는 AWS Glue 레지스트리에 필요합니다.
+ 최상의 성능을 얻으려면 데이터베이스 이름과 테이블 이름에 소문자만 사용합니다. 대/소문자를 혼합하여 사용하면 커넥터에서 대소문자를 구분하지 않고 검색하므로 더욱 컴퓨팅 집약적입니다.

**Amazon MSK 환경 및 AWS Glue Schema Registry를 설정하려면**

1. Amazon MSK 환경을 설정합니다. 자세한 내용은 Amazon Managed Streaming for Apache Kafka 개발자 안내서의 [Amazon MSK 설정](https://docs.aws.amazon.com/msk/latest/developerguide/before-you-begin.html) 및 [Amazon MSK 사용 시작하기](https://docs.aws.amazon.com/msk/latest/developerguide/getting-started.html)를 참조하세요.

1. JSON 형식의 Kafka 주제 설명 파일, 즉, 스키마를 AWS Glue Schema Registry에 업로드합니다. 자세한 내용은 AWS Glue 개발자 안내서의 [AWS Glue Schema Registry와 통합](https://docs.aws.amazon.com/glue/latest/dg/schema-registry-integrations.html)을 참조하세요. 스키마 예는 다음 단원을 참조하세요.

### AWS Glue Schema Registry의 스키마 예
<a name="connectors-msk-setup-schema-examples"></a>

스키마를 [AWS Glue Schema Registry](https://docs.aws.amazon.com/glue/latest/dg/schema-registry.html)에 업로드할 경우 이 단원의 예제 형식을 사용하세요.

#### JSON 유형 스키마 예
<a name="connectors-msk-setup-schema-examples-json"></a>

다음 예제에서 AWS Glue Schema Registry에서 생성할 스키마는 `json`을 `dataFormat`의 값으로 지정하고 `datatypejson`을 `topicName`에 사용합니다.

**참고**  
`topicName`의 값에서는 Kafka의 주제 이름과 동일한 대/소문자를 사용해야 합니다.

```
{
  "topicName": "datatypejson",
  "message": {
    "dataFormat": "json",
    "fields": [
      {
        "name": "intcol",
        "mapping": "intcol",
        "type": "INTEGER"
      },
      {
        "name": "varcharcol",
        "mapping": "varcharcol",
        "type": "VARCHAR"
      },
      {
        "name": "booleancol",
        "mapping": "booleancol",
        "type": "BOOLEAN"
      },
      {
        "name": "bigintcol",
        "mapping": "bigintcol",
        "type": "BIGINT"
      },
      {
        "name": "doublecol",
        "mapping": "doublecol",
        "type": "DOUBLE"
      },
      {
        "name": "smallintcol",
        "mapping": "smallintcol",
        "type": "SMALLINT"
      },
      {
        "name": "tinyintcol",
        "mapping": "tinyintcol",
        "type": "TINYINT"
      },
      {
        "name": "datecol",
        "mapping": "datecol",
        "type": "DATE",
        "formatHint": "yyyy-MM-dd"
      },
      {
        "name": "timestampcol",
        "mapping": "timestampcol",
        "type": "TIMESTAMP",
        "formatHint": "yyyy-MM-dd HH:mm:ss.SSS"
      }
    ]
  }
}
```

#### CSV 유형 스키마 예
<a name="connectors-msk-setup-schema-examples-csv"></a>

다음 예제에서 AWS Glue Schema Registry에서 생성할 스키마는 `csv`을 `dataFormat`의 값으로 지정하고 `datatypecsvbulk`을 `topicName`에 사용합니다. `topicName`의 값에서는 Kafka의 주제 이름과 동일한 대/소문자를 사용해야 합니다.

```
{
  "topicName": "datatypecsvbulk",
  "message": {
    "dataFormat": "csv",
    "fields": [
      {
        "name": "intcol",
        "type": "INTEGER",
        "mapping": "0"
      },
      {
        "name": "varcharcol",
        "type": "VARCHAR",
        "mapping": "1"
      },
      {
        "name": "booleancol",
        "type": "BOOLEAN",
        "mapping": "2"
      },
      {
        "name": "bigintcol",
        "type": "BIGINT",
        "mapping": "3"
      },
      {
        "name": "doublecol",
        "type": "DOUBLE",
        "mapping": "4"
      },
      {
        "name": "smallintcol",
        "type": "SMALLINT",
        "mapping": "5"
      },
      {
        "name": "tinyintcol",
        "type": "TINYINT",
        "mapping": "6"
      },
      {
        "name": "floatcol",
        "type": "DOUBLE",
        "mapping": "7"
      }
    ]
  }
}
```

### Athena MSK 커넥터에 대한 인증 구성
<a name="connectors-msk-setup-configuring-authentication"></a>

IAM, SSL, SCRAM, 독립 실행형 Kafka를 비롯한 다양한 방법으로 Amazon MSK 클러스터에 인증할 수 있습니다.

다음 표에는 커넥터의 인증 유형과 각 유형에 대한 보안 프로토콜 및 SASL 메커니즘이 나와 있습니다. 자세한 내용은 Amazon Managed Streaming for Apache Kafka 개발자 안내서의 [Apache Kafka API에 대한 인증 및 권한 부여](https://docs.aws.amazon.com/msk/latest/developerguide/kafka_apis_iam.html)를 참조하세요.


****  

| auth\$1type | security.protocol | sasl.mechanism | 
| --- | --- | --- | 
| SASL\$1SSL\$1PLAIN | SASL\$1SSL | PLAIN | 
| SASL\$1PLAINTEXT\$1PLAIN | SASL\$1PLAINTEXT | PLAIN | 
| SASL\$1SSL\$1AWS\$1MSK\$1IAM | SASL\$1SSL | AWS\$1MSK\$1IAM | 
| SASL\$1SSL\$1SCRAM\$1SHA512 | SASL\$1SSL | SCRAM-SHA-512 | 
| SSL | SSL | 해당 사항 없음 | 

**참고**  
`SASL_SSL_PLAIN` 및 `SASL_PLAINTEXT_PLAIN` 인증 유형은 Apache Kafka에서 지원되지만 Amazon MSK에서는 지원되지 않습니다.

#### SASL/IAM
<a name="connectors-msk-setup-configuring-authentication-sasl-iam"></a>

클러스터에서 IAM 인증을 사용하는 경우 클러스터를 설정할 때 사용자에 대한 IAM 정책을 구성해야 합니다. 자세한 내용은 Amazon Managed Streaming for Apache Kafka 개발자 안내서의 [IAM 액세스 제어](https://docs.aws.amazon.com/msk/latest/developerguide/IAM-access-control.html)를 참조하세요.

이 인증 유형을 사용하려면 커넥터에 대한 `auth_type` Lambda 환경 변수를 `SASL_SSL_AWS_MSK_IAM`으로 설정합니다.

#### SSL
<a name="connectors-msk-setup-configuring-authentication-tls"></a>

클러스터가 SSL 인증을 받은 경우 트러스트 스토어와 키 스토어 파일을 생성하여 Amazon S3 버킷에 업로드해야 합니다. 커넥터를 배포할 때 이 Amazon S3 참조를 제공해야 합니다. 키 스토어, 트러스트 스토어 및 SSL 키는 AWS Secrets Manager에 저장됩니다. 커넥터를 배포할 때 AWS 비밀 키를 제공합니다.

Secrets Manager에서 보안 암호를 생성하는 방법에 대한 자세한 내용은 [AWS Secrets Manager 보안 암호 생성](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)을 참조하세요.

이 인증 유형을 사용하려면 다음 표에 표시된 대로 환경 변수를 설정합니다.


****  

| 파라미터 | 값 | 
| --- | --- | 
| auth\$1type | SSL | 
| certificates\$1s3\$1reference | 인증서가 포함된 Amazon S3 위치입니다. | 
| secrets\$1manager\$1secret | AWS 비밀 키의 이름입니다. | 

Secrets Manager에서 보안 암호를 생성한 이후에 Secrets Manager 콘솔에서 보안 암호를 볼 수 있습니다.

**Secrets Manager에서 보안 암호를 보려면**

1. [https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)에서 Secrets Manager 콘솔을 엽니다.

1. 탐색 창에서 **Secrets**(보안 암호)를 선택합니다.

1. **Secrets**(보안 암호) 페이지에서 보안 암호에 대한 링크를 선택합니다.

1. 보안 암호에 대한 세부 정보 페이지에서 **Retrieve secret value**(보안 암호 값 검색)를 선택합니다.

   다음 이미지는 세 개의 키/값 쌍(`keystore_password`, `truststore_password`, `ssl_key_password`)을 가진 보안 암호의 예를 보여줍니다.  
![\[Secrets Manager에서 SSL 보안 암호 검색\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/connectors-msk-setup-1.png)

#### SASL/SCRAM
<a name="connectors-msk-setup-configuring-authentication-sasl-scram"></a>

클러스터에서 SCRAM 인증을 사용하는 경우 커넥터를 배포할 때 클러스터와 연결되는 Secrets Manager 키를 제공합니다. 사용자의 AWS 보안 인증(비밀 키 및 액세스 키)은 클러스터에 인증하는 데 사용됩니다.

다음 표에 표시된 대로 환경 변수를 설정합니다.


****  

| 파라미터 | 값 | 
| --- | --- | 
| auth\$1type | SASL\$1SSL\$1SCRAM\$1SHA512 | 
| secrets\$1manager\$1secret | AWS 비밀 키의 이름입니다. | 

다음 이미지는 Secrets Manager 콘솔에서 `username` 및 `password`에 대해 하나씩 두 개의 키/값 쌍으로 구성된 보안 암호의 예를 보여줍니다.

![\[Secrets Manager에서 SCRAM 보안 암호 검색\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/connectors-msk-setup-2.png)


## 라이선스 정보
<a name="connectors-msk-license-information"></a>

이 커넥터를 사용하면 이 커넥터에 대한 [pom.xml](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-msk/pom.xml) 파일에서 목록을 찾을 수 있는 타사 구성 요소가 포함되어 있음을 인정하고 GitHub.com의 [LICENSE.txt](https://github.com/awslabs/aws-athena-query-federation/blob/master/athena-msk/LICENSE.txt) 파일에 제공된 해당 타사 라이선스의 조건에 동의하는 것으로 간주됩니다.

## 추가 리소스
<a name="connectors-msk-additional-resources"></a>

이 커넥터에 대한 추가 정보를 알아보려면 GitHub.com의 [해당 사이트](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-msk)를 참조하세요.