

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

# 지원 및 사용 중단된 Apache Flink 버전
<a name="release-version-list"></a>

이 주제는 Apache Flink in Managed Service에서 지원되는 Apache Flink 버전에 대한 정보를 제공합니다. 이 주제에서는 각 릴리스에서 지원되는 Apache Flink 기능 목록도 제공합니다.

**참고**  
지원 중단 예정인 Apache Flink 버전을 사용 중인 경우, Managed Service for Apache Flink의 [Apache Flink에 인플레이스 버전 업그레이드 사용](how-in-place-version-upgrades.md) 기능을 사용하여 애플리케이션을 최신 지원 Flink 버전으로 업그레이드할 것을 권장합니다.


| Apache Flink 버전 | 상태 - Amazon Managed Service for Apache Flink | 상태 - Apache Flink 커뮤니티 | 링크 | Note | 
| --- | --- | --- | --- | --- | 
| 2.2.0 | 지원됨 | 지원됨 | [Amazon Managed Service for Apache Flink 2.2](flink-2-2.md) | 이 버전은 주요 버전이며 주요 변경 사항이 있습니다. 계속하기 [주요 변경 사항 및 사용 중단](flink-2-2.md#flink-2-2-breaking-changes) 전에 단원을 참조하십시오. | 
| 1.20.0 | 지원됨 | 지원됨 | [Amazon Managed Service for Apache Flink 1.20](flink-1-20.md) |  | 
| 1.19.1 | 지원됨 | 지원됨 | [Amazon Managed Service for Apache Flink 1.19](flink-1-19.md) |  | 
| 1.18.1 | 지원됨 | 지원되지 않음 | [Amazon Managed Service for Apache Flink 1.18](flink-1-18.md) |  | 
| 1.15.2 | 지원됨 | 지원되지 않음 | [Amazon Managed Service for Apache Flink 1.15](flink-1-15-2.md) |  | 
| 1.13.1 | 사용 중단 | 지원되지 않음 | [시작하기: Flink 1.13.2](earlier.md#getting-started-1-13) | 이 버전에 대한 Amazon Managed Service for Apache Flink 지원은 2025년 10월 16일에 종료됩니다. | 
| 1.11.1 | 사용 중단 | 지원되지 않음 | [Managed Service for Apache Flink에 대한 이전 버전 정보](earlier.md)(이 버전은 2025년 2월부터 지원되지 않음) |  Amazon Managed Service for Apache Flink에서 Apache Flink 버전 1.6, 1.8, 1.11에 대한 지원을 종료할 계획입니다. 2025년 7월 14일부터는 이러한 버전을 사용하는 애플리케이션을 준비 상태로 전환합니다. 2025년 7월 28일부터는 이러한 버전을 사용하여 애플리케이션을 시작할 수 없습니다. Amazon Managed Service for Apache Flink의 인플레이스 버전 업그레이드 기능을 사용하여 애플리케이션을 지금 즉시 Flink 버전 1.20으로 업그레이드할 것을 권장합니다. 자세한 내용은 [Apache Flink에 인플레이스 버전 업그레이드 사용](how-in-place-version-upgrades.md) 단원을 참조하십시오.  | 
| 1.8.2 | 사용 중단 | 지원되지 않음 | [Managed Service for Apache Flink에 대한 이전 버전 정보](earlier.md)(이 버전은 2025년 2월부터 지원되지 않음) |  Amazon Managed Service for Apache Flink에서 Apache Flink 버전 1.6, 1.8, 1.11에 대한 지원을 종료할 계획입니다. 2025년 7월 14일부터는 이러한 버전을 사용하는 애플리케이션을 준비 상태로 전환합니다. 2025년 7월 28일부터는 이러한 버전을 사용하여 애플리케이션을 시작할 수 없습니다. Amazon Managed Service for Apache Flink의 인플레이스 버전 업그레이드 기능을 사용하여 애플리케이션을 지금 즉시 Flink 버전 1.20으로 업그레이드할 것을 권장합니다. 자세한 내용은 [Apache Flink에 인플레이스 버전 업그레이드 사용](how-in-place-version-upgrades.md) 단원을 참조하십시오. | 
| 1.6.2 | 사용 중단 | 지원되지 않음 | [Managed Service for Apache Flink에 대한 이전 버전 정보](earlier.md)(이 버전은 2025년 2월부터 지원되지 않음) |  Amazon Managed Service for Apache Flink에서 Apache Flink 버전 1.6, 1.8, 1.11에 대한 지원을 종료할 계획입니다. 2025년 7월 14일부터는 이러한 버전을 사용하는 애플리케이션을 준비 상태로 전환합니다. 2025년 7월 28일부터는 이러한 버전을 사용하여 애플리케이션을 시작할 수 없습니다. Amazon Managed Service for Apache Flink의 인플레이스 버전 업그레이드 기능을 사용하여 애플리케이션을 지금 즉시 Flink 버전 1.20으로 업그레이드할 것을 권장합니다. 자세한 내용은 [Apache Flink에 인플레이스 버전 업그레이드 사용](how-in-place-version-upgrades.md) 단원을 참조하십시오.  | 

**Topics**
+ [Amazon Managed Service for Apache Flink 2.2](flink-2-2.md)
+ [Amazon Managed Service for Apache Flink 1.20](flink-1-20.md)
+ [Amazon Managed Service for Apache Flink 1.19](flink-1-19.md)
+ [Amazon Managed Service for Apache Flink 1.18](flink-1-18.md)
+ [Amazon Managed Service for Apache Flink 1.15](flink-1-15-2.md)
+ [Managed Service for Apache Flink에 대한 이전 버전 정보](earlier.md)

# Amazon Managed Service for Apache Flink 2.2
<a name="flink-2-2"></a>

Amazon Managed Service for Apache Flink는 이제 Apache Flink 버전 2.2를 지원합니다. 서비스에 대한 첫 번째 메이저 버전 업그레이드입니다. 이 페이지에서는 Flink 2.2에 도입된 기능과 Flink 1.x에서 업그레이드하기 위한 중요한 고려 사항을 다룹니다.

**참고**  
Flink 2.2에는 신중한 계획이 필요한 주요 변경 사항이 도입되었습니다. 1.x에서 업그레이드[Flink 2.2 업그레이드를 위한 상태 호환성 가이드](state-compatibility.md)하기 전에 아래 및의 주요 변경 사항 및 사용 중단의 전체 목록을 검토합니다.

## Amazon Managed Service for Apache Flink 2.2의 새로운 기능
<a name="flink-2-2-whats-new"></a>

Amazon Managed Service for Apache Flink 2.2는 업그레이드 시 기존 애플리케이션을 손상시킬 수 있는 동작 변경을 도입합니다. 다음 섹션의 Flink API 변경 사항과 함께 주의 깊게 검토하세요.

**프로그래밍 방식 구성 처리**
+ MSF Flink 2.2는 이제 고객이 `env.getConfig().set()` 또는 유사한 APIs를 통해 MSF에서 지원하지 않는 구성을 수정하려고 할 때 예외를 보고합니다. [프로그래밍 방식 Flink 구성 속성](programmatic-configuration.md)을(를) 참조하세요.
+ 고객은 여전히 지원 티켓을 통해 특정 구성 변경을 요청할 수 있습니다([수정 가능한 설정](https://docs.aws.amazon.com/managed-flink/latest/java/reference-modifiable-settings.html) 참조).

**지표 제거**
+ Flink `fullRestarts` 2.2에서 지표가 제거되었습니다. 대신 `numRestarts` 지표를 사용합니다.
+ KDS 커넥터에 대한 지표는 Flink AWS 커넥터 버전 `bytesRequestedPerFetch` 6.0.0(Flink 2.2와 호환되는 커넥터 버전만 해당)에서 제거되었습니다.
+ `uptime` 및 `downtime` 지표는 모두 Flink 2.2에서 더 이상 사용되지 않는 것으로 표시되며 곧 제거될 예정입니다. 를 새 지표 `uptime`로 바꿉니다`runningTime`. `downtime`를 `restartingTime`, `cancellingTime`및 중 하나 이상으로 바꿉니다`failingTime`.
+ 지원되는 [지표의 전체 목록은 지표 및 차원 페이지를 참조하세요](https://docs.aws.amazon.com/managed-flink/latest/java/metrics-dimensions.html).

**자격 증명이 아닌 IMDS 호출 차단됨**
+ 이러한 허용된 엔드포인트는 AWS SDK의 **DefaultCredentialsProvider**(`/latest/meta-data/iam/security-credentials/`) 및 **DefaultAwsRegionProviderChain**(`/latest/dynamic/instance-identity/document`)에서 애플리케이션에 대한 자격 증명과 리전을 자동으로 구성하는 데 사용됩니다.
+ 비보안 인증 IMDS 호출(예: `EC2MetadataUtils.getInstanceId()`, `EC2MetadataUtils.getInstanceType()``EC2MetadataUtils.getLocalHostName()`, 또는 `EC2MetadataUtils.getAvailabilityZone()`)에 의존하는 AWS SDK 함수를 사용하는 애플리케이션은 이러한 호출을 시도할 때 HTTP 4xx 오류를 수신합니다.
+ 애플리케이션이 인스턴스 메타데이터 또는 허용된 경로 외부의 기타 정보에 IMDS를 사용하는 경우 대신 환경 변수 또는 애플리케이션 구성을 사용하도록 코드를 리팩터링합니다.

**읽기 전용 루트 파일 시스템**
+ 보안을 개선하기 위해이 아닌 모든 종속성이 기본 flink 작업 디렉터리`/tmp`인 경우가 발생합니다`java.io.FileNotFoundException: /{path}/{filename} (Read-only file system)`.
+ 파일 시스템 종속성은 코드에서 직접 시작하거나 종속성에 포함된 라이브러리에서 간접적으로 시작될 수 있습니다. 코드`/tmp/`에서 직접 파일 시스템 종속성을 로 재정의합니다. 라이브러리의 간접 파일 시스템 종속성의 경우 라이브러리 구성 재정의를 사용하여 파일 시스템 작업을 로 리디렉션합니다`/tmp/`.

## 주요 변경 사항 및 사용 중단
<a name="flink-2-2-breaking-changes"></a>

다음은 Managed Service for Apache Flink 2.2에 도입된 주요 변경 사항 및 사용 중단에 대한 요약입니다. 이러한 주요 변경 사항을 도입하는 [Apache Flink 2.0](https://nightlies.apache.org/flink/flink-docs-stable/release-notes/flink-2.0/)의 전체 릴리스 정보는 Apache Flink 2.0 릴리스 정보를 참조하세요.

**DataSet API 제거됨**
+ 배치 처리를 위한 레거시 DataSet API가 Flink 2.0 이상에서 완전히 제거되었습니다. 이제 모든 배치 처리에서 통합 DataStream API를 사용해야 합니다.
+ 업그레이드하기 전에 DataSet API를 사용하는 애플리케이션을 DataStream API로 마이그레이션해야 합니다. [DataSet에서 DataStream으로의 변환에 대한 Apache Flink 마이그레이션 가이드](https://nightlies.apache.org/flink/flink-docs-release-1.20/docs/dev/datastream/dataset_migration/) 참조

**Java 11 및 Python 3.8 제거됨**
+ Java 11 지원은 완전히 제거되었습니다. Java 17이 기본이며 권장되는 런타임입니다.
+ Python 3.8 지원이 제거되었습니다. 이제 Python 3.12가 기본값입니다.

**레거시 커넥터 클래스 제거됨**
+ 레거시 `SourceFunction` 및 `SinkFunction` 인터페이스는 새로운 통합 소스(FLIP-27) 및 싱크(FLIP-143) APIs로 대체되었으며, 이는 경계/비경계 이중성, 향상된 체크포인트 조정 및 더 깨끗한 프로그래밍 모델에 대한 더 나은 지원을 제공합니다.
+ Kinesis Data Streams의 경우 `KinesisStreamsSink`의 `KinesisStreamsSource` 및를 사용합니다`flink-connector-aws-kinesis-streams:6.0.0-2.0`.

**Scala API 제거됨**
+ Flink Scala API가 제거되었습니다. Flink의 Java API는 이제 JVM 기반 애플리케이션에 지원되는 단일 API입니다.
+ 애플리케이션이 Scala로 작성된 경우 Scala 코드에서 Flink의 Java API를 계속 사용할 수 있습니다. 주요 변경 사항은 Scala별 래퍼와 암시적 변환을 더 이상 사용할 수 없다는 것입니다. Scala [애플리케이션 업데이트에 대한 자세한 내용은 애플리케이션 및 Flink 버전 업그레이드를](https://nightlies.apache.org/flink/flink-docs-release-2.0/docs/ops/upgrading/) 참조하세요.

**상태 호환성 고려 사항**
+ 버전 2.24에서 5.6으로 업그레이드된 Kryo serializer는 상태 호환성 문제를 일으킬 수 있습니다.
+ 컬렉션(`HashMap`, `ArrayList`, `HashSet`)이 있는 POJOs에는 상태 호환성 문제가 있을 수 있습니다.
+ Avro 및 Protobuf 직렬화는 영향을 받지 않습니다.
+ 애플리케이션의 위험 수준을 분류하기 [Flink 2.2 업그레이드를 위한 상태 호환성 가이드](state-compatibility.md) 위한 자세한 평가는 섹션을 참조하세요.

## Apache Flink 2.2 기능 지원
<a name="flink-2-2-supported-features"></a>

**런타임 및 언어 지원**


****  

| 기능 | 설명 | 설명서 | 
| --- | --- | --- | 
| Java 17 런타임 | Java 17이 이제 기본이며 권장되는 런타임입니다. Java 11 지원이 제거되었습니다. | [Java 호환성](https://nightlies.apache.org/flink/flink-docs-stable/zh/docs/deployment/java_compatibility/) | 
| Python 3.12 지원 | 이제 Python 3.12가 지원되고 Python 3.8 지원이 제거되었습니다. | [PyFlink 설명서](https://nightlies.apache.org/flink/flink-docs-release-2.2/docs/dev/python/overview/) | 

**상태 관리 및 성능**


****  

| 기능 | 설명 | 설명서 | 
| --- | --- | --- | 
| RocksDB 8.10.0 | RocksDB 업그레이드를 통해 I/O 성능을 개선했습니다. | [상태 백엔드](https://nightlies.apache.org/flink/flink-docs-release-2.0/docs/ops/state/state_backends/) | 
| 직렬화 개선 사항 | Map, List, Set 전용 직렬 변환기. Kryo는 2.24에서 5.6으로 업그레이드되었습니다. | [유형 직렬화](https://nightlies.apache.org/flink/flink-docs-release-2.0/docs/dev/datastream/fault-tolerance/serialization/types_serialization/) | 

**SQL 및 Table API 기능**


****  

| 기능 | 설명 | 설명서 | 
| --- | --- | --- | 
| 변형 데이터 형식 | 반복 문자열 구문 분석 없이 반정형 데이터(JSON)를 기본적으로 지원합니다. | [데이터 형식](https://nightlies.apache.org/flink/flink-docs-release-2.1/docs/dev/table/types/) | 
| 델타 조인 | 각 키의 최신 버전만 유지하여 스트리밍 조인의 상태 요구 사항을 줄입니다. 고객 관리형 인프라(예: Apache Fluss)가 필요합니다. | [조인](https://nightlies.apache.org/flink/flink-docs-release-2.1/docs/dev/table/sql/queries/joins/) | 
| StreamingMultiJoinOperator | 멀티웨이 조인을 단일 연산자로 실행하여 중간 구체화를 제거합니다. | [FLIP-516](https://cwiki.apache.org/confluence/display/FLINK/FLIP-516) | 
| ProcessTableFunction(PTF) | 키별 상태 및 타이머를 사용하여 SQL에서 직접 상태 저장 이벤트 기반 로직을 활성화합니다. | [사용자 정의 함수](https://nightlies.apache.org/flink/flink-docs-release-2.1/docs/dev/table/functions/udfs/) | 
| ML\$1PREDICT 함수 | SQL에서 직접 스트리밍/배치 테이블에서 등록된 ML 모델을 호출합니다. 고객이 ModelProvider 구현을 번들링해야 합니다(예: flink-model-openai). ModelProvider 라이브러리는 Managed Service for Apache Flink에서 제공되지 않습니다. | [ML 예측](https://nightlies.apache.org/flink/flink-docs-release-2.1/docs/dev/table/sql/queries/model-inference/) | 
| 모델 DDL | CREATE MODEL 문을 사용하여 ML 모델을 일급 카탈로그 객체로 정의합니다. | [CREATE 문](https://nightlies.apache.org/flink/flink-docs-release-2.1/docs/dev/table/sql/create/#create-model) | 
| 벡터 검색 | Flink SQL API는 벡터 데이터베이스 검색을 지원합니다. 현재 오픈 소스 VectorSearchTableSource 구현은 사용할 수 없습니다. 고객은 자체 구현을 제공해야 합니다. | [Flink SQL](https://nightlies.apache.org/flink/flink-docs-stable/release-notes/flink-2.2/#support-vector_search-in-flink-sql) | 

**DataStream API 기능**


****  

| 기능 | 설명 | 설명서 | 
| --- | --- | --- | 
| FLIP-27 소스 API | 레거시 SourceFunction 인터페이스입니다. | [소스](https://nightlies.apache.org/flink/flink-docs-release-2.0/docs/dev/datastream/sources/) | 
| FLIP-143 싱크 API | 레거시 SinkFunction을 대체하는 새로운 통합 싱크 인터페이스입니다. | [싱크](https://nightlies.apache.org/flink/flink-docs-release-2.0/docs/dev/datastream/sinks/) | 
| 비동기 Python DataStream | AsyncFunction을 사용한 Python DataStream API의 비차단 I/O 작업. | [비동기 I/O](https://nightlies.apache.org/flink/flink-docs-release-2.2/docs/dev/python/datastream/operators/async_io/) | 

## 커넥터 가용성
<a name="flink-2-2-connectors"></a>

Flink 2.2로 업그레이드할 때 커넥터 종속성을 Flink 2.2 런타임과 호환되는 버전으로 업데이트해야 합니다. Flink 커넥터는 Flink 런타임과 독립적으로 릴리스되며 일부 커넥터에는 아직 Flink 2.2 호환 릴리스가 없습니다. 다음 표에는 Amazon Managed Service for Apache Flink에서 일반적으로 사용되는 커넥터의 가용성이 요약되어 있습니다.


**Flink 2.2의 커넥터 가용성**  

| 커넥터 | Flink 1.20 버전 | Flink 2.0 이상 버전 | 참고 | 
| --- | --- | --- | --- | 
| Apache Kafka | flink-connector-kafka 3.4.0-1.20 | flink-connector-kafka 4.0.0-2.0 | Flink 2.2에 권장 | 
| Kinesis Data Streams(소스) | flink-connector-kinesis 5.0.0-1.20 | flink-connector-aws-kinesis-streams 6.0.0-2.0 | Flink 2.2에 권장 | 
| Kinesis Data Streams(싱크) | flink-connector-aws-kinesis-streams 5.1.0-1.20 | flink-connector-aws-kinesis-streams 6.0.0-2.0 | Flink 2.2에 권장 | 
| Amazon Data Firehose | flink-connector-aws-kinesis-firehose 5.1.0-1.20 | flink-connector-aws-kinesis-firehose 6.0.0-2.0 | Flink 2.0과 호환 | 
| Amazon DynamoDB | flink-connector-dynamodb 5.1.0-1.20 | flink-connector-dynamodb 6.0.0-2.0 | Flink 2.0과 호환 | 
|  Amazon SQS | flink-connector-sqs 5.1.0\$11.20 | flink-connector-sqs 6.0.0-2.0 | Flink 2.0과 호환 | 
| FileSystem(S3, HDFS) | Flink와 번들로 제공 | Flink와 번들로 제공 | Flink 배포에 내장 - 항상 사용 가능 | 
| JDBC | flink-connector-jdbc 3.3.0-1.20 | 2.x에 대해 아직 릴리스되지 않음 | Flink 2.x 호환 릴리스 사용 불가 | 
| OpenSearch | flink-connector-opensearch 1.2.0-1.19 | 2.x에 대해 아직 릴리스되지 않음 | Flink 2.x 호환 릴리스 사용 불가 | 
| Elasticsearch | 레거시 커넥터만 해당 | 2.x에 대해 아직 릴리스되지 않음 | OpenSearch 커넥터로 마이그레이션 고려 | 
|  – Amazon Managed Service for Prometheus | flink-connector-prometheus 1.0.0-1.20 | 2.x에 대해 아직 릴리스되지 않음 | Flink 2.x 호환 릴리스 사용 불가 | 
+ 애플리케이션이 아직 Flink 2.x 릴리스가 없는 커넥터에 의존하는 경우 커넥터가 호환 버전을 릴리스할 때까지 기다리거나 대체 버전으로 대체할 수 있는지(예: JDBC 카탈로그 또는 사용자 지정 싱크 사용) 평가하는 두 가지 옵션이 있습니다.
+ 커넥터 버전을 업데이트할 때 아티팩트 이름 변경에 유의하세요. 일부 커넥터는 메이저 버전 간에 이름이 변경되었습니다(예: Firehose 커넥터가 일부 중간 버전`flink-connector-aws-firehose`에서에서 `flink-connector-aws-kinesis-firehose` 로 변경됨).
+ [Amazon Managed Service for Apache Flink 커넥터 설명서](https://docs.aws.amazon.com/managed-flink/latest/java/how-flink-connectors.html)에서 대상 런타임에서 지원되는 정확한 아티팩트 이름 및 버전을 항상 확인하세요.

## 지원되지 않는 실험 기능
<a name="flink-2-2-unsupported"></a>

Amazon Managed Service for Apache Flink 2.2에서는 다음 기능이 지원되지 않습니다.
+ **구체화된 테이블**: 지속적으로 유지 관리되고 쿼리 가능한 테이블 스냅샷.
+ **사용자 지정 원격 측정 변경**: 사용자 지정 지표 리포터 및 원격 측정 구성.
+ **ForSt 상태 백엔드**: 분해된 상태 스토리지(오픈 소스의 실험적).
+ **Java 21**: Managed Service for Apache Flink에서 지원되지 않는 오픈 소스에서의 실험 지원.

## 알려진 문제
<a name="flink-2-2-known-issues"></a>

**Amazon Managed Service for Apache Flink Studio**

Amazon Managed Service for Apache Flink의 Flink 2.2는 Studio 애플리케이션을 지원하지 않습니다. 자세한 내용은 [Studio 노트북 생성](https://docs.aws.amazon.com/managed-flink/latest/java/how-zeppelin-creating.html)을 참조하세요.

**Kinesis 커넥터 EFO**
+ 커넥터 v5.0.0 및 v6.0.0에 도입된 EFO(Enhanced Fan-Out/SubscribeToShard) 경로와 `KinesisStreamsSource` 함께를 사용하는 애플리케이션은 Kinesis 스트림이 리샤딩될 때 실패할 수 있습니다. 이는 커뮤니티에서 알려진 문제입니다. 자세한 내용은 [FLINK-37648](https://issues.apache.org/jira/browse/FLINK-37648)을 참조하세요.
+ 커넥터 v5.0.0 및 v6.0.0에 도입된 `KinesisStreamsSource` EFO(Enhanced Fan-Out/SubscribeToShard) 경로를와 함께 사용하는 애플리케이션은 Flink 애플리케이션에 역압이 가해지면 교착 상태가 발생하여 하나 이상의 TaskManager에서 데이터 처리가 완전히 중지될 `KinesisStreamsSink` 수 있습니다. TaskManagers 애플리케이션을 복구하려면 강제 중지 작업과 애플리케이션 시작 작업이 필요합니다. 커뮤니티에서 알려진 문제의 하위 사례입니다. 자세한 내용은 [FLINK-34071](https://issues.apache.org/jira/browse/FLINK-34071)을 참조하세요.

## 업그레이드 경험
<a name="flink-2-2-upgrade"></a>

Amazon Managed Service for Apache Flink는 애플리케이션 구성, 로그, 지표, 태그 및 상태 및 바이너리가 호환되는 경우 애플리케이션 상태를 보존하는 인플레이스 버전 업그레이드를 지원합니다. 단계별 지침은 [Flink 2.2로 업그레이드: 전체 가이드](flink-2-2-upgrade-guide.md)섹션을 참조하세요.

업그레이드 중에 상태 호환성 위험을 평가하고 호환되지 않는 상태를 처리하는 방법에 대한 지침은 섹션을 참조하세요[Flink 2.2 업그레이드를 위한 상태 호환성 가이드](state-compatibility.md).

## 다음 단계
<a name="flink-2-2-next-steps"></a>
+ Flink 2.2를 처음 사용하시나요? 자세한 Apache Flink 2.2 설명서는 [Apache Flink 2.2 설명서를](https://nightlies.apache.org/flink/flink-docs-release-2.2/) 참조하세요.
+ 업그레이드를 계획하고 있나요? [Flink 2.2로 업그레이드: 전체 가이드](flink-2-2-upgrade-guide.md) 섹션을 참조하세요
+ 상태 호환성 문제? [Flink 2.2 업그레이드를 위한 상태 호환성 가이드](state-compatibility.md) 섹션을 참조하세요

질문이나 문제는 섹션을 참조[Managed Service for Apache Flink 문제 해결](troubleshooting.md)하거나 AWS Support에 문의하세요.

# Amazon Managed Service for Apache Flink 1.20
<a name="flink-1-20"></a>

Managed Service for Apache Flink은 이제 Apache Flink 버전 1.20.0을 지원합니다. 이 섹션에서는 Managed Service for Apache Flink의 Apache Flink 1.20.0을 지원하면서 도입된 새로운 주요 기능과 변경 사항을 소개합니다. Apache Flink 1.20은 마지막 1.x 릴리스이자 Flink 장기 지원(LTS) 버전이 될 것으로 예상됩니다. 자세한 내용은 [FLIP-458: Apache Flink 1.x 라인의 최종 릴리스 장기 지원](https://cwiki.apache.org/confluence/display/FLINK/FLIP-458%3A+Long-Term+Support+for+the+Final+Release+of+Apache+Flink+1.x+Line)을 참조하세요.

**참고**  
지원되는 이전 Apache Flink 버전을 사용 중이며 기존 애플리케이션을 Apache Flink 1.20.0으로 업그레이드하려는 경우, 인플레이스 Apache Flink 버전 업그레이드를 사용하여 업그레이드할 수 있습니다. 자세한 내용은 [Apache Flink에 인플레이스 버전 업그레이드 사용](how-in-place-version-upgrades.md) 단원을 참조하십시오. 인플레이스 버전 업그레이드를 사용하면 스냅샷, 로그, 지표, 태그, Flink 구성 등을 포함하여 Apache Flink 버전 전반에 걸쳐 단일 ARN을 기준으로 애플리케이션 추적성을 유지할 수 있습니다.

## 지원되는 기능
<a name="flink-1-20-0-supported-features"></a>

Apache Flink 1.20.0에서는 SQL API, DataStream API, Flink 대시보드가 개선되었습니다.


**지원되는 기능 및 관련 설명서**  

| 지원되는 기능 | 설명 | Apache Flink 설명서 참조  | 
| --- | --- | --- | 
| DISTRIBUTED BY 절 추가 | 여러 SQL 엔진이 Partitioning, Bucketing 또는Clustering의 개념을 공개합니다. Flink 1.20은 Flink에 Bucketing 개념을 도입합니다. | [FLIP-376: DISTRIBUTED BY 절 추가](https://cwiki.apache.org/confluence/display/FLINK/FLIP-376%3A+Add+DISTRIBUTED+BY+clause) | 
| DataStream API: 전체 파티션 처리 지원  | Flink 1.20은 FullPartitionWindow API를 통해 키가 지정되지 않은 스트림의 집계를 기본 지원합니다. | [FLIP-380: 키가 지정되지 않은 DataStream에서 전체 파티션 처리 지원](https://cwiki.apache.org/confluence/display/FLINK/FLIP-380%3A+Support+Full+Partition+Processing+On+Non-keyed+DataStream) | 
| Flink 대시보드에 데이터 스큐 점수 표시 | Flink 1.20 대시보드는 데이터 스큐 정보를 표시합니다. Flink 작업 그래프 UI의 각 연산자는 추가 데이터 스큐 점수를 표시합니다. | [FLIP-418: Flink 대시보드에 데이터 스큐 점수 표시](https://cwiki.apache.org/confluence/display/FLINK/FLIP-418%3A+Show+data+skew+score+on+Flink+Dashboard) | 

Apache Flink 1.20.0 릴리스 설명서는 [Apache Flink 설명서 v1.20.0](https://nightlies.apache.org/flink/flink-docs-stable/)을 참조하세요. Flink 1.20 릴리스 정보는 [릴리스 노트 - Flink 1.20](https://nightlies.apache.org/flink/flink-docs-release-1.20/release-notes/flink-1.20/)을 참조하세요.

## 구성 요소
<a name="flink-1-20-0-components"></a>


**Flink 1.20 구성 요소**  

| 구성 요소 | 버전 | 
| --- | --- | 
| Java  | 11 (권장) | 
| Python |  3.11  | 
| Kinesis Data Analytics Flink Runtime(aws-kinesisanalytics-runtime) | 1.2.0 | 
| 커넥터 | 사용 가능한 커넥터에 관한 자세한 내용은 [Apache Flink 커넥터](https://docs.aws.amazon.com/managed-flink/latest/java/how-flink-connectors.html)를 참조하세요. | 
| [Apache Beam (빔 애플리케이션만 해당)](https://aws.amazon.com/developer/language/python/) |  Flink 1.20에는 호환되는 Apache Flink 러너가 없습니다. 자세한 내용은 [Flink 버전 호환성](https://beam.apache.org/documentation/runners/flink/#flink-version-compatibility)을 참조하세요.  | 

## 알려진 문제
<a name="flink-1-20-0-known-issues"></a>

**Apache Beam**

현재 Apache Beam에는 Flink 1.20과 호환되는 Apache Flink 러너가 없습니다. 자세한 내용은 [Flink 버전 호환성](https://beam.apache.org/documentation/runners/flink/#flink-version-compatibility)을 참조하세요.

**Amazon Managed Service for Apache Flink Studio**

Amazon Managed Service for Apache Flink Studio는 Apache Zeppelin 노트북을 사용해 Apache Flink 스트림 처리 애플리케이션을 개발하고 코드를 디버깅하고 실행하기 위한 단일 인터페이스 개발 환경을 제공합니다. Flink 1.20 지원을 위해서는 Zeppelin의 Flink 인터프리터를 업그레이드해야 합니다. 이 작업은 Zeppelin 커뮤니티와 함께 진행될 예정입니다. 작업이 완료되면 이러한 참고 사항을 업데이트할 예정입니다. Amazon Managed Service for Apache Flink Studio에서는 Flink 1.15를 계속 사용할 수 있습니다. 자세한 내용은 [Studio 노트북 생성](https://docs.aws.amazon.com/managed-flink/latest/java/how-zeppelin-creating.html)을 참조하세요.

**백포트된 버그 수정**

Amazon Managed Service for Apache Flink는 주요 문제를 해결하기 위해 Flink 커뮤니티에서 제공하는 버그 수정 사항을 백포트하고 있습니다. 다음은 백포트된 버그 수정 목록입니다.


**백포트된 버그 수정**  

| Apache Flink JIRA 링크 | 설명 | 
| --- | --- | 
| [FLINK-35886](https://issues.apache.org/jira/browse/FLINK-35886) | 이 수정 사항은 하위 작업이 역압/차단된 경우 워터마크 유휴 제한 시간이 잘못 계산되는 문제를 해결합니다. | 

# Amazon Managed Service for Apache Flink 1.19
<a name="flink-1-19"></a>

Managed Service for Apache Flink은 이제 Apache Flink 버전 1.19.1을 지원합니다. 이 섹션에서는 Managed Service for Apache Flink의 Apache Flink 1.19.1을 지원하면서 도입된 새로운 주요 기능과 변경 사항을 소개합니다.

**참고**  
지원되는 이전 Apache Flink 버전을 사용 중이며 기존 애플리케이션을 Apache Flink 1.19.1로 업그레이드하려는 경우, 인플레이스 Apache Flink 버전 업그레이드를 사용하여 업그레이드할 수 있습니다. 자세한 내용은 [Apache Flink에 인플레이스 버전 업그레이드 사용](how-in-place-version-upgrades.md) 단원을 참조하십시오. 인플레이스 버전 업그레이드를 사용하면 스냅샷, 로그, 지표, 태그, Flink 구성 등을 포함하여 Apache Flink 버전 전반에 걸쳐 단일 ARN을 기준으로 애플리케이션 추적성을 유지할 수 있습니다.

## 지원되는 기능
<a name="flink-1-19-1-supported-features"></a>

Apache Flink 1.19.1은 SQL API에서 명명된 파라미터, 사용자 지정 소스 병렬 처리 그리고 여러 Flink 연산자에 대해 서로 다른 상태 TTL을 설정할 수 있는 기능 등 다양한 개선 사항을 제공합니다.


**지원되는 기능 및 관련 설명서**  

| 지원되는 기능 | 설명 | Apache Flink 설명서 참조  | 
| --- | --- | --- | 
| SQL API: SQL 힌트를 사용한 서로 다른 상태 TTL 구성 지원 | 이제 사용자는 스트림 정규 조인 및 그룹 집계에서 상태 TTL을 구성할 수 있습니다. | [FLIP-373: SQL 힌트를 사용한 서로 다른 상태 TTL 구성](https://cwiki.apache.org/confluence/display/FLINK/FLIP-373%3A+Support+Configuring+Different+State+TTLs+using+SQL+Hint) | 
| SQL API: 함수 및 프로시저를 직접적으로 호출하기 위한 명명된 파라미터 지원 | 이제 사용자는 파라미터 순서에 의존하지 않고 명명된 파라미터를 사용할 수 있습니다. | [FLIP-378: 함수 및 프로시저를 직접적으로 호출하기 위한 명명된 파라미터 지원](https://cwiki.apache.org/confluence/display/FLINK/FLIP-387%3A+Support+named+parameters+for+functions+and+call+procedures) | 
| SQL API: SQL 소스의 병렬 처리 설정 | 이제 사용자는 SQL 소스의 병렬 처리를 지정할 수 있습니다. | [FLIP-367: 테이블/SQL 소스의 병렬 처리 설정 지원](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=263429150) | 
| SQL API: 세션 창 TVF 지원 | 이제 사용자는 세션 창 테이블 값 함수를 사용할 수 있습니다. | [FLINK-24024: 세션 창 TVF 지원](https://issues.apache.org/jira/browse/FLINK-24024) | 
| SQL API: 창 TVF 집계의 변경 로그 입력 지원 | 이제 사용자는 변경 로그 입력에 대해 창 집계를 할 수 있습니다. | [FLINK-20281: 변경 로그 스트림 입력을 지원하는 창 집계](https://issues.apache.org/jira/browse/FLINK-20281) | 
|  Python 3.11 지원  | Flink는 Python 3.11을 지원하며, 이는 Python 3.10 대비 약 10\$160% 더 빠릅니다. 자세한 내용은 [Python 3.11의 새로운 기능](https://docs.python.org/3/whatsnew/3.11.html#summary-release-highlights)을 참조하세요. | [FLINK-33030: Python 3.11 지원 추가](https://issues.apache.org/jira/browse/FLINK-33030) | 
| TwoPhaseCommitting 싱크 지표 제공 | 사용자는 2단계 커미팅 싱크에서 커미터 상태와 관련된 통계를 확인할 수 있습니다. | [FLIP-371: TwoPhaseCommittingSink의 커미터 생성에 초기화 컨텍스트 제공](https://cwiki.apache.org/confluence/display/FLINK/FLIP-371%3A+Provide+initialization+context+for+Committer+creation+in+TwoPhaseCommittingSink) | 
|  작업 재시작 및 체크포인팅을 위한 트레이스 리포터  | 이제 사용자는 체크포인트 지속 시간 및 복구 추세와 관련된 트레이스를 모니터링할 수 있습니다. Amazon Managed Service for Apache Flink에서는 Slf4j 트레이스 리포터가 기본 활성화되어 있어, 애플리케이션 CloudWatch Logs를 통해 체크포인트 및 작업 트레이스를 모니터링할 수 있습니다. | [FLIP-384: TraceReporter를 도입하고 이를 사용하여 체크포인팅 및 복구 트레이스 생성](https://cwiki.apache.org/confluence/display/FLINK/FLIP-384%3A+Introduce+TraceReporter+and+use+it+to+create+checkpointing+and+recovery+traces) | 

**참고**  
[지원 사례](https://console.aws.amazon.com/support/home#/) 제출을 통해 다음 기능으로 옵트인할 수 있습니다.


**옵트인 기능 및 관련 설명서**  

| 옵트인 기능 | 설명 | Apache Flink 설명서 참조  | 
| --- | --- | --- | 
| 소스가 백로그를 처리하는 동안 더 긴 체크포인팅 간격을 사용할 수 있도록 지원 | 이 기능은 작업 요구 사항에 맞게 구성을 조정해야 하므로 옵트인 방식으로 제공됩니다. | [FLIP-309: 소스가 백로그를 처리하는 동안 더 긴 체크포인팅 간격을 사용할 수 있도록 지원](https://cwiki.apache.org/confluence/display/FLINK/FLIP-309%3A+Support+using+larger+checkpointing+interval+when+source+is+processing+backlog) | 
| System.out 및 System.err을 Java 로그로 리디렉션 | 이 기능은 옵트인 기능입니다. Amazon Managed Service for Apache Flink에서는 프로덕션에서 기본 Java 로거 사용이 모범 사례이므로 System.out 및 System.err 출력은 기본적으로 무시됩니다. | [FLIP-390: System out 및 err를 LOG로 리디렉션하거나 폐기하도록 지원](https://cwiki.apache.org/confluence/display/FLINK/FLIP-390%3A+Support+System+out+and+err+to+be+redirected+to+LOG+or+discarded) | 

Apache Flink 1.19.1 릴리스 설명서는 [Apache Flink 설명서 v1.19.1](https://nightlies.apache.org/flink/flink-docs-stable/)을 참조하세요.

## Amazon Managed Service for Apache Flink 1.19.1의 변경 사항
<a name="flink-1-19-1-known-issues"></a>

**기본적으로 활성화되어 있는 트레이스 리포터 로깅**

Apache Flink 1.19.1에서는 체크포인트 및 복구 트레이스를 도입하여 사용자가 체크포인트 및 작업 복구 문제를 디버깅하는 데 도움이 됩니다. Amazon Managed Service for Apache Flink에서는 이러한 트레이스가 CloudWatch 로그 스트림에 기록되어 작업 초기화 소요 시간 분석과 체크포인트 크기 이력 기록이 가능합니다.

**이제 지수 지연 방식으로 전환된 기본 재시작 전략**

Apache Flink 1.19.1에서는 이 지수 지연 재시작 전략이 크게 개선되었습니다. Amazon Managed Service for Apache Flink에서도 Flink 1.19.1부터 기본적으로 지수 지연 재시작 전략을 사용합니다. 이를 통해 사용자 작업은 일시적 오류에서 더 빠르게 복구되며, 재시작이 반복될 경우 외부 시스템에 과부하가 발생하는 것을 방지할 수 있습니다.

**백포트된 버그 수정**

Amazon Managed Service for Apache Flink는 주요 문제를 해결하기 위해 Flink 커뮤니티에서 제공하는 버그 수정 사항을 백포트하고 있습니다. 따라서 런타임은 Apache Flink 1.19.1 원본 릴리스와 일부 다를 수 있습니다. 다음은 백포트된 버그 수정 목록입니다.


**백포트된 버그 수정**  

| Apache Flink JIRA 링크 | 설명 | 
| --- | --- | 
| [FLINK-35531](https://issues.apache.org/jira/browse/FLINK-35531) | 이 수정 사항은 1.17.0에서 도입된 성능 회귀로 인해 HDFS에 대한 쓰기 속도가 느려지는 문제를 해결합니다. | 
| [FLINK-35157](https://issues.apache.org/jira/browse/FLINK-35157) | 이 수정 사항은 워터마크 정렬을 사용하는 소스에서 완료된 하위 작업을 만나면 Flink 작업이 멈추는 문제를 해결합니다. | 
| [FLINK-34252](https://issues.apache.org/jira/browse/FLINK-34252) | 이 수정 사항은 잘못된 IDLE 워터마크 상태를 생성하게 하던 워터마크 생성 문제를 해결합니다. | 
| [FLINK-34252](https://issues.apache.org/jira/browse/FLINK-34252) | 이 수정 사항은 시스템 직접 호출을 줄여 워터마크 생성 중 발생하던 성능 회귀 문제를 해결합니다. | 
| [FLINK-33936](https://issues.apache.org/jira/browse/FLINK-33936) | 이 수정 사항은 Table API에서 미니 배치 집계 중 중복 레코드가 발생하는 문제를 해결합니다. | 
| [FLINK-35498](https://issues.apache.org/jira/browse/FLINK-35498) | 이 수정 사항은 Table API UDF에서 명명된 파라미터를 정의할 때 인수 이름 충돌이 발생하는 문제를 해결합니다. | 
| [FLINK-33192](https://issues.apache.org/jira/browse/FLINK-33192) | 이 수정 사항은 타이머가 적절히 정리되지 않아 창 연산자에서 상태 메모리 누수가 발생하던 문제를 해결합니다. | 
| [FLINK-35069](https://issues.apache.org/jira/browse/FLINK-35069) | 이 수정 사항은 창 종료 시 타이머를 트리거하는 과정에서 Flink 작업이 멈추는 문제를 해결합니다. | 
| [FLINK-35832](https://issues.apache.org/jira/browse/FLINK-35832) | 이 수정 사항은 IFNULL이 잘못된 결과를 반환하는 문제를 해결합니다. | 
| [FLINK-35886](https://issues.apache.org/jira/browse/FLINK-35886) | 이 수정 사항은 역압된 작업이 유휴 상태로 잘못 인식되는 문제를 해결합니다. | 

## 구성 요소
<a name="flink-1-19-1-components"></a>


****  

| 구성 요소 | 버전 | 
| --- | --- | 
| Java  | 11 (권장) | 
| Python |  3.11  | 
| Kinesis Data Analytics Flink Runtime(aws-kinesisanalytics-runtime) | 1.2.0 | 
| 커넥터 | 사용 가능한 커넥터에 관한 자세한 내용은 [Apache Flink 커넥터](https://docs.aws.amazon.com/managed-flink/latest/java/how-flink-connectors.html)를 참조하세요. | 
| [Apache Beam (빔 애플리케이션만 해당)](https://aws.amazon.com/developer/language/python/) |  버전 2.61.0부터 지원됩니다. 자세한 내용은 [Flink 버전 호환성](https://beam.apache.org/documentation/runners/flink/#flink-version-compatibility)을 참조하세요.  | 

## 알려진 문제
<a name="flink-1-19-other-issues"></a>

**Amazon Managed Service for Apache Flink Studio**

Studio는 Apache Zeppelin 노트북을 활용하여 Apache Flink 스트림 처리 애플리케이션을 개발하고 코드를 디버깅하고 실행하기 위한 단일 인터페이스 개발 환경을 제공합니다. Flink 1.19 지원을 위해서는 Zeppelin의 Flink 인터프리터를 업그레이드해야 합니다. 이 작업은 Zeppelin 커뮤니티와 함께 진행될 예정이며, 완료되는 대로 이 노트를 업데이트할 예정입니다. Amazon Managed Service for Apache Flink Studio에서는 Flink 1.15를 계속 사용할 수 있습니다. 자세한 내용은 [Studio 노트북 생성](https://docs.aws.amazon.com/managed-flink/latest/java/how-zeppelin-creating.html)을 참조하세요.

# Amazon Managed Service for Apache Flink 1.18
<a name="flink-1-18"></a>

 Managed Service for Apache Flink은 이제 Apache Flink 버전 1.18.1을 지원합니다. Managed Service for Apache Flink에서 Apache Flink 1.18.1을 지원하면서 도입된 주요 신규 기능과 변경 사항을 확인해 보세요.

**참고**  
지원되는 이전 Apache Flink 버전을 사용 중이며 기존 애플리케이션을 Apache Flink 1.18.1로 업그레이드하려는 경우, 인플레이스 Apache Flink 버전 업그레이드를 사용하여 업그레이드할 수 있습니다. 인플레이스 버전 업그레이드를 사용하면 스냅샷, 로그, 지표, 태그, Flink 구성 등을 포함하여 Apache Flink 버전 전반에 걸쳐 단일 ARN을 기준으로 애플리케이션 추적성을 유지할 수 있습니다. 이 기능은 `RUNNING` 및 `READY` 상태에서 사용할 수 있습니다. 자세한 내용은 [Apache Flink에 인플레이스 버전 업그레이드 사용](how-in-place-version-upgrades.md) 단원을 참조하십시오.


**Apache Flink 설명서 참조로 지원되는 기능**  

| 지원 기능 | 설명 | Apache Flink 설명서 참조  | 
| --- | --- | --- | 
| Opensearch 커넥터 | 이 커넥터에는 at-least-once 전달을 보장하는 싱크가 포함되어 있습니다. | [github: Opensearch 커넥터](https://github.com/apache/flink-connector-opensearch/blob/main/docs/content/docs/connectors/datastream/opensearch.md) | 
| Amazon DynamoDB 커넥터 | 이 커넥터에는 at-least-once 전달을 보장하는 싱크가 포함되어 있습니다. | [Amazon DynamoDB 싱크](https://nightlies.apache.org/flink/flink-docs-master/docs/connectors/datastream/dynamodb/) | 
| MongoDB 커넥터 | 이 커넥터에는 at-least-once 전달을 보장하는 소스와 싱크가 포함되어 있습니다. | [MongoDB 커넥터](https://nightlies.apache.org/flink/flink-docs-master/docs/connectors/datastream/mongodb/) | 
| Hive와 Flink 플래너 분리 |  추가 JAR 교체 없이 Hive 방언을 직접 사용할 수 있습니다.  | [FLINK-26603: Hive와 Flink 플래너 분리](https://issues.apache.org/jira/browse/FLINK-26603) | 
| 기본적으로 RocksDBWriteBatchWrapper에서 WAL 비활성화 |  이렇게 하면 복구 시간이 단축됩니다.  | [FLINK-32326: 기본적으로 RocksDBWriteBatchWrapper에서 WAL 비활성화](https://issues.apache.org/jira/browse/FLINK-32326) | 
|  워터마크 정렬 활성화 시 워터마크 집계 성능 개선  |  워터마크 정렬을 사용하도록 하면 워터마크 집계 성능을 개선하고 관련 벤치마크를 추가합니다.  | [FLINK-32524: 워터마크 집계 성능](https://issues.apache.org/jira/browse/FLINK-32420) | 
| 프로덕션 환경 사용을 위한 워터마크 정렬 지원 | 대규모 작업이 JobManager를 과부하시킬 위험 제거 | [FLINK-32548: 워터마크 정렬 준비](https://issues.apache.org/jira/browse/FLINK-32548) | 
|  비동기 싱크를 위한 구성 가능한 RateLimitingStrategy  |  RateLimitingStrategy를 사용하면 무엇을, 언제, 얼마나 규모 조정할지를 구성할 수 있습니다.  | [FLIP-242: 비동기 싱크를 위한 구성 가능한 RateLimitingStrategy 도입](https://cwiki.apache.org/confluence/display/FLINK/FLIP-242%3A+Introduce+configurable+RateLimitingStrategy+for+Async+Sink) | 
|  테이블 및 열 통계 대량 가져오기  | 쿼리 성능이 개선되었습니다. | [FLIP-247: 지정된 파티션에 대한 표 및 열 통계 대량 가져오기](https://cwiki.apache.org/confluence/display/FLINK/FLIP-247%3A+Bulk+fetch+of+table+and+column+statistics+for+given+partitions) | 

Apache Flink 1.18.1 릴리스 설명서는 [Apache Flink 1.18.1 릴리스 발표](https://flink.apache.org/2024/01/19/apache-flink-1.18.1-release-announcement/)를 참조하세요.

## Apache Flink 1.18을 사용한 Amazon Managed Service for Apache Flink의 변경 사항
<a name="flink-1-15-2-known-issues"></a>

**Pekko로 Akka 교체**

 Apache Flink는 Apache Flink 1.18에서 Akka를 Pekko로 교체했습니다. 이 변경 사항은 Apache Flink 1.18.1부터 Amazon Managed Service for Apache Flink에서 완전히 지원됩니다. 이 변경으로 인해 애플리케이션을 수정할 필요는 없습니다. 자세한 내용은 [FLINK-32468: Akka를 Pekko로 대체](https://issues.apache.org/jira/browse/FLINK-32468)를 참조하세요.

**스레드 모드에서 PyFlink 런타임 실행 지원**

이번 Apache Flink 변경 사항은 PyFlink 런타임 프레임워크에 새로운 실행 모드인 프로세스 모드를 도입합니다. 프로세스 모드에서는 별도의 프로세스가 아닌 동일한 스레드에서 Python 사용자 정의 함수를 실행할 수 있습니다.

**백포트된 버그 수정**

Amazon Managed Service for Apache Flink는 주요 문제를 해결하기 위해 Flink 커뮤니티에서 제공하는 버그 수정 사항을 백포트하고 있습니다. 따라서 런타임은 Apache Flink 1.18.1 원본 릴리스와 일부 다를 수 있습니다. 다음은 백포트된 버그 수정 목록입니다.


**백포트된 버그 수정**  

| Apache Flink JIRA 링크 | 설명 | 
| --- | --- | 
| [FLINK-33863](https://issues.apache.org/jira/browse/FLINK-33863) | 이 수정 사항은 압축된 스냅샷에서 상태 복원이 실패하는 문제를 해결합니다. | 
| [FLINK-34063](https://issues.apache.org/jira/browse/FLINK-34063) | 이 수정 사항은 스냅샷 압축을 활성화했을 때 소스 연산자가 스플릿을 잃어버리는 문제를 해결합니다. Apache Flink는 모든 체크포인트 및 저장점에 대해 선택적 압축 기능(기본값: 꺼짐)을 제공합니다. Apache Flink는 Flink 1.18.1에서 스냅샷 압축이 활성화된 경우 연산자 상태가 올바르게 복원되지 않는 버그를 확인했습니다. 이 문제는 데이터 손실 또는 체크포인트 복원 불가 상태로 이어질 수 있습니다. | 
| [FLINK-35069](https://issues.apache.org/jira/browse/FLINK-35069) | 이 수정 사항은 창 종료 시 타이머를 트리거하는 과정에서 Flink 작업이 멈추는 문제를 해결합니다. | 
| [FLINK-35097](https://issues.apache.org/jira/browse/FLINK-35097) | 이 수정 사항은 Table API Filesystem 커넥터에서 원시 형식을 사용할 때 중복 레코드가 생성되는 문제를 해결합니다. | 
| [FLINK-34379](https://issues.apache.org/jira/browse/FLINK-34379) | 이 수정 사항은 동적 테이블 필터링을 활성화했을 때 OutOfMemoryError가 발생하는 문제를 해결합니다. | 
| [FLINK-28693](https://issues.apache.org/jira/browse/FLINK-28693) | 이 수정 사항은 워터마크에 columnBy 표현식이 포함된 경우 Table API가 그래프를 생성하지 못하는 문제를 해결합니다. | 
| [FLINK-35217](https://issues.apache.org/jira/browse/FLINK-35217) | 이 수정 사항은 특정 Flink 작업 실패 모드에서 체크포인트가 손상되는 문제를 해결합니다. | 

## 구성 요소
<a name="flink-1-15-2-components"></a>


****  

| 구성 요소 | 버전 | 
| --- | --- | 
| Java  | 11 (권장) | 
| Scala |  버전 1.15부터 Flink는 Scala에 구애받지 않습니다. 참조로 MSF Flink 1.18은 Scala 3.3(LTS)에 대해 검증되었습니다.  | 
| Managed Service for Apache Flink Flink Runtime (aws-kinesisanalytics-runtime) | 1.2.0 | 
| [AWS Kinesis Connector(flink-connector-kinesis)[소스]](https://mvnrepository.com/artifact/org.apache.flink/flink-connector-kinesis/4.2.0-1.18) | 4.2.0-1.18 | 
| [AWS Kinesis Connector(flink-connector-kinesis)[싱크]](https://mvnrepository.com/artifact/org.apache.flink/flink-connector-aws-kinesis-streams/4.2.0-1.18) | 4.2.0-1.18 | 
| [Apache Beam (빔 애플리케이션만 해당)](https://aws.amazon.com/developer/language/python/) |  버전 2.57.0부터 지원됩니다. 자세한 내용은 [Flink 버전 호환성](https://beam.apache.org/documentation/runners/flink/#flink-version-compatibility)을 참조하세요.  | 

## 알려진 문제
<a name="flink-1-18-known-issues"></a>

**Amazon Managed Service for Apache Flink Studio**

Studio는 Apache Zeppelin 노트북을 활용하여 Apache Flink 스트림 처리 애플리케이션을 개발하고 코드를 디버깅하고 실행하기 위한 단일 인터페이스 개발 환경을 제공합니다. Flink 1.18 지원을 위해서는 Zeppelin의 Flink 인터프리터를 업그레이드해야 합니다. 이 작업은 Zeppelin 커뮤니티와 함께 진행될 예정이며, 완료되는 대로 이 노트를 업데이트할 예정입니다. Amazon Managed Service for Apache Flink Studio에서는 Flink 1.15를 계속 사용할 수 있습니다. 자세한 내용은 [Studio 노트북 생성](https://docs.aws.amazon.com/managed-flink/latest/java/how-zeppelin-creating.html)을 참조하세요.

**하위 작업이 역압될 때 워터마크 유휴 상태가 잘못 계산되는 문제**

하위 작업이 역압될 때 워터마크 생성 과정에서 알려진 문제가 있으며, 이는 Flink 1.19부터 수정되었습니다. 이 문제는 Flink 작업 그래프가 역압될 때 지연 레코드 수가 급증하는 형태로 나타날 수 있습니다. 이 문제를 해결하려면 최신 Flink 버전으로 업그레이드할 것을 권장합니다. 자세한 내용은 [하위 작업이 역압 및 차단되는 경우 잘못된 워터마크 유휴 시간 초과 기록](https://issues.apache.org/jira/browse/FLINK-35886)을 참조하세요.

# Amazon Managed Service for Apache Flink 1.15
<a name="flink-1-15-2"></a>

 Managed Service for Apache Flink는 Apache 1.15.2의 다음 신규 기능을 지원합니다.


****  

| 기능 | 설명 | Apache Flip 참조  | 
| --- | --- | --- | 
| 비동기식 싱크  | 개발자가 이전 작업의 절반 미만으로 사용자 지정 AWS 커넥터를 빌드할 수 있도록 하는 비동기 대상을 빌드하기 위한 AWS 기여 프레임워크입니다. 자세한 내용은 [일반 비동기식 베이스 싱크](https://flink.apache.org/2022/05/06/async-sink-base.html)를 참조하세요. | [FLIP-171: 비동기 싱크](https://cwiki.apache.org/confluence/display/FLINK/FLIP-171%3A+Async+Sink). | 
| Kinesis Data Firehose Sink  | AWS 는 비동기 프레임워크를 사용하여 새로운 Amazon Kinesis Firehose Sink를 제공했습니다. | [Amazon Kinesis Data Firehose Sink](https://nightlies.apache.org/flink/flink-docs-release-1.15//docs/connectors/datastream/firehose/) | 
| 세이브 포인트로 중지  | 세이브 포인트로 중지는 클린 스탑 오퍼레이션을 보장하며, 가장 중요한 것은 이를 신뢰하는 고객을 위해 정확히 한 번의 시맨틱을 지원한다는 것입니다. | [FLIP-34: 세이브 포인트를 사용하여 작업을 종료/일시 중단합니다](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=103090212). | 
| Scala 디커플링  | 이제 사용자는 Scala 3을 포함한 모든 Scala 버전에서 Java API를 활용할 수 있습니다. 고객은 Scala 애플리케이션에 원하는 Scala 표준 라이브러리를 번들로 제공해야 합니다. | [FLIP-28: 스칼라 없는 플링크 테이블을 만드는 장기 목표.](https://cwiki.apache.org/confluence/display/FLINK/FLIP-28%3A+Long-term+goal+of+making+flink-table+Scala-free) | 
| Scala | 위의 Scala 디커플링을 참조하세요. | [FLIP-28: 스칼라 없는 플링크 테이블을 만드는 장기 목표.](https://cwiki.apache.org/confluence/display/FLINK/FLIP-28%3A+Long-term+goal+of+making+flink-table+Scala-free) | 
| 통합 커넥터 지표 | Flink는 작업, 작업 및 연산자에 대한 [표준 지표를 정의](https://nightlies.apache.org/flink/flink-docs-release-1.15//docs/ops/metrics/)했습니다. Managed Service for Apache Flink는 싱크 및 소스 지표를 계속 지원할 예정이며, 1.15에서는 numRestarts을(를) 가용성 지표fullRestarts와 병행하여 도입될 예정입니다. | [FLIP-33: 커넥터 지표의 표준화](https://cwiki.apache.org/confluence/display/FLINK/FLIP-33%3A+Standardize+Connector+Metrics) 및 [FLIP-179: 표준화된 운영자 지표 공개](https://cwiki.apache.org/confluence/display/FLINK/FLIP-179%3A+Expose+Standardized+Operator+Metrics). | 
| 완료된 작업 체크포인트  | 이 기능은 Flink 1.15에서 기본적으로 활성화되어 있으며, 작업 그래프의 일부가 모든 데이터 처리를 완료한 경우에도 체크포인트를 계속 수행할 수 있습니다. 이는 제한된 (일괄 처리) 소스가 포함된 경우 발생할 수 있습니다. | [FLIP-147: 작업 완료 후 체크포인트를 지원합니다](https://cwiki.apache.org/confluence/display/FLINK/FLIP-147%3A+Support+Checkpoints+After+Tasks+Finished). | 

## Apache Flink 1.15를 사용하는 Amazon Managed Service for Apache Flink의 변경 사항
<a name="flink-1-15-2-changes"></a>

**Studio 노트북**

이제 Managed Service for Apache Flink Studio가 Apache Flink 1.15를 지원합니다. Managed Service for Apache Flink Studio는 Apache Zeppelin 노트북을 활용하여 Apache Flink 스트림 처리 애플리케이션을 개발, 디버깅 및 실행하기 위한 단일 인터페이스 개발 환경을 제공합니다. Managed Service for Apache Flink Studio 및 시작 방법에 대한 자세한 내용은 [Managed Service for Apache Flink와 함께 Studio 노트북 사용](how-notebook.md)에서 확인할 수 있습니다.

**EFO 커넥터**

Managed Service for Apache Flink 버전 1.15로 업그레이드할 때는 최신 EFO 커넥터(모든 버전 1.15.3 이상)를 사용하고 있는지 확인하세요. 이유에 대한 자세한 내용은 [FLINK-29324](https://issues.apache.org/jira/browse/FLINK-29324 ) 항목을 참조하세요.

**Scala 디커플링**

Flink 1.15.2부터 Scala 애플리케이션에 원하는 Scala 표준 라이브러리를 번들로 제공해야 합니다.

**Kinesis Data Firehose Sink **

Managed Service for Apache Flink 버전 1.15로 업그레이드할 때는 최신 [Amazon Kinesis Data Firehose Sink](https://nightlies.apache.org/flink/flink-docs-release-1.15//docs/connectors/datastream/firehose/)를 사용하고 있는지 확인하세요.

**Kafka 커넥터**

Apache Flink 버전 1.15용 Amazon Managed Service for Apache Flink로 업그레이드할 때 최신 Kafka 커넥터 API를 사용하고 있는지 확인하세요. Apache Flink는 [FlinkKafkaConsumer](https://nightlies.apache.org/flink/flink-docs-master/docs/connectors/datastream/kafka/#kafka-consumer) 및 [FlinkKafkaProducer](https://nightlies.apache.org/flink/flink-docs-master/docs/connectors/datastream/kafka/#kafka-producer)를 더 이상 사용하지 않습니다. Kafka 싱크용 이러한 API는 Flink 1.15용 Kafka를 커밋할 수 없습니다. [KafkaSource](https://nightlies.apache.org/flink/flink-docs-master/docs/connectors/datastream/kafka/#kafka-source)와 [KafkaSink](https://nightlies.apache.org/flink/flink-docs-master/docs/connectors/datastream/kafka/#kafka-sink)를 사용하고 있는지 확인하세요.

## 구성 요소
<a name="flink-1-15-2-components"></a>


****  

| 구성 요소 | 버전 | 
| --- | --- | 
| Java  | 11 (권장) | 
| Scala | 2.12 | 
| Managed Service for Apache Flink Flink Runtime (aws-kinesisanalytics-runtime) | 1.2.0 | 
| [AWS Kinesis Connector(flink-connector-kinesis)](https://mvnrepository.com/artifact/org.apache.flink/flink-connector-kinesis/1.15.4) | 1.15.4 | 
| [Apache Beam (빔 애플리케이션만 해당)](https://aws.amazon.com/developer/language/python/) | 2.33.0(Jackson 버전 2.12.2 포함) | 

## 알려진 문제
<a name="flink-1-15-known-issues"></a>

**브로커 재시작 후 Kafka 커밋이 체크포인트에서 반복적으로 실패**

Flink 버전 1.15의 Apache Kafka 커넥터에는 Kafka Client 2.8.1의 심각한 오픈 소스 Kafka Client 버그로 인해 발생하는 알려진 오픈 소스 Apache Flink 문제가 있습니다. 자세한 내용은 [브로커 재시작 후 Kafka 커밋이 체크포인트에서 반복적으로 실패](https://issues.apache.org/jira/browse/FLINK-28060) 및 [commitOffsetAsync 예외 후 KafkaConsumer가 그룹 코디네이터에 대한 연결을 복원할 수 없음](https://issues.apache.org/jira/browse/KAFKA-13840)을 참조하세요.

이 문제를 방지하려면 Amazon Managed Service for Apache Flink에서 Apache Flink 1.18 이상을 사용하는 것을 권장합니다.

# Managed Service for Apache Flink에 대한 이전 버전 정보
<a name="earlier"></a>

**참고**  
Apache Flink 버전 1.6, 1.8 및 1.11은 3년 이상 Apache Flink 커뮤니티에서 지원되지 않습니다. 이 변경 사항은 2024년 6월과 2024년 10월에 공지되었으며 이제 Amazon Managed Service for Apache Flink에서도 이러한 버전에 대한 지원을 종료합니다.  
2025년 7월 14일부터 애플리케이션을 중지하고 준비 상태로 전환할 예정입니다. 이때 애플리케이션을 다시 시작하여 애플리케이션을 정상적으로 계속 사용할 수 있지만 서비스 제한이 적용됩니다.
2025년 7월 28일부터 애플리케이션을 시작할 수 있는 기능이 비활성화됩니다. 이 시점부터는 Flink 버전 1.6 애플리케이션을 시작하거나 운영할 수 없습니다.
Apache Flink 버전 1.6, 1.8, 1.11을 사용하는 기존 애플리케이션은 즉시 Apache Flink 버전 1.20으로 업그레이드할 것을 권장합니다. 이는 가장 최근에 지원되는 Flink 버전입니다. Amazon Managed Service for Apache Flink의 인플레이스 버전 업그레이드 기능을 사용하면 애플리케이션을 업그레이드할 수 있습니다. 자세한 내용은 [Apache Flink에 인플레이스 버전 업그레이드 사용](how-in-place-version-upgrades.md) 단원을 참조하십시오.  
추가 질문이나 우려 사항이 있는 경우 [AWS Support](https://aws.amazon.com/support)에 문의하세요.

**참고**  
Apache Flink 버전 **1.13**은 3년 이상 Apache Flink 커뮤니티의 지원을 받지 못했습니다. 이 버전에 대한 Amazon Managed Service for Apache Flink 지원은 **2025년 10월 16일**에 종료할 예정입니다. 이 날짜 이후에는 Amazon Managed Service for Apache Flink에서 Apache Flink 1.13 버전을 사용하는 애플리케이션을 생성, 시작 또는 실행할 수 없습니다.  
Managed Service for Apache Flink의 인플레이스 버전 업그레이드 기능을 사용하면 애플리케이션 상태를 유지한 채 업그레이드할 수 있습니다. 자세한 내용은 [Apache Flink에 인플레이스 버전 업그레이드 사용](how-in-place-version-upgrades.md) 단원을 참조하십시오.

버전 **1.15.2**는 Managed Service for Apache Flink에서 지원되지만, Apache Flink 커뮤니티에서는 더 이상 지원되지 않습니다.

**Topics**
+ [Apache Flink Kinesis 스트림 커넥터를 이전 Apache Flink 버전과 함께 사용](#how-creating-apps-building-kinesis)
+ [Apache Flink 1.8.2를 사용한 애플리케이션 구축](#earlier-buildingapps-1_8)
+ [Apache Flink 1.6.2를 사용한 애플리케이션 구축](#earlier-buildingapps-1_6)
+ [애플리케이션 업그레이드](#earlier-upgrading)
+ [Apache Flink 1.6.2 및 1.8.2에서 사용 가능한 커넥터](#earlier-connectors)
+ [시작하기: Flink 1.13.2](#getting-started-1-13)
+ [시작하기: Flink 1.11.1 - 사용 중단](#earlier-gs-1_11)
+ [시작하기: Flink 1.8.2 - 사용 중단](#earlier-gs-1_8)
+ [시작하기: Flink 1.6.2 - 사용 중단](#earlier-gs-1_6)
+ [Managed Service for Apache Flink의 이전 버전(레거시) 예제](#legacy-examples)

## Apache Flink Kinesis 스트림 커넥터를 이전 Apache Flink 버전과 함께 사용
<a name="how-creating-apps-building-kinesis"></a>

Apache Flink Kinesis Streams 커넥터는 버전 1.11 이전의 Apache Flink에 포함되지 않았습니다. 애플리케이션에서 Apache Flink Kinesis 커넥터를 이전 버전의 Apache Flink와 함께 사용하려면 애플리케이션에서 사용하는 Apache Flink 버전을 다운로드, 컴파일 및 설치해야 합니다. 이 커넥터는 애플리케이션 소스로 사용되는 Kinesis 스트림의 데이터를 사용하거나 애플리케이션 출력에 사용되는 Kinesis 스트림에 데이터를 쓰는 데 사용됩니다.

**참고**  
[KPL 버전 0.14.0](https://mvnrepository.com/artifact/com.amazonaws/amazon-kinesis-producer/0.14.0) 이상으로 커넥터를 구축하고 있는지 확인하세요.

Apache Flink 버전 1.8.2 소스 코드를 다운로드하고 설치하려면 다음을 수행하세요.

1. [Apache Maven](https://maven.apache.org/)이 설치되어 있고 `JAVA_HOME` 환경 변수가 JRE가 아닌 JDK인지 확인하세요. 다음 명령을 사용하여 Apache Maven 설치를 테스트할 수 있습니다.

   ```
   mvn -version
   ```

1. Apache Flink 버전 1.8.2 소스 코드를 다운로드하세요.

   ```
   wget https://archive.apache.org/dist/flink/flink-1.8.2/flink-1.8.2-src.tgz
   ```

1. Apache Flink 소스 코드 압축 해제:

   ```
   tar -xvf flink-1.8.2-src.tgz
   ```

1. Apache Flink 소스 코드 디렉토리로 변경:

   ```
   cd flink-1.8.2
   ```

1. Apache Flink 컴파일 및 설치:

   ```
   mvn clean install -Pinclude-kinesis -DskipTests
   ```
**참고**  
Microsoft Windows에서 Flink를 컴파일하는 경우 `-Drat.skip=true` 파라미터를 추가해야 합니다.

## Apache Flink 1.8.2를 사용한 애플리케이션 구축
<a name="earlier-buildingapps-1_8"></a>

이 섹션에는 Apache Flink 1.8.2와 작동되는 Managed Service for Apache Flink 애플리케이션을 구축하는 데 사용하는 구성 요소에 대한 정보가 포함되어 있습니다.

Managed Service for Apache Flink 애플리케이션에 다음 구성 요소 버전을 사용하세요.


****  

| 구성 요소 | 버전 | 
| --- | --- | 
| Java | 1.8 (권장) | 
| Apache Flink | 1.8.2 | 
| Flink 런타임용 Managed Service for Apache Flink(aws-kinesisanalytics-runtime) | 1.0.1 | 
| Managed Service for Apache Flink Flink 커넥터(aws-kinesisanalytics-flink) | 1.0.1 | 
| Apache Maven | 3.1 | 

Apache Flink 1.8.2를 사용하여 애플리케이션을 컴파일하려면 다음 파라미터를 사용하여 Maven을 실행하세요.

```
mvn package -Dflink.version=1.8.2
```

Apache Flink 버전 1.8.2를 사용하는 Managed Service for Apache Flink 애플리케이션의 `pom.xml` 파일 예는 [Managed Service for Apache Flink 1.8.2 시작하기 애플리케이션](https://github.com/aws-samples/amazon-managed-service-for-apache-flink-examples/blob/master/GettingStarted_1_8/pom.xml)을 참조하세요.

Managed Service for Apache Flink 애플리케이션의 애플리케이션 코드를 구축하고 사용하는 방법에 대한 자세한 내용을 알아보려면 [애플리케이션 만들기](how-creating-apps.md) 섹션을 참조하세요.

## Apache Flink 1.6.2를 사용한 애플리케이션 구축
<a name="earlier-buildingapps-1_6"></a>

이 섹션에는 Apache Flink 1.6.2와 작동하는 Managed Service for Apache Flink 애플리케이션을 구축하는 데 사용하는 구성 요소에 대한 정보가 포함되어 있습니다.

Managed Service for Apache Flink 애플리케이션에 다음 구성 요소 버전을 사용하세요.


****  

| 구성 요소 | 버전 | 
| --- | --- | 
| Java | 1.8 (권장) | 
| AWS Java SDK | 1.11.379 | 
| Apache Flink | 1.6.2 | 
| Flink 런타임용 Managed Service for Apache Flink(aws-kinesisanalytics-runtime) | 1.0.1 | 
| Managed Service for Apache Flink Flink 커넥터(aws-kinesisanalytics-flink) | 1.0.1 | 
| Apache Maven | 3.1 | 
| Apache Beam | Apache Flink 1.6.2에서는 지원되지 않습니다. | 

**참고**  
Managed Service for Apache Flink 런타임 버전 **1.0.1**을 사용하는 경우 애플리케이션 코드를 컴파일할 때 `-Dflink.version` 파라미터를 사용하지 않고 `pom.xml` 파일에 Apache Flink 버전을 지정합니다.

Flink 버전 1.6.2를 사용하는 Managed Service for Apache Flink 애플리케이션의 `pom.xml` 파일 예는 [Managed Service for Apache Flink 1.6.2 시작하기 애플리케이션](https://github.com/aws-samples/amazon-managed-service-for-apache-flink-examples/blob/master/GettingStarted_1_6/pom.xml)을 참조하세요.

Managed Service for Apache Flink 애플리케이션의 애플리케이션 코드를 구축하고 사용하는 방법에 대한 자세한 내용을 알아보려면 [애플리케이션 만들기](how-creating-apps.md) 섹션을 참조하세요.

## 애플리케이션 업그레이드
<a name="earlier-upgrading"></a>

Amazon Managed Service for Apache Flink 애플리케이션의 Apache Flink 버전을 업그레이드하려면 AWS CLI, , AWS SDK CloudFormation또는를 사용하여 현재 위치 Apache Flink 버전 업그레이드 기능을 사용합니다 AWS Management Console. 자세한 내용은 [Apache Flink에 인플레이스 버전 업그레이드 사용](how-in-place-version-upgrades.md) 단원을 참조하십시오.

이 기능은 Amazon Managed Service for Apache Flink에서 `READY` 또는 `RUNNING` 상태로 사용 중인 기존 애플리케이션에 사용할 수 있습니다.

## Apache Flink 1.6.2 및 1.8.2에서 사용 가능한 커넥터
<a name="earlier-connectors"></a>

Apache Flink 프레임워크에는 다양한 소스의 데이터에 액세스하기 위한 커넥터가 포함되어 있습니다.
+ Apache Flink 1.6.2 프레임워크에서 사용할 수 있는 커넥터에 대한 자세한 내용을 알아보려면 [Apache Flink 설명서(1.6.2)](https://ci.apache.org/projects/flink/flink-docs-release-1.6/)의 [커넥터(1.6.2)](https://ci.apache.org/projects/flink/flink-docs-release-1.6/dev/connectors/)를 참조하세요.
+ Apache Flink 1.8.2 프레임워크에서 사용할 수 있는 커넥터에 대한 자세한 내용을 알아보려면 [Apache Flink 설명서(1.8.2)](https://ci.apache.org/projects/flink/flink-docs-release-1.8/)의 [커넥터(1.8.2)](https://ci.apache.org/projects/flink/flink-docs-release-1.8/dev/connectors/)를 참조하세요.

## 시작하기: Flink 1.13.2
<a name="getting-started-1-13"></a>

이 섹션에서는 Managed Service for Apache Flink와 DataStream API의 기본 개념을 소개합니다. 애플리케이션 생성 및 테스트에 사용할 수 있는 옵션에 대해 설명합니다. 또한 이 가이드의 자습서를 완료하고 첫 번째 애플리케이션을 만드는 데 필요한 도구를 설치하는 방법에 대한 지침도 제공합니다.

**Topics**
+ [Managed Service for Apache Flink 애플리케이션 구성 요소](#getting-started-components-1-13)
+ [연습 완료를 위한 필수 조건](#setting-up-prerequisites-1-13)
+ [1단계: AWS 계정 설정 및 관리자 사용자 생성](#earlier-gs-1_13-setting-up)
+ [다음 단계](#earlier-gs-1_13-setup-awscli)
+ [2단계: AWS Command Line Interface (AWS CLI) 설정](#setup-awscli-1-13)
+ [3단계: Managed Service for Apache Flink 애플리케이션 생성 및 실행](#get-started-exercise-1-13)
+ [4단계: AWS 리소스 정리](#getting-started-cleanup-1-13)
+ [5단계: 다음 절차](#getting-started-next-steps-1-13)

### Managed Service for Apache Flink 애플리케이션 구성 요소
<a name="getting-started-components-1-13"></a>

Managed Service for Apache Flink 애플리케이션은 데이터를 처리하기 위해 Apache Flink 런타임을 사용하여 입력을 처리하고 출력을 생성하는 Java/Apache Maven 또는 Scala 애플리케이션을 사용합니다.

Managed Service for Apache Flink 애플리케이션에는 다음 구성 요소가 있습니다.
+ **런타임 속성:** 애플리케이션 코드를 다시 컴파일하지 않고도 *런타임 속성*을 사용하여 애플리케이션을 구성할 수 있습니다.
+ **소스:** *애플리케이션은 소스를 사용하여 데이터를 소비합니다.* 소스 커넥터는 Kinesis 데이터 스트림, Amazon S3 버킷 등에서 데이터를 읽습니다. 자세한 내용을 알아보려면 [스트리밍 데이터 소스 추가](how-sources.md) 섹션을 참조하세요.
+ **연산자:** 애플리케이션은 하나 이상의 *연산자*를 사용하여 데이터를 처리합니다. 연산자는 데이터를 변환, 강화 또는 집계할 수 있습니다. 자세한 내용을 알아보려면 [연산자](how-operators.md) 섹션을 참조하세요.
+ **싱크:** 애플리케이션은 *싱크*를 사용하여 외부 소스에 데이터를 생성합니다. 싱크 커넥터는 Kinesis 데이터 스트림, Firehose 스트림, Amazon S3 버킷 등에 데이터를 씁니다. 자세한 내용은 [싱크를 사용하여 데이터 쓰기](how-sinks.md) 단원을 참조하십시오.

애플리케이션 코드를 생성, 컴파일 및 패키징한 후 Amazon Simple Storage Service (Amazon S3) 버킷에 코드 패키지를 업로드합니다. 그런 다음 Managed Service for Apache Flink 애플리케이션을 생성합니다. 코드 패키지 위치, Kinesis 데이터 스트림을 스트리밍 데이터 소스로 전달하고, 일반적으로 애플리케이션의 처리된 데이터를 수신하는 스트리밍 또는 파일 위치를 전달합니다.

### 연습 완료를 위한 필수 조건
<a name="setting-up-prerequisites-1-13"></a>

이 가이드의 단계를 완료하려면 다음이 필요합니다.
+ [Java Development Kit(JDK) 버전 11](https://www.oracle.com/java/technologies/javase-jdk11-downloads.html). `JAVA_HOME` 환경 변수가 JDK 설치 위치를 가리키도록 설정합니다.
+ 애플리케이션을 개발하고 컴파일하려면 개발 환경(예: [Eclipse Java Neon](http://www.eclipse.org/downloads/packages/release/neon/3) 또는 [IntelliJ Idea](https://www.jetbrains.com/idea/))을 사용하는 것이 좋습니다.
+ [Git 클라이언트](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git). 아직 설치하지 않았다면 Git 클라이언트를 설치합니다.
+ [Apache Maven 컴파일러 플러그인](https://maven.apache.org/plugins/maven-compiler-plugin/). Maven이 해당 작업 경로에 있어야 합니다. Apache Maven 설치를 테스트하려면 다음을 입력하십시오.

  ```
  $ mvn -version
  ```

시작하려면 [AWS 계정 설정 및 관리자 사용자 생성](setting-up.md) 섹션으로 이동하십시오.

### 1단계: AWS 계정 설정 및 관리자 사용자 생성
<a name="earlier-gs-1_13-setting-up"></a>

#### 에 가입 AWS 계정
<a name="sign-up-for-aws"></a>

이 없는 경우 다음 단계를 AWS 계정완료하여 생성합니다.

**에 가입하려면 AWS 계정**

1. [https://portal.aws.amazon.com/billing/signup](https://portal.aws.amazon.com/billing/signup)을 엽니다.

1. 온라인 지시 사항을 따르세요.

   등록 절차 중 전화 또는 텍스트 메시지를 받고 전화 키패드로 확인 코드를 입력하는 과정이 있습니다.

   에 가입하면 AWS 계정*AWS 계정 루트 사용자*이 생성됩니다. 루트 사용자에게는 계정의 모든 AWS 서비스 및 리소스에 액세스할 권한이 있습니다. 보안 모범 사례는 사용자에게 관리 액세스 권한을 할당하고, 루트 사용자만 사용하여 [루트 사용자 액세스 권한이 필요한 작업](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)을 수행하는 것입니다.

AWS 는 가입 프로세스가 완료된 후 확인 이메일을 보냅니다. 언제든지 [https://aws.amazon.com/](https://aws.amazon.com/)으로 이동하고 **내 계정**을 선택하여 현재 계정 활동을 확인하고 계정을 관리할 수 있습니다.

#### 관리자 액세스 권한이 있는 사용자 생성
<a name="create-an-admin"></a>

에 가입한 후 일상적인 작업에 루트 사용자를 사용하지 않도록 관리 사용자를 AWS 계정보호 AWS IAM Identity Center, AWS 계정 루트 사용자활성화 및 생성합니다.

**보안 AWS 계정 루트 사용자**

1.  **루트 사용자를** 선택하고 AWS 계정 이메일 주소를 입력하여 계정 소유자[AWS Management Console](https://console.aws.amazon.com/)로에 로그인합니다. 다음 페이지에서 비밀번호를 입력합니다.

   루트 사용자를 사용하여 로그인하는 데 도움이 필요하면 *AWS Sign-In 사용 설명서*의 [루트 사용자로 로그인](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html#introduction-to-root-user-sign-in-tutorial)을 참조하세요.

1. 루트 사용자의 다중 인증(MFA)을 활성화합니다.

   지침은 *IAM 사용 설명서*의 [AWS 계정 루트 사용자(콘솔)에 대한 가상 MFA 디바이스 활성화를 참조하세요](https://docs.aws.amazon.com/IAM/latest/UserGuide/enable-virt-mfa-for-root.html).

**관리자 액세스 권한이 있는 사용자 생성**

1. IAM Identity Center를 활성화합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [AWS IAM Identity Center설정](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-set-up-for-idc.html)을 참조하세요.

1. IAM Identity Center에서 사용자에게 관리 액세스 권한을 부여합니다.

   를 자격 증명 소스 IAM Identity Center 디렉터리 로 사용하는 방법에 대한 자습서는 사용 *AWS IAM Identity Center 설명서*[의 기본값으로 사용자 액세스 구성을 IAM Identity Center 디렉터리](https://docs.aws.amazon.com//singlesignon/latest/userguide/quick-start-default-idc.html) 참조하세요.

**관리 액세스 권한이 있는 사용자로 로그인**
+ IAM IDentity Center 사용자로 로그인하려면 IAM Identity Center 사용자를 생성할 때 이메일 주소로 전송된 로그인 URL을 사용합니다.

  IAM Identity Center 사용자를 사용하여 로그인하는 데 도움이 필요하면 *AWS Sign-In 사용 설명서*[의 AWS 액세스 포털에 로그인](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)을 참조하세요.

**추가 사용자에게 액세스 권한 할당**

1. IAM Identity Center에서 최소 권한 적용 모범 사례를 따르는 권한 세트를 생성합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [Create a permission set](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-started-create-a-permission-set.html)를 참조하세요.

1. 사용자를 그룹에 할당하고, 그룹에 Single Sign-On 액세스 권한을 할당합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [그룹 추가](https://docs.aws.amazon.com//singlesignon/latest/userguide/addgroups.html)를 참조하세요.

#### 프로그래밍 방식 액세스 권한 부여
<a name="setting-up-access-gs-13"></a>

사용자는 AWS 외부에서와 상호 작용하려는 경우 프로그래밍 방식으로 액세스해야 합니다 AWS Management Console. 프로그래밍 방식 액세스를 부여하는 방법은 액세스 중인 사용자 유형에 따라 다릅니다 AWS.

사용자에게 프로그래밍 방식 액세스 권한을 부여하려면 다음 옵션 중 하나를 선택합니다.


****  

| 프로그래밍 방식 액세스가 필요한 사용자 | 목적 | 방법 | 
| --- | --- | --- | 
| IAM | (권장) 콘솔 자격 증명을 임시 자격 증명으로 사용하여 AWS CLI, AWS SDKs 또는 AWS APIs. |  사용하고자 하는 인터페이스에 대한 지침을 따릅니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)  | 
|  작업 인력 ID (IAM Identity Center에서 관리되는 사용자)  | 임시 자격 증명을 사용하여 AWS CLI, AWS SDKs 또는 AWS APIs. |  사용하고자 하는 인터페이스에 대한 지침을 따릅니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)  | 
| IAM | 임시 자격 증명을 사용하여 AWS CLI, AWS SDKs 또는 AWS APIs. | IAM 사용 설명서의 [AWS 리소스에서 임시 자격 증명 사용](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html)의 지침을 따릅니다. | 
| IAM | (권장되지 않음)장기 자격 증명을 사용하여 AWS CLI, AWS SDKs 또는 AWS APIs. |  사용하고자 하는 인터페이스에 대한 지침을 따릅니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)  | 

#### 다음 단계
<a name="earlier-gs-1_13-setting-up-next-step-2"></a>

[AWS Command Line Interface (AWS CLI) 설정](#earlier-gs-1_13-setup-awscli)

### 다음 단계
<a name="earlier-gs-1_13-setup-awscli"></a>

[2단계: AWS Command Line Interface (AWS CLI) 설정](#setup-awscli-1-13)

### 2단계: AWS Command Line Interface (AWS CLI) 설정
<a name="setup-awscli-1-13"></a>

이 단계에서는 Managed Service for Apache Flink와 함께 사용하도록 AWS CLI 를 다운로드하고 구성합니다.

**참고**  
이 가이드의 시작하기 연습에서는 해당 계정에서 관리자 자격 증명(`adminuser`)을 사용하여 작업을 수행한다고 가정합니다.

**참고**  
가 이미 AWS CLI 설치되어 있는 경우 최신 기능을 얻기 위해 업그레이드해야 할 수 있습니다. 자세한 내용을 알아보려면 *AWS Command Line Interface 사용자 가이드*에서 [AWS Command Line Interface설치](https://docs.aws.amazon.com/cli/latest/userguide/installing.html)를 참조하세요. 의 버전을 확인하려면 다음 명령을 AWS CLI실행합니다.  

```
aws --version
```
이 자습서의 연습에는 다음 AWS CLI 버전 이상이 필요합니다.  

```
aws-cli/1.16.63
```

**를 설정하려면 AWS CLI**

1.  AWS CLI를 다운로드하고 구성합니다. 관련 지침은 *AWS Command Line Interface 사용 설명서*에서 다음 토픽을 참조하세요.
   + [AWS Command Line Interface설치](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-set-up.html)
   + [AWS CLI구성](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)

1. `config` 파일에 관리자 사용자의 AWS CLI 명명된 프로필을 추가합니다. 이 프로필은 AWS CLI 명령을 실행할 때 사용합니다. 프로파일 명명에 대한 자세한 설명은*AWS Command Line Interface 사용자 가이드*의 [프로파일 명명](https://docs.aws.amazon.com/cli/latest/userguide/cli-multiple-profiles.html)을 참조하십시오.

   ```
   [profile adminuser]
   aws_access_key_id = adminuser access key ID
   aws_secret_access_key = adminuser secret access key
   region = aws-region
   ```

   사용 가능한 AWS 리전 목록은의 [리전 및 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/rande.html)를 참조하세요*Amazon Web Services 일반 참조*.
**참고**  
이 자습서의 예 코드 및 명령은 미국 서부(오레곤) 지역을 사용합니다. 다른 지역을 사용하려면 이 자습서의 코드 및 명령에서 지역을 사용하려는 지역으로 변경하십시오.

1. 명령 프롬프트에서 다음 help 명령을 입력하여 설정을 확인하십시오: 

   ```
   aws help
   ```

 AWS 계정과를 설정한 후 샘플 애플리케이션을 구성하고 end-to-end 설정을 테스트하는 다음 연습을 시도할 AWS CLI수 있습니다.

#### 다음 단계
<a name="setup-awscli-next-step-3-1-13"></a>

[3단계: Managed Service for Apache Flink 애플리케이션 생성 및 실행](#get-started-exercise-1-13)

### 3단계: Managed Service for Apache Flink 애플리케이션 생성 및 실행
<a name="get-started-exercise-1-13"></a>

이 연습에서는 데이터 스트림을 소스 및 싱크로 사용하여 Managed Service for Apache Flink 애플리케이션을 만듭니다.

**Topics**
+ [2개의 Amazon Kinesis 데이터 스트림 생성](#get-started-exercise-1-1-13)
+ [샘플 레코드를 입력 스트림에 쓰기](#get-started-exercise-2-1-13)
+ [Apache Flink 스트리밍 Java 코드 다운로드 및 검사](#get-started-exercise-5-1-13)
+ [애플리케이션 코드 컴파일](#get-started-exercise-5.5-1-13)
+ [Apache Flink 스트리밍 Java 코드 업로드](#get-started-exercise-6-1-13)
+ [Managed Service for Apache Flink 애플리케이션 생성 및 실행](#get-started-exercise-7-1-13)
+ [다음 단계](#get-started-exercise-next-step-4-1-13)

#### 2개의 Amazon Kinesis 데이터 스트림 생성
<a name="get-started-exercise-1-1-13"></a>

이 연습을 위해 Managed Service for Apache Flink 애플리케이션을 생성하기 전에 두 개의 Kinesis 데이터 스트림(`ExampleInputStream` 및 `ExampleOutputStream`)을 생성하세요. 이 애플리케이션은 애플리케이션 소스 및 대상 스트림에 대해 이러한 스트림을 사용합니다.

Amazon Kinesis 콘솔 또는 다음 AWS CLI 명령을 사용하여 이러한 스트림을 만들 수 있습니다. 콘솔 지침은 *Amazon Kinesis Data Streams 개발자 가이드*의 [데이터 스트림 생성 및 업데이트](https://docs.aws.amazon.com/kinesis/latest/dev/amazon-kinesis-streams.html)를 참조하세요.

**데이터 스트림 (AWS CLI)을 생성하려면**

1. 첫 번째 스트림(`ExampleInputStream`)을 생성하려면 다음 Amazon Kinesis `create-stream` AWS CLI 명령을 사용합니다.

   ```
   $ aws kinesis create-stream \
   --stream-name ExampleInputStream \
   --shard-count 1 \
   --region us-west-2 \
   --profile adminuser
   ```

1. 애플리케이션에서 출력을 쓰는 데 사용하는 두 번째 스트림을 생성하려면 동일한 명령을 실행하여 스트림 명칭을 `ExampleOutputStream`으로 변경합니다.

   ```
   $ aws kinesis create-stream \
   --stream-name ExampleOutputStream \
   --shard-count 1 \
   --region us-west-2 \
   --profile adminuser
   ```

#### 샘플 레코드를 입력 스트림에 쓰기
<a name="get-started-exercise-2-1-13"></a>

이 섹션에서는 Python 스크립트를 사용하여 애플리케이션에서 처리할 샘플 레코드를 스트림에 쓰기 합니다.

**참고**  
이 섹션에서는 [AWS SDK for Python (Boto)](https://aws.amazon.com/developers/getting-started/python/)이 필요합니다.

1. 다음 콘텐츠를 가진 `stock.py`이라는 파일을 생성합니다:

   ```
       import datetime
       import json
       import random
       import boto3
       STREAM_NAME = "ExampleInputStream"
       def get_data():
           return {
               'event_time': datetime.datetime.now().isoformat(),
               'ticker': random.choice(['AAPL', 'AMZN', 'MSFT', 'INTC', 'TBV']),
               'price': round(random.random() * 100, 2)}
       def generate(stream_name, kinesis_client):
           while True:
               data = get_data()
               print(data)
               kinesis_client.put_record(
                   StreamName=stream_name,
                   Data=json.dumps(data),
                   PartitionKey="partitionkey")
       if __name__ == '__main__':
           generate(STREAM_NAME, boto3.client('kinesis', region_name='us-west-2'))
   ```

1. 이 자습서의 뒷부분에서 `stock.py` 스크립트를 실행하여 애플리케이션으로 데이터를 전송합니다.

   ```
   $ python stock.py
   ```

#### Apache Flink 스트리밍 Java 코드 다운로드 및 검사
<a name="get-started-exercise-5-1-13"></a>

이 예에 대한 Java 애플리케이션 코드는 GitHub에서 사용할 수 있습니다. 애플리케이션 코드를 다운로드하려면 다음을 수행하세요.

1. 다음 명령을 사용하여 원격 리포지토리를 복제합니다.

   ```
   git clone https://github.com/aws-samples/amazon-kinesis-data-analytics-examples.git
   ```

1. `amazon-kinesis-data-analytics-java-examples/GettingStarted` 디렉터리로 이동합니다.

애플리케이션 코드에 대해 다음을 유의하십시오:
+ [프로젝트 객체 모델(pom.xml)](https://maven.apache.org/guides/introduction/introduction-to-the-pom.html) 파일에는 Managed Service for Apache Flink 라이브러리를 비롯한 애플리케이션의 구성 및 종속성에 대한 정보가 들어 있습니다.
+ `BasicStreamingJob.java` 파일에는 애플리케이션의 기능을 정의하는 `main` 메서드가 들어 있습니다.
+ 애플리케이션은 Kinesis 소스를 사용하여 소스 스트림에서 읽습니다. 다음 스니펫은 Kinesis 소스를 생성합니다.

  ```
  return env.addSource(new FlinkKinesisConsumer<>(inputStreamName,
                  new SimpleStringSchema(), inputProperties));
  ```
+ 애플리케이션은 `StreamExecutionEnvironment` 객체를 사용하여 외부 리소스에 액세스하기 위한 소스 및 싱크 커넥터를 생성합니다.
+ 애플리케이션은 정적 속성을 사용하여 소스 및 싱크 커넥터를 만듭니다. 동적 애플리케이션 속성을 사용하려면 `createSourceFromApplicationProperties` 및 `createSinkFromApplicationProperties` 메서드를 사용하여 커넥터를 생성합니다. 이 메서드는 애플리케이션의 속성을 읽어 커넥터를 구성합니다.

  이러한 런타임 속성에 대한 자세한 내용을 알아보려면 [런타임 속성 사용](how-properties.md) 섹션을 참조하세요.

#### 애플리케이션 코드 컴파일
<a name="get-started-exercise-5.5-1-13"></a>

이 섹션에서는 Apache Maven 컴파일러를 사용하여 애플리케이션용 Java 코드를 생성합니다. Apache Maven 및 Java Development Kit(JDK) 설치에 대한 자세한 내용을 알아보려면 [연습 완료를 위한 필수 조건 충족](getting-started.md#setting-up-prerequisites) 섹션을 참조하십시오.

**애플리케이션 코드를 컴파일하려면**

1. 애플리케이션 코드를 사용하려면 이를 컴파일하고 JAR 파일로 패키징합니다. 다음 두 가지 방법 중 하나로 코드를 컴파일하고 패키징할 수 있습니다:
   + 명령행 Maven 도구를 사용합니다. `pom.xml` 파일이 있는 디렉터리에서 다음 명령을 실행하여 JAR 파일을 생성합니다:

     ```
     mvn package -Dflink.version=1.13.2
     ```
   + 귀하의 개발 환경 사용. 자세한 내용을 알아보려면 해당 개발 환경 설명서를 참조하십시오.
**참고**  
제공된 소스 코드는 Java 11의 라이브러리를 사용합니다.

   패키지를 JAR 파일로 업로드하거나 패키지를 압축하여 ZIP 파일로 업로드할 수 있습니다. 를 사용하여 애플리케이션을 생성하는 경우 코드 콘텐츠 유형(JAR 또는 ZIP)을 AWS CLI지정합니다.

1. 컴파일하는 동안 오류가 발생하면 `JAVA_HOME` 환경 변수가 올바르게 설정되어 있는지 확인하십시오.

애플리케이션이 성공적으로 컴파일되면 다음 파일이 생성됩니다:

`target/aws-kinesis-analytics-java-apps-1.0.jar`

#### Apache Flink 스트리밍 Java 코드 업로드
<a name="get-started-exercise-6-1-13"></a>

이 섹션에서는 Amazon Simple Storage Service(Amazon S3) 버킷을 만들고 애플리케이션 코드를 업로드합니다.

**애플리케이션 코드 업로드하기**

1. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

1. **버킷 만들기**를 선택합니다.

1. **버킷 명칭** 필드에 **ka-app-code-*<username>***을 입력합니다. 버킷 명칭에 사용자 이름 등의 접미사를 추가하여 전역적으로 고유하게 만듭니다. **다음**을 선택합니다.

1. **옵션 구성** 단계에서 설정을 기본값 그대로 두고 **다음**을 선택합니다.

1. **권한 설정** 단계에서 설정을 기본값 그대로 두고 **다음**을 선택합니다.

1. **버킷 생성**을 선택합니다.

1. Amazon S3 콘솔에서 **ka-app-code-*<username>*** 버킷을 선택하고 **업로드**를 선택합니다.

1. **파일 선택** 단계에서 **파일 추가**를 선택합니다. 이전 단계에서 생성한 `aws-kinesis-analytics-java-apps-1.0.jar` 파일로 이동합니다. **다음**을 선택합니다.

1. 개체 정보에 대한 설정은 변경할 필요가 없으므로 **업로드**를 선택합니다.

이제 애플리케이션 코드가 애플리케이션에서 액세스할 수 있는 Amazon S3 버킷에 저장됩니다.

#### Managed Service for Apache Flink 애플리케이션 생성 및 실행
<a name="get-started-exercise-7-1-13"></a>

콘솔이나 AWS CLI를 사용하여 Managed Service for Apache Flink 애플리케이션을 생성하고 실행할 수 있습니다.

**참고**  
콘솔을 사용하여 애플리케이션을 생성하면 AWS Identity and Access Management (IAM) 및 Amazon CloudWatch Logs 리소스가 자동으로 생성됩니다. 를 사용하여 애플리케이션을 생성할 때 이러한 리소스를 별도로 AWS CLI생성합니다.

**Topics**
+ [애플리케이션 생성 및 실행(콘솔)](#get-started-exercise-7-console-1-13)
+ [애플리케이션 생성 및 실행(AWS CLI)](#get-started-exercise-7-cli-1-13)

##### 애플리케이션 생성 및 실행(콘솔)
<a name="get-started-exercise-7-console-1-13"></a>

콘솔을 사용하여 애플리케이션을 생성, 구성, 업데이트 및 실행하려면 다음 단계를 수행하세요.

##### 애플리케이션 생성
<a name="get-started-exercise-7-console-create-1-13"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. **Managed Service for Apache Flink 대시보드에서 분석 애플리케이션 생성을 선택합니다.**

1. **Managed Service for Apache Flink - 애플리케이션 생성** 페이지에서 다음과 같이 애플리케이션 세부 정보를 제공합니다.
   + **애플리케이션 명칭**에 **MyApplication**을 입력합니다.
   + **설명**에 **My java test app**를 입력합니다.
   + **런타임**에서 **Apache Flink**를 선택합니다.
   + 버전 풀다운은 **Apache Flink 버전 1.13**으로 그대로 두십시오.

1. **액세스 권한**에서 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **애플리케이션 생성**을 선택합니다.

**참고**  
콘솔을 사용하여 Managed Service for Apache Flink 애플리케이션을 만들 때 내 애플리케이션에 대한 IAM 역할 및 정책을 둘 수 있는 옵션이 있습니다. 귀하의 애플리케이션은 이 역할 및 정책을 사용하여 종속 리소스에 액세스합니다. 이러한 IAM 리소스의 이름은 애플리케이션 명칭과 리전을 사용하여 다음과 같이 지정됩니다.  
정책: `kinesis-analytics-service-MyApplication-us-west-2`
역할: `kinesisanalytics-MyApplication-us-west-2`

##### IAM 정책 편집
<a name="get-started-exercise-7-console-iam-1-13"></a>

IAM 정책을 편집하여 Kinesis Data Streams에 액세스할 수 있는 권한을 추가합니다.

1. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 여세요.

1. **정책**을 선택하세요. 이전 섹션에서 콘솔이 생성한 **`kinesis-analytics-service-MyApplication-us-west-2`** 정책을 선택합니다.

1. **요약** 페이지에서 **정책 편집**을 선택합니다. **JSON** 탭을 선택합니다.

1. 다음 정책 예제의 강조 표시된 부분을 정책에 추가하세요. 샘플 계정 ID(*012345678901*)를 내 계정 ID로 바꿉니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ReadCode",
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "s3:GetObjectVersion"
               ],
               "Resource": [
                   "arn:aws:s3:::ka-app-code-username/aws-kinesis-analytics-java-apps-1.0.jar"
               ]
           },
           {
               "Sid": "DescribeLogGroups",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogGroups"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:*"
               ]
           },
           {
               "Sid": "DescribeLogStreams",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogStreams"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:*"
               ]
           },
           {
               "Sid": "PutLogEvents",
               "Effect": "Allow",
               "Action": [
                   "logs:PutLogEvents"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:kinesis-analytics-log-stream"
               ]
           },
           {
               "Sid": "ReadInputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleInputStream"
           },
           {
               "Sid": "WriteOutputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleOutputStream"
           }
       ]
   }
   ```

------

##### 애플리케이션 구성
<a name="get-started-exercise-7-console-configure-1-13"></a>

1. **MyApplication** 페이지에서 **구성**을 선택합니다.

1. **애플리케이션 구성** 페이지에서 **코드 위치**를 입력합니다.
   + **Amazon S3 버킷**의 경우 **ka-app-code-*<username>***를 입력합니다.
   + **Amazon S3 객체 경로**에는 **aws-kinesis-analytics-java-apps-1.0.jar**를 입력합니다.

1. **애플리케이션 리소스에 대한 액세스** 아래에서 **액세스 권한**의 경우 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. 다음을 입력합니다:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

1. **모니터링**에서 **지표 수준 모니터링**이 **애플리케이션**으로 설정되어 있는지 확인합니다.

1. **CloudWatch 로깅**에서 **활성화** 확인란을 선택합니다.

1. **업데이트**를 선택합니다.

**참고**  
Amazon CloudWatch 로깅을 활성화하도록 선택하면 Managed Service for Apache Flink에서 로그 그룹 및 로그 스트림을 생성합니다. 이러한 리소스의 이름은 다음과 같습니다.  
로그 그룹: `/aws/kinesis-analytics/MyApplication`
로그 스트림: `kinesis-analytics-log-stream`

##### 애플리케이션을 실행합니다
<a name="get-started-exercise-7-console-run-1-13"></a>

애플리케이션을 실행하고 Apache Flink 대시보드를 연 다음 원하는 Flink 작업을 선택하면 Flink 작업 그래프를 볼 수 있습니다.

##### 애플리케이션 중지
<a name="get-started-exercise-7-console-stop-1-13"></a>

**MyApplication** 페이지에서 **중지**를 선택합니다. 작업을 확인합니다.

##### 애플리케이션 업데이트
<a name="get-started-exercise-7-console-update-1-13"></a>

콘솔을 사용하여 애플리케이션 속성, 모니터링 설정, 애플리케이션 JAR의 위치 또는 파일 명칭과 같은 애플리케이션 설정을 업데이트할 수 있습니다. 애플리케이션 코드를 업데이트해야 하는 경우 Amazon S3 버킷에서 애플리케이션 JAR을 다시 로드할 수도 있습니다.

**MyApplication** 페이지에서 **구성**을 선택합니다. 애플리케이션 설정을 업데이트하고 **업데이트**를 선택합니다.

##### 애플리케이션 생성 및 실행(AWS CLI)
<a name="get-started-exercise-7-cli-1-13"></a>

이 섹션에서는 AWS CLI 를 사용하여 Managed Service for Apache Flink 애플리케이션을 생성하고 실행합니다. Managed Service for Apache Flink는 `kinesisanalyticsv2` AWS CLI 명령을 사용하여 Managed Service for Apache Flink 애플리케이션을 생성하고 상호 작용합니다.

##### 권한 정책 생성
<a name="get-started-exercise-7-cli-policy-1-13"></a>

**참고**  
애플리케이션에 대한 권한 정책 및 역할을 생성해야 합니다. 이러한 IAM 리소스를 생성하지 않으면 애플리케이션은 해당 데이터 및 로그 스트림에 액세스할 수 없습니다.

먼저 소스 스트림에서 두 개의 명령문, 즉 `read` 작업에 대한 권한을 부여하는 명령문과 싱크 스트림에서 `write` 작업에 대한 권한을 부여하는 명령문이 있는 권한 정책을 만듭니다. 그런 다음 정책을 IAM 역할(다음 섹션에서 생성)에 연결합니다. 따라서 Managed Service for Apache Flink가 역할을 맡을 때 서비스는 소스 스트림에서 읽고 싱크 스트림에 쓸 수 있는 권한이 있습니다.

다음 코드를 사용하여 `AKReadSourceStreamWriteSinkStream` 권한 정책을 생성합니다. `username`을 애플리케이션 코드를 저장하기 위해 Amazon S3 버킷을 만들 때 사용한 사용자 이름으로 바꿉니다. Amazon 리소스 이름(ARN)의 계정 ID(`012345678901`)를 사용자의 계정 ID로 바꿉니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "S3",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": ["arn:aws:s3:::ka-app-code-username",
                "arn:aws:s3:::ka-app-code-username/*"
            ]
        },
        {
            "Sid": "ReadInputStream",
            "Effect": "Allow",
            "Action": "kinesis:*",
            "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleInputStream"
        },
        {
            "Sid": "WriteOutputStream",
            "Effect": "Allow",
            "Action": "kinesis:*",
            "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleOutputStream"
        }
    ]
}
```

------

권한 정책을 생성하는 단계별 지침은 *IAM 사용자 가이드*의 [IAM 자습서: 첫 번째 고객 관리형 정책 만들기 및 연결](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_managed-policies.html#part-two-create-policy)을 참조하세요.

**참고**  
 AWS SDK for Java를 사용하여 다른 Amazon 서비스에 액세스할 수 있습니다. Managed Service for Apache Flink는 SDK에 필요한 자격 증명을 애플리케이션과 연결된 서비스 실행 IAM 역할의 자격 증명으로 자동 설정합니다. 추가 단계는 필요 없습니다.

##### IAM 역할 생성
<a name="get-started-exercise-7-cli-role-1-13"></a>

이 섹션에서는 Managed Service for Apache Flink 애플리케이션이 소스 스트림을 읽고 싱크 스트림에 쓰기 위해 맡을 수 있는 IAM 역할을 생성합니다.

Managed Service for Apache Flink는 권한 없이 스트림에 액세스할 수 없습니다. IAM 역할을 통해 이러한 권한을 부여합니다. 각 IAM 역할에는 두 가지 정책이 연결됩니다. 신뢰 정책은 Managed Service for Apache Flink가 역할을 취할 수 있는 권한을 부여하고, 권한 정책은 역할을 취한 후 Managed Service for Apache Flink에서 수행할 수 있는 작업을 결정합니다.

이전 섹션에서 생성한 권한 정책을 이 역할에 연결합니다.

**IAM 역할을 생성하려면**

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

1. 탐색 창에서 **역할**, **역할 생성**을 선택합니다.

1. **신뢰할 수 있는 유형의 자격 증명 선택**에서 **AWS 서비스**를 선택합니다. **이 역할을 사용할 서비스 선택**에서 **Kinesis**를 선택합니다. **사용 사례 선택**에서 **Kinesis Analytics**를 선택합니다.

   **다음: 권한**을 선택합니다.

1. **권한 정책 연결** 페이지에서 **다음: 검토**를 선택합니다. 역할을 생성한 후에 권한 정책을 연결합니다.

1. **역할 생성** 페이지에서 **역할 이름**으로 **MF-stream-rw-role**을 입력합니다. **역할 생성**을 선택합니다.

   `MF-stream-rw-role`이라는 새 IAM 역할이 생성되었습니다. 그런 다음 역할의 신뢰 정책 및 권한 정책을 업데이트합니다.

1. 역할에 권한 정책을 연결합니다.
**참고**  
이 연습에서는 Managed Service for Apache Flink가 이 역할을 취하여 Kinesis 데이터 스트림(소스)에서 데이터를 읽고 출력을 다른 Kinesis 데이터 스트림에 씁니다. 따라서 이전 단계 [권한 정책 생성](#get-started-exercise-7-cli-policy-1-13)에서 생성한 정책을 연결합니다.

   1. **요약** 페이지에서 **권한** 탭을 선택합니다.

   1. **정책 연결**을 선택합니다.

   1. 검색 상자에 **AKReadSourceStreamWriteSinkStream**(이전 섹션에서 생성한 정책)을 입력합니다.

   1. **AKReadSourceStreamWriteSinkStream** 정책을 선택하고 **정책 연결**을 선택합니다.

이제 애플리케이션이 리소스에 액세스하는 데 사용하는 서비스 실행 역할이 생성되었습니다. 새 역할의 ARN을 기록합니다.

역할 생성에 대한 단계별 지침은 *IAM 사용 설명서*의 [IAM 역할 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html#roles-creatingrole-user-console)을 참조하세요.

##### Managed Service for Apache Flink 애플리케이션 생성
<a name="get-started-exercise-7-cli-create-1-13"></a>

1. 다음 JSON 코드를 `create_request.json`이라는 파일에 저장합니다. 샘플 역할 ARN을 이전에 생성한 역할을 위한 ARN으로 바꿉니다. 버킷 ARN 접미사(`username`)를 이전 섹션에서 선택한 접미사로 바꿉니다. 서비스 실행 역할의 샘플 계정 ID(`012345678901`)를 해당 계정 ID로 바꿉니다.

   ```
   {
       "ApplicationName": "test",
       "ApplicationDescription": "my java test app",
       "RuntimeEnvironment": "FLINK-1_15",
       "ServiceExecutionRole": "arn:aws:iam::012345678901:role/MF-stream-rw-role",
       "ApplicationConfiguration": {
           "ApplicationCodeConfiguration": {
               "CodeContent": {
                   "S3ContentLocation": {
                       "BucketARN": "arn:aws:s3:::ka-app-code-username",
                       "FileKey": "aws-kinesis-analytics-java-apps-1.0.jar"
                   }
               },
               "CodeContentType": "ZIPFILE"
           },
           "EnvironmentProperties":  { 
            "PropertyGroups": [ 
               { 
                  "PropertyGroupId": "ProducerConfigProperties",
                  "PropertyMap" : {
                       "flink.stream.initpos" : "LATEST",
                       "aws.region" : "us-west-2",
                       "AggregationEnabled" : "false"
                  }
               },
               { 
                  "PropertyGroupId": "ConsumerConfigProperties",
                  "PropertyMap" : {
                       "aws.region" : "us-west-2"
                  }
               }
            ]
         }
       }
   }
   ```

1. 위의 요청과 함께 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html) 작업을 실행하여 애플리케이션을 생성합니다.

   ```
   aws kinesisanalyticsv2 create-application --cli-input-json file://create_request.json
   ```

애플리케이션이 생성되었습니다. 다음 단계에서는 애플리케이션을 시작합니다.

##### 애플리케이션 시작
<a name="get-started-exercise-7-cli-start-1-13"></a>

이 섹션에서는 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html) 작업을 사용하여 애플리케이션을 시작합니다.

**애플리케이션을 시작하려면**

1. 다음 JSON 코드를 `start_request.json`이라는 파일에 저장합니다.

   ```
   {
       "ApplicationName": "test",
       "RunConfiguration": {
           "ApplicationRestoreConfiguration": { 
            "ApplicationRestoreType": "RESTORE_FROM_LATEST_SNAPSHOT"
            }
       }
   }
   ```

1. 위의 요청과 함께 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html) 작업을 실행하여 애플리케이션을 시작합니다.

   ```
   aws kinesisanalyticsv2 start-application --cli-input-json file://start_request.json
   ```

애플리케이션이 실행됩니다. Amazon CloudWatch 콘솔에서 Managed Service for Apache Flink 지표를 확인하여 애플리케이션이 작동하는지 확인할 수 있습니다.

##### 애플리케이션 중지
<a name="get-started-exercise-7-cli-stop-1-13"></a>

이 섹션에서는 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StopApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StopApplication.html) 작업을 사용하여 애플리케이션을 중지합니다.

**애플리케이션을 중지하려면**

1. 다음 JSON 코드를 `stop_request.json`이라는 파일에 저장합니다.

   ```
   {
      "ApplicationName": "test"
   }
   ```

1. 다음 요청과 함께 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StopApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StopApplication.html) 작업을 실행하여 애플리케이션을 중지합니다.

   ```
   aws kinesisanalyticsv2 stop-application --cli-input-json file://stop_request.json
   ```

애플리케이션이 중지됩니다.

##### CloudWatch 로깅 옵션 추가
<a name="get-started-exercise-7-cli-cw-1-13"></a>

 AWS CLI 를 사용하여 애플리케이션에 Amazon CloudWatch 로그 스트림을 추가할 수 있습니다. 애플리케이션과 함께 CloudWatch Logs 사용하기에 대한 자세한 내용을 알아보려면 [Managed Service for Apache Flink 애플리케이션 로깅 설정](cloudwatch-logs.md) 섹션을 참조하세요.

##### 환경 속성 업데이트
<a name="get-started-exercise-7-cli-update-env-1-13"></a>

이 섹션에서는 애플리케이션 코드를 다시 컴파일하지 않고도 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 작업을 사용하여 애플리케이션의 환경 속성을 변경할 수 있습니다. 이 예제에서는 원본 스트림과 대상 스트림의 리전을 변경합니다.

**애플리케이션의 환경 속성 업데이트**

1. 다음 JSON 코드를 `update_properties_request.json`이라는 파일에 저장합니다.

   ```
   {"ApplicationName": "test",
      "CurrentApplicationVersionId": 1,
      "ApplicationConfigurationUpdate": { 
         "EnvironmentPropertyUpdates": { 
            "PropertyGroups": [ 
               { 
                  "PropertyGroupId": "ProducerConfigProperties",
                  "PropertyMap" : {
                       "flink.stream.initpos" : "LATEST",
                       "aws.region" : "us-west-2",
                       "AggregationEnabled" : "false"
                  }
               },
               { 
                  "PropertyGroupId": "ConsumerConfigProperties",
                  "PropertyMap" : {
                       "aws.region" : "us-west-2"
                  }
               }
            ]
         }
      }
   }
   ```

1. 이전 요청과 함께 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 작업을 실행하여 환경 속성을 업데이트하십시오.

   ```
   aws kinesisanalyticsv2 update-application --cli-input-json file://update_properties_request.json
   ```

##### 애플리케이션 코드 업데이트
<a name="get-started-exercise-7-cli-update-code-1-13"></a>

새 버전의 코드 패키지로 애플리케이션 코드를 업데이트해야 하는 경우 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) AWS CLI 작업을 사용합니다.

**참고**  
파일 이름이 같은 새 버전의 애플리케이션 코드를 로드하려면 새 객체 버전을 지정해야 합니다. Amazon S3 객체 버전 사용에 대한 자세한 내용을 알아보려면 [버전 관리 활성화 또는 비활성화](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/enable-versioning.html)를 참조하세요.

를 사용하려면 Amazon S3 버킷에서 이전 코드 패키지를 AWS CLI삭제하고 새 버전을 업로드한 다음 `UpdateApplication`를 호출하여 동일한 Amazon S3 버킷 및 객체 이름과 새 객체 버전을 지정합니다. 애플리케이션이 새 코드 패키지로 다시 시작됩니다.

다음 예 `UpdateApplication` 작업 요청은 애플리케이션 코드를 다시 로드하고 애플리케이션을 다시 시작합니다. `CurrentApplicationVersionId`를 현재 애플리케이션 버전으로 업데이트하세요. `ListApplications` 또는 `DescribeApplication` 작업을 사용하여 현재 애플리케이션 버전을 확인할 수 있습니다. 버킷 명칭 접미사 (*<username>*)를 [2개의 Amazon Kinesis 데이터 스트림 생성](get-started-exercise.md#get-started-exercise-1) 섹션에서 선택한 접미사로 업데이트합니다.

```
{
    "ApplicationName": "test",
    "CurrentApplicationVersionId": 1,
    "ApplicationConfigurationUpdate": {
        "ApplicationCodeConfigurationUpdate": {
            "CodeContentUpdate": {
                "S3ContentLocationUpdate": {
                    "BucketARNUpdate": "arn:aws:s3:::ka-app-code-username",
                    "FileKeyUpdate": "aws-kinesis-analytics-java-apps-1.0.jar",
                    "ObjectVersionUpdate": "SAMPLEUehYngP87ex1nzYIGYgfhypvDU"
                }
            }
        }
    }
}
```

#### 다음 단계
<a name="get-started-exercise-next-step-4-1-13"></a>

[4단계: AWS 리소스 정리](#getting-started-cleanup-1-13)

### 4단계: AWS 리소스 정리
<a name="getting-started-cleanup-1-13"></a>

이 단원에는 시작하기 자습서에서 생성된 AWS 리소스를 정리하는 절차가 포함되어 있습니다.

**Topics**
+ [Managed Service for Apache Flink 애플리케이션 삭제](#getting-started-cleanup-app-1-13)
+ [Kinesis 데이터 스트림 삭제](#getting-started-cleanup-stream-1-13)
+ [Amazon S3 객체 및 버킷 삭제](#getting-started-cleanup-s3-1-13)
+ [IAM 리소스 삭제](#getting-started-cleanup-iam-1-13)
+ [CloudWatch 리소스 삭제](#getting-started-cleanup-cw-1-13)
+ [다음 단계](#getting-started-cleanup-next-step-5-1-13)

#### Managed Service for Apache Flink 애플리케이션 삭제
<a name="getting-started-cleanup-app-1-13"></a>

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

1. Managed Service for Apache Flink 패널에서 **MyApplication**을 선택합니다.

1. 애플리케이션 페이지에서 **삭제**를 선택한 다음 삭제를 확인합니다.

#### Kinesis 데이터 스트림 삭제
<a name="getting-started-cleanup-stream-1-13"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. Kinesis Data Streams 패널에서 **ExampleInputStream**을 선택합니다.

1. **ExampleInputStream** 페이지에서 **Kinesis 스트림 삭제**를 선택한 다음 삭제를 확인합니다.

1. **Kinesis 스트림** 페이지에서 **ExampleOutputStream**을 선택하고, **작업**을 선택하고, **삭제**를 선택한 다음 삭제 여부를 확인합니다.

#### Amazon S3 객체 및 버킷 삭제
<a name="getting-started-cleanup-s3-1-13"></a>

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

1. **ka-app-code-*<username>* 버킷을 선택합니다.**

1. **삭제**를 선택한 후 버킷 이름을 입력하여 삭제를 확인합니다.

#### IAM 리소스 삭제
<a name="getting-started-cleanup-iam-1-13"></a>

1. IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))을 엽니다.

1. 탐색 바에서 **정책**을 선택합니다.

1. 필터 컨트롤에서 **kinesis**를 입력합니다.

1. **kinesis-analytics-service-MyApplication-us-west-2** 정책을 선택합니다.

1. **정책 작업**을 선택한 후 **삭제**를 선택합니다.

1. 탐색 모음에서 **역할**을 선택합니다.

1. **kinesis-analytics-MyApplication-us-west-2** 역할을 선택합니다.

1. **역할 삭제**를 선택하고 삭제를 확인합니다.

#### CloudWatch 리소스 삭제
<a name="getting-started-cleanup-cw-1-13"></a>

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

1. 탐색 바에서 **로그**를 선택합니다.

1. **/aws/kinesis-analytics/MyApplication** 로그 그룹을 선택합니다.

1. **로그 그룹 삭제**를 선택한 다음 삭제를 확인합니다.

#### 다음 단계
<a name="getting-started-cleanup-next-step-5-1-13"></a>

[5단계: 다음 절차](#getting-started-next-steps-1-13)

### 5단계: 다음 절차
<a name="getting-started-next-steps-1-13"></a>

이제 Managed Service for Apache Flink 애플리케이션을 만들고 실행했으므로 고급 Managed Service for Apache Flink 솔루션에 대해서는 다음 리소스를 참조하세요.
+ ** [ Amazon Kinesis용 AWS 스트리밍 데이터 솔루션](https://aws.amazon.com/solutions/implementations/aws-streaming-data-solution-for-amazon-kinesis/):** Amazon Kinesis용 AWS 스트리밍 데이터 솔루션은 스트리밍 데이터를 쉽게 캡처, 저장, 처리 및 전송하는 데 필요한 AWS 서비스를 자동으로 구성합니다. 이 솔루션은 스트리밍 데이터 사용 사례를 해결하기 위한 다양한 옵션을 제공합니다. Managed Service for Apache Flink 옵션은 시뮬레이션된 뉴욕 택시 데이터에 대한 분석 작업을 실행하는 실제 애플리케이션을 보여주는 종단 간 스트리밍 ETL 예를 제공합니다. 솔루션은 IAM 역할 및 정책, CloudWatch 대시보드, CloudWatch 경보와 같은 필요한 모든 AWS 리소스를 설정합니다.
+ ** [AWS Amazon MSK용 스트리밍 데이터 솔루션](https://aws.amazon.com/solutions/implementations/aws-streaming-data-solution-for-amazon-msk/):** Amazon MSK용 AWS 스트리밍 데이터 솔루션은 생산자, 스트리밍 스토리지, 소비자 및 대상을 통해 데이터가 흐르는 AWS CloudFormation 템플릿을 제공합니다.
+ ** [ Apache Flink 및 Apache Kafka를 사용한 클릭스트림 랩](https://amazonmsk-labs.workshop.aws/en/mskkdaflinklab.html)**: 스트리밍 스토리지로는 Apache Kafka용 Amazon Managed Streaming을 사용하고 스트림 처리에는 Managed Service for Apache Flink 애플리케이션을 사용하는 클릭스트림 사용 사례를 위한 종합적인 실습입니다.
+ **[Amazon Managed Service for Apache Flink 워크숍](https://catalog.workshops.aws/managed-flink):** 이 워크숍에서는 스트리밍 데이터를 거의 실시간으로 수집, 분석 및 시각화하는 엔드 투 엔드 스트리밍 아키텍처를 구축합니다. 여러분은 뉴욕시에 있는 택시 회사의 운영을 개선하기 위해 나섰습니다. 뉴욕시에 있는 택시의 원격 측정 데이터를 거의 실시간으로 분석하여 차량 운영을 최적화합니다.
+ **[Flink 알아보기: 실습 교육](https://ci.apache.org/projects/flink/flink-docs-master/learn-flink/):** 확장 가능한 스트리밍 ETL, 분석 및 이벤트 기반 애플리케이션 작성을 시작하는 데 도움이 되는 공식 Apache Flink 입문 교육입니다.
**참고**  
Managed Service for Apache Flink는 이 교육에 사용된 Apache Flink 버전(1.12)을 지원하지 않는다는 점에 유의하십시오. Flink Managed Service for Apache Flink에서 Flink 1.15.2를 사용할 수 있습니다.

## 시작하기: Flink 1.11.1 - 사용 중단
<a name="earlier-gs-1_11"></a>

**참고**  
Apache Flink 버전 **1.6, 1.8, 1.11**은 3년 이상 Apache Flink 커뮤니티의 지원을 받지 못했습니다. Amazon Managed Service for Apache Flink에서는 **2024년 11월 5일**에 이러한 버전을 사용 중단할 예정입니다. 이 날짜부터는 이러한 Flink 버전으로 새로운 애플리케이션을 생성할 수 없습니다. 현재 시점에서는 기존 애플리케이션을 계속 실행할 수 있습니다. Amazon Managed Service for Apache Flink의 인플레이스 버전 업그레이드 기능을 사용하면 상태를 유지한 채 애플리케이션을 업그레이드할 수 있습니다. 자세한 내용은 [Apache Flink에 인플레이스 버전 업그레이드 사용](how-in-place-version-upgrades.md) 섹션을 참조하세요.

이 주제에는 Apache Flink 1.11.1을 사용하는 [자습서: Managed Service for Apache Flink에서 DataStream API 사용 시작하기](getting-started.md) 자습서 버전이 포함되어 있습니다.

이 섹션에서는 Managed Service for Apache Flink와 DataStream API의 기본 개념을 소개합니다. 애플리케이션 생성 및 테스트에 사용할 수 있는 옵션에 대해 설명합니다. 또한 이 가이드의 자습서를 완료하고 첫 번째 애플리케이션을 만드는 데 필요한 도구를 설치하는 방법에 대한 지침도 제공합니다.

**Topics**
+ [Managed Service for Apache Flink 애플리케이션 구성 요소](#earlier-gs-1_11-components)
+ [연습 완료를 위한 필수 조건](#earlier-gs-1_11-setting-up-prerequisites)
+ [1단계: AWS 계정 설정 및 관리자 사용자 생성](#earlier-gs-1_11-setting-up)
+ [2단계: AWS Command Line Interface (AWS CLI) 설정](#earlier-gs-1_11-setup-awscli)
+ [3단계: Managed Service for Apache Flink 애플리케이션 생성 및 실행](#earlier-gs-1_11-get-started-exercise)
+ [4단계: AWS 리소스 정리](#earlier-gs-1_11-cleanup)
+ [5단계: 다음 절차](#earlier-gs-1_11-next-steps)

### Managed Service for Apache Flink 애플리케이션 구성 요소
<a name="earlier-gs-1_11-components"></a>

Managed Service for Apache Flink 애플리케이션은 데이터를 처리하기 위해 Apache Flink 런타임을 사용하여 입력을 처리하고 출력을 생성하는 Java/Apache Maven 또는 Scala 애플리케이션을 사용합니다.

Managed Service for Apache Flink 애플리케이션에는 다음과 같은 구성 요소가 있습니다.
+ **런타임 속성:** 애플리케이션 코드를 다시 컴파일하지 않고도 *런타임 속성*을 사용하여 애플리케이션을 구성할 수 있습니다.
+ **소스:** *애플리케이션은 소스를 사용하여 데이터를 소비합니다.* 소스 커넥터는 Kinesis 데이터 스트림, Amazon S3 버킷 등에서 데이터를 읽습니다. 자세한 내용을 알아보려면 [스트리밍 데이터 소스 추가](how-sources.md) 섹션을 참조하세요.
+ **연산자:** 애플리케이션은 하나 이상의 *연산자*를 사용하여 데이터를 처리합니다. 연산자는 데이터를 변환, 강화 또는 집계할 수 있습니다. 자세한 내용을 알아보려면 [연산자](how-operators.md) 섹션을 참조하세요.
+ **싱크:** 애플리케이션은 *싱크*를 사용하여 외부 소스에 데이터를 생성합니다. 싱크 커넥터는 Kinesis 데이터 스트림, Firehose 스트림, Amazon S3 버킷 등에 데이터를 씁니다. 자세한 내용은 [싱크를 사용하여 데이터 쓰기](how-sinks.md) 단원을 참조하십시오.

애플리케이션 코드를 생성, 컴파일 및 패키징한 후 Amazon Simple Storage Service (Amazon S3) 버킷에 코드 패키지를 업로드합니다. 그런 다음 Managed Service for Apache Flink 애플리케이션을 생성합니다. 코드 패키지 위치, Kinesis 데이터 스트림을 스트리밍 데이터 소스로 전달하고, 일반적으로 애플리케이션의 처리된 데이터를 수신하는 스트리밍 또는 파일 위치를 전달합니다.

### 연습 완료를 위한 필수 조건
<a name="earlier-gs-1_11-setting-up-prerequisites"></a>

이 가이드의 단계를 완료하려면 다음이 필요합니다.
+ [Java Development Kit(JDK) 버전 11](https://www.oracle.com/java/technologies/javase-jdk11-downloads.html). `JAVA_HOME` 환경 변수가 JDK 설치 위치를 가리키도록 설정합니다.
+ 애플리케이션을 개발하고 컴파일하려면 개발 환경(예: [Eclipse Java Neon](http://www.eclipse.org/downloads/packages/release/neon/3) 또는 [IntelliJ Idea](https://www.jetbrains.com/idea/))을 사용하는 것이 좋습니다.
+ [Git 클라이언트](https://git-scm.com/book/en/v2/earlier-gs-1_11-Installing-Git). 아직 설치하지 않았다면 Git 클라이언트를 설치합니다.
+ [Apache Maven 컴파일러 플러그인](https://maven.apache.org/plugins/maven-compiler-plugin/). Maven이 해당 작업 경로에 있어야 합니다. Apache Maven 설치를 테스트하려면 다음을 입력하십시오.

  ```
  $ mvn -version
  ```

시작하려면 [AWS 계정 설정 및 관리자 사용자 생성](setting-up.md) 섹션으로 이동하십시오.

### 1단계: AWS 계정 설정 및 관리자 사용자 생성
<a name="earlier-gs-1_11-setting-up"></a>

#### 에 가입 AWS 계정
<a name="sign-up-for-aws"></a>

이 없는 경우 다음 단계를 AWS 계정완료하여 생성합니다.

**에 가입하려면 AWS 계정**

1. [https://portal.aws.amazon.com/billing/signup](https://portal.aws.amazon.com/billing/signup)을 엽니다.

1. 온라인 지시 사항을 따르세요.

   등록 절차 중 전화 또는 텍스트 메시지를 받고 전화 키패드로 확인 코드를 입력하는 과정이 있습니다.

   에 가입하면 AWS 계정*AWS 계정 루트 사용자*이 생성됩니다. 루트 사용자에게는 계정의 모든 AWS 서비스 및 리소스에 액세스할 권한이 있습니다. 보안 모범 사례는 사용자에게 관리 액세스 권한을 할당하고, 루트 사용자만 사용하여 [루트 사용자 액세스 권한이 필요한 작업](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)을 수행하는 것입니다.

AWS 는 가입 프로세스가 완료된 후 확인 이메일을 보냅니다. 언제든지 [https://aws.amazon.com/](https://aws.amazon.com/)으로 이동하고 **내 계정**을 선택하여 현재 계정 활동을 확인하고 계정을 관리할 수 있습니다.

#### 관리자 액세스 권한이 있는 사용자 생성
<a name="create-an-admin"></a>

에 가입한 후 일상적인 작업에 루트 사용자를 사용하지 않도록 관리 사용자를 AWS 계정보호 AWS IAM Identity Center, AWS 계정 루트 사용자활성화 및 생성합니다.

**보안 AWS 계정 루트 사용자**

1.  **루트 사용자를** 선택하고 AWS 계정 이메일 주소를 입력하여 계정 소유자[AWS Management Console](https://console.aws.amazon.com/)로에 로그인합니다. 다음 페이지에서 비밀번호를 입력합니다.

   루트 사용자를 사용하여 로그인하는 데 도움이 필요하면 *AWS Sign-In 사용 설명서*의 [루트 사용자로 로그인](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html#introduction-to-root-user-sign-in-tutorial)을 참조하세요.

1. 루트 사용자의 다중 인증(MFA)을 활성화합니다.

   지침은 *IAM 사용 설명서*의 [AWS 계정 루트 사용자(콘솔)에 대한 가상 MFA 디바이스 활성화를 참조하세요](https://docs.aws.amazon.com/IAM/latest/UserGuide/enable-virt-mfa-for-root.html).

**관리자 액세스 권한이 있는 사용자 생성**

1. IAM Identity Center를 활성화합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [AWS IAM Identity Center설정](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-set-up-for-idc.html)을 참조하세요.

1. IAM Identity Center에서 사용자에게 관리 액세스 권한을 부여합니다.

   를 자격 증명 소스 IAM Identity Center 디렉터리 로 사용하는 방법에 대한 자습서는 사용 *AWS IAM Identity Center 설명서*[의 기본값으로 사용자 액세스 구성을 IAM Identity Center 디렉터리](https://docs.aws.amazon.com//singlesignon/latest/userguide/quick-start-default-idc.html) 참조하세요.

**관리 액세스 권한이 있는 사용자로 로그인**
+ IAM IDentity Center 사용자로 로그인하려면 IAM Identity Center 사용자를 생성할 때 이메일 주소로 전송된 로그인 URL을 사용합니다.

  IAM Identity Center 사용자를 사용하여 로그인하는 데 도움이 필요하면 *AWS Sign-In 사용 설명서*[의 AWS 액세스 포털에 로그인](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)을 참조하세요.

**추가 사용자에게 액세스 권한 할당**

1. IAM Identity Center에서 최소 권한 적용 모범 사례를 따르는 권한 세트를 생성합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [Create a permission set](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-started-create-a-permission-set.html)를 참조하세요.

1. 사용자를 그룹에 할당하고, 그룹에 Single Sign-On 액세스 권한을 할당합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [그룹 추가](https://docs.aws.amazon.com//singlesignon/latest/userguide/addgroups.html)를 참조하세요.

#### 프로그래밍 방식 액세스 권한 부여
<a name="setting-up-access-gs-11"></a>

사용자는 AWS 외부에서와 상호 작용하려는 경우 프로그래밍 방식으로 액세스해야 합니다 AWS Management Console. 프로그래밍 방식 액세스를 부여하는 방법은 액세스 중인 사용자 유형에 따라 다릅니다 AWS.

사용자에게 프로그래밍 방식 액세스 권한을 부여하려면 다음 옵션 중 하나를 선택합니다.


****  

| 프로그래밍 방식 액세스가 필요한 사용자 | 목적 | 방법 | 
| --- | --- | --- | 
| IAM | (권장) 콘솔 자격 증명을 임시 자격 증명으로 사용하여 AWS CLI, AWS SDKs 또는 AWS APIs. |  사용하고자 하는 인터페이스에 대한 지침을 따릅니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)  | 
|  작업 인력 ID (IAM Identity Center에서 관리되는 사용자)  | 임시 자격 증명을 사용하여 AWS CLI, AWS SDKs 또는 AWS APIs. |  사용하고자 하는 인터페이스에 대한 지침을 따릅니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)  | 
| IAM | 임시 자격 증명을 사용하여 AWS CLI, AWS SDKs 또는 AWS APIs. | IAM 사용 설명서의 [AWS 리소스에서 임시 자격 증명 사용](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html)의 지침을 따릅니다. | 
| IAM | (권장되지 않음)장기 자격 증명을 사용하여 AWS CLI, AWS SDKs 또는 AWS APIs. |  사용하고자 하는 인터페이스에 대한 지침을 따릅니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)  | 

#### 다음 단계
<a name="earlier-gs-1_11-setting-up-next-step-2"></a>

[AWS Command Line Interface (AWS CLI) 설정](#earlier-gs-1_11-setup-awscli)

### 2단계: AWS Command Line Interface (AWS CLI) 설정
<a name="earlier-gs-1_11-setup-awscli"></a>

이 단계에서는 Managed Service for Apache Flink와 함께 사용하도록 AWS CLI 를 다운로드하고 구성합니다.

**참고**  
이 가이드의 시작하기 연습에서는 해당 계정에서 관리자 자격 증명(`adminuser`)을 사용하여 작업을 수행한다고 가정합니다.

**참고**  
가 이미 AWS CLI 설치되어 있는 경우 최신 기능을 얻기 위해 업그레이드해야 할 수 있습니다. 자세한 내용을 알아보려면 *AWS Command Line Interface 사용자 가이드*에서 [AWS Command Line Interface설치](https://docs.aws.amazon.com/cli/latest/userguide/installing.html)를 참조하세요. 의 버전을 확인하려면 다음 명령을 AWS CLI실행합니다.  

```
aws --version
```
이 자습서의 연습에는 다음 AWS CLI 버전 이상이 필요합니다.  

```
aws-cli/1.16.63
```

**를 설정하려면 AWS CLI**

1.  AWS CLI를 다운로드하고 구성합니다. 관련 지침은 *AWS Command Line Interface 사용 설명서*에서 다음 토픽을 참조하세요.
   + [AWS Command Line Interface설치](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-set-up.html)
   + [AWS CLI구성](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-earlier-gs-1_11.html)

1. `config` 파일에 관리자 사용자의 AWS CLI 명명된 프로필을 추가합니다. 이 프로필은 AWS CLI 명령을 실행할 때 사용합니다. 프로파일 명명에 대한 자세한 설명은*AWS Command Line Interface 사용자 가이드*의 [프로파일 명명](https://docs.aws.amazon.com/cli/latest/userguide/cli-multiple-profiles.html)을 참조하십시오.

   ```
   [profile adminuser]
   aws_access_key_id = adminuser access key ID
   aws_secret_access_key = adminuser secret access key
   region = aws-region
   ```

   사용 가능한 AWS 리전 목록은의 [리전 및 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/rande.html)를 참조하세요*Amazon Web Services 일반 참조*.
**참고**  
이 자습서의 예 코드 및 명령은 미국 서부(오레곤) 지역을 사용합니다. 다른 지역을 사용하려면 이 자습서의 코드 및 명령에서 지역을 사용하려는 지역으로 변경하십시오.

1. 명령 프롬프트에서 다음 help 명령을 입력하여 설정을 확인하십시오: 

   ```
   aws help
   ```

 AWS 계정과를 설정한 후 샘플 애플리케이션을 구성하고 end-to-end 설정을 테스트하는 다음 연습을 시도할 AWS CLI수 있습니다.

#### 다음 단계
<a name="earlier-gs-1_11-setup-awscli-next-step-3"></a>

[3단계: Managed Service for Apache Flink 애플리케이션 생성 및 실행](#earlier-gs-1_11-get-started-exercise)

### 3단계: Managed Service for Apache Flink 애플리케이션 생성 및 실행
<a name="earlier-gs-1_11-get-started-exercise"></a>

이 연습에서는 데이터 스트림을 소스 및 싱크로 사용하여 Managed Service for Apache Flink 애플리케이션을 만듭니다.

**Topics**
+ [2개의 Amazon Kinesis 데이터 스트림 생성](#earlier-gs-1_11-get-started-exercise-1)
+ [샘플 레코드를 입력 스트림에 쓰기](#earlier-gs-1_11-get-started-exercise-2)
+ [Apache Flink 스트리밍 Java 코드 다운로드 및 검사](#earlier-gs-1_11-get-started-exercise-5)
+ [애플리케이션 코드 컴파일](#earlier-gs-1_11-get-started-exercise-5.5)
+ [Apache Flink 스트리밍 Java 코드 업로드](#earlier-gs-1_11-get-started-exercise-6)
+ [Managed Service for Apache Flink 애플리케이션 생성 및 실행](#earlier-gs-1_11-get-started-exercise-7)
+ [다음 단계](#earlier-gs-1_11-get-started-exercise-next-step-4)

#### 2개의 Amazon Kinesis 데이터 스트림 생성
<a name="earlier-gs-1_11-get-started-exercise-1"></a>

이 연습을 위해 Managed Service for Apache Flink 애플리케이션을 생성하기 전에 두 개의 Kinesis 데이터 스트림(`ExampleInputStream` 및 `ExampleOutputStream`)을 생성하세요. 이 애플리케이션은 애플리케이션 소스 및 대상 스트림에 대해 이러한 스트림을 사용합니다.

Amazon Kinesis 콘솔 또는 다음 AWS CLI 명령을 사용하여 이러한 스트림을 만들 수 있습니다. 콘솔 지침은 *Amazon Kinesis Data Streams 개발자 가이드*의 [데이터 스트림 생성 및 업데이트](https://docs.aws.amazon.com/kinesis/latest/dev/amazon-kinesis-streams.html)를 참조하세요.

**데이터 스트림 (AWS CLI)을 생성하려면**

1. 첫 번째 스트림(`ExampleInputStream`)을 생성하려면 다음 Amazon Kinesis `create-stream` AWS CLI 명령을 사용합니다.

   ```
   $ aws kinesis create-stream \
   --stream-name ExampleInputStream \
   --shard-count 1 \
   --region us-west-2 \
   --profile adminuser
   ```

1. 애플리케이션에서 출력을 쓰는 데 사용하는 두 번째 스트림을 생성하려면 동일한 명령을 실행하여 스트림 명칭을 `ExampleOutputStream`으로 변경합니다.

   ```
   $ aws kinesis create-stream \
   --stream-name ExampleOutputStream \
   --shard-count 1 \
   --region us-west-2 \
   --profile adminuser
   ```

#### 샘플 레코드를 입력 스트림에 쓰기
<a name="earlier-gs-1_11-get-started-exercise-2"></a>

이 섹션에서는 Python 스크립트를 사용하여 애플리케이션에서 처리할 샘플 레코드를 스트림에 쓰기 합니다.

**참고**  
이 섹션에서는 [AWS SDK for Python (Boto)](https://aws.amazon.com/sdk-for-python/)이 필요합니다.

1. 다음 콘텐츠를 가진 `stock.py`이라는 파일을 생성합니다:

   ```
    
   import datetime
   import json
   import random
   import boto3
   
   STREAM_NAME = "ExampleInputStream"
   
   
   def get_data():
       return {
           "EVENT_TIME": datetime.datetime.now().isoformat(),
           "TICKER": random.choice(["AAPL", "AMZN", "MSFT", "INTC", "TBV"]),
           "PRICE": round(random.random() * 100, 2),
       }
   
   
   def generate(stream_name, kinesis_client):
       while True:
           data = get_data()
           print(data)
           kinesis_client.put_record(
               StreamName=stream_name, Data=json.dumps(data), PartitionKey="partitionkey"
           )
   
   
   if __name__ == "__main__":
       generate(STREAM_NAME, boto3.client("kinesis"))
   ```

1. 이 자습서의 뒷부분에서 `stock.py` 스크립트를 실행하여 애플리케이션으로 데이터를 전송합니다.

   ```
   $ python stock.py
   ```

#### Apache Flink 스트리밍 Java 코드 다운로드 및 검사
<a name="earlier-gs-1_11-get-started-exercise-5"></a>

이 예에 대한 Java 애플리케이션 코드는 GitHub에서 사용할 수 있습니다. 애플리케이션 코드를 다운로드하려면 다음을 수행하세요.

1. 다음 명령을 사용하여 원격 리포지토리를 복제합니다.

   ```
   git clone https://github.com/aws-samples/amazon-kinesis-data-analytics-examples.git
   ```

1. `amazon-kinesis-data-analytics-java-examples/GettingStarted` 디렉터리로 이동합니다.

애플리케이션 코드에 대해 다음을 유의하십시오:
+ [프로젝트 객체 모델(pom.xml)](https://maven.apache.org/guides/introduction/introduction-to-the-pom.html) 파일에는 Managed Service for Apache Flink 라이브러리를 비롯한 애플리케이션의 구성 및 종속성에 대한 정보가 들어 있습니다.
+ `BasicStreamingJob.java` 파일에는 애플리케이션의 기능을 정의하는 `main` 메서드가 들어 있습니다.
+ 애플리케이션은 Kinesis 소스를 사용하여 소스 스트림에서 읽습니다. 다음 스니펫은 Kinesis 소스를 생성합니다.

  ```
  return env.addSource(new FlinkKinesisConsumer<>(inputStreamName,
                  new SimpleStringSchema(), inputProperties));
  ```
+ 애플리케이션은 `StreamExecutionEnvironment` 객체를 사용하여 외부 리소스에 액세스하기 위한 소스 및 싱크 커넥터를 생성합니다.
+ 애플리케이션은 정적 속성을 사용하여 소스 및 싱크 커넥터를 만듭니다. 동적 애플리케이션 속성을 사용하려면 `createSourceFromApplicationProperties` 및 `createSinkFromApplicationProperties` 메서드를 사용하여 커넥터를 생성합니다. 이 메서드는 애플리케이션의 속성을 읽어 커넥터를 구성합니다.

  이러한 런타임 속성에 대한 자세한 내용을 알아보려면 [런타임 속성 사용](how-properties.md) 섹션을 참조하세요.

#### 애플리케이션 코드 컴파일
<a name="earlier-gs-1_11-get-started-exercise-5.5"></a>

이 섹션에서는 Apache Maven 컴파일러를 사용하여 애플리케이션용 Java 코드를 생성합니다. Apache Maven 및 Java Development Kit(JDK) 설치에 대한 자세한 내용을 알아보려면 [연습 완료를 위한 필수 조건 충족](getting-started.md#setting-up-prerequisites) 섹션을 참조하십시오.

**애플리케이션 코드를 컴파일하려면**

1. 애플리케이션 코드를 사용하려면 이를 컴파일하고 JAR 파일로 패키징합니다. 다음 두 가지 방법 중 하나로 코드를 컴파일하고 패키징할 수 있습니다:
   + 명령행 Maven 도구를 사용합니다. `pom.xml` 파일이 있는 디렉터리에서 다음 명령을 실행하여 JAR 파일을 생성합니다:

     ```
     mvn package -Dflink.version=1.11.3
     ```
   + 귀하의 개발 환경 사용. 자세한 내용을 알아보려면 해당 개발 환경 설명서를 참조하십시오.
**참고**  
제공된 소스 코드는 Java 11의 라이브러리를 사용합니다. 프로젝트의 Java 버전이 11인지 확인하십시오.

   패키지를 JAR 파일로 업로드하거나 패키지를 압축하여 ZIP 파일로 업로드할 수 있습니다. 를 사용하여 애플리케이션을 생성하는 경우 코드 콘텐츠 유형(JAR 또는 ZIP)을 AWS CLI지정합니다.

1. 컴파일하는 동안 오류가 발생하면 `JAVA_HOME` 환경 변수가 올바르게 설정되어 있는지 확인하십시오.

애플리케이션이 성공적으로 컴파일되면 다음 파일이 생성됩니다:

`target/aws-kinesis-analytics-java-apps-1.0.jar`

#### Apache Flink 스트리밍 Java 코드 업로드
<a name="earlier-gs-1_11-get-started-exercise-6"></a>

이 섹션에서는 Amazon Simple Storage Service(Amazon S3) 버킷을 만들고 애플리케이션 코드를 업로드합니다.

**애플리케이션 코드 업로드하기**

1. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

1. **버킷 만들기**를 선택합니다.

1. **버킷 명칭** 필드에 **ka-app-code-*<username>***을 입력합니다. 버킷 명칭에 사용자 이름 등의 접미사를 추가하여 전역적으로 고유하게 만듭니다. **다음**을 선택합니다.

1. **옵션 구성** 단계에서 설정을 기본값 그대로 두고 **다음**을 선택합니다.

1. **권한 설정** 단계에서 설정을 기본값 그대로 두고 **다음**을 선택합니다.

1. **버킷 생성**을 선택합니다.

1. Amazon S3 콘솔에서 **ka-app-code-*<username>*** 버킷을 선택하고 **업로드**를 선택합니다.

1. **파일 선택** 단계에서 **파일 추가**를 선택합니다. 이전 단계에서 생성한 `aws-kinesis-analytics-java-apps-1.0.jar` 파일로 이동합니다. **다음**을 선택합니다.

1. 개체 정보에 대한 설정은 변경할 필요가 없으므로 **업로드**를 선택합니다.

이제 애플리케이션 코드가 애플리케이션에서 액세스할 수 있는 Amazon S3 버킷에 저장됩니다.

#### Managed Service for Apache Flink 애플리케이션 생성 및 실행
<a name="earlier-gs-1_11-get-started-exercise-7"></a>

콘솔이나 AWS CLI를 사용하여 Managed Service for Apache Flink 애플리케이션을 생성하고 실행할 수 있습니다.

**참고**  
콘솔을 사용하여 애플리케이션을 생성하면 AWS Identity and Access Management (IAM) 및 Amazon CloudWatch Logs 리소스가 자동으로 생성됩니다. 를 사용하여 애플리케이션을 생성할 때 이러한 리소스를 별도로 AWS CLI생성합니다.

**Topics**
+ [애플리케이션 생성 및 실행(콘솔)](#earlier-gs-1_11-get-started-exercise-7-console)
+ [애플리케이션 생성 및 실행(AWS CLI)](#earlier-gs-1_11-get-started-exercise-7-cli)

##### 애플리케이션 생성 및 실행(콘솔)
<a name="earlier-gs-1_11-get-started-exercise-7-console"></a>

콘솔을 사용하여 애플리케이션을 생성, 구성, 업데이트 및 실행하려면 다음 단계를 수행하세요.

##### 애플리케이션 생성
<a name="earlier-gs-1_11-get-started-exercise-7-console-create"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. **Managed Service for Apache Flink 대시보드에서 분석 애플리케이션 생성을 선택합니다.**

1. **Managed Service for Apache Flink - 애플리케이션 생성** 페이지에서 다음과 같이 애플리케이션 세부 정보를 제공합니다.
   + **애플리케이션 명칭**에 **MyApplication**을 입력합니다.
   + **설명**에 **My java test app**를 입력합니다.
   + **런타임**에서 **Apache Flink**를 선택합니다.
   + 버전 풀다운은 **Apache Flink 버전 1.11(권장 버전**)로 그대로 두십시오.

1. **액세스 권한**에서 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **애플리케이션 생성**을 선택합니다.

**참고**  
콘솔을 사용하여 Managed Service for Apache Flink 애플리케이션을 만들 때 내 애플리케이션에 대한 IAM 역할 및 정책을 둘 수 있는 옵션이 있습니다. 귀하의 애플리케이션은 이 역할 및 정책을 사용하여 종속 리소스에 액세스합니다. 이러한 IAM 리소스의 이름은 애플리케이션 명칭과 리전을 사용하여 다음과 같이 지정됩니다.  
정책: `kinesis-analytics-service-MyApplication-us-west-2`
역할: `kinesisanalytics-MyApplication-us-west-2`

##### IAM 정책 편집
<a name="earlier-gs-1_11-get-started-exercise-7-console-iam"></a>

IAM 정책을 편집하여 Kinesis Data Streams에 액세스할 수 있는 권한을 추가합니다.

1. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 여세요.

1. **정책**을 선택하세요. 이전 섹션에서 콘솔이 생성한 **`kinesis-analytics-service-MyApplication-us-west-2`** 정책을 선택합니다.

1. **요약** 페이지에서 **정책 편집**을 선택합니다. **JSON** 탭을 선택합니다.

1. 다음 정책 예제의 강조 표시된 부분을 정책에 추가하세요. 샘플 계정 ID(*012345678901*)를 내 계정 ID로 바꿉니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ReadCode",
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "s3:GetObjectVersion"
               ],
               "Resource": [
                   "arn:aws:s3:::ka-app-code-username/aws-kinesis-analytics-java-apps-1.0.jar"
               ]
           },
           {
               "Sid": "DescribeLogGroups",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogGroups"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:*"
               ]
           },
           {
               "Sid": "DescribeLogStreams",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogStreams"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:*"
               ]
           },
           {
               "Sid": "PutLogEvents",
               "Effect": "Allow",
               "Action": [
                   "logs:PutLogEvents"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:kinesis-analytics-log-stream"
               ]
           },
           {
               "Sid": "ReadInputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleInputStream"
           },
           {
               "Sid": "WriteOutputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleOutputStream"
           }
       ]
   }
   ```

------

##### 애플리케이션 구성
<a name="earlier-gs-1_11-get-started-exercise-7-console-configure"></a>

1. **MyApplication** 페이지에서 **구성**을 선택합니다.

1. **애플리케이션 구성** 페이지에서 **코드 위치**를 입력합니다.
   + **Amazon S3 버킷**의 경우 **ka-app-code-*<username>***를 입력합니다.
   + **Amazon S3 객체 경로**에는 **aws-kinesis-analytics-java-apps-1.0.jar**를 입력합니다.

1. **애플리케이션 리소스에 대한 액세스** 아래에서 **액세스 권한**의 경우 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **속성**에서 **그룹 ID**에 **ProducerConfigProperties**를 입력합니다.

1. 다음 애플리케이션 속성 및 값을 입력합니다:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

1. **모니터링**에서 **지표 수준 모니터링**이 **애플리케이션**으로 설정되어 있는지 확인합니다.

1. **CloudWatch 로깅**에서 **활성화** 확인란을 선택합니다.

1. **업데이트**를 선택합니다.

**참고**  
Amazon CloudWatch 로깅을 활성화하도록 선택하면 Managed Service for Apache Flink에서 로그 그룹 및 로그 스트림을 생성합니다. 이러한 리소스의 이름은 다음과 같습니다.  
로그 그룹: `/aws/kinesis-analytics/MyApplication`
로그 스트림: `kinesis-analytics-log-stream`

##### 애플리케이션을 실행합니다
<a name="earlier-gs-1_11-get-started-exercise-7-console-run"></a>

애플리케이션을 실행하고 Apache Flink 대시보드를 연 다음 원하는 Flink 작업을 선택하면 Flink 작업 그래프를 볼 수 있습니다.

##### 애플리케이션 중지
<a name="earlier-gs-1_11-get-started-exercise-7-console-stop"></a>

**MyApplication** 페이지에서 **중지**를 선택합니다. 작업을 확인합니다.

##### 애플리케이션 업데이트
<a name="earlier-gs-1_11-get-started-exercise-7-console-update"></a>

콘솔을 사용하여 애플리케이션 속성, 모니터링 설정, 애플리케이션 JAR의 위치 또는 파일 명칭과 같은 애플리케이션 설정을 업데이트할 수 있습니다. 애플리케이션 코드를 업데이트해야 하는 경우 Amazon S3 버킷에서 애플리케이션 JAR을 다시 로드할 수도 있습니다.

**MyApplication** 페이지에서 **구성**을 선택합니다. 애플리케이션 설정을 업데이트하고 **업데이트**를 선택합니다.

##### 애플리케이션 생성 및 실행(AWS CLI)
<a name="earlier-gs-1_11-get-started-exercise-7-cli"></a>

이 단원에서는 AWS CLI 를 사용하여 Managed Service for Apache Flink 애플리케이션을 생성하고 실행합니다. Managed Service for Apache Flink는 `kinesisanalyticsv2` AWS CLI 명령을 사용하여 Managed Service for Apache Flink 애플리케이션을 생성하고 상호 작용합니다.

##### 권한 정책 생성
<a name="earlier-gs-1_11-get-started-exercise-7-cli-policy"></a>

**참고**  
애플리케이션에 대한 권한 정책 및 역할을 생성해야 합니다. 이러한 IAM 리소스를 생성하지 않으면 애플리케이션은 해당 데이터 및 로그 스트림에 액세스할 수 없습니다.

먼저 소스 스트림에서 두 개의 명령문, 즉 `read` 작업에 대한 권한을 부여하는 명령문과 싱크 스트림에서 `write` 작업에 대한 권한을 부여하는 명령문이 있는 권한 정책을 만듭니다. 그런 다음 정책을 IAM 역할(다음 섹션에서 생성)에 연결합니다. 따라서 Managed Service for Apache Flink가 역할을 맡을 때 서비스는 소스 스트림에서 읽고 싱크 스트림에 쓸 수 있는 권한이 있습니다.

다음 코드를 사용하여 `AKReadSourceStreamWriteSinkStream` 권한 정책을 생성합니다. `username`을 애플리케이션 코드를 저장하기 위해 Amazon S3 버킷을 만들 때 사용한 사용자 이름으로 바꿉니다. Amazon 리소스 이름(ARN)의 계정 ID(`012345678901`)를 사용자의 계정 ID로 바꿉니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "S3",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": ["arn:aws:s3:::ka-app-code-username",
                "arn:aws:s3:::ka-app-code-username/*"
            ]
        },
        {
            "Sid": "ReadInputStream",
            "Effect": "Allow",
            "Action": "kinesis:*",
            "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleInputStream"
        },
        {
            "Sid": "WriteOutputStream",
            "Effect": "Allow",
            "Action": "kinesis:*",
            "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleOutputStream"
        }
    ]
}
```

------

권한 정책을 생성하는 단계별 지침은 *IAM 사용자 가이드*의 [IAM 자습서: 첫 번째 고객 관리형 정책 만들기 및 연결](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_managed-policies.html#part-two-create-policy)을 참조하세요.

**참고**  
 AWS SDK for Java를 사용하여 다른 Amazon 서비스에 액세스할 수 있습니다. Managed Service for Apache Flink는 SDK에 필요한 자격 증명을 애플리케이션과 연결된 서비스 실행 IAM 역할의 자격 증명으로 자동 설정합니다. 추가 단계는 필요 없습니다.

##### IAM 역할 생성
<a name="earlier-gs-1_11-get-started-exercise-7-cli-role"></a>

이 섹션에서는 Managed Service for Apache Flink 애플리케이션이 소스 스트림을 읽고 싱크 스트림에 쓰기 위해 맡을 수 있는 IAM 역할을 생성합니다.

Managed Service for Apache Flink는 권한 없이 스트림에 액세스할 수 없습니다. IAM 역할을 통해 이러한 권한을 부여합니다. 각 IAM 역할에는 두 가지 정책이 연결됩니다. 신뢰 정책은 Managed Service for Apache Flink가 역할을 취할 수 있는 권한을 부여하고, 권한 정책은 역할을 취한 후 Managed Service for Apache Flink에서 수행할 수 있는 작업을 결정합니다.

이전 섹션에서 생성한 권한 정책을 이 역할에 연결합니다.

**IAM 역할을 생성하려면**

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

1. 탐색 창에서 **역할**, **역할 생성**을 선택합니다.

1. **신뢰할 수 있는 유형의 자격 증명 선택**에서 **AWS 서비스**를 선택합니다. **이 역할을 사용할 서비스 선택**에서 **Kinesis**를 선택합니다. **사용 사례 선택**에서 **Kinesis Analytics**를 선택합니다.

   **다음: 권한**을 선택합니다.

1. **권한 정책 연결** 페이지에서 **다음: 검토**를 선택합니다. 역할을 생성한 후에 권한 정책을 연결합니다.

1. **역할 생성** 페이지에서 **역할 이름**으로 **MF-stream-rw-role**을 입력합니다. **역할 생성**을 선택합니다.

   `MF-stream-rw-role`이라는 새 IAM 역할이 생성되었습니다. 그런 다음 역할의 신뢰 정책 및 권한 정책을 업데이트합니다.

1. 역할에 권한 정책을 연결합니다.
**참고**  
이 연습에서는 Managed Service for Apache Flink가 이 역할을 취하여 Kinesis 데이터 스트림(소스)에서 데이터를 읽고 출력을 다른 Kinesis 데이터 스트림에 씁니다. 따라서 이전 단계 [권한 정책 생성](#earlier-gs-1_11-get-started-exercise-7-cli-policy)에서 생성한 정책을 연결합니다.

   1. **요약** 페이지에서 **권한** 탭을 선택합니다.

   1. **정책 연결**을 선택합니다.

   1. 검색 상자에 **AKReadSourceStreamWriteSinkStream**(이전 섹션에서 생성한 정책)을 입력합니다.

   1. **AKReadSourceStreamWriteSinkStream** 정책을 선택하고 **정책 연결**을 선택합니다.

이제 애플리케이션이 리소스에 액세스하는 데 사용하는 서비스 실행 역할이 생성되었습니다. 새 역할의 ARN을 기록합니다.

역할 생성에 대한 단계별 지침은 *IAM 사용 설명서*의 [IAM 역할 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html#roles-creatingrole-user-console)을 참조하세요.

##### Managed Service for Apache Flink 애플리케이션 생성
<a name="earlier-gs-1_11-get-started-exercise-7-cli-create"></a>

1. 다음 JSON 코드를 `create_request.json`이라는 파일에 저장합니다. 샘플 역할 ARN을 이전에 생성한 역할을 위한 ARN으로 바꿉니다. 버킷 ARN 접미사(`username`)를 이전 섹션에서 선택한 접미사로 바꿉니다. 서비스 실행 역할의 샘플 계정 ID(`012345678901`)를 해당 계정 ID로 바꿉니다.

   ```
   {
       "ApplicationName": "test",
       "ApplicationDescription": "my java test app",
       "RuntimeEnvironment": "FLINK-1_11",
       "ServiceExecutionRole": "arn:aws:iam::012345678901:role/MF-stream-rw-role",
       "ApplicationConfiguration": {
           "ApplicationCodeConfiguration": {
               "CodeContent": {
                   "S3ContentLocation": {
                       "BucketARN": "arn:aws:s3:::ka-app-code-username",
                       "FileKey": "aws-kinesis-analytics-java-apps-1.0.jar"
                   }
               },
               "CodeContentType": "ZIPFILE"
           },
           "EnvironmentProperties":  { 
            "PropertyGroups": [ 
               { 
                  "PropertyGroupId": "ProducerConfigProperties",
                  "PropertyMap" : {
                       "flink.stream.initpos" : "LATEST",
                       "aws.region" : "us-west-2",
                       "AggregationEnabled" : "false"
                  }
               },
               { 
                  "PropertyGroupId": "ConsumerConfigProperties",
                  "PropertyMap" : {
                       "aws.region" : "us-west-2"
                  }
               }
            ]
         }
       }
   }
   ```

1. 위의 요청과 함께 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html) 작업을 실행하여 애플리케이션을 생성합니다.

   ```
   aws kinesisanalyticsv2 create-application --cli-input-json file://create_request.json
   ```

애플리케이션이 생성되었습니다. 다음 단계에서는 애플리케이션을 시작합니다.

##### 애플리케이션 시작
<a name="earlier-gs-1_11-get-started-exercise-7-cli-start"></a>

이 섹션에서는 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html) 작업을 사용하여 애플리케이션을 시작합니다.

**애플리케이션을 시작하려면**

1. 다음 JSON 코드를 `start_request.json`이라는 파일에 저장합니다.

   ```
   {
       "ApplicationName": "test",
       "RunConfiguration": {
           "ApplicationRestoreConfiguration": { 
            "ApplicationRestoreType": "RESTORE_FROM_LATEST_SNAPSHOT"
            }
       }
   }
   ```

1. 위의 요청과 함께 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html) 작업을 실행하여 애플리케이션을 시작합니다.

   ```
   aws kinesisanalyticsv2 start-application --cli-input-json file://start_request.json
   ```

애플리케이션이 실행됩니다. Amazon CloudWatch 콘솔에서 Managed Service for Apache Flink 지표를 확인하여 애플리케이션이 작동하는지 확인할 수 있습니다.

##### 애플리케이션 중지
<a name="earlier-gs-1_11-get-started-exercise-7-cli-stop"></a>

이 섹션에서는 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StopApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StopApplication.html) 작업을 사용하여 애플리케이션을 중지합니다.

**애플리케이션을 중지하려면**

1. 다음 JSON 코드를 `stop_request.json`이라는 파일에 저장합니다.

   ```
   {
       "ApplicationName": "test"
   }
   ```

1. 다음 요청과 함께 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StopApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StopApplication.html) 작업을 실행하여 애플리케이션을 중지합니다.

   ```
   aws kinesisanalyticsv2 stop-application --cli-input-json file://stop_request.json
   ```

애플리케이션이 중지됩니다.

##### CloudWatch 로깅 옵션 추가
<a name="earlier-gs-1_11-get-started-exercise-7-cli-cw"></a>

 AWS CLI 를 사용하여 애플리케이션에 Amazon CloudWatch 로그 스트림을 추가할 수 있습니다. 애플리케이션과 함께 CloudWatch Logs 사용하기에 대한 자세한 내용을 알아보려면 [Managed Service for Apache Flink 애플리케이션 로깅 설정](cloudwatch-logs.md) 섹션을 참조하세요.

##### 환경 속성 업데이트
<a name="earlier-gs-1_11-get-started-exercise-7-cli-update-env"></a>

이 섹션에서는 애플리케이션 코드를 다시 컴파일하지 않고도 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 작업을 사용하여 애플리케이션의 환경 속성을 변경할 수 있습니다. 이 예제에서는 원본 스트림과 대상 스트림의 리전을 변경합니다.

**애플리케이션의 환경 속성 업데이트**

1. 다음 JSON 코드를 `update_properties_request.json`이라는 파일에 저장합니다.

   ```
   {"ApplicationName": "test",
      "CurrentApplicationVersionId": 1,
      "ApplicationConfigurationUpdate": { 
         "EnvironmentPropertyUpdates": { 
            "PropertyGroups": [ 
               { 
                  "PropertyGroupId": "ProducerConfigProperties",
                  "PropertyMap" : {
                       "flink.stream.initpos" : "LATEST",
                       "aws.region" : "us-west-2",
                       "AggregationEnabled" : "false"
                  }
               },
               { 
                  "PropertyGroupId": "ConsumerConfigProperties",
                  "PropertyMap" : {
                       "aws.region" : "us-west-2"
                  }
               }
            ]
         }
      }
   }
   ```

1. 이전 요청과 함께 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 작업을 실행하여 환경 속성을 업데이트하십시오.

   ```
   aws kinesisanalyticsv2 update-application --cli-input-json file://update_properties_request.json
   ```

##### 애플리케이션 코드 업데이트
<a name="earlier-gs-1_11-get-started-exercise-7-cli-update-code"></a>

새 버전의 코드 패키지로 애플리케이션 코드를 업데이트해야 하는 경우 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) AWS CLI 작업을 사용합니다.

**참고**  
파일 이름이 같은 새 버전의 애플리케이션 코드를 로드하려면 새 객체 버전을 지정해야 합니다. Amazon S3 객체 버전 사용에 대한 자세한 내용을 알아보려면 [버전 관리 활성화 또는 비활성화](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/enable-versioning.html)를 참조하세요.

를 사용하려면 Amazon S3 버킷에서 이전 코드 패키지를 AWS CLI삭제하고 새 버전을 업로드한 다음 `UpdateApplication`를 호출하여 동일한 Amazon S3 버킷 및 객체 이름과 새 객체 버전을 지정합니다. 애플리케이션이 새 코드 패키지로 다시 시작됩니다.

다음 예 `UpdateApplication` 작업 요청은 애플리케이션 코드를 다시 로드하고 애플리케이션을 다시 시작합니다. `CurrentApplicationVersionId`를 현재 애플리케이션 버전으로 업데이트하세요. `ListApplications` 또는 `DescribeApplication` 작업을 사용하여 현재 애플리케이션 버전을 확인할 수 있습니다. 버킷 명칭 접미사 (*<username>*)를 [2개의 Amazon Kinesis 데이터 스트림 생성](#earlier-gs-1_11-get-started-exercise-1) 섹션에서 선택한 접미사로 업데이트합니다.

```
{
    "ApplicationName": "test",
    "CurrentApplicationVersionId": 1,
    "ApplicationConfigurationUpdate": {
        "ApplicationCodeConfigurationUpdate": {
            "CodeContentUpdate": {
                "S3ContentLocationUpdate": {
                    "BucketARNUpdate": "arn:aws:s3:::ka-app-code-username",
                    "FileKeyUpdate": "aws-kinesis-analytics-java-apps-1.0.jar",
                    "ObjectVersionUpdate": "SAMPLEUehYngP87ex1nzYIGYgfhypvDU"
                }
            }
        }
    }
}
```

#### 다음 단계
<a name="earlier-gs-1_11-get-started-exercise-next-step-4"></a>

[4단계: AWS 리소스 정리](#earlier-gs-1_11-cleanup)

### 4단계: AWS 리소스 정리
<a name="earlier-gs-1_11-cleanup"></a>

이 단원에는 시작하기 자습서에서 생성된 AWS 리소스를 정리하는 절차가 포함되어 있습니다.

**Topics**
+ [Managed Service for Apache Flink 애플리케이션 삭제](#earlier-gs-1_11-cleanup-app)
+ [Kinesis 데이터 스트림 삭제](#earlier-gs-1_11-cleanup-stream)
+ [Amazon S3 객체 및 버킷 삭제](#earlier-gs-1_11-cleanup-s3)
+ [IAM 리소스 삭제](#earlier-gs-1_11-cleanup-iam)
+ [CloudWatch 리소스 삭제](#earlier-gs-1_11-cleanup-cw)
+ [다음 단계](#earlier-gs-1_11-cleanup-next-step-5)

#### Managed Service for Apache Flink 애플리케이션 삭제
<a name="earlier-gs-1_11-cleanup-app"></a>

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

1. Managed Service for Apache Flink 패널에서 **MyApplication**을 선택합니다.

1. 애플리케이션 페이지에서 **삭제**를 선택한 다음 삭제를 확인합니다.

#### Kinesis 데이터 스트림 삭제
<a name="earlier-gs-1_11-cleanup-stream"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. Kinesis Data Streams 패널에서 **ExampleInputStream**을 선택합니다.

1. **ExampleInputStream** 페이지에서 **Kinesis 스트림 삭제**를 선택한 다음 삭제를 확인합니다.

1. **Kinesis 스트림** 페이지에서 **ExampleOutputStream**을 선택하고, **작업**을 선택하고, **삭제**를 선택한 다음 삭제 여부를 확인합니다.

#### Amazon S3 객체 및 버킷 삭제
<a name="earlier-gs-1_11-cleanup-s3"></a>

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

1. **ka-app-code-*<username>* 버킷을 선택합니다.**

1. **삭제**를 선택한 후 버킷 이름을 입력하여 삭제를 확인합니다.

#### IAM 리소스 삭제
<a name="earlier-gs-1_11-cleanup-iam"></a>

1. IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))을 엽니다.

1. 탐색 바에서 **정책**을 선택합니다.

1. 필터 컨트롤에서 **kinesis**를 입력합니다.

1. **kinesis-analytics-service-MyApplication-us-west-2** 정책을 선택합니다.

1. **정책 작업**을 선택한 후 **삭제**를 선택합니다.

1. 탐색 모음에서 **역할**을 선택합니다.

1. **kinesis-analytics-MyApplication-us-west-2** 역할을 선택합니다.

1. **역할 삭제**를 선택하고 삭제를 확인합니다.

#### CloudWatch 리소스 삭제
<a name="earlier-gs-1_11-cleanup-cw"></a>

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

1. 탐색 바에서 **로그**를 선택합니다.

1. **/aws/kinesis-analytics/MyApplication** 로그 그룹을 선택합니다.

1. **로그 그룹 삭제**를 선택한 다음 삭제를 확인합니다.

#### 다음 단계
<a name="earlier-gs-1_11-cleanup-next-step-5"></a>

[5단계: 다음 절차](#earlier-gs-1_11-next-steps)

### 5단계: 다음 절차
<a name="earlier-gs-1_11-next-steps"></a>

이제 Managed Service for Apache Flink 애플리케이션을 만들고 실행했으므로 고급 Managed Service for Apache Flink 솔루션에 대해서는 다음 리소스를 참조하세요.
+ ** [ Amazon Kinesis용 AWS 스트리밍 데이터 솔루션](https://aws.amazon.com/solutions/implementations/aws-streaming-data-solution-for-amazon-kinesis/):** Amazon Kinesis용 AWS 스트리밍 데이터 솔루션은 스트리밍 데이터를 쉽게 캡처, 저장, 처리 및 전송하는 데 필요한 AWS 서비스를 자동으로 구성합니다. 이 솔루션은 스트리밍 데이터 사용 사례를 해결하기 위한 다양한 옵션을 제공합니다. Managed Service for Apache Flink 옵션은 시뮬레이션된 뉴욕 택시 데이터에 대한 분석 작업을 실행하는 실제 애플리케이션을 보여주는 종단 간 스트리밍 ETL 예를 제공합니다. 솔루션은 IAM 역할 및 정책, CloudWatch 대시보드, CloudWatch 경보와 같은 필요한 모든 AWS 리소스를 설정합니다.
+ ** [AWS Amazon MSK용 스트리밍 데이터 솔루션](https://aws.amazon.com/solutions/implementations/aws-streaming-data-solution-for-amazon-msk/):** Amazon MSK용 AWS 스트리밍 데이터 솔루션은 생산자, 스트리밍 스토리지, 소비자 및 대상을 통해 데이터가 흐르는 AWS CloudFormation 템플릿을 제공합니다.
+ ** [ Apache Flink 및 Apache Kafka를 사용한 클릭스트림 랩](https://amazonmsk-labs.workshop.aws/en/mskkdaflinklab.html)**: 스트리밍 스토리지로는 Apache Kafka용 Amazon Managed Streaming을 사용하고 스트림 처리에는 Managed Service for Apache Flink 애플리케이션을 사용하는 클릭스트림 사용 사례를 위한 종합적인 실습입니다.
+ **[Amazon Managed Service for Apache Flink 워크숍](https://catalog.workshops.aws/managed-flink):** 이 워크숍에서는 스트리밍 데이터를 거의 실시간으로 수집, 분석 및 시각화하는 엔드 투 엔드 스트리밍 아키텍처를 구축합니다. 여러분은 뉴욕시에 있는 택시 회사의 운영을 개선하기 위해 나섰습니다. 뉴욕시에 있는 택시의 원격 측정 데이터를 거의 실시간으로 분석하여 차량 운영을 최적화합니다.
+ **[Flink 알아보기: 실습 교육](https://ci.apache.org/projects/flink/flink-docs-master/learn-flink/):** 확장 가능한 스트리밍 ETL, 분석 및 이벤트 기반 애플리케이션 작성을 시작하는 데 도움이 되는 공식 Apache Flink 입문 교육입니다.
**참고**  
Managed Service for Apache Flink는 이 교육에 사용된 Apache Flink 버전(1.12)을 지원하지 않는다는 점에 유의하십시오. Flink Managed Service for Apache Flink에서 Flink 1.15.2를 사용할 수 있습니다.
+ **[Apache Flink 코드 예](https://github.com/apache/flink/tree/master/flink-examples/flink-examples-streaming/src/main/java/org/apache/flink/streaming/examples):** 다양한 아파치 플링크 애플리케이션 예가 있는 GitHub 리포지토리입니다.

## 시작하기: Flink 1.8.2 - 사용 중단
<a name="earlier-gs-1_8"></a>

**참고**  
Apache Flink 버전 **1.6, 1.8, 1.11**은 3년 이상 Apache Flink 커뮤니티의 지원을 받지 못했습니다. Amazon Managed Service for Apache Flink에서는 **2024년 11월 5일**에 이러한 버전을 사용 중단할 예정입니다. 이 날짜부터는 이러한 Flink 버전으로 새로운 애플리케이션을 생성할 수 없습니다. 현재 시점에서는 기존 애플리케이션을 계속 실행할 수 있습니다. Amazon Managed Service for Apache Flink의 인플레이스 버전 업그레이드 기능을 사용하면 상태를 유지한 채 애플리케이션을 업그레이드할 수 있습니다. 자세한 내용은 [Apache Flink에 인플레이스 버전 업그레이드 사용](how-in-place-version-upgrades.md) 섹션을 참조하세요.

이 주제에는 Apache Flink 1.8.2를 사용하는 [자습서: Managed Service for Apache Flink에서 DataStream API 사용 시작하기](getting-started.md) 자습서 버전이 포함되어 있습니다.

**Topics**
+ [Managed Service for Apache Flink 애플리케이션의 구성 요소](#getting-started-components)
+ [연습 완료를 위한 필수 조건](#su-1_8-prerequisites)
+ [1단계: AWS 계정 설정 및 관리자 사용자 생성](#earlier-gs-1_8-setting-up)
+ [2단계: AWS Command Line Interface (AWS CLI) 설정](#su-1_8-awscli)
+ [3단계: Managed Service for Apache Flink 애플리케이션 생성 및 실행](#earlier-gs-1_8-exercise)
+ [4단계: AWS 리소스 정리](#earlier-gs-1_8-cleanup)

### Managed Service for Apache Flink 애플리케이션의 구성 요소
<a name="getting-started-components"></a>

Managed Service for Apache Flink 애플리케이션은 데이터를 처리하기 위해 Apache Flink 런타임을 사용하여 입력을 처리하고 출력을 생성하는 Java/Apache Maven 또는 Scala 애플리케이션을 사용합니다.

Managed Service for Apache Flink 애플리케이션에는 다음과 같은 구성 요소가 있습니다.
+ **런타임 속성:** 애플리케이션 코드를 다시 컴파일하지 않고도 *런타임 속성*을 사용하여 애플리케이션을 구성할 수 있습니다.
+ **소스:** *애플리케이션은 소스를 사용하여 데이터를 소비합니다.* 소스 커넥터는 Kinesis 데이터 스트림, Amazon S3 버킷 등에서 데이터를 읽습니다. 자세한 내용을 알아보려면 [스트리밍 데이터 소스 추가](how-sources.md) 섹션을 참조하세요.
+ **연산자:** 애플리케이션은 하나 이상의 *연산자*를 사용하여 데이터를 처리합니다. 연산자는 데이터를 변환, 강화 또는 집계할 수 있습니다. 자세한 내용을 알아보려면 [연산자](how-operators.md) 섹션을 참조하세요.
+ **싱크:** 애플리케이션은 *싱크*를 사용하여 외부 소스에 데이터를 생성합니다. 싱크 커넥터는 Kinesis 데이터 스트림, Firehose 스트림, Amazon S3 버킷 등에 데이터를 씁니다. 자세한 내용은 [싱크를 사용하여 데이터 쓰기](how-sinks.md) 단원을 참조하십시오.

애플리케이션 코드를 생성, 컴파일 및 패키징한 후 Amazon Simple Storage Service (Amazon S3) 버킷에 코드 패키지를 업로드합니다. 그런 다음 Managed Service for Apache Flink 애플리케이션을 생성합니다. 코드 패키지 위치, Kinesis 데이터 스트림을 스트리밍 데이터 소스로 전달하고, 일반적으로 애플리케이션의 처리된 데이터를 수신하는 스트리밍 또는 파일 위치를 전달합니다.

### 연습 완료를 위한 필수 조건
<a name="su-1_8-prerequisites"></a>

이 가이드의 단계를 완료하려면 다음이 필요합니다.
+ [Java Development Kit](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)(JDK) 버전 8. `JAVA_HOME` 환경 변수가 JDK 설치 위치를 가리키도록 설정합니다.
+ 이 자습서에서 Apache Flink Kinesis 커넥터를 사용하려면 Apache Flink를 다운로드하여 설치해야 합니다. 자세한 내용을 알아보려면 [Apache Flink Kinesis 스트림 커넥터를 이전 Apache Flink 버전과 함께 사용](#how-creating-apps-building-kinesis) 섹션을 참조하세요.
+ 애플리케이션을 개발하고 컴파일하려면 개발 환경(예: [Eclipse Java Neon](http://www.eclipse.org/downloads/packages/release/neon/3) 또는 [IntelliJ Idea](https://www.jetbrains.com/idea/))을 사용하는 것이 좋습니다.
+ [Git 클라이언트](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git). 아직 설치하지 않았다면 Git 클라이언트를 설치합니다.
+ [Apache Maven 컴파일러 플러그인](https://maven.apache.org/plugins/maven-compiler-plugin/). Maven이 해당 작업 경로에 있어야 합니다. Apache Maven 설치를 테스트하려면 다음을 입력하십시오.

  ```
  $ mvn -version
  ```

시작하려면 [1단계: AWS 계정 설정 및 관리자 사용자 생성](#earlier-gs-1_8-setting-up) 섹션으로 이동하십시오.

### 1단계: AWS 계정 설정 및 관리자 사용자 생성
<a name="earlier-gs-1_8-setting-up"></a>

#### 에 가입 AWS 계정
<a name="sign-up-for-aws"></a>

이 없는 경우 다음 단계를 AWS 계정완료하여 생성합니다.

**에 가입하려면 AWS 계정**

1. [https://portal.aws.amazon.com/billing/signup](https://portal.aws.amazon.com/billing/signup)을 엽니다.

1. 온라인 지시 사항을 따르세요.

   등록 절차 중 전화 또는 텍스트 메시지를 받고 전화 키패드로 확인 코드를 입력하는 과정이 있습니다.

   에 가입하면 AWS 계정*AWS 계정 루트 사용자*이 생성됩니다. 루트 사용자에게는 계정의 모든 AWS 서비스 및 리소스에 액세스할 권한이 있습니다. 보안 모범 사례는 사용자에게 관리 액세스 권한을 할당하고, 루트 사용자만 사용하여 [루트 사용자 액세스 권한이 필요한 작업](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)을 수행하는 것입니다.

AWS 는 가입 프로세스가 완료된 후 확인 이메일을 보냅니다. 언제든지 [https://aws.amazon.com/](https://aws.amazon.com/)으로 이동하고 **내 계정**을 선택하여 현재 계정 활동을 확인하고 계정을 관리할 수 있습니다.

#### 관리자 액세스 권한이 있는 사용자 생성
<a name="create-an-admin"></a>

에 가입한 후 일상적인 작업에 루트 사용자를 사용하지 않도록 관리 사용자를 AWS 계정보호 AWS IAM Identity Center, AWS 계정 루트 사용자활성화 및 생성합니다.

**보안 AWS 계정 루트 사용자**

1.  **루트 사용자를** 선택하고 AWS 계정 이메일 주소를 입력하여 계정 소유자[AWS Management Console](https://console.aws.amazon.com/)로에 로그인합니다. 다음 페이지에서 비밀번호를 입력합니다.

   루트 사용자를 사용하여 로그인하는 데 도움이 필요하면 *AWS Sign-In 사용 설명서*의 [루트 사용자로 로그인](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html#introduction-to-root-user-sign-in-tutorial)을 참조하세요.

1. 루트 사용자의 다중 인증(MFA)을 활성화합니다.

   지침은 *IAM 사용 설명서*의 [AWS 계정 루트 사용자(콘솔)에 대한 가상 MFA 디바이스 활성화를 참조하세요](https://docs.aws.amazon.com/IAM/latest/UserGuide/enable-virt-mfa-for-root.html).

**관리자 액세스 권한이 있는 사용자 생성**

1. IAM Identity Center를 활성화합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [AWS IAM Identity Center설정](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-set-up-for-idc.html)을 참조하세요.

1. IAM Identity Center에서 사용자에게 관리 액세스 권한을 부여합니다.

   를 자격 증명 소스 IAM Identity Center 디렉터리 로 사용하는 방법에 대한 자습서는 사용 *AWS IAM Identity Center 설명서*[의 기본값으로 사용자 액세스 구성을 IAM Identity Center 디렉터리](https://docs.aws.amazon.com//singlesignon/latest/userguide/quick-start-default-idc.html) 참조하세요.

**관리 액세스 권한이 있는 사용자로 로그인**
+ IAM IDentity Center 사용자로 로그인하려면 IAM Identity Center 사용자를 생성할 때 이메일 주소로 전송된 로그인 URL을 사용합니다.

  IAM Identity Center 사용자를 사용하여 로그인하는 데 도움이 필요하면 *AWS Sign-In 사용 설명서*[의 AWS 액세스 포털에 로그인](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)을 참조하세요.

**추가 사용자에게 액세스 권한 할당**

1. IAM Identity Center에서 최소 권한 적용 모범 사례를 따르는 권한 세트를 생성합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [Create a permission set](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-started-create-a-permission-set.html)를 참조하세요.

1. 사용자를 그룹에 할당하고, 그룹에 Single Sign-On 액세스 권한을 할당합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [그룹 추가](https://docs.aws.amazon.com//singlesignon/latest/userguide/addgroups.html)를 참조하세요.

#### 프로그래밍 방식 액세스 권한 부여
<a name="setting-up-access-gs-8"></a>

사용자는 AWS 외부에서와 상호 작용하려는 경우 프로그래밍 방식으로 액세스해야 합니다 AWS Management Console. 프로그래밍 방식 액세스를 부여하는 방법은 액세스 중인 사용자 유형에 따라 다릅니다 AWS.

사용자에게 프로그래밍 방식 액세스 권한을 부여하려면 다음 옵션 중 하나를 선택합니다.


****  

| 프로그래밍 방식 액세스가 필요한 사용자 | 목적 | 방법 | 
| --- | --- | --- | 
| IAM | (권장) 콘솔 자격 증명을 임시 자격 증명으로 사용하여 AWS CLI, AWS SDKs 또는 AWS APIs. |  사용하고자 하는 인터페이스에 대한 지침을 따릅니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)  | 
|  작업 인력 ID (IAM Identity Center에서 관리되는 사용자)  | 임시 자격 증명을 사용하여 AWS CLI, AWS SDKs 또는 AWS APIs. |  사용하고자 하는 인터페이스에 대한 지침을 따릅니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)  | 
| IAM | 임시 자격 증명을 사용하여 AWS CLI, AWS SDKs 또는 AWS APIs. | IAM 사용 설명서의 [AWS 리소스에서 임시 자격 증명 사용](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html)의 지침을 따릅니다. | 
| IAM | (권장되지 않음)장기 자격 증명을 사용하여 AWS CLI, AWS SDKs 또는 AWS APIs. |  사용하고자 하는 인터페이스에 대한 지침을 따릅니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)  | 

### 2단계: AWS Command Line Interface (AWS CLI) 설정
<a name="su-1_8-awscli"></a>

이 단계에서는 Managed Service for Apache Flink와 함께 사용하도록 AWS CLI 를 다운로드하고 구성합니다.

**참고**  
이 가이드의 시작하기 연습에서는 해당 계정에서 관리자 자격 증명(`adminuser`)을 사용하여 작업을 수행한다고 가정합니다.

**참고**  
가 이미 AWS CLI 설치되어 있는 경우 최신 기능을 얻기 위해 업그레이드해야 할 수 있습니다. 자세한 내용을 알아보려면 *AWS Command Line Interface 사용자 가이드*에서 [AWS Command Line Interface설치](https://docs.aws.amazon.com/cli/latest/userguide/installing.html)를 참조하세요. 의 버전을 확인하려면 다음 명령을 AWS CLI실행합니다.  

```
aws --version
```
이 자습서의 연습에는 다음 AWS CLI 버전 이상이 필요합니다.  

```
aws-cli/1.16.63
```

**를 설정하려면 AWS CLI**

1.  AWS CLI를 다운로드하고 구성합니다. 관련 지침은 *AWS Command Line Interface 사용 설명서*에서 다음 토픽을 참조하세요.
   + [AWS Command Line Interface설치](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-set-up.html)
   + [AWS CLI구성](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)

1. `config` 파일에 관리자 사용자의 AWS CLI 명명된 프로필을 추가합니다. 이 프로필은 AWS CLI 명령을 실행할 때 사용합니다. 명명된 프로필에 대한 자세한 내용을 알아보려면 *AWS Command Line Interface 사용자 가이드*의 [명명된 프로필](https://docs.aws.amazon.com/cli/latest/userguide/cli-multiple-profiles.html)을 참조하세요.

   ```
   [profile adminuser]
   aws_access_key_id = adminuser access key ID
   aws_secret_access_key = adminuser secret access key
   region = aws-region
   ```

   사용할 수 있는 리전 목록은 *Amazon Web Services 일반 참조*의 [리전 및 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/rande.html)를 참조하세요.
**참고**  
이 자습서의 예 코드 및 명령은 미국 서부(오레곤) 지역을 사용합니다. 다른 AWS 리전을 사용하려면이 자습서의 코드 및 명령에서 리전을 사용하려는 리전으로 변경합니다.

1. 명령 프롬프트에서 다음 help 명령을 입력하여 설정을 확인하십시오: 

   ```
   aws help
   ```

 AWS 계정과를 설정한 후 샘플 애플리케이션을 구성하고 end-to-end 설정을 테스트하는 다음 연습을 시도할 AWS CLI수 있습니다.

#### 다음 단계
<a name="su-1_8-awscli-next-step-3"></a>

[3단계: Managed Service for Apache Flink 애플리케이션 생성 및 실행](#earlier-gs-1_8-exercise)

### 3단계: Managed Service for Apache Flink 애플리케이션 생성 및 실행
<a name="earlier-gs-1_8-exercise"></a>

이 연습에서는 데이터 스트림을 소스 및 싱크로 사용하여 Managed Service for Apache Flink 애플리케이션을 만듭니다.

**Topics**
+ [2개의 Amazon Kinesis 데이터 스트림 생성](#earlier-gs-1_8-exercise-1)
+ [샘플 레코드를 입력 스트림에 쓰기](#earlier-gs-1_8-exercise-2)
+ [Apache Flink 스트리밍 Java 코드 다운로드 및 검사](#earlier-gs-1_8-exercise-5)
+ [애플리케이션 코드 컴파일](#earlier-gs-1_8-exercise-5.5)
+ [Apache Flink 스트리밍 Java 코드 업로드](#earlier-gs-1_8-exercise-6)
+ [Managed Service for Apache Flink 애플리케이션 생성 및 실행](#earlier-gs-1_8-exercise-7)
+ [다음 단계](#earlier-gs-1_8-exercise-next-step-4)

#### 2개의 Amazon Kinesis 데이터 스트림 생성
<a name="earlier-gs-1_8-exercise-1"></a>

이 연습을 위해 Managed Service for Apache Flink 애플리케이션을 생성하기 전에 두 개의 Kinesis 데이터 스트림(`ExampleInputStream` 및 `ExampleOutputStream`)을 생성하세요. 이 애플리케이션은 애플리케이션 소스 및 대상 스트림에 대해 이러한 스트림을 사용합니다.

Amazon Kinesis 콘솔 또는 다음 AWS CLI 명령을 사용하여 이러한 스트림을 만들 수 있습니다. 콘솔 지침은 *Amazon Kinesis Data Streams 개발자 가이드*의 [데이터 스트림 생성 및 업데이트](https://docs.aws.amazon.com/kinesis/latest/dev/amazon-kinesis-streams.html)를 참조하세요.

**데이터 스트림 (AWS CLI)을 생성하려면**

1. 첫 번째 스트림(`ExampleInputStream`)을 생성하려면 다음 Amazon Kinesis `create-stream` AWS CLI 명령을 사용합니다.

   ```
   $ aws kinesis create-stream \
   --stream-name ExampleInputStream \
   --shard-count 1 \
   --region us-west-2 \
   --profile adminuser
   ```

1. 애플리케이션에서 출력을 쓰는 데 사용하는 두 번째 스트림을 생성하려면 동일한 명령을 실행하여 스트림 명칭을 `ExampleOutputStream`으로 변경합니다.

   ```
   $ aws kinesis create-stream \
   --stream-name ExampleOutputStream \
   --shard-count 1 \
   --region us-west-2 \
   --profile adminuser
   ```

#### 샘플 레코드를 입력 스트림에 쓰기
<a name="earlier-gs-1_8-exercise-2"></a>

이 섹션에서는 Python 스크립트를 사용하여 애플리케이션에서 처리할 샘플 레코드를 스트림에 쓰기 합니다.

**참고**  
이 섹션에서는 [AWS SDK for Python (Boto)](https://aws.amazon.com/developers/getting-started/python/)이 필요합니다.

1. 다음 콘텐츠를 가진 `stock.py`이라는 파일을 생성합니다:

   ```
    
   import datetime
   import json
   import random
   import boto3
   
   STREAM_NAME = "ExampleInputStream"
   
   
   def get_data():
       return {
           "EVENT_TIME": datetime.datetime.now().isoformat(),
           "TICKER": random.choice(["AAPL", "AMZN", "MSFT", "INTC", "TBV"]),
           "PRICE": round(random.random() * 100, 2),
       }
   
   
   def generate(stream_name, kinesis_client):
       while True:
           data = get_data()
           print(data)
           kinesis_client.put_record(
               StreamName=stream_name, Data=json.dumps(data), PartitionKey="partitionkey"
           )
   
   
   if __name__ == "__main__":
       generate(STREAM_NAME, boto3.client("kinesis"))
   ```

1. 이 자습서의 뒷부분에서 `stock.py` 스크립트를 실행하여 애플리케이션으로 데이터를 전송합니다.

   ```
   $ python stock.py
   ```

#### Apache Flink 스트리밍 Java 코드 다운로드 및 검사
<a name="earlier-gs-1_8-exercise-5"></a>

이 예에 대한 Java 애플리케이션 코드는 GitHub에서 사용할 수 있습니다. 애플리케이션 코드를 다운로드하려면 다음을 수행하세요.

1. 다음 명령을 사용하여 원격 리포지토리를 복제합니다.

   ```
   git clone https://github.com/aws-samples/amazon-kinesis-data-analytics-examples.git
   ```

1. `amazon-kinesis-data-analytics-java-examples/GettingStarted_1_8` 디렉터리로 이동합니다.

애플리케이션 코드에 대해 다음을 유의하십시오:
+ [프로젝트 객체 모델(pom.xml)](https://maven.apache.org/guides/introduction/introduction-to-the-pom.html) 파일에는 Managed Service for Apache Flink 라이브러리를 비롯한 애플리케이션의 구성 및 종속성에 대한 정보가 들어 있습니다.
+ `BasicStreamingJob.java` 파일에는 애플리케이션의 기능을 정의하는 `main` 메서드가 들어 있습니다.
+ 애플리케이션은 Kinesis 소스를 사용하여 소스 스트림에서 읽습니다. 다음 스니펫은 Kinesis 소스를 생성합니다.

  ```
  return env.addSource(new FlinkKinesisConsumer<>(inputStreamName,
                  new SimpleStringSchema(), inputProperties));
  ```
+ 애플리케이션은 `StreamExecutionEnvironment` 객체를 사용하여 외부 리소스에 액세스하기 위한 소스 및 싱크 커넥터를 생성합니다.
+ 애플리케이션은 정적 속성을 사용하여 소스 및 싱크 커넥터를 만듭니다. 동적 애플리케이션 속성을 사용하려면 `createSourceFromApplicationProperties` 및 `createSinkFromApplicationProperties` 메서드를 사용하여 커넥터를 생성합니다. 이 메서드는 애플리케이션의 속성을 읽어 커넥터를 구성합니다.

  이러한 런타임 속성에 대한 자세한 내용을 알아보려면 [런타임 속성 사용](how-properties.md) 섹션을 참조하세요.

#### 애플리케이션 코드 컴파일
<a name="earlier-gs-1_8-exercise-5.5"></a>

이 섹션에서는 Apache Maven 컴파일러를 사용하여 애플리케이션용 Java 코드를 생성합니다. Apache Maven 및 Java Development Kit(JDK) 설치에 대한 자세한 내용을 알아보려면 [연습 완료를 위한 필수 조건](#su-1_8-prerequisites) 섹션을 참조하십시오.

**참고**  
**Kinesis 커넥터를 Apache Flink 1.11 이전 버전에서 사용하려면 Apache Maven을 다운로드, 빌드, 설치해야 합니다. 자세한 내용은 단원을 참조하십시오[Apache Flink Kinesis 스트림 커넥터를 이전 Apache Flink 버전과 함께 사용](#how-creating-apps-building-kinesis).**

**애플리케이션 코드를 컴파일하려면**

1. 애플리케이션 코드를 사용하려면 이를 컴파일하고 JAR 파일로 패키징합니다. 다음 두 가지 방법 중 하나로 코드를 컴파일하고 패키징할 수 있습니다:
   + 명령행 Maven 도구를 사용합니다. `pom.xml` 파일이 있는 디렉터리에서 다음 명령을 실행하여 JAR 파일을 생성합니다:

     ```
     mvn package -Dflink.version=1.8.2
     ```
   + 귀하의 개발 환경 사용. 자세한 내용을 알아보려면 해당 개발 환경 설명서를 참조하십시오.
**참고**  
제공된 소스 코드는 Java 1.8의 라이브러리를 사용합니다. 프로젝트의 Java 버전이 1.8인지 확인하십시오.

   패키지를 JAR 파일로 업로드하거나 패키지를 압축하여 ZIP 파일로 업로드할 수 있습니다. 를 사용하여 애플리케이션을 생성하는 경우 코드 콘텐츠 유형(JAR 또는 ZIP)을 AWS CLI지정합니다.

1. 컴파일하는 동안 오류가 발생하면 `JAVA_HOME` 환경 변수가 올바르게 설정되어 있는지 확인하십시오.

애플리케이션이 성공적으로 컴파일되면 다음 파일이 생성됩니다:

`target/aws-kinesis-analytics-java-apps-1.0.jar`

#### Apache Flink 스트리밍 Java 코드 업로드
<a name="earlier-gs-1_8-exercise-6"></a>

이 섹션에서는 Amazon Simple Storage Service(Amazon S3) 버킷을 만들고 애플리케이션 코드를 업로드합니다.

**애플리케이션 코드 업로드하기**

1. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

1. **버킷 만들기**를 선택합니다.

1. **버킷 명칭** 필드에 **ka-app-code-*<username>***을 입력합니다. 버킷 명칭에 사용자 이름 등의 접미사를 추가하여 전역적으로 고유하게 만듭니다. **다음**을 선택합니다.

1. **옵션 구성** 단계에서 설정을 기본값 그대로 두고 **다음**을 선택합니다.

1. **권한 설정** 단계에서 설정을 기본값 그대로 두고 **다음**을 선택합니다.

1. **버킷 생성**을 선택합니다.

1. Amazon S3 콘솔에서 **ka-app-code-*<username>*** 버킷을 선택하고 **업로드**를 선택합니다.

1. **파일 선택** 단계에서 **파일 추가**를 선택합니다. 이전 단계에서 생성한 `aws-kinesis-analytics-java-apps-1.0.jar` 파일로 이동합니다. **다음**을 선택합니다.

1. 개체 정보에 대한 설정은 변경할 필요가 없으므로 **업로드**를 선택합니다.

이제 애플리케이션 코드가 애플리케이션에서 액세스할 수 있는 Amazon S3 버킷에 저장됩니다.

#### Managed Service for Apache Flink 애플리케이션 생성 및 실행
<a name="earlier-gs-1_8-exercise-7"></a>

콘솔이나 AWS CLI를 사용하여 Managed Service for Apache Flink 애플리케이션을 생성하고 실행할 수 있습니다.

**참고**  
콘솔을 사용하여 애플리케이션을 생성하면 AWS Identity and Access Management (IAM) 및 Amazon CloudWatch Logs 리소스가 자동으로 생성됩니다. 를 사용하여 애플리케이션을 생성할 때 이러한 리소스를 별도로 AWS CLI생성합니다.

**Topics**
+ [애플리케이션 생성 및 실행(콘솔)](#earlier-gs-1_8-exercise-7-console)
+ [애플리케이션 생성 및 실행(AWS CLI)](#earlier-gs-1_8-exercise-7-cli)

##### 애플리케이션 생성 및 실행(콘솔)
<a name="earlier-gs-1_8-exercise-7-console"></a>

콘솔을 사용하여 애플리케이션을 생성, 구성, 업데이트 및 실행하려면 다음 단계를 수행하세요.

##### 애플리케이션 생성
<a name="earlier-gs-1_8-exercise-7-console-create"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. **Managed Service for Apache Flink 대시보드에서 분석 애플리케이션 생성을 선택합니다.**

1. **Managed Service for Apache Flink - 애플리케이션 생성** 페이지에서 다음과 같이 애플리케이션 세부 정보를 제공합니다.
   + **애플리케이션 명칭**에 **MyApplication**을 입력합니다.
   + **설명**에 **My java test app**를 입력합니다.
   + **런타임**에서 **Apache Flink**를 선택합니다.
   + 버전 풀다운은 **Apache Flink** 1.8(권장 버전)으로 그대로 두십시오.

1. **액세스 권한**에서 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **애플리케이션 생성**을 선택합니다.

**참고**  
콘솔을 사용하여 Managed Service for Apache Flink 애플리케이션을 만들 때 내 애플리케이션에 대한 IAM 역할 및 정책을 둘 수 있는 옵션이 있습니다. 귀하의 애플리케이션은 이 역할 및 정책을 사용하여 종속 리소스에 액세스합니다. 이러한 IAM 리소스의 이름은 애플리케이션 명칭과 리전을 사용하여 다음과 같이 지정됩니다.  
정책: `kinesis-analytics-service-MyApplication-us-west-2`
역할: `kinesisanalytics-MyApplication-us-west-2`

##### IAM 정책 편집
<a name="earlier-gs-1_8-exercise-7-console-iam"></a>

IAM 정책을 편집하여 Kinesis Data Streams에 액세스할 수 있는 권한을 추가합니다.

1. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 여세요.

1. **정책**을 선택하세요. 이전 섹션에서 콘솔이 생성한 **`kinesis-analytics-service-MyApplication-us-west-2`** 정책을 선택합니다.

1. **요약** 페이지에서 **정책 편집**을 선택합니다. **JSON** 탭을 선택합니다.

1. 다음 정책 예제의 강조 표시된 부분을 정책에 추가하세요. 샘플 계정 ID(*012345678901*)를 내 계정 ID로 바꿉니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ReadCode",
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "s3:GetObjectVersion"
               ],
               "Resource": [
                   "arn:aws:s3:::ka-app-code-username/aws-kinesis-analytics-java-apps-1.0.jar"
               ]
           },
           {
               "Sid": "DescribeLogGroups",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogGroups"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:*"
               ]
           },
           {
               "Sid": "DescribeLogStreams",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogStreams"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:*"
               ]
           },
           {
               "Sid": "PutLogEvents",
               "Effect": "Allow",
               "Action": [
                   "logs:PutLogEvents"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:kinesis-analytics-log-stream"
               ]
           },
           {
               "Sid": "ReadInputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleInputStream"
           },
           {
               "Sid": "WriteOutputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleOutputStream"
           }
       ]
   }
   ```

------

##### 애플리케이션 구성
<a name="earlier-gs-1_8-exercise-7-console-configure"></a>

1. **MyApplication** 페이지에서 **구성**을 선택합니다.

1. **애플리케이션 구성** 페이지에서 **코드 위치**를 입력합니다.
   + **Amazon S3 버킷**의 경우 **ka-app-code-*<username>***를 입력합니다.
   + **Amazon S3 객체 경로**에는 **aws-kinesis-analytics-java-apps-1.0.jar**를 입력합니다.

1. **애플리케이션 리소스에 대한 액세스** 아래에서 **액세스 권한**의 경우 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. 다음 애플리케이션 속성 및 값을 입력합니다:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

1. **모니터링**에서 **지표 수준 모니터링**이 **애플리케이션**으로 설정되어 있는지 확인합니다.

1. **CloudWatch 로깅**에서 **활성화** 확인란을 선택합니다.

1. **업데이트**를 선택합니다.

**참고**  
Amazon CloudWatch 로깅을 활성화하도록 선택하면 Managed Service for Apache Flink에서 로그 그룹 및 로그 스트림을 생성합니다. 이러한 리소스의 이름은 다음과 같습니다.  
로그 그룹: `/aws/kinesis-analytics/MyApplication`
로그 스트림: `kinesis-analytics-log-stream`

##### 애플리케이션을 실행합니다
<a name="earlier-gs-1_8-exercise-7-console-run"></a>

1. **MyApplication** 페이지에서 **실행**을 선택합니다. 작업을 확인합니다.

1. 애플리케이션이 실행 중이면 페이지를 새로 고칩니다. 콘솔에 **애플리케이션 그래프**가 표시됩니다.

##### 애플리케이션 중지
<a name="earlier-gs-1_8-exercise-7-console-stop"></a>

**MyApplication** 페이지에서 **중지**를 선택합니다. 작업을 확인합니다.

##### 애플리케이션 업데이트
<a name="earlier-gs-1_8-exercise-7-console-update"></a>

콘솔을 사용하여 애플리케이션 속성, 모니터링 설정, 애플리케이션 JAR의 위치 또는 파일 명칭과 같은 애플리케이션 설정을 업데이트할 수 있습니다. 애플리케이션 코드를 업데이트해야 하는 경우 Amazon S3 버킷에서 애플리케이션 JAR을 다시 로드할 수도 있습니다.

**MyApplication** 페이지에서 **구성**을 선택합니다. 애플리케이션 설정을 업데이트하고 **업데이트**를 선택합니다.

##### 애플리케이션 생성 및 실행(AWS CLI)
<a name="earlier-gs-1_8-exercise-7-cli"></a>

이 섹션에서는 AWS CLI 를 사용하여 Managed Service for Apache Flink 애플리케이션을 생성하고 실행합니다. Managed Service for Apache Flink는 `kinesisanalyticsv2` AWS CLI 명령을 사용하여 Managed Service for Apache Flink 애플리케이션을 생성하고 상호 작용합니다.

##### 권한 정책 생성
<a name="earlier-gs-1_8-exercise-7-cli-policy"></a>

**참고**  
애플리케이션에 대한 권한 정책 및 역할을 생성해야 합니다. 이러한 IAM 리소스를 생성하지 않으면 애플리케이션은 해당 데이터 및 로그 스트림에 액세스할 수 없습니다.

먼저 소스 스트림에서 두 개의 명령문, 즉 `read` 작업에 대한 권한을 부여하는 명령문과 싱크 스트림에서 `write` 작업에 대한 권한을 부여하는 명령문이 있는 권한 정책을 만듭니다. 그런 다음 정책을 IAM 역할(다음 섹션에서 생성)에 연결합니다. 따라서 Managed Service for Apache Flink가 역할을 맡을 때 서비스는 소스 스트림에서 읽고 싱크 스트림에 쓸 수 있는 권한이 있습니다.

다음 코드를 사용하여 `AKReadSourceStreamWriteSinkStream` 권한 정책을 생성합니다. `username`을 애플리케이션 코드를 저장하기 위해 Amazon S3 버킷을 만들 때 사용한 사용자 이름으로 바꿉니다. Amazon 리소스 이름(ARN)의 계정 ID(`012345678901`)를 사용자의 계정 ID로 바꿉니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "S3",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": ["arn:aws:s3:::ka-app-code-username",
                "arn:aws:s3:::ka-app-code-username/*"
            ]
        },
        {
            "Sid": "ReadInputStream",
            "Effect": "Allow",
            "Action": "kinesis:*",
            "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleInputStream"
        },
        {
            "Sid": "WriteOutputStream",
            "Effect": "Allow",
            "Action": "kinesis:*",
            "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleOutputStream"
        }
    ]
}
```

------

권한 정책을 생성하는 단계별 지침은 *IAM 사용자 가이드*의 [IAM 자습서: 첫 번째 고객 관리형 정책 만들기 및 연결](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_managed-policies.html#part-two-create-policy)을 참조하세요.

**참고**  
 AWS SDK for Java를 사용하여 다른 Amazon 서비스에 액세스할 수 있습니다. Managed Service for Apache Flink는 SDK에 필요한 자격 증명을 애플리케이션과 연결된 서비스 실행 IAM 역할의 자격 증명으로 자동 설정합니다. 추가 단계는 필요 없습니다.

##### IAM 역할 생성
<a name="earlier-gs-1_8-exercise-7-cli-role"></a>

이 섹션에서는 Managed Service for Apache Flink 애플리케이션이 소스 스트림을 읽고 싱크 스트림에 쓰기 위해 맡을 수 있는 IAM 역할을 생성합니다.

Managed Service for Apache Flink는 권한 없이 스트림에 액세스할 수 없습니다. IAM 역할을 통해 이러한 권한을 부여합니다. 각 IAM 역할에는 두 가지 정책이 연결됩니다. 신뢰 정책은 Managed Service for Apache Flink가 역할을 취할 수 있는 권한을 부여하고, 권한 정책은 역할을 취한 후 Managed Service for Apache Flink에서 수행할 수 있는 작업을 결정합니다.

이전 섹션에서 생성한 권한 정책을 이 역할에 연결합니다.

**IAM 역할을 생성하려면**

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

1. 탐색 창에서 **역할**, **역할 생성**을 선택합니다.

1. **신뢰할 수 있는 유형의 자격 증명 선택**에서 **AWS 서비스**를 선택합니다. **이 역할을 사용할 서비스 선택**에서 **Kinesis**를 선택합니다. **사용 사례 선택**에서 **Kinesis Analytics**를 선택합니다.

   **다음: 권한**을 선택합니다.

1. **권한 정책 연결** 페이지에서 **다음: 검토**를 선택합니다. 역할을 생성한 후에 권한 정책을 연결합니다.

1. **역할 생성** 페이지에서 **역할 이름**으로 **MF-stream-rw-role**을 입력합니다. **역할 생성**을 선택합니다.

   `MF-stream-rw-role`이라는 새 IAM 역할이 생성되었습니다. 그런 다음 역할의 신뢰 정책 및 권한 정책을 업데이트합니다.

1. 역할에 권한 정책을 연결합니다.
**참고**  
이 연습에서는 Managed Service for Apache Flink가 이 역할을 취하여 Kinesis 데이터 스트림(소스)에서 데이터를 읽고 출력을 다른 Kinesis 데이터 스트림에 씁니다. 따라서 이전 단계 [권한 정책 생성](#earlier-gs-1_8-exercise-7-cli-policy)에서 생성한 정책을 연결합니다.

   1. **요약** 페이지에서 **권한** 탭을 선택합니다.

   1. **정책 연결**을 선택합니다.

   1. 검색 상자에 **AKReadSourceStreamWriteSinkStream**(이전 섹션에서 생성한 정책)을 입력합니다.

   1. **AKReadSourceStreamWriteSinkStream** 정책을 선택하고 **정책 연결**을 선택합니다.

이제 애플리케이션이 리소스에 액세스하는 데 사용하는 서비스 실행 역할이 생성되었습니다. 새 역할의 ARN을 기록합니다.

역할 생성에 대한 단계별 지침은 *IAM 사용 설명서*의 [IAM 역할 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html#roles-creatingrole-user-console)을 참조하세요.

##### Managed Service for Apache Flink 애플리케이션 생성
<a name="earlier-gs-1_8-exercise-7-cli-create"></a>

1. 다음 JSON 코드를 `create_request.json`이라는 파일에 저장합니다. 샘플 역할 ARN을 이전에 생성한 역할을 위한 ARN으로 바꿉니다. 버킷 ARN 접미사(`username`)를 이전 섹션에서 선택한 접미사로 바꿉니다. 서비스 실행 역할의 샘플 계정 ID(`012345678901`)를 해당 계정 ID로 바꿉니다.

   ```
   {
       "ApplicationName": "test",
       "ApplicationDescription": "my java test app",
       "RuntimeEnvironment": "FLINK-1_8",
       "ServiceExecutionRole": "arn:aws:iam::012345678901:role/MF-stream-rw-role",
       "ApplicationConfiguration": {
           "ApplicationCodeConfiguration": {
               "CodeContent": {
                   "S3ContentLocation": {
                       "BucketARN": "arn:aws:s3:::ka-app-code-username",
                       "FileKey": "aws-kinesis-analytics-java-apps-1.0.jar"
                   }
               },
               "CodeContentType": "ZIPFILE"
           },
           "EnvironmentProperties":  { 
            "PropertyGroups": [ 
               { 
                  "PropertyGroupId": "ProducerConfigProperties",
                  "PropertyMap" : {
                       "flink.stream.initpos" : "LATEST",
                       "aws.region" : "us-west-2",
                       "AggregationEnabled" : "false"
                  }
               },
               { 
                  "PropertyGroupId": "ConsumerConfigProperties",
                  "PropertyMap" : {
                       "aws.region" : "us-west-2"
                  }
               }
            ]
         }
       }
   }
   ```

1. 위의 요청과 함께 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html) 작업을 실행하여 애플리케이션을 생성합니다.

   ```
   aws kinesisanalyticsv2 create-application --cli-input-json file://create_request.json
   ```

애플리케이션이 생성되었습니다. 다음 단계에서는 애플리케이션을 시작합니다.

##### 애플리케이션 시작
<a name="earlier-gs-1_8-exercise-7-cli-start"></a>

이 섹션에서는 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html) 작업을 사용하여 애플리케이션을 시작합니다.

**애플리케이션을 시작하려면**

1. 다음 JSON 코드를 `start_request.json`이라는 파일에 저장합니다.

   ```
   {
       "ApplicationName": "test",
       "RunConfiguration": {
           "ApplicationRestoreConfiguration": { 
            "ApplicationRestoreType": "RESTORE_FROM_LATEST_SNAPSHOT"
            }
       }
   }
   ```

1. 위의 요청과 함께 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html) 작업을 실행하여 애플리케이션을 시작합니다.

   ```
   aws kinesisanalyticsv2 start-application --cli-input-json file://start_request.json
   ```

애플리케이션이 실행됩니다. Amazon CloudWatch 콘솔에서 Managed Service for Apache Flink 지표를 확인하여 애플리케이션이 작동하는지 확인할 수 있습니다.

##### 애플리케이션 중지
<a name="earlier-gs-1_8-exercise-7-cli-stop"></a>

이 섹션에서는 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StopApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StopApplication.html) 작업을 사용하여 애플리케이션을 중지합니다.

**애플리케이션을 중지하려면**

1. 다음 JSON 코드를 `stop_request.json`이라는 파일에 저장합니다.

   ```
   {
      "ApplicationName": "test"
   }
   ```

1. 다음 요청과 함께 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StopApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StopApplication.html) 작업을 실행하여 애플리케이션을 중지합니다.

   ```
   aws kinesisanalyticsv2 stop-application --cli-input-json file://stop_request.json
   ```

애플리케이션이 중지됩니다.

##### CloudWatch 로깅 옵션 추가
<a name="earlier-gs-1_8-exercise-7-cli-cw"></a>

 AWS CLI 를 사용하여 애플리케이션에 Amazon CloudWatch 로그 스트림을 추가할 수 있습니다. 애플리케이션과 함께 CloudWatch Logs 사용하기에 대한 자세한 내용을 알아보려면 [Managed Service for Apache Flink 애플리케이션 로깅 설정](cloudwatch-logs.md) 섹션을 참조하세요.

##### 환경 속성 업데이트
<a name="earlier-gs-1_8-exercise-7-cli-update-env"></a>

이 섹션에서는 애플리케이션 코드를 다시 컴파일하지 않고도 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 작업을 사용하여 애플리케이션의 환경 속성을 변경할 수 있습니다. 이 예제에서는 원본 스트림과 대상 스트림의 리전을 변경합니다.

**애플리케이션의 환경 속성 업데이트**

1. 다음 JSON 코드를 `update_properties_request.json`이라는 파일에 저장합니다.

   ```
   {"ApplicationName": "test",
      "CurrentApplicationVersionId": 1,
      "ApplicationConfigurationUpdate": { 
         "EnvironmentPropertyUpdates": { 
            "PropertyGroups": [ 
               { 
                  "PropertyGroupId": "ProducerConfigProperties",
                  "PropertyMap" : {
                       "flink.stream.initpos" : "LATEST",
                       "aws.region" : "us-west-2",
                       "AggregationEnabled" : "false"
                  }
               },
               { 
                  "PropertyGroupId": "ConsumerConfigProperties",
                  "PropertyMap" : {
                       "aws.region" : "us-west-2"
                  }
               }
            ]
         }
      }
   }
   ```

1. 이전 요청과 함께 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 작업을 실행하여 환경 속성을 업데이트하십시오.

   ```
   aws kinesisanalyticsv2 update-application --cli-input-json file://update_properties_request.json
   ```

##### 애플리케이션 코드 업데이트
<a name="earlier-gs-1_8-exercise-7-cli-update-code"></a>

새 버전의 코드 패키지로 애플리케이션 코드를 업데이트해야 하는 경우 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) AWS CLI 작업을 사용합니다.

**참고**  
파일 이름이 같은 새 버전의 애플리케이션 코드를 로드하려면 새 객체 버전을 지정해야 합니다. Amazon S3 객체 버전 사용에 대한 자세한 내용을 알아보려면 [버전 관리 활성화 또는 비활성화](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/enable-versioning.html)를 참조하세요.

를 사용하려면 Amazon S3 버킷에서 이전 코드 패키지를 AWS CLI삭제하고 새 버전을 업로드한 다음 `UpdateApplication`를 호출하여 동일한 Amazon S3 버킷 및 객체 이름과 새 객체 버전을 지정합니다. 애플리케이션이 새 코드 패키지로 다시 시작됩니다.

다음 예 `UpdateApplication` 작업 요청은 애플리케이션 코드를 다시 로드하고 애플리케이션을 다시 시작합니다. `CurrentApplicationVersionId`를 현재 애플리케이션 버전으로 업데이트하세요. `ListApplications` 또는 `DescribeApplication` 작업을 사용하여 현재 애플리케이션 버전을 확인할 수 있습니다. 버킷 명칭 접미사 (*<username>*)를 [2개의 Amazon Kinesis 데이터 스트림 생성](#earlier-gs-1_8-exercise-1) 섹션에서 선택한 접미사로 업데이트합니다.

```
{
    "ApplicationName": "test",
    "CurrentApplicationVersionId": 1,
    "ApplicationConfigurationUpdate": {
        "ApplicationCodeConfigurationUpdate": {
            "CodeContentUpdate": {
                "S3ContentLocationUpdate": {
                    "BucketARNUpdate": "arn:aws:s3:::ka-app-code-username",
                    "FileKeyUpdate": "aws-kinesis-analytics-java-apps-1.0.jar",
                    "ObjectVersionUpdate": "SAMPLEUehYngP87ex1nzYIGYgfhypvDU"
                }
            }
        }
    }
}
```

#### 다음 단계
<a name="earlier-gs-1_8-exercise-next-step-4"></a>

[4단계: AWS 리소스 정리](#earlier-gs-1_8-cleanup)

### 4단계: AWS 리소스 정리
<a name="earlier-gs-1_8-cleanup"></a>

이 단원에는 시작하기 자습서에서 생성된 AWS 리소스를 정리하는 절차가 포함되어 있습니다.

**Topics**
+ [Managed Service for Apache Flink 애플리케이션 삭제](#earlier-gs-1_8-cleanup-app)
+ [Kinesis 데이터 스트림 삭제](#earlier-gs-1_8-cleanup-stream)
+ [Amazon S3 객체 및 버킷 삭제](#earlier-gs-1_8-cleanup-s3)
+ [IAM 리소스 삭제](#earlier-gs-1_8-cleanup-iam)
+ [CloudWatch 리소스 삭제](#earlier-gs-1_8-cleanup-cw)

#### Managed Service for Apache Flink 애플리케이션 삭제
<a name="earlier-gs-1_8-cleanup-app"></a>

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

1. Managed Service for Apache Flink 패널에서 **MyApplication**을 선택합니다.

1. **구성**을 선택합니다.

1. **스냅샷** 섹션에서 **비활성화**를 선택한 다음 **업데이트**를 선택합니다.

1. 애플리케이션 페이지에서 **삭제**를 선택한 다음 삭제를 확인합니다.

#### Kinesis 데이터 스트림 삭제
<a name="earlier-gs-1_8-cleanup-stream"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. Kinesis Data Streams 패널에서 **ExampleInputStream**을 선택합니다.

1. **ExampleInputStream** 페이지에서 **Kinesis 스트림 삭제**를 선택한 다음 삭제를 확인합니다.

1. **Kinesis 스트림** 페이지에서 **ExampleOutputStream**을 선택하고, **작업**을 선택하고, **삭제**를 선택한 다음 삭제 여부를 확인합니다.

#### Amazon S3 객체 및 버킷 삭제
<a name="earlier-gs-1_8-cleanup-s3"></a>

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

1. **ka-app-code-*<username>* 버킷을 선택합니다.**

1. **삭제**를 선택한 후 버킷 이름을 입력하여 삭제를 확인합니다.

#### IAM 리소스 삭제
<a name="earlier-gs-1_8-cleanup-iam"></a>

1. IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))을 엽니다.

1. 탐색 바에서 **정책**을 선택합니다.

1. 필터 컨트롤에서 **kinesis**를 입력합니다.

1. **kinesis-analytics-service-MyApplication-us-west-2** 정책을 선택합니다.

1. **정책 작업**을 선택한 후 **삭제**를 선택합니다.

1. 탐색 모음에서 **역할**을 선택합니다.

1. **kinesis-analytics-MyApplication-us-west-2** 역할을 선택합니다.

1. **역할 삭제**를 선택하고 삭제를 확인합니다.

#### CloudWatch 리소스 삭제
<a name="earlier-gs-1_8-cleanup-cw"></a>

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

1. 탐색 바에서 **로그**를 선택합니다.

1. **/aws/kinesis-analytics/MyApplication** 로그 그룹을 선택합니다.

1. **로그 그룹 삭제**를 선택한 다음 삭제를 확인합니다.

## 시작하기: Flink 1.6.2 - 사용 중단
<a name="earlier-gs-1_6"></a>

**참고**  
Apache Flink 버전 **1.6, 1.8, 1.11**은 3년 이상 Apache Flink 커뮤니티의 지원을 받지 못했습니다. Amazon Managed Service for Apache Flink에서는 **2024년 11월 5일**에 이러한 버전을 사용 중단할 예정입니다. 이 날짜부터는 이러한 Flink 버전으로 새로운 애플리케이션을 생성할 수 없습니다. 현재 시점에서는 기존 애플리케이션을 계속 실행할 수 있습니다. Amazon Managed Service for Apache Flink의 인플레이스 버전 업그레이드 기능을 사용하면 상태를 유지한 채 애플리케이션을 업그레이드할 수 있습니다. 자세한 내용은 [Apache Flink에 인플레이스 버전 업그레이드 사용](how-in-place-version-upgrades.md) 섹션을 참조하세요.

이 주제에는 Apache Flink 1.6.2를 사용하는 [자습서: Managed Service for Apache Flink에서 DataStream API 사용 시작하기](getting-started.md) 자습서 버전이 포함되어 있습니다.

**Topics**
+ [Managed Service for Apache Flink 애플리케이션 구성 요소](#earlier-gs-1_6-components)
+ [연습 완료를 위한 필수 조건](#su-1_6-prerequisites)
+ [1단계: AWS 계정 설정 및 관리자 사용자 생성](#earlier-gs-1_6-setting-up)
+ [2단계: AWS Command Line Interface (AWS CLI) 설정](#su-1_6-awscli)
+ [3단계: Managed Service for Apache Flink 애플리케이션 생성 및 실행](#earlier-gs-1_6-exercise)
+ [4단계: AWS 리소스 정리](#earlier-gs-1_6-cleanup)

### Managed Service for Apache Flink 애플리케이션 구성 요소
<a name="earlier-gs-1_6-components"></a>

Managed Service for Apache Flink 애플리케이션은 데이터를 처리하기 위해 Apache Flink 런타임을 사용하여 입력을 처리하고 출력을 생성하는 Java/Apache Maven 또는 Scala 애플리케이션을 사용합니다.

Managed Service for Apache Flink는 다음과 같은 구성 요소를 갖습니다.
+ **런타임 속성:** 애플리케이션 코드를 다시 컴파일하지 않고도 *런타임 속성*을 사용하여 애플리케이션을 구성할 수 있습니다.
+ **소스:** *애플리케이션은 소스를 사용하여 데이터를 소비합니다.* 소스 커넥터는 Kinesis 데이터 스트림, Amazon S3 버킷 등에서 데이터를 읽습니다. 자세한 내용을 알아보려면 [스트리밍 데이터 소스 추가](how-sources.md) 섹션을 참조하세요.
+ **연산자:** 애플리케이션은 하나 이상의 *연산자*를 사용하여 데이터를 처리합니다. 연산자는 데이터를 변환, 강화 또는 집계할 수 있습니다. 자세한 내용을 알아보려면 [연산자](how-operators.md) 섹션을 참조하세요.
+ **싱크:** 애플리케이션은 *싱크*를 사용하여 외부 소스에 데이터를 생성합니다. 싱크 커넥터는 Kinesis 데이터 스트림, Firehose 스트림, Amazon S3 버킷 등에 데이터를 씁니다. 자세한 내용은 [싱크를 사용하여 데이터 쓰기](how-sinks.md) 단원을 참조하십시오.

애플리케이션 코드를 생성, 컴파일 및 패키징한 후 Amazon Simple Storage Service (Amazon S3) 버킷에 코드 패키지를 업로드합니다. 그런 다음 Managed Service for Apache Flink 애플리케이션을 생성합니다. 코드 패키지 위치, Kinesis 데이터 스트림을 스트리밍 데이터 소스로 전달하고, 일반적으로 애플리케이션의 처리된 데이터를 수신하는 스트리밍 또는 파일 위치를 전달합니다.

### 연습 완료를 위한 필수 조건
<a name="su-1_6-prerequisites"></a>

이 가이드의 단계를 완료하려면 다음이 필요합니다.
+ [Java Development Kit](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)(JDK) 버전 8. `JAVA_HOME` 환경 변수가 JDK 설치 위치를 가리키도록 설정합니다.
+ 애플리케이션을 개발하고 컴파일하려면 개발 환경(예: [Eclipse Java Neon](http://www.eclipse.org/downloads/packages/release/neon/3) 또는 [IntelliJ Idea](https://www.jetbrains.com/idea/))을 사용하는 것이 좋습니다.
+ [Git 클라이언트.](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) 아직 설치하지 않았다면 Git 클라이언트를 설치합니다.
+ [Apache Maven 컴파일러 플러그인](https://maven.apache.org/plugins/maven-compiler-plugin/). Maven이 해당 작업 경로에 있어야 합니다. Apache Maven 설치를 테스트하려면 다음을 입력하십시오.

  ```
  $ mvn -version
  ```

시작하려면 [1단계: AWS 계정 설정 및 관리자 사용자 생성](#earlier-gs-1_6-setting-up) 섹션으로 이동하십시오.

### 1단계: AWS 계정 설정 및 관리자 사용자 생성
<a name="earlier-gs-1_6-setting-up"></a>

#### 에 가입 AWS 계정
<a name="sign-up-for-aws"></a>

이 없는 경우 다음 단계를 AWS 계정완료하여 생성합니다.

**에 가입하려면 AWS 계정**

1. [https://portal.aws.amazon.com/billing/signup](https://portal.aws.amazon.com/billing/signup)을 엽니다.

1. 온라인 지시 사항을 따르세요.

   등록 절차 중 전화 또는 텍스트 메시지를 받고 전화 키패드로 확인 코드를 입력하는 과정이 있습니다.

   에 가입하면 AWS 계정*AWS 계정 루트 사용자*이 생성됩니다. 루트 사용자에게는 계정의 모든 AWS 서비스 및 리소스에 액세스할 권한이 있습니다. 보안 모범 사례는 사용자에게 관리 액세스 권한을 할당하고, 루트 사용자만 사용하여 [루트 사용자 액세스 권한이 필요한 작업](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)을 수행하는 것입니다.

AWS 는 가입 프로세스가 완료된 후 확인 이메일을 보냅니다. 언제든지 [https://aws.amazon.com/](https://aws.amazon.com/)으로 이동하고 **내 계정**을 선택하여 현재 계정 활동을 확인하고 계정을 관리할 수 있습니다.

#### 관리자 액세스 권한이 있는 사용자 생성
<a name="create-an-admin"></a>

에 가입한 후 일상적인 작업에 루트 사용자를 사용하지 않도록 관리 사용자를 AWS 계정보호 AWS IAM Identity Center, AWS 계정 루트 사용자활성화 및 생성합니다.

**보안 AWS 계정 루트 사용자**

1.  **루트 사용자를** 선택하고 AWS 계정 이메일 주소를 입력하여 계정 소유자[AWS Management Console](https://console.aws.amazon.com/)로에 로그인합니다. 다음 페이지에서 비밀번호를 입력합니다.

   루트 사용자를 사용하여 로그인하는 데 도움이 필요하면 *AWS Sign-In 사용 설명서*의 [루트 사용자로 로그인](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html#introduction-to-root-user-sign-in-tutorial)을 참조하세요.

1. 루트 사용자의 다중 인증(MFA)을 활성화합니다.

   지침은 *IAM 사용 설명서*의 [AWS 계정 루트 사용자(콘솔)에 대한 가상 MFA 디바이스 활성화를 참조하세요](https://docs.aws.amazon.com/IAM/latest/UserGuide/enable-virt-mfa-for-root.html).

**관리자 액세스 권한이 있는 사용자 생성**

1. IAM Identity Center를 활성화합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [AWS IAM Identity Center설정](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-set-up-for-idc.html)을 참조하세요.

1. IAM Identity Center에서 사용자에게 관리 액세스 권한을 부여합니다.

   를 자격 증명 소스 IAM Identity Center 디렉터리 로 사용하는 방법에 대한 자습서는 사용 *AWS IAM Identity Center 설명서*[의 기본값으로 사용자 액세스 구성을 IAM Identity Center 디렉터리](https://docs.aws.amazon.com//singlesignon/latest/userguide/quick-start-default-idc.html) 참조하세요.

**관리 액세스 권한이 있는 사용자로 로그인**
+ IAM IDentity Center 사용자로 로그인하려면 IAM Identity Center 사용자를 생성할 때 이메일 주소로 전송된 로그인 URL을 사용합니다.

  IAM Identity Center 사용자를 사용하여 로그인하는 데 도움이 필요하면 *AWS Sign-In 사용 설명서*[의 AWS 액세스 포털에 로그인](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)을 참조하세요.

**추가 사용자에게 액세스 권한 할당**

1. IAM Identity Center에서 최소 권한 적용 모범 사례를 따르는 권한 세트를 생성합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [Create a permission set](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-started-create-a-permission-set.html)를 참조하세요.

1. 사용자를 그룹에 할당하고, 그룹에 Single Sign-On 액세스 권한을 할당합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [그룹 추가](https://docs.aws.amazon.com//singlesignon/latest/userguide/addgroups.html)를 참조하세요.

#### 프로그래밍 방식 액세스 권한 부여
<a name="setting-up-access-gs-6"></a>

사용자는 AWS 외부에서와 상호 작용하려는 경우 프로그래밍 방식으로 액세스해야 합니다 AWS Management Console. 프로그래밍 방식 액세스를 부여하는 방법은 액세스 중인 사용자 유형에 따라 다릅니다 AWS.

사용자에게 프로그래밍 방식 액세스 권한을 부여하려면 다음 옵션 중 하나를 선택합니다.


****  

| 프로그래밍 방식 액세스가 필요한 사용자 | 목적 | 방법 | 
| --- | --- | --- | 
| IAM | (권장) 콘솔 자격 증명을 임시 자격 증명으로 사용하여 AWS CLI, AWS SDKs 또는 AWS APIs. |  사용하고자 하는 인터페이스에 대한 지침을 따릅니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)  | 
|  작업 인력 ID (IAM Identity Center에서 관리되는 사용자)  | 임시 자격 증명을 사용하여 AWS CLI, AWS SDKs 또는 AWS APIs. |  사용하고자 하는 인터페이스에 대한 지침을 따릅니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)  | 
| IAM | 임시 자격 증명을 사용하여 AWS CLI, AWS SDKs 또는 AWS APIs. | IAM 사용 설명서의 [AWS 리소스에서 임시 자격 증명 사용](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html)의 지침을 따릅니다. | 
| IAM | (권장되지 않음)장기 자격 증명을 사용하여 AWS CLI, AWS SDKs 또는 AWS APIs. |  사용하고자 하는 인터페이스에 대한 지침을 따릅니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)  | 

### 2단계: AWS Command Line Interface (AWS CLI) 설정
<a name="su-1_6-awscli"></a>

이 단계에서는 Managed Service for Apache Flink와 함께 AWS CLI 사용하도록를 다운로드하고 구성합니다.

**참고**  
이 가이드의 시작하기 연습에서는 해당 계정에서 관리자 자격 증명(`adminuser`)을 사용하여 작업을 수행한다고 가정합니다.

**참고**  
가 이미 AWS CLI 설치되어 있는 경우 최신 기능을 얻기 위해 업그레이드해야 할 수 있습니다. 자세한 내용을 알아보려면 *AWS Command Line Interface 사용자 가이드*에서 [AWS Command Line Interface설치](https://docs.aws.amazon.com/cli/latest/userguide/installing.html)를 참조하세요. 버전을 확인하려면 다음 명령을 AWS CLI실행합니다.  

```
aws --version
```
이 자습서의 연습에는 다음 AWS CLI 버전 이상이 필요합니다.  

```
aws-cli/1.16.63
```

**를 설정하려면 AWS CLI**

1.  AWS CLI를 다운로드하고 구성합니다. 관련 지침은 *AWS Command Line Interface 사용 설명서*에서 다음 토픽을 참조하세요.
   + [AWS Command Line Interface설치](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-set-up.html)
   + [AWS CLI구성](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)

1. `config` 파일에 관리자 사용자의 AWS CLI 명명된 프로필을 추가합니다. 이 프로필은 AWS CLI 명령을 실행할 때 사용합니다. 프로파일 명명에 대한 자세한 설명은*AWS Command Line Interface 사용자 가이드*의 [프로파일 명명](https://docs.aws.amazon.com/cli/latest/userguide/cli-multiple-profiles.html)을 참조하십시오.

   ```
   [profile adminuser]
   aws_access_key_id = adminuser access key ID
   aws_secret_access_key = adminuser secret access key
   region = aws-region
   ```

   사용 가능한 AWS 리전 목록은의 [리전 및 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/rande.html)를 참조하세요*Amazon Web Services 일반 참조*.
**참고**  
이 자습서의 예 코드 및 명령은 미국 서부(오레곤) 지역을 사용합니다. 다른 지역을 사용하려면 이 자습서의 코드 및 명령에서 지역을 사용하려는 지역으로 변경하십시오.

1. 명령 프롬프트에서 다음 help 명령을 입력하여 설정을 확인하십시오: 

   ```
   aws help
   ```

 AWS 계정과를 설정한 후 샘플 애플리케이션을 구성하고 end-to-end 설정을 테스트하는 다음 연습을 시도할 AWS CLI수 있습니다.

#### 다음 단계
<a name="su-1_6-next-step-3"></a>

[3단계: Managed Service for Apache Flink 애플리케이션 생성 및 실행](#earlier-gs-1_6-exercise)

### 3단계: Managed Service for Apache Flink 애플리케이션 생성 및 실행
<a name="earlier-gs-1_6-exercise"></a>

이 연습에서는 데이터 스트림을 소스 및 싱크로 사용하여 Managed Service for Apache Flink 애플리케이션을 만듭니다.

**Topics**
+ [2개의 Amazon Kinesis 데이터 스트림 생성](#earlier-gs-1_6-exercise-1)
+ [샘플 레코드를 입력 스트림에 쓰기](#earlier-gs-1_6-exercise-2)
+ [Apache Flink 스트리밍 Java 코드 다운로드 및 검사](#earlier-gs-1_6-exercise-5)
+ [애플리케이션 코드 컴파일](#earlier-gs-1_6-exercise-5.5)
+ [Apache Flink 스트리밍 Java 코드 업로드](#earlier-gs-1_6-exercise-6)
+ [Managed Service for Apache Flink 애플리케이션 생성 및 실행](#earlier-gs-1_6-exercise-7)

#### 2개의 Amazon Kinesis 데이터 스트림 생성
<a name="earlier-gs-1_6-exercise-1"></a>

이 연습을 위해 Managed Service for Apache Flink 애플리케이션을 생성하기 전에 두 개의 Kinesis 데이터 스트림(`ExampleInputStream` 및 `ExampleOutputStream`)을 생성하세요. 이 애플리케이션은 애플리케이션 소스 및 대상 스트림에 대해 이러한 스트림을 사용합니다.

Amazon Kinesis 콘솔 또는 다음 AWS CLI 명령을 사용하여 이러한 스트림을 만들 수 있습니다. 콘솔 지침은 *Amazon Kinesis Data Streams 개발자 가이드*의 [데이터 스트림 생성 및 업데이트](https://docs.aws.amazon.com/kinesis/latest/dev/amazon-kinesis-streams.html)를 참조하세요.

**데이터 스트림 (AWS CLI)을 생성하려면**

1. 첫 번째 스트림(`ExampleInputStream`)을 생성하려면 다음 Amazon Kinesis `create-stream` AWS CLI 명령을 사용합니다.

   ```
   $ aws kinesis create-stream \
   --stream-name ExampleInputStream \
   --shard-count 1 \
   --region us-west-2 \
   --profile adminuser
   ```

1. 애플리케이션에서 출력을 쓰는 데 사용하는 두 번째 스트림을 생성하려면 동일한 명령을 실행하여 스트림 명칭을 `ExampleOutputStream`으로 변경합니다.

   ```
   $ aws kinesis create-stream \
   --stream-name ExampleOutputStream \
   --shard-count 1 \
   --region us-west-2 \
   --profile adminuser
   ```

#### 샘플 레코드를 입력 스트림에 쓰기
<a name="earlier-gs-1_6-exercise-2"></a>

이 섹션에서는 Python 스크립트를 사용하여 애플리케이션에서 처리할 샘플 레코드를 스트림에 쓰기 합니다.

**참고**  
이 섹션에서는 [AWS SDK for Python (Boto)](https://aws.amazon.com/developers/getting-started/python/)이 필요합니다.

1. 다음 콘텐츠를 가진 `stock.py`이라는 파일을 생성합니다:

   ```
    
   import datetime
   import json
   import random
   import boto3
   
   STREAM_NAME = "ExampleInputStream"
   
   
   def get_data():
       return {
           "EVENT_TIME": datetime.datetime.now().isoformat(),
           "TICKER": random.choice(["AAPL", "AMZN", "MSFT", "INTC", "TBV"]),
           "PRICE": round(random.random() * 100, 2),
       }
   
   
   def generate(stream_name, kinesis_client):
       while True:
           data = get_data()
           print(data)
           kinesis_client.put_record(
               StreamName=stream_name, Data=json.dumps(data), PartitionKey="partitionkey"
           )
   
   
   if __name__ == "__main__":
       generate(STREAM_NAME, boto3.client("kinesis"))
   ```

1. 이 자습서의 뒷부분에서 `stock.py` 스크립트를 실행하여 애플리케이션으로 데이터를 전송합니다.

   ```
   $ python stock.py
   ```

#### Apache Flink 스트리밍 Java 코드 다운로드 및 검사
<a name="earlier-gs-1_6-exercise-5"></a>

이 예에 대한 Java 애플리케이션 코드는 GitHub에서 사용할 수 있습니다. 애플리케이션 코드를 다운로드하려면 다음을 수행하세요.

1. 다음 명령을 사용하여 원격 리포지토리를 복제합니다.

   ```
   git clone https://github.com/aws-samples/amazon-kinesis-data-analytics-examples.git
   ```

1. `amazon-kinesis-data-analytics-java-examples/GettingStarted_1_6` 디렉터리로 이동합니다.

애플리케이션 코드에 대해 다음을 유의하십시오:
+ [프로젝트 객체 모델(pom.xml)](https://maven.apache.org/guides/introduction/introduction-to-the-pom.html) 파일에는 Managed Service for Apache Flink 라이브러리를 비롯한 애플리케이션의 구성 및 종속성에 대한 정보가 들어 있습니다.
+ `BasicStreamingJob.java` 파일에는 애플리케이션의 기능을 정의하는 `main` 메서드가 들어 있습니다.
+ 애플리케이션은 Kinesis 소스를 사용하여 소스 스트림에서 읽습니다. 다음 스니펫은 Kinesis 소스를 생성합니다.

  ```
  return env.addSource(new FlinkKinesisConsumer<>(inputStreamName,
                  new SimpleStringSchema(), inputProperties));
  ```
+ 애플리케이션은 `StreamExecutionEnvironment` 객체를 사용하여 외부 리소스에 액세스하기 위한 소스 및 싱크 커넥터를 생성합니다.
+ 애플리케이션은 정적 속성을 사용하여 소스 및 싱크 커넥터를 만듭니다. 동적 애플리케이션 속성을 사용하려면 `createSourceFromApplicationProperties` 및 `createSinkFromApplicationProperties` 메서드를 사용하여 커넥터를 생성합니다. 이 메서드는 애플리케이션의 속성을 읽어 커넥터를 구성합니다.

  이러한 런타임 속성에 대한 자세한 내용을 알아보려면 [런타임 속성 사용](how-properties.md) 섹션을 참조하세요.

#### 애플리케이션 코드 컴파일
<a name="earlier-gs-1_6-exercise-5.5"></a>

이 섹션에서는 Apache Maven 컴파일러를 사용하여 애플리케이션용 Java 코드를 생성합니다. Apache Maven 및 Java Development Kit(JDK) 설치에 대한 자세한 내용을 알아보려면 [연습 완료를 위한 필수 조건](#su-1_6-prerequisites) 섹션을 참조하십시오.

**참고**  
**1.11 이전 버전의 Apache Flink에서 Kinesis 커넥터를 사용하려면 커넥터의 소스 코드를 다운로드하고 [Apache Flink 설명서](https://ci.apache.org/projects/flink/flink-docs-release-1.6/dev/connectors/kinesis.html)에 설명된 대로 구축해야 합니다**.

**애플리케이션 코드를 컴파일하려면**

1. 애플리케이션 코드를 사용하려면 이를 컴파일하고 JAR 파일로 패키징합니다. 다음 두 가지 방법 중 하나로 코드를 컴파일하고 패키징할 수 있습니다:
   + 명령행 Maven 도구를 사용합니다. `pom.xml` 파일이 있는 디렉터리에서 다음 명령을 실행하여 JAR 파일을 생성합니다:

     ```
     mvn package
     ```
**참고**  
-Dflink.version 파라미터는 Managed Service for Apache Flink 런타임 버전 1.0.1에는 필요하지 않으며 버전 1.1.0 이상에만 필요합니다. 자세한 내용을 알아보려면 [애플리케이션의 Apache Flink 버전 지정](how-creating-apps.md#how-creating-apps-building-flink) 섹션을 참조하세요.
   + 귀하의 개발 환경 사용. 자세한 내용을 알아보려면 해당 개발 환경 설명서를 참조하십시오.

   패키지를 JAR 파일로 업로드하거나 패키지를 압축하여 ZIP 파일로 업로드할 수 있습니다. 를 사용하여 애플리케이션을 생성하는 경우 코드 콘텐츠 유형(JAR 또는 ZIP)을 AWS CLI지정합니다.

1. 컴파일하는 동안 오류가 발생하면 `JAVA_HOME` 환경 변수가 올바르게 설정되어 있는지 확인하십시오.

애플리케이션이 성공적으로 컴파일되면 다음 파일이 생성됩니다:

`target/aws-kinesis-analytics-java-apps-1.0.jar`

#### Apache Flink 스트리밍 Java 코드 업로드
<a name="earlier-gs-1_6-exercise-6"></a>

이 섹션에서는 Amazon Simple Storage Service(Amazon S3) 버킷을 만들고 애플리케이션 코드를 업로드합니다.

**애플리케이션 코드 업로드하기**

1. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

1. **버킷 만들기**를 선택합니다.

1. **버킷 명칭** 필드에 **ka-app-code-*<username>***을 입력합니다. 버킷 명칭에 사용자 이름 등의 접미사를 추가하여 전역적으로 고유하게 만듭니다. **다음**을 선택합니다.

1. **옵션 구성** 단계에서 설정을 기본값 그대로 두고 **다음**을 선택합니다.

1. **권한 설정** 단계에서 설정을 기본값 그대로 두고 **다음**을 선택합니다.

1. **버킷 생성**을 선택합니다.

1. Amazon S3 콘솔에서 **ka-app-code-*<username>*** 버킷을 선택하고 **업로드**를 선택합니다.

1. **파일 선택** 단계에서 **파일 추가**를 선택합니다. 이전 단계에서 생성한 `aws-kinesis-analytics-java-apps-1.0.jar` 파일로 이동합니다. **다음**을 선택합니다.

1. **권한 설정** 단계에서 설정을 기본값 그대로 유지합니다. **다음**을 선택합니다.

1. **속성 설정** 단계에서 설정을 기본값 그대로 유지합니다. **업로드**를 선택합니다.

이제 애플리케이션 코드가 애플리케이션에서 액세스할 수 있는 Amazon S3 버킷에 저장됩니다.

#### Managed Service for Apache Flink 애플리케이션 생성 및 실행
<a name="earlier-gs-1_6-exercise-7"></a>

콘솔이나 AWS CLI를 사용하여 Managed Service for Apache Flink 애플리케이션을 생성하고 실행할 수 있습니다.

**참고**  
콘솔을 사용하여 애플리케이션을 생성하면 AWS Identity and Access Management (IAM) 및 Amazon CloudWatch Logs 리소스가 자동으로 생성됩니다. 를 사용하여 애플리케이션을 생성할 때 이러한 리소스를 별도로 AWS CLI생성합니다.

**Topics**
+ [애플리케이션 생성 및 실행(콘솔)](#earlier-gs-1_6-exercise-7-console)
+ [애플리케이션 생성 및 실행(AWS CLI)](#earlier-gs-1_6-exercise-7-cli)

##### 애플리케이션 생성 및 실행(콘솔)
<a name="earlier-gs-1_6-exercise-7-console"></a>

콘솔을 사용하여 애플리케이션을 생성, 구성, 업데이트 및 실행하려면 다음 단계를 수행하세요.

##### 애플리케이션 생성
<a name="earlier-gs-1_6-exercise-7-console-create"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. **Managed Service for Apache Flink 대시보드에서 분석 애플리케이션 생성을 선택합니다.**

1. **Managed Service for Apache Flink - 애플리케이션 생성** 페이지에서 다음과 같이 애플리케이션 세부 정보를 제공합니다.
   + **애플리케이션 명칭**에 **MyApplication**을 입력합니다.
   + **설명**에 **My java test app**를 입력합니다.
   + **런타임**에서 **Apache Flink**를 선택합니다.
**참고**  
Managed Service for Apache Flink는 Apache Flink 버전 1.8.2 또는 1.6.2를 사용합니다.
   + **버전 풀다운을 Apache Flink 1.6으로 변경합니다.**

1. **액세스 권한**에서 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **애플리케이션 생성**을 선택합니다.

**참고**  
콘솔을 사용하여 Managed Service for Apache Flink 애플리케이션을 만들 때 내 애플리케이션에 대한 IAM 역할 및 정책을 둘 수 있는 옵션이 있습니다. 귀하의 애플리케이션은 이 역할 및 정책을 사용하여 종속 리소스에 액세스합니다. 이러한 IAM 리소스의 이름은 애플리케이션 명칭과 리전을 사용하여 다음과 같이 지정됩니다.  
정책: `kinesis-analytics-service-MyApplication-us-west-2`
역할: `kinesisanalytics-MyApplication-us-west-2`

##### IAM 정책 편집
<a name="earlier-gs-1_6-exercise-7-console-iam"></a>

IAM 정책을 편집하여 Kinesis Data Streams에 액세스할 수 있는 권한을 추가합니다.

1. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 여세요.

1. **정책**을 선택하세요. 이전 섹션에서 콘솔이 생성한 **`kinesis-analytics-service-MyApplication-us-west-2`** 정책을 선택합니다.

1. **요약** 페이지에서 **정책 편집**을 선택합니다. **JSON** 탭을 선택합니다.

1. 다음 정책 예제의 강조 표시된 부분을 정책에 추가하세요. 샘플 계정 ID(*012345678901*)를 내 계정 ID로 바꿉니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ReadCode",
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "s3:GetObjectVersion"
               ],
               "Resource": [
                   "arn:aws:s3:::ka-app-code-username/java-getting-started-1.0.jar"
               ]
           },
           {
               "Sid": "DescribeLogGroups",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogGroups"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:*"
               ]
           },
           {
               "Sid": "DescribeLogStreams",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogStreams"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:*"
               ]
           },
           {
               "Sid": "PutLogEvents",
               "Effect": "Allow",
               "Action": [
                   "logs:PutLogEvents"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:kinesis-analytics-log-stream"
               ]
           },
           {
               "Sid": "ReadInputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleInputStream"
           },
           {
               "Sid": "WriteOutputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleOutputStream"
           }
       ]
   }
   ```

------

##### 애플리케이션 구성
<a name="earlier-gs-1_6-exercise-7-console-configure"></a>

1. **MyApplication** 페이지에서 **구성**을 선택합니다.

1. **애플리케이션 구성** 페이지에서 **코드 위치**를 입력합니다.
   + **Amazon S3 버킷**의 경우 **ka-app-code-*<username>***를 입력합니다.
   + **Amazon S3 객체 경로**에는 **java-getting-started-1.0.jar**를 입력합니다.

1. **애플리케이션 리소스에 대한 액세스** 아래에서 **액세스 권한**의 경우 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. 다음 애플리케이션 속성 및 값을 입력합니다:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

1. **모니터링**에서 **지표 수준 모니터링**이 **애플리케이션**으로 설정되어 있는지 확인합니다.

1. **CloudWatch 로깅**에서 **활성화** 확인란을 선택합니다.

1. **업데이트**를 선택합니다.

**참고**  
Amazon CloudWatch 로깅을 활성화하도록 선택하면 Managed Service for Apache Flink에서 로그 그룹 및 로그 스트림을 생성합니다. 이러한 리소스의 이름은 다음과 같습니다.  
로그 그룹: `/aws/kinesis-analytics/MyApplication`
로그 스트림: `kinesis-analytics-log-stream`

##### 애플리케이션을 실행합니다
<a name="earlier-gs-1_6-exercise-7-console-run"></a>

1. **MyApplication** 페이지에서 **실행**을 선택합니다. 작업을 확인합니다.

1. 애플리케이션이 실행 중이면 페이지를 새로 고칩니다. 콘솔에 **애플리케이션 그래프**가 표시됩니다.

##### 애플리케이션 중지
<a name="earlier-gs-1_6-exercise-7-console-stop"></a>

**MyApplication** 페이지에서 **중지**를 선택합니다. 작업을 확인합니다.

##### 애플리케이션 업데이트
<a name="earlier-gs-1_6-exercise-7-console-update"></a>

콘솔을 사용하여 애플리케이션 속성, 모니터링 설정, 애플리케이션 JAR의 위치 또는 파일 명칭과 같은 애플리케이션 설정을 업데이트할 수 있습니다. 애플리케이션 코드를 업데이트해야 하는 경우 Amazon S3 버킷에서 애플리케이션 JAR을 다시 로드할 수도 있습니다.

**MyApplication** 페이지에서 **구성**을 선택합니다. 애플리케이션 설정을 업데이트하고 **업데이트**를 선택합니다.

##### 애플리케이션 생성 및 실행(AWS CLI)
<a name="earlier-gs-1_6-exercise-7-cli"></a>

이 섹션에서는 AWS CLI 를 사용하여 Managed Service for Apache Flink 애플리케이션을 생성하고 실행합니다. Managed Service for Apache Flink는 `kinesisanalyticsv2` AWS CLI 명령을 사용하여 Managed Service for Apache Flink 애플리케이션을 생성하고 상호 작용합니다.

##### 권한 정책 생성
<a name="earlier-gs-1_6-exercise-7-cli-policy"></a>

먼저 소스 스트림에서 두 개의 명령문, 즉 `read` 작업에 대한 권한을 부여하는 명령문과 싱크 스트림에서 `write` 작업에 대한 권한을 부여하는 명령문이 있는 권한 정책을 만듭니다. 그런 다음 정책을 IAM 역할(다음 섹션에서 생성)에 연결합니다. 따라서 Managed Service for Apache Flink가 역할을 맡을 때 서비스는 소스 스트림에서 읽고 싱크 스트림에 쓸 수 있는 권한이 있습니다.

다음 코드를 사용하여 `AKReadSourceStreamWriteSinkStream` 권한 정책을 생성합니다. `username`을 애플리케이션 코드를 저장하기 위해 Amazon S3 버킷을 만들 때 사용한 사용자 이름으로 바꿉니다. Amazon 리소스 이름(ARN)의 계정 ID(`012345678901`)를 사용자의 계정 ID로 바꿉니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "S3",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": ["arn:aws:s3:::ka-app-code-username",
                "arn:aws:s3:::ka-app-code-username/*"
            ]
        },
        {
            "Sid": "ReadInputStream",
            "Effect": "Allow",
            "Action": "kinesis:*",
            "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleInputStream"
        },
        {
            "Sid": "WriteOutputStream",
            "Effect": "Allow",
            "Action": "kinesis:*",
            "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleOutputStream"
        }
    ]
}
```

------

권한 정책을 생성하는 단계별 지침은 *IAM 사용자 가이드*의 [IAM 자습서: 첫 번째 고객 관리형 정책 만들기 및 연결](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_managed-policies.html#part-two-create-policy)을 참조하세요.

**참고**  
 AWS SDK for Java를 사용하여 다른 Amazon 서비스에 액세스할 수 있습니다. Managed Service for Apache Flink는 SDK에 필요한 자격 증명을 애플리케이션과 연결된 서비스 실행 IAM 역할의 자격 증명으로 자동 설정합니다. 추가 단계는 필요 없습니다.

##### IAM 역할 생성
<a name="earlier-gs-1_6-exercise-7-cli-role"></a>

이 섹션에서는 Managed Service for Apache Flink 애플리케이션이 소스 스트림을 읽고 싱크 스트림에 쓰기 위해 맡을 수 있는 IAM 역할을 생성합니다.

Managed Service for Apache Flink는 권한 없이 스트림에 액세스할 수 없습니다. IAM 역할을 통해 이러한 권한을 부여합니다. 각 IAM 역할에는 두 가지 정책이 연결됩니다. 신뢰 정책은 Managed Service for Apache Flink가 역할을 취할 수 있는 권한을 부여하고, 권한 정책은 역할을 취한 후 Managed Service for Apache Flink에서 수행할 수 있는 작업을 결정합니다.

이전 섹션에서 생성한 권한 정책을 이 역할에 연결합니다.

**IAM 역할을 생성하려면**

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

1. 탐색 창에서 **역할**, **역할 생성**을 선택합니다.

1. **신뢰할 수 있는 유형의 자격 증명 선택**에서 **AWS 서비스**를 선택합니다. **이 역할을 사용할 서비스 선택**에서 **Kinesis**를 선택합니다. **사용 사례 선택**에서 **Kinesis Analytics**를 선택합니다.

   **다음: 권한**을 선택합니다.

1. **권한 정책 연결** 페이지에서 **다음: 검토**를 선택합니다. 역할을 생성한 후에 권한 정책을 연결합니다.

1. **역할 생성** 페이지에서 **역할 이름**으로 **MF-stream-rw-role**을 입력합니다. **역할 생성**을 선택합니다.

   `MF-stream-rw-role`이라는 새 IAM 역할이 생성되었습니다. 그런 다음 역할의 신뢰 정책 및 권한 정책을 업데이트합니다.

1. 역할에 권한 정책을 연결합니다.
**참고**  
이 연습에서는 Managed Service for Apache Flink가 이 역할을 취하여 Kinesis 데이터 스트림(소스)에서 데이터를 읽고 출력을 다른 Kinesis 데이터 스트림에 씁니다. 따라서 이전 단계 [권한 정책 생성](#earlier-gs-1_6-exercise-7-cli-policy)에서 생성한 정책을 연결합니다.

   1. **요약** 페이지에서 **권한** 탭을 선택합니다.

   1. **정책 연결**을 선택합니다.

   1. 검색 상자에 **AKReadSourceStreamWriteSinkStream**(이전 섹션에서 생성한 정책)을 입력합니다.

   1. **AKReadSourceStreamWriteSinkStream** 정책을 선택하고 **정책 연결**을 선택합니다.

이제 애플리케이션이 리소스에 액세스하는 데 사용하는 서비스 실행 역할이 생성되었습니다. 새 역할의 ARN을 기록합니다.

역할 생성에 대한 단계별 지침은 *IAM 사용 설명서*의 [IAM 역할 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html#roles-creatingrole-user-console)을 참조하세요.

##### Managed Service for Apache Flink 애플리케이션 생성
<a name="earlier-gs-1_6-exercise-7-cli-create"></a>

1. 다음 JSON 코드를 `create_request.json`이라는 파일에 저장합니다. 샘플 역할 ARN을 이전에 생성한 역할을 위한 ARN으로 바꿉니다. 버킷 ARN 접미사(`username`)를 이전 섹션에서 선택한 접미사로 바꿉니다. 서비스 실행 역할의 샘플 계정 ID(`012345678901`)를 해당 계정 ID로 바꿉니다.

   ```
   {
       "ApplicationName": "test",
       "ApplicationDescription": "my java test app",
       "RuntimeEnvironment": "FLINK-1_6",
       "ServiceExecutionRole": "arn:aws:iam::012345678901:role/MF-stream-rw-role",
       "ApplicationConfiguration": {
           "ApplicationCodeConfiguration": {
               "CodeContent": {
                   "S3ContentLocation": {
                       "BucketARN": "arn:aws:s3:::ka-app-code-username",
                       "FileKey": "java-getting-started-1.0.jar"
                   }
               },
               "CodeContentType": "ZIPFILE"
           },
           "EnvironmentProperties":  { 
            "PropertyGroups": [ 
               { 
                  "PropertyGroupId": "ProducerConfigProperties",
                  "PropertyMap" : {
                       "flink.stream.initpos" : "LATEST",
                       "aws.region" : "us-west-2",
                       "AggregationEnabled" : "false"
                  }
               },
               { 
                  "PropertyGroupId": "ConsumerConfigProperties",
                  "PropertyMap" : {
                       "aws.region" : "us-west-2"
                  }
               }
            ]
         }
       }
   }
   ```

1. 위의 요청과 함께 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html) 작업을 실행하여 애플리케이션을 생성합니다.

   ```
   aws kinesisanalyticsv2 create-application --cli-input-json file://create_request.json
   ```

애플리케이션이 생성되었습니다. 다음 단계에서는 애플리케이션을 시작합니다.

##### 애플리케이션 시작
<a name="earlier-gs-1_6-exercise-7-cli-start"></a>

이 섹션에서는 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html) 작업을 사용하여 애플리케이션을 시작합니다.

**애플리케이션을 시작하려면**

1. 다음 JSON 코드를 `start_request.json`이라는 파일에 저장합니다.

   ```
   {
       "ApplicationName": "test",
       "RunConfiguration": {
           "ApplicationRestoreConfiguration": { 
            "ApplicationRestoreType": "RESTORE_FROM_LATEST_SNAPSHOT"
            }
       }
   }
   ```

1. 위의 요청과 함께 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html) 작업을 실행하여 애플리케이션을 시작합니다.

   ```
   aws kinesisanalyticsv2 start-application --cli-input-json file://start_request.json
   ```

애플리케이션이 실행됩니다. Amazon CloudWatch 콘솔에서 Managed Service for Apache Flink 지표를 확인하여 애플리케이션이 작동하는지 확인할 수 있습니다.

##### 애플리케이션 중지
<a name="earlier-gs-1_6-exercise-7-cli-stop"></a>

이 섹션에서는 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StopApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StopApplication.html) 작업을 사용하여 애플리케이션을 중지합니다.

**애플리케이션을 중지하려면**

1. 다음 JSON 코드를 `stop_request.json`이라는 파일에 저장합니다.

   ```
   {
      "ApplicationName": "test"
   }
   ```

1. 다음 요청과 함께 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StopApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StopApplication.html) 작업을 실행하여 애플리케이션을 중지합니다.

   ```
   aws kinesisanalyticsv2 stop-application --cli-input-json file://stop_request.json
   ```

애플리케이션이 중지됩니다.

##### CloudWatch 로깅 옵션 추가
<a name="earlier-gs-1_6-exercise-7-cli-cw"></a>

 AWS CLI 를 사용하여 애플리케이션에 Amazon CloudWatch 로그 스트림을 추가할 수 있습니다. 애플리케이션과 함께 CloudWatch Logs 사용하기에 대한 자세한 내용을 알아보려면 [Managed Service for Apache Flink 애플리케이션 로깅 설정](cloudwatch-logs.md) 섹션을 참조하세요.

##### 환경 속성 업데이트
<a name="earlier-gs-1_6-exercise-7-cli-update-env"></a>

이 섹션에서는 애플리케이션 코드를 다시 컴파일하지 않고도 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 작업을 사용하여 애플리케이션의 환경 속성을 변경할 수 있습니다. 이 예제에서는 원본 스트림과 대상 스트림의 리전을 변경합니다.

**애플리케이션의 환경 속성 업데이트**

1. 다음 JSON 코드를 `update_properties_request.json`이라는 파일에 저장합니다.

   ```
   {"ApplicationName": "test",
      "CurrentApplicationVersionId": 1,
      "ApplicationConfigurationUpdate": { 
         "EnvironmentPropertyUpdates": { 
            "PropertyGroups": [ 
               { 
                  "PropertyGroupId": "ProducerConfigProperties",
                  "PropertyMap" : {
                       "flink.stream.initpos" : "LATEST",
                       "aws.region" : "us-west-2",
                       "AggregationEnabled" : "false"
                  }
               },
               { 
                  "PropertyGroupId": "ConsumerConfigProperties",
                  "PropertyMap" : {
                       "aws.region" : "us-west-2"
                  }
               }
            ]
         }
      }
   }
   ```

1. 이전 요청과 함께 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 작업을 실행하여 환경 속성을 업데이트하십시오.

   ```
   aws kinesisanalyticsv2 update-application --cli-input-json file://update_properties_request.json
   ```

##### 애플리케이션 코드 업데이트
<a name="earlier-gs-1_6-exercise-7-cli-update-code"></a>

새 버전의 코드 패키지로 애플리케이션 코드를 업데이트해야 하는 경우 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) AWS CLI 작업을 사용합니다.

를 사용하려면 Amazon S3 버킷에서 이전 코드 패키지를 AWS CLI삭제하고 새 버전을 업로드한 다음를 호출하여 동일한 Amazon S3 버킷과 객체 이름을 `UpdateApplication`지정합니다. 애플리케이션이 새 코드 패키지로 다시 시작됩니다.

다음 예 `UpdateApplication` 작업 요청은 애플리케이션 코드를 다시 로드하고 애플리케이션을 다시 시작합니다. `CurrentApplicationVersionId`를 현재 애플리케이션 버전으로 업데이트하세요. `ListApplications` 또는 `DescribeApplication` 작업을 사용하여 현재 애플리케이션 버전을 확인할 수 있습니다. 버킷 명칭 접미사 (*<username>*)를 [2개의 Amazon Kinesis 데이터 스트림 생성](#earlier-gs-1_6-exercise-1) 섹션에서 선택한 접미사로 업데이트합니다.

```
{
    "ApplicationName": "test",
    "CurrentApplicationVersionId": 1,
    "ApplicationConfigurationUpdate": {
        "ApplicationCodeConfigurationUpdate": {
            "CodeContentUpdate": {
                "S3ContentLocationUpdate": {
                    "BucketARNUpdate": "arn:aws:s3:::ka-app-code-username",
                    "FileKeyUpdate": "java-getting-started-1.0.jar"
                }
            }
        }
    }
}
```

### 4단계: AWS 리소스 정리
<a name="earlier-gs-1_6-cleanup"></a>

이 단원에는 시작하기 자습서에서 생성된 AWS 리소스를 정리하는 절차가 포함되어 있습니다.

**Topics**
+ [Managed Service for Apache Flink 애플리케이션 삭제](#earlier-gs-1_6-cleanup-app)
+ [Kinesis 데이터 스트림 삭제](#earlier-gs-1_6-cleanup-stream)
+ [Amazon S3 객체 및 버킷 삭제](#earlier-gs-1_6-cleanup-s3)
+ [IAM 리소스 삭제](#earlier-gs-1_6-cleanup-iam)
+ [CloudWatch 리소스 삭제](#earlier-gs-1_6-cleanup-cw)

#### Managed Service for Apache Flink 애플리케이션 삭제
<a name="earlier-gs-1_6-cleanup-app"></a>

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

1. Managed Service for Apache Flink 패널에서 **MyApplication**을 선택합니다.

1. **구성**을 선택합니다.

1. **스냅샷** 섹션에서 **비활성화**를 선택한 다음 **업데이트**를 선택합니다.

1. 애플리케이션 페이지에서 **삭제**를 선택한 다음 삭제를 확인합니다.

#### Kinesis 데이터 스트림 삭제
<a name="earlier-gs-1_6-cleanup-stream"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. Kinesis Data Streams 패널에서 **ExampleInputStream**을 선택합니다.

1. **ExampleInputStream** 페이지에서 **Kinesis 스트림 삭제**를 선택한 다음 삭제를 확인합니다.

1. **Kinesis 스트림** 페이지에서 **ExampleOutputStream**을 선택하고, **작업**을 선택하고, **삭제**를 선택한 다음 삭제 여부를 확인합니다.

#### Amazon S3 객체 및 버킷 삭제
<a name="earlier-gs-1_6-cleanup-s3"></a>

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

1. **ka-app-code-*<username>* 버킷을 선택합니다.**

1. **삭제**를 선택한 후 버킷 이름을 입력하여 삭제를 확인합니다.

#### IAM 리소스 삭제
<a name="earlier-gs-1_6-cleanup-iam"></a>

1. IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))을 엽니다.

1. 탐색 바에서 **정책**을 선택합니다.

1. 필터 컨트롤에서 **kinesis**를 입력합니다.

1. **kinesis-analytics-service-MyApplication-us-west-2** 정책을 선택합니다.

1. **정책 작업**을 선택한 후 **삭제**를 선택합니다.

1. 탐색 모음에서 **역할**을 선택합니다.

1. **kinesis-analytics-MyApplication-us-west-2** 역할을 선택합니다.

1. **역할 삭제**를 선택하고 삭제를 확인합니다.

#### CloudWatch 리소스 삭제
<a name="earlier-gs-1_6-cleanup-cw"></a>

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

1. 탐색 바에서 **로그**를 선택합니다.

1. **/aws/kinesis-analytics/MyApplication** 로그 그룹을 선택합니다.

1. **로그 그룹 삭제**를 선택한 다음 삭제를 확인합니다.

## Managed Service for Apache Flink의 이전 버전(레거시) 예제
<a name="legacy-examples"></a>

**참고**  
현재 예제는 [Managed Service for Apache Flink 애플리케이션 생성 및 사용 예제](examples-collapsibles.md) 섹션을 참조하세요.

이 섹션은 Managed Service for Apache Flink에서 애플리케이션을 만들고 사용하는 방법의 예제들을 제공합니다. 여기에는 Managed Service for Apache Flink 애플리케이션을 생성하고 결과를 테스트하는 데 도움이 되는 예제 코드와 단계별 지침이 포함되어 있습니다.

이 예제들을 살펴보기 전에 먼저 다음 사항을 검토하는 것이 좋습니다.
+ [작동 방식](how-it-works.md)
+ [자습서: Managed Service for Apache Flink에서 DataStream API 사용 시작하기](getting-started.md)

**참고**  
이 예제들은 사용자가 미국 서부(오레곤) 리전(`us-west-2`)을 사용하고 있다고 가정합니다. 다른 리전을 사용하는 경우 애플리케이션 코드, 명령, IAM 역할을 적절하게 업데이트하세요.

**Topics**
+ [DataStream API 예제](#examples-datastream)
+ [Python 예제](#examples-python)
+ [Scala 예제](#examples-scala)

### DataStream API 예제
<a name="examples-datastream"></a>

다음 예제는 Apache Flink DataStream API를 사용하여 애플리케이션을 생성하는 방법을 보여줍니다.

**Topics**
+ [예: 텀블링 윈도우](#examples-tumbling)
+ [예: 슬라이딩 윈도우](#examples-sliding)
+ [예: Amazon S3 버킷에 쓰기](#examples-s3)
+ [자습서: Managed Service for Apache Flink 애플리케이션을 사용하여 MSK 클러스터의 한 주제에서 VPC의 다른 주제로 데이터 복제](#example-msk)
+ [예: Kinesis 데이터 스트림과 함께 EFO 소비자 사용](#examples-efo)
+ [예제: Firehose에 쓰기](#get-started-exercise-fh)
+ [예: 다른 계정의 Kinesis 스트림에서 읽기](#examples-cross)
+ [자습서: Amazon MSK에서 사용자 지정 트러스트 스토어 사용](#example-keystore)

#### 예: 텀블링 윈도우
<a name="examples-tumbling"></a>

**참고**  
현재 예제는 [Managed Service for Apache Flink 애플리케이션 생성 및 사용 예제](examples-collapsibles.md) 섹션을 참조하세요.

이 연습에서는 텀블링 윈도우를 사용하여 데이터를 집계하는 Managed Service for Apache Flink 애플리케이션을 만들어 봅니다. Flink에서 집계(aggregration)는 기본적으로 활성화되어 있습니다. 이것을 비활성화하려면 다음 명령을 사용합니다.

```
sink.producer.aggregation-enabled' = 'false'
```

**참고**  
이 연습에 필수 사전 조건을 설정하려면 먼저 [자습서: Managed Service for Apache Flink에서 DataStream API 사용 시작하기](getting-started.md) 연습을 완료하세요.

**Topics**
+ [종속 리소스 생성](#examples-tumbling-resources)
+ [샘플 레코드를 입력 스트림에 쓰기](#examples-tumbling-write)
+ [애플리케이션 코드 다운로드 및 검토](#examples-tumbling-download)
+ [애플리케이션 코드 컴파일](#examples-tumbling-compile)
+ [Apache Flink 스트리밍 Java 코드 업로드](#examples-tumbling-upload)
+ [Managed Service for Apache Flink 애플리케이션 생성 및 실행](#examples-tumbling-create-run)
+ [AWS 리소스 정리](#examples-tumbling-cleanup)

##### 종속 리소스 생성
<a name="examples-tumbling-resources"></a>

이 연습을 위해 Managed Service for Apache Flink 애플리케이션을 생성하기 전에 다음과 같은 종속 리소스를 생성해야 합니다.
+ 두 개의 Kinesis Data Streams(`ExampleInputStream` 및 `ExampleOutputStream`)
+ 애플리케이션 코드를 저장할 Amazon S3 버킷(`ka-app-code-<username>`) 

콘솔을 사용하여 Kinesis 스트림과 Amazon S3 버킷을 만들 수 있습니다. 이러한 리소스를 만드는 방법 설명은 다음 주제를 참조하세요.
+ *Amazon Kinesis Data Streams 개발자 안내서*의 [데이터 스트림 만들기 및 업데이트](https://docs.aws.amazon.com/kinesis/latest/dev/amazon-kinesis-streams.html). 데이터 스트림 **ExampleInputStream** 및 **ExampleOutputStream**의 이름을 지정합니다.
+ *Amazon Simple Storage Service 사용 설명서*의 [S3 버킷을 생성하려면 어떻게 해야 합니까?](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket.html) 로그인 명칭(예: **ka-app-code-*<username>***)을 추가하여 Amazon S3 버킷에 전역적으로 고유한 명칭을 지정합니다.

##### 샘플 레코드를 입력 스트림에 쓰기
<a name="examples-tumbling-write"></a>

이 섹션에서는 Python 스크립트를 사용하여 애플리케이션에서 처리할 샘플 레코드를 스트림에 쓰기 합니다.

**참고**  
이 섹션에서는 [AWS SDK for Python (Boto)](https://aws.amazon.com/developers/getting-started/python/)이 필요합니다.

1. 다음 콘텐츠를 가진 `stock.py`이라는 파일을 생성합니다:

   ```
       import datetime
       import json
       import random
       import boto3
   
       STREAM_NAME = "ExampleInputStream"
   
   
       def get_data():
           return {
               'event_time': datetime.datetime.now().isoformat(),
               'ticker': random.choice(['AAPL', 'AMZN', 'MSFT', 'INTC', 'TBV']),
               'price': round(random.random() * 100, 2)}
   
   
       def generate(stream_name, kinesis_client):
           while True:
               data = get_data()
               print(data)
               kinesis_client.put_record(
                   StreamName=stream_name,
                   Data=json.dumps(data),
                   PartitionKey="partitionkey")
   
   
       if __name__ == '__main__':
           generate(STREAM_NAME, boto3.client('kinesis', region_name='us-west-2'))
   ```

1. `stock.py` 스크립트를 실행합니다.

   ```
   $ python stock.py
   ```

   자습서의 나머지 부분을 완료하는 동안 스크립트가 계속 돌아가게 둡니다.

##### 애플리케이션 코드 다운로드 및 검토
<a name="examples-tumbling-download"></a>

이 예에 대한 Java 애플리케이션 코드는 GitHub에서 사용할 수 있습니다. 애플리케이션 코드를 다운로드하려면 다음을 수행하세요.

1. 아직 설치하지 않았다면 Git 클라이언트를 설치합니다. 자세한 정보는 [Git 설치](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)를 참조하세요.

1. 다음 명령을 사용하여 원격 리포지토리를 복제합니다:

   ```
   git clone https://github.com/aws-samples/amazon-kinesis-data-analytics-examples.git
   ```

1. `amazon-kinesis-data-analytics-java-examples/TumblingWindow` 디렉터리로 이동합니다.

애플리케이션 코드는 `TumblingWindowStreamingJob.java` 파일에 있습니다. 애플리케이션 코드에 대해 다음을 유의하십시오:
+ 애플리케이션은 Kinesis 소스를 사용하여 소스 스트림에서 읽습니다. 다음 스니펫은 Kinesis 소스를 생성합니다.

  ```
  return env.addSource(new FlinkKinesisConsumer<>(inputStreamName,
                  new SimpleStringSchema(), inputProperties));
  ```
+ 다음 가져오기 설명을 추가합니다.

  ```
  import org.apache.flink.streaming.api.windowing.assigners.TumblingProcessingTimeWindows; //flink 1.13 onward
  ```
+ 이 애플리케이션은 `timeWindow` 연산자를 사용하여 5초 동안의 텀블링 윈도우에서 각 주식 기호에 대한 값의 개수를 찾습니다. 다음 코드는 연산자를 생성하고 집계된 데이터를 새로운 Kinesis Data Streams 싱크로 전송합니다.

  ```
  input.flatMap(new Tokenizer()) // Tokenizer for generating words
                      .keyBy(0) // Logically partition the stream for each word
                      
                      .window(TumblingProcessingTimeWindows.of(Time.seconds(5))) //Flink 1.13 onward
                      .sum(1) // Sum the number of words per partition
                      .map(value -> value.f0 + "," + value.f1.toString() + "\n")
                      .addSink(createSinkFromStaticConfig());
  ```

##### 애플리케이션 코드 컴파일
<a name="examples-tumbling-compile"></a>

애플리케이션을 컴파일하려면 다음을 수행하세요.

1. 아직 Java 및 Maven을 설치하지 않았으면 설치합니다. 자세한 정보는 [자습서: Managed Service for Apache Flink에서 DataStream API 사용 시작하기](getting-started.md)자습서의 [필수 사전 조건 완료](getting-started.md#setting-up-prerequisites) 섹션을 참조하세요.

1. 다음 명령을 사용하여 애플리케이션을 컴파일합니다.

   ```
   mvn package -Dflink.version=1.15.3
   ```
**참고**  
제공된 소스 코드는 Java 11의 라이브러리를 사용합니다.

애플리케이션을 컴파일하면 애플리케이션 JAR 파일(`target/aws-kinesis-analytics-java-apps-1.0.jar`)이 생성됩니다.

##### Apache Flink 스트리밍 Java 코드 업로드
<a name="examples-tumbling-upload"></a>

이 섹션에서는 [종속 리소스 생성](#examples-tumbling-resources) 섹션에서 생성한 Amazon S3 버킷에 애플리케이션 코드를 업로드합니다.

1. Amazon S3 콘솔에서 **ka-app-code-*<username>*** 버킷을 선택하고 **업로드**를 선택합니다.

1. **파일 선택** 단계에서 **파일 추가**를 선택합니다. 이전 단계에서 생성한 `aws-kinesis-analytics-java-apps-1.0.jar` 파일로 이동합니다.

1. 개체 정보에 대한 설정은 변경할 필요가 없으므로 **업로드**를 선택합니다.

이제 애플리케이션 코드가 애플리케이션에서 액세스할 수 있는 Amazon S3 버킷에 저장됩니다.

##### Managed Service for Apache Flink 애플리케이션 생성 및 실행
<a name="examples-tumbling-create-run"></a>

콘솔을 사용하여 애플리케이션을 생성, 구성, 업데이트 및 실행하려면 다음 단계를 수행하세요.

##### 애플리케이션 생성
<a name="examples-tumbling-create"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. **Managed Service for Apache Flink 대시보드에서 분석 애플리케이션 생성을 선택합니다.**

1. **Managed Service for Apache Flink - 애플리케이션 생성** 페이지에서 다음과 같이 애플리케이션 세부 정보를 제공합니다.
   + **애플리케이션 명칭**에 **MyApplication**을 입력합니다.
   + **런타임**에서 **Apache Flink**를 선택합니다.
**참고**  
Managed Service for Apache Flink는 Apache Flink 버전 1.15.2를 사용합니다.
   + 버전 풀다운은 **Apache Flink 버전 1.15.2(권장 버전)**로 그대로 두세요.

1. **액세스 권한**에서 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **애플리케이션 생성**을 선택합니다.

**참고**  
콘솔을 사용하여 Managed Service for Apache Flink 애플리케이션을 만들 때 내 애플리케이션에 대한 IAM 역할 및 정책을 둘 수 있는 옵션이 있습니다. 귀하의 애플리케이션은 이 역할 및 정책을 사용하여 종속 리소스에 액세스합니다. 이러한 IAM 리소스의 이름은 애플리케이션 명칭과 리전을 사용하여 다음과 같이 지정됩니다.  
정책: `kinesis-analytics-service-MyApplication-us-west-2`
역할: `kinesisanalytics-MyApplication-us-west-2`

##### IAM 정책 편집
<a name="get-started-exercise-7-console-iam"></a>

IAM 정책을 편집하여 Kinesis Data Streams에 액세스할 수 있는 권한을 추가합니다.

1. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 여세요.

1. **정책**을 선택하세요. 이전 섹션에서 콘솔이 생성한 **`kinesis-analytics-service-MyApplication-us-west-2`** 정책을 선택합니다.

1. **요약** 페이지에서 **정책 편집**을 선택합니다. **JSON** 탭을 선택합니다.

1. 다음 정책 예제의 강조 표시된 부분을 정책에 추가하세요. 샘플 계정 ID(*012345678901*)를 내 계정 ID로 바꿉니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ReadCode",
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "logs:DescribeLogGroups",
                   "s3:GetObjectVersion"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:*",
                   "arn:aws:s3:::ka-app-code-<username>/aws-kinesis-analytics-java-apps-1.0.jar"
               ]
           },
           {
               "Sid": "DescribeLogStreams",
               "Effect": "Allow",
               "Action": "logs:DescribeLogStreams",
               "Resource": "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:*"
           },
           {
               "Sid": "PutLogEvents",
               "Effect": "Allow",
               "Action": "logs:PutLogEvents",
               "Resource": "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:kinesis-analytics-log-stream"
           },
           {
               "Sid": "ListCloudwatchLogGroups",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogGroups"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:*"
               ]
           },
           {
               "Sid": "ReadInputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleInputStream"
           },
           {
               "Sid": "WriteOutputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleOutputStream"
           }
       ]
   }
   ```

------

##### 애플리케이션 구성
<a name="examples-tumbling-configure"></a>

1. **MyApplication** 페이지에서 **구성**을 선택합니다.

1. **애플리케이션 구성** 페이지에서 **코드 위치**를 입력합니다.
   + **Amazon S3 버킷**의 경우 **ka-app-code-*<username>***를 입력합니다.
   + **Amazon S3 객체 경로**에는 **aws-kinesis-analytics-java-apps-1.0.jar**를 입력합니다.

1. **애플리케이션 리소스에 대한 액세스** 아래에서 **액세스 권한**의 경우 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **모니터링**에서 **지표 수준 모니터링**이 **애플리케이션**으로 설정되어 있는지 확인합니다.

1. **CloudWatch 로깅**에서 **활성화** 확인란을 선택합니다.

1. **업데이트**를 선택합니다.

**참고**  
CloudWatch 로깅을 활성화하도록 선택하면 Managed Service for Apache Flink에서 로그 그룹 및 로그 스트림을 생성합니다. 이러한 리소스의 이름은 다음과 같습니다.  
로그 그룹: `/aws/kinesis-analytics/MyApplication`
로그 스트림: `kinesis-analytics-log-stream`
이 로그 스트림은 애플리케이션을 모니터링하는 데 사용됩니다. 이 로그 스트림은 애플리케이션이 결과를 전송하는 데 사용하는 로그 스트림과 다릅니다.

##### 애플리케이션을 실행합니다
<a name="examples-tumbling-run"></a>

1. **MyApplication** 페이지에서 **실행**을 선택합니다. **스냅샷 없이 실행** 옵션을 선택한 상태로 두고 작업을 확인합니다.

1. 애플리케이션이 실행 중이면 페이지를 새로 고칩니다. 콘솔에 **애플리케이션 그래프**가 표시됩니다.

CloudWatch 콘솔에서 Managed Service for Apache Flink 지표를 확인하여 애플리케이션이 작동하는지 확인할 수 있습니다.

##### AWS 리소스 정리
<a name="examples-tumbling-cleanup"></a>

이 단원에는 텀블링 윈도우 자습서에서 생성된 AWS 리소스를 정리하는 절차가 포함되어 있습니다.

**Topics**
+ [Managed Service for Apache Flink 애플리케이션 삭제](#examples-tumbling-cleanup-app)
+ [Kinesis 데이터 스트림 삭제](#examples-tumbling-cleanup-stream)
+ [Amazon S3 객체 및 버킷 삭제](#examples-tumbling-cleanup-s3)
+ [IAM 리소스 삭제](#examples-tumbling-cleanup-iam)
+ [CloudWatch 리소스 삭제](#examples-tumbling-cleanup-cw)

##### Managed Service for Apache Flink 애플리케이션 삭제
<a name="examples-tumbling-cleanup-app"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. Managed Service for Apache Flink 패널에서 **MyApplication**을 선택합니다.

1. 애플리케이션 페이지에서 **삭제**를 선택한 다음 삭제를 확인합니다.

##### Kinesis 데이터 스트림 삭제
<a name="examples-tumbling-cleanup-stream"></a>

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

1. Kinesis Data Streams 패널에서 **ExampleInputStream**을 선택합니다.

1. **ExampleInputStream** 페이지에서 **Kinesis 스트림 삭제**를 선택한 다음 삭제를 확인합니다.

1. **Kinesis 스트림** 페이지에서 **ExampleOutputStream**을 선택하고, **작업**을 선택하고, **삭제**를 선택한 다음 삭제 여부를 확인합니다.

##### Amazon S3 객체 및 버킷 삭제
<a name="examples-tumbling-cleanup-s3"></a>

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

1. **ka-app-code-*<username>* 버킷을 선택합니다.**

1. **삭제**를 선택한 후 버킷 이름을 입력하여 삭제를 확인합니다.

##### IAM 리소스 삭제
<a name="examples-tumbling-cleanup-iam"></a>

1. IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))을 엽니다.

1. 탐색 바에서 **정책**을 선택합니다.

1. 필터 컨트롤에서 **kinesis**를 입력합니다.

1. **kinesis-analytics-service-MyApplication-us-west-2** 정책을 선택합니다.

1. **정책 작업**을 선택한 후 **삭제**를 선택합니다.

1. 탐색 모음에서 **역할**을 선택합니다.

1. **kinesis-analytics-MyApplication-us-west-2** 역할을 선택합니다.

1. **역할 삭제**를 선택하고 삭제를 확인합니다.

##### CloudWatch 리소스 삭제
<a name="examples-tumbling-cleanup-cw"></a>

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

1. 탐색 바에서 **로그**를 선택합니다.

1. **/aws/kinesis-analytics/MyApplication** 로그 그룹을 선택합니다.

1. **로그 그룹 삭제**를 선택한 다음 삭제를 확인합니다.

#### 예: 슬라이딩 윈도우
<a name="examples-sliding"></a>

**참고**  
현재 예제는 [Managed Service for Apache Flink 애플리케이션 생성 및 사용 예제](examples-collapsibles.md) 섹션을 참조하세요.

**참고**  
이 연습에 필수 사전 조건을 설정하려면 먼저 [자습서: Managed Service for Apache Flink에서 DataStream API 사용 시작하기](getting-started.md) 연습을 완료하세요.

**Topics**
+ [종속 리소스 생성](#examples-sliding-resources)
+ [샘플 레코드를 입력 스트림에 쓰기](#examples-sliding-write)
+ [애플리케이션 코드 다운로드 및 검토](#examples-sliding-download)
+ [애플리케이션 코드 컴파일](#examples-sliding-compile)
+ [Apache Flink 스트리밍 Java 코드 업로드](#examples-sliding-upload)
+ [Managed Service for Apache Flink 애플리케이션 생성 및 실행](#examples-sliding-create-run)
+ [AWS 리소스 정리](#examples-sliding-cleanup)

##### 종속 리소스 생성
<a name="examples-sliding-resources"></a>

이 연습을 위해 Managed Service for Apache Flink 애플리케이션을 생성하기 전에 다음과 같은 종속 리소스를 생성해야 합니다.
+ 두 개의 Kinesis Data Streams(`ExampleInputStream` 및 `ExampleOutputStream`).
+ 애플리케이션 코드를 저장할 Amazon S3 버킷(`ka-app-code-<username>`) 

콘솔을 사용하여 Kinesis 스트림과 Amazon S3 버킷을 만들 수 있습니다. 이러한 리소스를 만드는 방법 설명은 다음 주제를 참조하세요.
+ *Amazon Kinesis Data Streams 개발자 안내서*의 [데이터 스트림 만들기 및 업데이트](https://docs.aws.amazon.com/kinesis/latest/dev/amazon-kinesis-streams.html). 데이터 스트림 **ExampleInputStream** 및 **ExampleOutputStream**에 명칭을 지정합니다.
+ *Amazon Simple Storage Service 사용 설명서*의 [S3 버킷을 생성하려면 어떻게 해야 합니까?](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket.html) 로그인 명칭(예: **ka-app-code-*<username>***)을 추가하여 Amazon S3 버킷에 전역적으로 고유한 명칭을 지정합니다.

##### 샘플 레코드를 입력 스트림에 쓰기
<a name="examples-sliding-write"></a>

이 섹션에서는 Python 스크립트를 사용하여 애플리케이션에서 처리할 샘플 레코드를 스트림에 쓰기 합니다.

**참고**  
이 섹션에서는 [AWS SDK for Python (Boto)](https://aws.amazon.com/developers/getting-started/python/)이 필요합니다.

1. 다음 콘텐츠를 가진 `stock.py`이라는 파일을 생성합니다:

   ```
    
   import datetime
   import json
   import random
   import boto3
   
   STREAM_NAME = "ExampleInputStream"
   
   
   def get_data():
       return {
           "EVENT_TIME": datetime.datetime.now().isoformat(),
           "TICKER": random.choice(["AAPL", "AMZN", "MSFT", "INTC", "TBV"]),
           "PRICE": round(random.random() * 100, 2),
       }
   
   
   def generate(stream_name, kinesis_client):
       while True:
           data = get_data()
           print(data)
           kinesis_client.put_record(
               StreamName=stream_name, Data=json.dumps(data), PartitionKey="partitionkey"
           )
   
   
   if __name__ == "__main__":
       generate(STREAM_NAME, boto3.client("kinesis"))
   ```

1. `stock.py` 스크립트를 실행합니다.

   ```
   $ python stock.py
   ```

   자습서의 나머지 부분을 완료하는 동안 스크립트가 계속 돌아가게 둡니다.

##### 애플리케이션 코드 다운로드 및 검토
<a name="examples-sliding-download"></a>

이 예에 대한 Java 애플리케이션 코드는 GitHub에서 사용할 수 있습니다. 애플리케이션 코드를 다운로드하려면 다음을 수행하세요.

1. 아직 설치하지 않았다면 Git 클라이언트를 설치합니다. 자세한 정보는 [Git 설치](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)를 참조하세요.

1. 다음 명령을 사용하여 원격 리포지토리를 복제합니다:

   ```
   git clone https://github.com/aws-samples/amazon-kinesis-data-analytics-examples.git
   ```

1. `amazon-kinesis-data-analytics-java-examples/SlidingWindow` 디렉터리로 이동합니다.

애플리케이션 코드는 `SlidingWindowStreamingJobWithParallelism.java` 파일에 있습니다. 애플리케이션 코드에 대해 다음을 유의하십시오:
+ 애플리케이션은 Kinesis 소스를 사용하여 소스 스트림에서 읽습니다. 다음 스니펫은 Kinesis 소스를 생성합니다.

  ```
  return env.addSource(new FlinkKinesisConsumer<>(inputStreamName,
                  new SimpleStringSchema(), inputProperties));
  ```
+ 이 애플리케이션은 `timeWindow` 연산자를 사용하여 5초씩 슬라이드되는 10초 윈도우에서 각 주식 종목의 최소값을 찾습니다. 다음 코드는 연산자를 생성하고 집계된 데이터를 새로운 Kinesis Data Streams 싱크로 전송합니다.
+ 다음 가져오기 설명을 추가합니다.

  ```
  import org.apache.flink.streaming.api.windowing.assigners.TumblingProcessingTimeWindows; //flink 1.13 onward
  ```
+ 이 애플리케이션은 `timeWindow` 연산자를 사용하여 5초 동안의 텀블링 윈도우에서 각 주식 기호에 대한 값의 개수를 찾습니다. 다음 코드는 연산자를 생성하고 집계된 데이터를 새로운 Kinesis Data Streams 싱크로 전송합니다.

  ```
  input.flatMap(new Tokenizer()) // Tokenizer for generating words
                  .keyBy(0) // Logically partition the stream for each word
                 
  		.window(TumblingProcessingTimeWindows.of(Time.seconds(5))) //Flink 1.13 onward
                  .sum(1) // Sum the number of words per partition
                  .map(value -> value.f0 + "," + value.f1.toString() + "\n")
                  .addSink(createSinkFromStaticConfig());
  ```

##### 애플리케이션 코드 컴파일
<a name="examples-sliding-compile"></a>

애플리케이션을 컴파일하려면 다음을 수행하세요.

1. 아직 Java 및 Maven을 설치하지 않았으면 설치합니다. 자세한 정보는 [자습서: Managed Service for Apache Flink에서 DataStream API 사용 시작하기](getting-started.md)자습서의 [필수 사전 조건 완료](getting-started.md#setting-up-prerequisites) 섹션을 참조하세요.

1. 다음 명령을 사용하여 애플리케이션을 컴파일합니다.

   ```
   mvn package -Dflink.version=1.15.3
   ```
**참고**  
제공된 소스 코드는 Java 11의 라이브러리를 사용합니다.

애플리케이션을 컴파일하면 애플리케이션 JAR 파일(`target/aws-kinesis-analytics-java-apps-1.0.jar`)이 생성됩니다.

##### Apache Flink 스트리밍 Java 코드 업로드
<a name="examples-sliding-upload"></a>

이 섹션에서는 [종속 리소스 생성](#examples-sliding-resources) 섹션에서 생성한 Amazon S3 버킷에 애플리케이션 코드를 업로드합니다.

1. Amazon S3 콘솔에서 **ka-app-code-*<username>*** 버킷을 선택하고 **업로드**를 선택합니다.

1. **파일 선택** 단계에서 **파일 추가**를 선택합니다. 이전 단계에서 생성한 `aws-kinesis-analytics-java-apps-1.0.jar` 파일로 이동합니다.

1. 개체 정보에 대한 설정은 변경할 필요가 없으므로 **업로드**를 선택합니다.

이제 애플리케이션 코드가 애플리케이션에서 액세스할 수 있는 Amazon S3 버킷에 저장됩니다.

##### Managed Service for Apache Flink 애플리케이션 생성 및 실행
<a name="examples-sliding-create-run"></a>

콘솔을 사용하여 애플리케이션을 생성, 구성, 업데이트 및 실행하려면 다음 단계를 수행하세요.

##### 애플리케이션 생성
<a name="examples-sliding-create"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. **Managed Service for Apache Flink 대시보드에서 분석 애플리케이션 생성을 선택합니다.**

1. **Managed Service for Apache Flink - 애플리케이션 생성** 페이지에서 다음과 같이 애플리케이션 세부 정보를 제공합니다.
   + **애플리케이션 명칭**에 **MyApplication**을 입력합니다.
   + **런타임**에서 **Apache Flink**를 선택합니다.
   + 버전 풀다운은 **Apache Flink 버전 1.15.2(권장 버전)**로 그대로 두세요.

1. **액세스 권한**에서 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **애플리케이션 생성**을 선택합니다.

**참고**  
콘솔을 사용하여 Managed Service for Apache Flink 애플리케이션을 만들 때 내 애플리케이션에 대한 IAM 역할 및 정책을 둘 수 있는 옵션이 있습니다. 귀하의 애플리케이션은 이 역할 및 정책을 사용하여 종속 리소스에 액세스합니다. 이러한 IAM 리소스의 이름은 애플리케이션 명칭과 리전을 사용하여 다음과 같이 지정됩니다.  
정책: `kinesis-analytics-service-MyApplication-us-west-2`
역할: `kinesisanalytics-MyApplication-us-west-2`

##### IAM 정책 편집
<a name="get-started-exercise-7-console-iam"></a>

IAM 정책을 편집하여 Kinesis Data Streams에 액세스할 수 있는 권한을 추가합니다.

1. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 여세요.

1. **정책**을 선택하세요. 이전 섹션에서 콘솔이 생성한 **`kinesis-analytics-service-MyApplication-us-west-2`** 정책을 선택합니다.

1. **요약** 페이지에서 **정책 편집**을 선택합니다. **JSON** 탭을 선택합니다.

1. 다음 정책 예제의 강조 표시된 부분을 정책에 추가하세요. 샘플 계정 ID(*012345678901*)를 내 계정 ID로 바꿉니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ReadCode",
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "logs:DescribeLogGroups",
                   "s3:GetObjectVersion"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:*",
                   "arn:aws:s3:::ka-app-code-<username>/aws-kinesis-analytics-java-apps-1.0.jar"
               ]
           },
           {
               "Sid": "DescribeLogStreams",
               "Effect": "Allow",
               "Action": "logs:DescribeLogStreams",
               "Resource": "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:*"
           },
           {
               "Sid": "PutLogEvents",
               "Effect": "Allow",
               "Action": "logs:PutLogEvents",
               "Resource": "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:kinesis-analytics-log-stream"
           },
           {
               "Sid": "ListCloudwatchLogGroups",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogGroups"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:*"
               ]
           },
           {
               "Sid": "ReadInputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleInputStream"
           },
           {
               "Sid": "WriteOutputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleOutputStream"
           }
       ]
   }
   ```

------

##### 애플리케이션 구성
<a name="examples-sliding-configure"></a>

1. **MyApplication** 페이지에서 **구성**을 선택합니다.

1. **애플리케이션 구성** 페이지에서 **코드 위치**를 입력합니다.
   + **Amazon S3 버킷**의 경우 **ka-app-code-*<username>***를 입력합니다.
   + **Amazon S3 객체 경로**에는 **aws-kinesis-analytics-java-apps-1.0.jar**를 입력합니다.

1. **애플리케이션 리소스에 대한 액세스** 아래에서 **액세스 권한**의 경우 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **모니터링**에서 **지표 수준 모니터링**이 **애플리케이션**으로 설정되어 있는지 확인합니다.

1. **CloudWatch 로깅**에서 **활성화** 확인란을 선택합니다.

1. **업데이트**를 선택합니다.

**참고**  
Amazon CloudWatch 로깅을 활성화하도록 선택하면 Managed Service for Apache Flink에서 로그 그룹 및 로그 스트림을 생성합니다. 이러한 리소스의 이름은 다음과 같습니다.  
로그 그룹: `/aws/kinesis-analytics/MyApplication`
로그 스트림: `kinesis-analytics-log-stream`
이 로그 스트림은 애플리케이션을 모니터링하는 데 사용됩니다. 이 로그 스트림은 애플리케이션이 결과를 전송하는 데 사용하는 로그 스트림과 다릅니다.

##### 애플리케이션 병렬 처리 구성
<a name="examples-sliding-parallelism"></a>

이 애플리케이션 예제에서는 작업의 병렬 실행을 사용합니다. 다음 애플리케이션 코드는 `min` 연산자의 병렬 처리를 설정합니다.

```
.setParallelism(3) // Set parallelism for the min operator
```

애플리케이션 병렬 처리는 기본값이 1인 프로비저닝된 병렬 처리보다 클 수 없습니다. 애플리케이션의 병렬 처리를 높이려면 다음 AWS CLI 작업을 사용합니다.

```
aws kinesisanalyticsv2 update-application
      --application-name MyApplication
      --current-application-version-id <VersionId>
      --application-configuration-update "{\"FlinkApplicationConfigurationUpdate\": { \"ParallelismConfigurationUpdate\": {\"ParallelismUpdate\": 5, \"ConfigurationTypeUpdate\": \"CUSTOM\" }}}"
```

[DescribeApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_DescribeApplication.html) 또는 [ListApplications](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_ListApplications.html) 작업을 사용하여 현재 애플리케이션 버전 ID를 검색할 수 있습니다.

##### 애플리케이션을 실행합니다
<a name="examples-sliding-run"></a>

애플리케이션을 실행하고 Apache Flink 대시보드를 연 다음 원하는 Flink 작업을 선택하면 Flink 작업 그래프를 볼 수 있습니다.

CloudWatch 콘솔에서 Managed Service for Apache Flink 지표를 확인하여 애플리케이션이 작동하는지 확인할 수 있습니다.

##### AWS 리소스 정리
<a name="examples-sliding-cleanup"></a>

이 섹션에는 슬라이딩 윈도우 자습서에서 생성된 AWS 리소스를 정리하는 절차가 포함되어 있습니다.

**Topics**
+ [Managed Service for Apache Flink 애플리케이션 삭제](#examples-sliding-cleanup-app)
+ [Kinesis 데이터 스트림 삭제](#examples-sliding-cleanup-stream)
+ [Amazon S3 객체 및 버킷 삭제](#examples-sliding-cleanup-s3)
+ [IAM 리소스 삭제](#examples-sliding-cleanup-iam)
+ [CloudWatch 리소스 삭제](#examples-sliding-cleanup-cw)

##### Managed Service for Apache Flink 애플리케이션 삭제
<a name="examples-sliding-cleanup-app"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. Managed Service for Apache Flink 패널에서 **MyApplication**을 선택합니다.

1. 애플리케이션 페이지에서 **삭제**를 선택한 다음 삭제를 확인합니다.

##### Kinesis 데이터 스트림 삭제
<a name="examples-sliding-cleanup-stream"></a>

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

1. Kinesis Data Streams 패널에서 **ExampleInputStream**을 선택합니다.

1. **ExampleInputStream** 페이지에서 **Kinesis 스트림 삭제**를 선택한 다음 삭제를 확인합니다.

1. **Kinesis 스트림** 페이지에서 **ExampleOutputStream**을 선택하고, **작업**을 선택하고, **삭제**를 선택한 다음 삭제 여부를 확인합니다.

##### Amazon S3 객체 및 버킷 삭제
<a name="examples-sliding-cleanup-s3"></a>

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

1. **ka-app-code-*<username>* 버킷을 선택합니다.**

1. **삭제**를 선택한 후 버킷 이름을 입력하여 삭제를 확인합니다.

##### IAM 리소스 삭제
<a name="examples-sliding-cleanup-iam"></a>

1. IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))을 엽니다.

1. 탐색 바에서 **정책**을 선택합니다.

1. 필터 컨트롤에서 **kinesis**를 입력합니다.

1. **kinesis-analytics-service-MyApplication-us-west-2** 정책을 선택합니다.

1. **정책 작업**을 선택한 후 **삭제**를 선택합니다.

1. 탐색 모음에서 **역할**을 선택합니다.

1. **kinesis-analytics-MyApplication-us-west-2** 역할을 선택합니다.

1. **역할 삭제**를 선택하고 삭제를 확인합니다.

##### CloudWatch 리소스 삭제
<a name="examples-sliding-cleanup-cw"></a>

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

1. 탐색 바에서 **로그**를 선택합니다.

1. **/aws/kinesis-analytics/MyApplication** 로그 그룹을 선택합니다.

1. **로그 그룹 삭제**를 선택한 다음 삭제를 확인합니다.

#### 예: Amazon S3 버킷에 쓰기
<a name="examples-s3"></a>

이 연습에서는 Kinesis Data Stream을 소스로 사용하고 Amazon S3 버킷을 싱크로 사용하는 Managed Service for Apache Flink를 생성합니다. 싱크를 사용하여 Amazon S3 콘솔의 애플리케이션 출력을 확인할 수 있습니다.

**참고**  
이 연습에 필수 사전 조건을 설정하려면 먼저 [자습서: Managed Service for Apache Flink에서 DataStream API 사용 시작하기](getting-started.md) 연습을 완료하세요.

**Topics**
+ [종속 리소스 생성](#examples-s3-resources)
+ [샘플 레코드를 입력 스트림에 쓰기](#examples-s3-write)
+ [애플리케이션 코드 다운로드 및 검토](#examples-s3-download)
+ [애플리케이션 코드 수정](#examples-s3-modify)
+ [애플리케이션 코드 컴파일](#examples-s3-compile)
+ [Apache Flink 스트리밍 Java 코드 업로드](#examples-s3-upload)
+ [Managed Service for Apache Flink 애플리케이션 생성 및 실행](#examples-s3-create-run)
+ [애플리케이션 출력 확인](#examples-s3-verify)
+ [선택 사항: 소스 및 싱크 사용자 지정](#examples-s3-customize)
+ [AWS 리소스 정리](#examples-s3-cleanup)

##### 종속 리소스 생성
<a name="examples-s3-resources"></a>

이 연습을 위해 Managed Service for Apache Flink를 생성하기 전에 먼저 다음과 같은 종속 리소스를 생성해야 합니다.
+ Kinesis Data Streams(`ExampleInputStream`).
+ 애플리케이션 코드와 출력을 저장할 Amazon S3 버킷(`ka-app-code-<username>`) 

**참고**  
Managed Service for Apache Flink는 Managed Service for Apache Flink에서 서버 측 암호화가 활성화된 상태에서는 Amazon S3에 데이터를 쓸 수 없습니다.

콘솔을 사용하여 Kinesis 스트림과 Amazon S3 버킷을 만들 수 있습니다. 이러한 리소스를 만드는 방법 설명은 다음 주제를 참조하세요.
+ *Amazon Kinesis Data Streams 개발자 안내서*의 [데이터 스트림 만들기 및 업데이트](https://docs.aws.amazon.com/kinesis/latest/dev/amazon-kinesis-streams.html). 데이터 스트림 **ExampleInputStream**의 이름을 지정합니다.
+ *Amazon Simple Storage Service 사용 설명서*의 [S3 버킷을 생성하려면 어떻게 해야 합니까?](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket.html) 로그인 명칭(예: **ka-app-code-*<username>***)을 추가하여 Amazon S3 버킷에 전역적으로 고유한 명칭을 지정합니다. Amazon S3 버킷에 두 개의 폴더(**code**및**data**)를 생성합니다.

애플리케이션은 아직 존재하지 않는 경우 다음과 같은 CloudWatch 리소스를 생성합니다.
+ `/AWS/KinesisAnalytics-java/MyApplication`라는 로그 그룹.
+ `kinesis-analytics-log-stream`라는 로그 스트림.

##### 샘플 레코드를 입력 스트림에 쓰기
<a name="examples-s3-write"></a>

이 섹션에서는 Python 스크립트를 사용하여 애플리케이션에서 처리할 샘플 레코드를 스트림에 쓰기 합니다.

**참고**  
이 섹션에서는 [AWS SDK for Python (Boto)](https://aws.amazon.com/developers/getting-started/python/)이 필요합니다.

1. 다음 콘텐츠를 가진 `stock.py`이라는 파일을 생성합니다:

   ```
       import datetime
       import json
       import random
       import boto3
   
       STREAM_NAME = "ExampleInputStream"
   
   
       def get_data():
           return {
               'event_time': datetime.datetime.now().isoformat(),
               'ticker': random.choice(['AAPL', 'AMZN', 'MSFT', 'INTC', 'TBV']),
               'price': round(random.random() * 100, 2)}
   
   
       def generate(stream_name, kinesis_client):
           while True:
               data = get_data()
               print(data)
               kinesis_client.put_record(
                   StreamName=stream_name,
                   Data=json.dumps(data),
                   PartitionKey="partitionkey")
   
   
       if __name__ == '__main__':
           generate(STREAM_NAME, boto3.client('kinesis', region_name='us-west-2'))
   ```

1. `stock.py` 스크립트를 실행합니다.

   ```
   $ python stock.py
   ```

   자습서의 나머지 부분을 완료하는 동안 스크립트가 계속 돌아가게 둡니다.

##### 애플리케이션 코드 다운로드 및 검토
<a name="examples-s3-download"></a>

이 예에 대한 Java 애플리케이션 코드는 GitHub에서 사용할 수 있습니다. 애플리케이션 코드를 다운로드하려면 다음을 수행하세요.

1. 아직 설치하지 않았다면 Git 클라이언트를 설치합니다. 자세한 정보는 [Git 설치](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)를 참조하세요.

1. 다음 명령을 사용하여 원격 리포지토리를 복제합니다:

   ```
   git clone https://github.com/aws-samples/amazon-kinesis-data-analytics-examples.git
   ```

1. `amazon-kinesis-data-analytics-java-examples/S3Sink` 디렉터리로 이동합니다.

애플리케이션 코드는 `S3StreamingSinkJob.java` 파일에 있습니다. 애플리케이션 코드에 대해 다음을 유의하십시오:
+ 애플리케이션은 Kinesis 소스를 사용하여 소스 스트림에서 읽습니다. 다음 스니펫은 Kinesis 소스를 생성합니다.

  ```
  return env.addSource(new FlinkKinesisConsumer<>(inputStreamName,
                  new SimpleStringSchema(), inputProperties));
  ```
+ 가져오기 설명을 다음과 같이 추가합니다.

  ```
  import org.apache.flink.streaming.api.windowing.assigners.TumblingProcessingTimeWindows;
  ```
+ 이 애플리케이션은 Apache Flink S3 싱크를 사용하여 Amazon S3에 쓰기 합니다.

  싱크는 텀블링 윈도우에서 메시지를 읽고, 메시지를 S3 버킷 객체로 인코딩하고, 인코딩된 객체를 S3 싱크로 보냅니다. 다음 코드는 Amazon S3로 전송할 객체를 인코딩합니다.

  ```
  input.map(value -> { // Parse the JSON
                  JsonNode jsonNode = jsonParser.readValue(value, JsonNode.class);
                  return new Tuple2<>(jsonNode.get("ticker").toString(), 1);
              }).returns(Types.TUPLE(Types.STRING, Types.INT))
              .keyBy(v -> v.f0) // Logically partition the stream for each word
              .window(TumblingProcessingTimeWindows.of(Time.minutes(1)))
              .sum(1) // Count the appearances by ticker per partition
              .map(value -> value.f0 + " count: " + value.f1.toString() + "\n")
              .addSink(createS3SinkFromStaticConfig());
  ```

**참고**  
이 애플리케이션은 Flink `StreamingFileSink` 객체를 사용하여 Amazon S3에 쓰기 합니다. `StreamingFileSink`에 대한 자세한 내용은 [Apache Flink 설명서](https://nightlies.apache.org/flink/flink-docs-release-1.13/)의 [StreamingFileSink를](https://nightlies.apache.org/flink/flink-docs-release-1.13/dev/connectors/streamfile_sink.html) 참조하세요.

##### 애플리케이션 코드 수정
<a name="examples-s3-modify"></a>

이 섹션에서는 Amazon S3 버킷에 출력을 쓰기 하도록 애플리케이션 코드를 수정합니다.

다음 줄을 사용자 이름으로 업데이트하여 애플리케이션의 출력 위치를 지정하세요.

```
private static final String s3SinkPath = "s3a://ka-app-code-<username>/data";
```

##### 애플리케이션 코드 컴파일
<a name="examples-s3-compile"></a>

애플리케이션을 컴파일하려면 다음을 수행하세요.

1. 아직 Java 및 Maven을 설치하지 않았으면 설치합니다. 자세한 정보는 [자습서: Managed Service for Apache Flink에서 DataStream API 사용 시작하기](getting-started.md)자습서의 [필수 사전 조건 완료](getting-started.md#setting-up-prerequisites) 섹션을 참조하세요.

1. 다음 명령을 사용하여 애플리케이션을 컴파일합니다.

   ```
   mvn package -Dflink.version=1.15.3
   ```

애플리케이션을 컴파일하면 애플리케이션 JAR 파일(`target/aws-kinesis-analytics-java-apps-1.0.jar`)이 생성됩니다.

**참고**  
제공된 소스 코드는 Java 11의 라이브러리를 사용합니다.

##### Apache Flink 스트리밍 Java 코드 업로드
<a name="examples-s3-upload"></a>

이 섹션에서는 [종속 리소스 생성샘플 레코드를 입력 스트림에 쓰기](#examples-s3-resources) 섹션에서 생성한 Amazon S3 버킷에 애플리케이션 코드를 업로드합니다.

1. Amazon S3 콘솔에서 **ka-app-code-*<username>*** 버킷을 선택하고 **코드** 폴더로 이동하고, **업로드**를 선택합니다.

1. **파일 선택** 단계에서 **파일 추가**를 선택합니다. 이전 단계에서 생성한 `aws-kinesis-analytics-java-apps-1.0.jar` 파일로 이동합니다.

1. 개체 정보에 대한 설정은 변경할 필요가 없으므로 **업로드**를 선택합니다.

이제 애플리케이션 코드가 애플리케이션에서 액세스할 수 있는 Amazon S3 버킷에 저장됩니다.

##### Managed Service for Apache Flink 애플리케이션 생성 및 실행
<a name="examples-s3-create-run"></a>

콘솔을 사용하여 애플리케이션을 생성, 구성, 업데이트 및 실행하려면 다음 단계를 수행하세요.

##### 애플리케이션 생성
<a name="examples-s3-create"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. **Managed Service for Apache Flink 대시보드에서 분석 애플리케이션 생성을 선택합니다.**

1. **Managed Service for Apache Flink - 애플리케이션 생성** 페이지에서 다음과 같이 애플리케이션 세부 정보를 제공합니다.
   + **애플리케이션 명칭**에 **MyApplication**을 입력합니다.
   + **런타임**에서 **Apache Flink**를 선택합니다.
   + 버전 풀다운은 **Apache Flink 버전 1.15.2(권장 버전)**로 그대로 두세요.

1. **액세스 권한**에서 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **애플리케이션 생성**을 선택합니다.
**참고**  
콘솔을 사용하여 Managed Service for Apache Flink 애플리케이션을 만들 때 내 애플리케이션에 대한 IAM 역할 및 정책을 둘 수 있는 옵션이 있습니다. 귀하의 애플리케이션은 이 역할 및 정책을 사용하여 종속 리소스에 액세스합니다. 이러한 IAM 리소스의 이름은 애플리케이션 명칭과 리전을 사용하여 다음과 같이 지정됩니다.  
**애플리케이션 명칭**에 **MyApplication**을 입력합니다.
**런타임**에서 **Apache Flink**를 선택합니다.
버전은 **Apache Flink 버전 1.15.2(권장 버전)**로 그대로 둡니다.

1. **액세스 권한**에서 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **애플리케이션 생성**을 선택합니다.

**참고**  
콘솔을 사용하여 Managed Service for Apache Flink를 만들 때 내 애플리케이션에 대한 IAM 역할 및 정책을 둘 수 있는 옵션이 있습니다. 귀하의 애플리케이션은 이 역할 및 정책을 사용하여 종속 리소스에 액세스합니다. 이러한 IAM 리소스의 이름은 애플리케이션 명칭과 리전을 사용하여 다음과 같이 지정됩니다.  
정책: `kinesis-analytics-service-MyApplication-us-west-2`
역할: `kinesisanalytics-MyApplication-us-west-2`

##### IAM 정책 편집
<a name="get-started-exercise-7-console-iam"></a>

IAM 정책을 편집하여 Kinesis Data Stream에 액세스할 수 있는 권한을 추가합니다.

1. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 여세요.

1. **정책**을 선택하세요. 이전 섹션에서 콘솔이 생성한 **`kinesis-analytics-service-MyApplication-us-west-2`** 정책을 선택합니다.

1. **요약** 페이지에서 **정책 편집**을 선택합니다. **JSON** 탭을 선택합니다.

1. 다음 정책 예제의 강조 표시된 부분을 정책에 추가하세요. 샘플 계정 ID(*012345678901*)를 내 계정 ID로 바꿉니다. <username>을 내 사용자 이름으로 바꿉니다.

   ```
   {
               "Sid": "S3",
               "Effect": "Allow",
               "Action": [
                   "s3:Abort*",
                   "s3:DeleteObject*",
                   "s3:GetObject*",
                   "s3:GetBucket*",
                   "s3:List*",
                   "s3:ListBucket",
                   "s3:PutObject"
               ],
               "Resource": [
                   "arn:aws:s3:::ka-app-code-<username>",
                   "arn:aws:s3:::ka-app-code-<username>/*"
               ]
             }, 
           {
               "Sid": "ListCloudwatchLogGroups",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogGroups"
               ],
               "Resource": [
                   "arn:aws:logs:region:account-id:log-group:*"
               ]
           },
           {
               "Sid": "ListCloudwatchLogStreams",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogStreams"
               ],
               "Resource": [
                   "arn:aws:logs:region:account-id:log-group:%LOG_GROUP_PLACEHOLDER%:log-stream:*"
               ]
           },
           {
               "Sid": "PutCloudwatchLogs",
               "Effect": "Allow",
               "Action": [
                   "logs:PutLogEvents"
               ],
               "Resource": [
                   "arn:aws:logs:region:account-id:log-group:%LOG_GROUP_PLACEHOLDER%:log-stream:%LOG_STREAM_PLACEHOLDER%"
               ]
           }
           ,
           {
               "Sid": "ReadInputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleInputStream"
           },
           
       ]
   }
   ```

##### 애플리케이션 구성
<a name="examples-s3-configure"></a>

1. **MyApplication** 페이지에서 **구성**을 선택합니다.

1. **애플리케이션 구성** 페이지에서 **코드 위치**를 입력합니다.
   + **Amazon S3 버킷**의 경우 **ka-app-code-*<username>***를 입력합니다.
   + **Amazon S3 객체 경로**에는 **code/aws-kinesis-analytics-java-apps-1.0.jar**를 입력합니다.

1. **애플리케이션 리소스에 대한 액세스** 아래에서 **액세스 권한**의 경우 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **모니터링**에서 **지표 수준 모니터링**이 **애플리케이션**으로 설정되어 있는지 확인합니다.

1. **CloudWatch 로깅**에서 **활성화** 확인란을 선택합니다.

1. **업데이트**를 선택합니다.

**참고**  
CloudWatch 로깅을 활성화하도록 선택하면 Managed Service for Apache Flink에서 로그 그룹 및 로그 스트림을 생성합니다. 이러한 리소스의 이름은 다음과 같습니다.  
로그 그룹: `/aws/kinesis-analytics/MyApplication`
로그 스트림: `kinesis-analytics-log-stream`
이 로그 스트림은 애플리케이션을 모니터링하는 데 사용됩니다. 이 로그 스트림은 애플리케이션이 결과를 전송하는 데 사용하는 로그 스트림과 다릅니다.

##### 애플리케이션을 실행합니다
<a name="examples-s3-run"></a>

1. **MyApplication** 페이지에서 **실행**을 선택합니다. **스냅샷 없이 실행** 옵션을 선택한 상태로 두고 작업을 확인합니다.

1. 애플리케이션이 실행 중이면 페이지를 새로 고칩니다. 콘솔에 **애플리케이션 그래프**가 표시됩니다.

##### 애플리케이션 출력 확인
<a name="examples-s3-verify"></a>

Amazon S3 콘솔에서 S3 버킷의 **데이터** 폴더를 엽니다.

몇 분 후 애플리케이션에서 집계된 데이터를 포함하는 객체가 나타납니다.

**참고**  
Flink에서 집계(aggregration)는 기본적으로 활성화되어 있습니다. 이것을 비활성화하려면 다음 명령을 사용합니다.  

```
sink.producer.aggregation-enabled' = 'false'
```

##### 선택 사항: 소스 및 싱크 사용자 지정
<a name="examples-s3-customize"></a>

이 섹션에서는 소스 및 싱크 객체의 설정을 사용자 지정합니다.

**참고**  
다음 섹션에 설명된 코드 섹션을 변경한 후 다음을 수행하여 애플리케이션 코드를 다시 로드하세요.  
[애플리케이션 코드 컴파일](#examples-s3-compile) 섹션의 단계를 반복하여 업데이트된 애플리케이션 코드를 컴파일합니다.
[Apache Flink 스트리밍 Java 코드 업로드](#examples-s3-upload) 섹션의 단계를 반복하여 업데이트된 애플리케이션 코드를 업로드합니다.
콘솔의 애플리케이션 페이지에서 **구성**을 선택한 다음 **업데이트**를 선택하여 업데이트된 애플리케이션 코드를 애플리케이션에 다시 로드합니다.

**Topics**
+ [데이터 파티셔닝 구성](#examples-s3-configure-partition)
+ [읽기 빈도 구성](#examples-s3-configure-read)
+ [쓰기 버퍼링 구성](#examples-s3-configure-write)

##### 데이터 파티셔닝 구성
<a name="examples-s3-configure-partition"></a>

이 섹션에서는 스트리밍 파일 싱크가 S3 버킷에 생성하는 폴더의 이름을 구성합니다. 스트리밍 파일 싱크에 버킷 할당자를 추가하여 이 작업을 수행합니다.

S3 버킷에 생성된 폴더 이름을 사용자 지정하려면 다음을 수행합니다.

1. `S3StreamingSinkJob.java` 파일 시작 부분에 다음 가져오기 문을 추가합니다.

   ```
   import org.apache.flink.streaming.api.functions.sink.filesystem.rollingpolicies.DefaultRollingPolicy;
   import org.apache.flink.streaming.api.functions.sink.filesystem.bucketassigners.DateTimeBucketAssigner;
   ```

1. 코드의 `createS3SinkFromStaticConfig()` 메서드를 다음과 같이 업데이트하세요.

   ```
   private static StreamingFileSink<String> createS3SinkFromStaticConfig() {
   
       final StreamingFileSink<String> sink = StreamingFileSink
           .forRowFormat(new Path(s3SinkPath), new SimpleStringEncoder<String>("UTF-8"))
           .withBucketAssigner(new DateTimeBucketAssigner("yyyy-MM-dd--HH"))
           .withRollingPolicy(DefaultRollingPolicy.create().build())
           .build();
       return sink;
   }
   ```

앞의 코드 예제에서는 사용자 지정 날짜 형식과 함께 `DateTimeBucketAssigner`를 사용하여 S3 버킷에 폴더를 만듭니다. `DateTimeBucketAssigner`에서는 현재 시스템 시간을 사용하여 버킷 이름을 생성합니다. 사용자 지정 버킷 할당자를 만들어 생성된 폴더 이름을 추가로 사용자 지정하려는 경우 [BucketAssigner](https://nightlies.apache.org/flink/flink-docs-release-1.15/api/java/org/apache/flink/streaming/api/functions/sink/filesystem/BucketAssigner.html)를 구현하는 클래스를 만들 수 있습니다. `getBucketId` 메서드를 사용하여 사용자 지정 로직을 구현합니다.

`BucketAssigner`의 사용자 지정 구현에서는 [콘텍스트](https://nightlies.apache.org/flink/flink-docs-release-1.15/api/java/org/apache/flink/streaming/api/functions/sink/filesystem/BucketAssigner.Context.html) 파라미터를 사용하여 레코드에 대한 추가 정보를 가져와 대상 폴더를 결정할 수 있습니다.

##### 읽기 빈도 구성
<a name="examples-s3-configure-read"></a>

이 섹션에서는 소스 스트림의 읽기 빈도를 구성합니다.

Kinesis Streams 소비자는 기본적으로 소스 스트림에서 초당 5회 읽습니다. 스트림에서 읽는 클라이언트가 두 명 이상이거나 애플리케이션이 레코드 읽기를 재시도해야 하는 경우 이 빈도로 인해 문제가 발생합니다. 소비자의 읽기 빈도를 설정하면 이러한 문제를 피할 수 있습니다.

Kinesis 소비자의 읽기 빈도를 설정하려면 `SHARD_GETRECORDS_INTERVAL_MILLIS` 설정을 지정합니다.

다음 코드 예제는 `SHARD_GETRECORDS_INTERVAL_MILLIS` 설정을 1초로 지정합니다.

```
kinesisConsumerConfig.setProperty(ConsumerConfigConstants.SHARD_GETRECORDS_INTERVAL_MILLIS, "1000");
```

##### 쓰기 버퍼링 구성
<a name="examples-s3-configure-write"></a>

이 섹션에서는 싱크의 쓰기 빈도와 기타 설정을 구성합니다.

기본적으로 애플리케이션은 대상 버킷에 1분마다 데이터를 씁니다. `DefaultRollingPolicy` 객체를 구성하여 이 간격 및 기타 설정을 변경할 수 있습니다.

**참고**  
Apache Flink 스트리밍 파일 싱크는 애플리케이션이 체크포인트를 생성할 때마다 출력 버킷에 기록합니다. 애플리케이션은 기본적으로 1분마다 체크포인트를 생성합니다. S3 싱크의 쓰기 간격을 늘리려면 체크포인트 간격도 늘려야 합니다.

`DefaultRollingPolicy` 객체를 구성하려면 다음을 수행합니다.

1. 애플리케이션의 `CheckpointInterval` 설정을 늘립니다. [UpdateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_UpdateApplication.html) 작업에 대한 다음 입력은 체크포인트 간격을 10분으로 설정합니다.

   ```
   {
      "ApplicationConfigurationUpdate": {  
         "FlinkApplicationConfigurationUpdate": { 
            "CheckpointConfigurationUpdate": {
               "ConfigurationTypeUpdate" : "CUSTOM", 
               "CheckpointIntervalUpdate": 600000
            }
         }
      },
      "ApplicationName": "MyApplication",
      "CurrentApplicationVersionId": 5
   }
   ```

   위의 코드를 사용하려면 현재 애플리케이션 버전을 지정합니다. [ListApplications](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_ListApplications.html) 작업을 사용하여 애플리케이션 버전을 검색할 수 있습니다.

1. `S3StreamingSinkJob.java` 파일 시작 부분에 다음 가져오기 설명을 추가합니다.

   ```
   import java.util.concurrent.TimeUnit; 
   ```

1. `S3StreamingSinkJob.java` 파일에서 `createS3SinkFromStaticConfig` 메서드를 다음과 같이 업데이트합니다.

   ```
   private static StreamingFileSink<String> createS3SinkFromStaticConfig() {
   
           final StreamingFileSink<String> sink = StreamingFileSink
                   .forRowFormat(new Path(s3SinkPath), new SimpleStringEncoder<String>("UTF-8"))
                   .withBucketAssigner(new DateTimeBucketAssigner("yyyy-MM-dd--HH"))
                   .withRollingPolicy(
                           DefaultRollingPolicy.create()
                               .withRolloverInterval(TimeUnit.MINUTES.toMillis(8))
                               .withInactivityInterval(TimeUnit.MINUTES.toMillis(5))
                               .withMaxPartSize(1024 * 1024 * 1024)
                               .build())
                   .build();
           return sink;
       }
   ```

   위의 코드 예제는 Amazon S3 버킷에 대한 쓰기 빈도를 8분으로 설정합니다.

Apache Flink 스트리밍 파일 싱크를 구성하는 방법에 대한 자세한 내용은 [Apache Flink 설명서](https://nightlies.apache.org/flink/flink-docs-release-1.13/)의 [행 인코딩 형식](https://nightlies.apache.org/flink/flink-docs-release-1.13/dev/connectors/streamfile_sink.html#row-encoded-formats)을 참조하세요.

##### AWS 리소스 정리
<a name="examples-s3-cleanup"></a>

이 섹션에는 Amazon S3 자습서에서 생성한 AWS 리소스를 정리하는 절차가 포함되어 있습니다.

**Topics**
+ [Managed Service for Apache Flink 애플리케이션 삭제](#examples-s3-cleanup-app)
+ [Kinesis 데이터 스트림 삭제](#examples-s3-cleanup-stream)
+ [Amazon S3 객체 및 버킷 삭제](#examples-s3-cleanup-s3)
+ [IAM 리소스 삭제](#examples-s3-cleanup-iam)
+ [CloudWatch 리소스 삭제](#examples-s3-cleanup-cw)

##### Managed Service for Apache Flink 애플리케이션 삭제
<a name="examples-s3-cleanup-app"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. Managed Service for Apache Flink 패널에서 **MyApplication**을 선택합니다.

1. 애플리케이션 페이지에서 **삭제**를 선택한 다음 삭제를 확인합니다.

##### Kinesis 데이터 스트림 삭제
<a name="examples-s3-cleanup-stream"></a>

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

1. Kinesis Data Streams 패널에서 **ExampleInputStream**을 선택합니다.

1. **ExampleInputStream** 페이지에서 **Kinesis 스트림 삭제**를 선택한 다음 삭제를 확인합니다.

##### Amazon S3 객체 및 버킷 삭제
<a name="examples-s3-cleanup-s3"></a>

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

1. **ka-app-code-*<username>* 버킷을 선택합니다.**

1. **삭제**를 선택한 후 버킷 이름을 입력하여 삭제를 확인합니다.

##### IAM 리소스 삭제
<a name="examples-s3-cleanup-iam"></a>

1. IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))을 엽니다.

1. 탐색 바에서 **정책**을 선택합니다.

1. 필터 컨트롤에서 **kinesis**를 입력합니다.

1. **kinesis-analytics-service-MyApplication-us-west-2** 정책을 선택합니다.

1. **정책 작업**을 선택한 후 **삭제**를 선택합니다.

1. 탐색 바에서 **역할**을 선택합니다.

1. **kinesis-analytics-MyApplication-us-west-2** 역할을 선택합니다.

1. **역할 삭제**를 선택하고 삭제를 확인합니다.

##### CloudWatch 리소스 삭제
<a name="examples-s3-cleanup-cw"></a>

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

1. 탐색 바에서 **로그**를 선택합니다.

1. **/aws/kinesis-analytics/MyApplication** 로그 그룹을 선택합니다.

1. **로그 그룹 삭제**를 선택한 다음 삭제를 확인합니다.

#### 자습서: Managed Service for Apache Flink 애플리케이션을 사용하여 MSK 클러스터의 한 주제에서 VPC의 다른 주제로 데이터 복제
<a name="example-msk"></a>

**참고**  
현재 예제는 [Managed Service for Apache Flink 애플리케이션 생성 및 사용 예제](examples-collapsibles.md) 섹션을 참조하세요.

다음 자습서는 Amazon MSK 클러스터와 두 가지 주제를 사용하여 Amazon VPC를 생성하는 방법과 하나의 Amazon MSK 주제에서 읽고 다른 주제에 쓰는 Managed Service for Apache Flink 애플리케이션을 생성하는 방법을 보여줍니다.

**참고**  
이 연습에 필수 사전 조건을 설정하려면 먼저 [자습서: Managed Service for Apache Flink에서 DataStream API 사용 시작하기](getting-started.md) 연습을 완료하세요.

**Topics**
+ [Amazon MSK 클러스터로 Amazon VPC 생성](#example-msk-createcluster)
+ [애플리케이션 코드 생성](#example-msk-code)
+ [Apache Flink 스트리밍 Java 코드 업로드](#example-msk-upload)
+ [애플리케이션 생성](#example-msk-create)
+ [애플리케이션 구성](#example-msk-configure)
+ [애플리케이션을 실행합니다](#example-msk-run)
+ [애플리케이션 테스트](#example-msk-test)

##### Amazon MSK 클러스터로 Amazon VPC 생성
<a name="example-msk-createcluster"></a>

Managed Service for Apache Flink 애플리케이션에서 액세스할 샘플 VPC 및 Amazon MSK 클러스터를 생성하려면 [Amazon MSK 사용 시작하기](https://docs.aws.amazon.com/msk/latest/developerguide/getting-started.html) 자습서를 따르세요.

자습서를 완료할 때는 다음 사항에 유의하십시오.
+ [3단계: 주제 만들기](https://docs.aws.amazon.com/msk/latest/developerguide/create-topic.html)에서 `kafka-topics.sh --create` 명령을 반복하여 `AWSKafkaTutorialTopicDestination`라는 이름의 대상 주제를 생성합니다.

  ```
  bin/kafka-topics.sh --create --zookeeper ZooKeeperConnectionString --replication-factor 3 --partitions 1 --topic AWS KafkaTutorialTopicDestination
  ```
+ 클러스터의 부트스트랩 서버 목록을 기록합니다. 다음 명령을 사용하여 부트스트랩 서버 목록을 가져올 수 있습니다 (*ClusterArn*을 MSK 클러스터의 ARN으로 대체).

  ```
  aws kafka get-bootstrap-brokers --region us-west-2 --cluster-arn ClusterArn
  {...
      "BootstrapBrokerStringTls": "b-2.awskafkatutorialcluste.t79r6y.c4.kafka.us-west-2.amazonaws.com:9094,b-1.awskafkatutorialcluste.t79r6y.c4.kafka.us-west-2.amazonaws.com:9094,b-3.awskafkatutorialcluste.t79r6y.c4.kafka.us-west-2.amazonaws.com:9094"
  }
  ```
+ 자습서의 단계를 따를 때는 코드, 명령 및 콘솔 항목에서 선택한 AWS 리전을 사용해야 합니다.

##### 애플리케이션 코드 생성
<a name="example-msk-code"></a>

이 섹션에서는 애플리케이션 JAR 파일을 다운로드하고 컴파일합니다. Java 11을 사용하는 것이 좋습니다.

이 예에 대한 Java 애플리케이션 코드는 GitHub에서 사용할 수 있습니다. 애플리케이션 코드를 다운로드하려면 다음을 수행하세요.

1. 아직 설치하지 않았다면 Git 클라이언트를 설치합니다. 자세한 정보는 [Git 설치](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)를 참조하세요.

1. 다음 명령을 사용하여 원격 리포지토리를 복제합니다:

   ```
   git clone https://github.com/aws-samples/amazon-kinesis-data-analytics-examples.git
   ```

1. 애플리케이션 코드는 `amazon-kinesis-data-analytics-java-examples/KafkaConnectors/KafkaGettingStartedJob.java` 파일에 있습니다. 코드를 검토하여 Managed Service for Apache Flink 애플리케이션 코드의 구조를 익힐 수 있습니다.

1. 명령줄 Maven 도구 또는 원하는 개발 환경을 사용하여 JAR 파일을 만드세요. 명령줄 Maven 도구를 사용하여 JAR 파일을 컴파일하려면 다음을 입력합니다.

   ```
   mvn package -Dflink.version=1.15.3
   ```

   빌드가 성공하면 다음 파일이 생성됩니다.

   ```
   target/KafkaGettingStartedJob-1.0.jar
   ```
**참고**  
제공된 소스 코드는 Java 11의 라이브러리를 사용합니다. 개발 환경을 사용하는 경우 

##### Apache Flink 스트리밍 Java 코드 업로드
<a name="example-msk-upload"></a>

이 섹션에서는 [자습서: Managed Service for Apache Flink에서 DataStream API 사용 시작하기](getting-started.md) 자습서에서 생성한 Amazon S3 버킷에 애플리케이션 코드를 업로드합니다.

**참고**  
시작 자습서에서 Amazon S3 버킷을 삭제한 경우 [애플리케이션 코드 JAR 파일 업로드](get-started-exercise.md#get-started-exercise-6) 단계를 다시 수행하세요.

1. Amazon S3 콘솔에서 **ka-app-code-*<username>*** 버킷을 선택하고 **업로드**를 선택합니다.

1. **파일 선택** 단계에서 **파일 추가**를 선택합니다. 이전 단계에서 생성한 `KafkaGettingStartedJob-1.0.jar` 파일로 이동합니다.

1. 개체 정보에 대한 설정은 변경할 필요가 없으므로 **업로드**를 선택합니다.

이제 애플리케이션 코드가 애플리케이션에서 액세스할 수 있는 Amazon S3 버킷에 저장됩니다.

##### 애플리케이션 생성
<a name="example-msk-create"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. **Managed Service for Apache Flink 대시보드에서 분석 애플리케이션 생성을 선택합니다.**

1. **Managed Service for Apache Flink - 애플리케이션 생성** 페이지에서 다음과 같이 애플리케이션 세부 정보를 제공합니다.
   + **애플리케이션 명칭**에 **MyApplication**을 입력합니다.
   + **런타임**에서 **Apache Flink 버전 1.15.2**를 선택합니다.

1. **액세스 권한**에서 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **애플리케이션 생성**을 선택합니다.

**참고**  
콘솔을 사용하여 Managed Service for Apache Flink 애플리케이션을 만들 때 내 애플리케이션에 대한 IAM 역할 및 정책을 둘 수 있는 옵션이 있습니다. 귀하의 애플리케이션은 이 역할 및 정책을 사용하여 종속 리소스에 액세스합니다. 이러한 IAM 리소스의 이름은 애플리케이션 명칭과 리전을 사용하여 다음과 같이 지정됩니다.  
정책: `kinesis-analytics-service-MyApplication-us-west-2`
역할: `kinesisanalytics-MyApplication-us-west-2`

##### 애플리케이션 구성
<a name="example-msk-configure"></a>

1. **MyApplication** 페이지에서 **구성**을 선택합니다.

1. **애플리케이션 구성** 페이지에서 **코드 위치**를 입력합니다.
   + **Amazon S3 버킷**의 경우 **ka-app-code-*<username>***를 입력합니다.
   + **Amazon S3 객체 경로**에는 **KafkaGettingStartedJob-1.0.jar**를 입력합니다.

1. **애플리케이션 리소스에 대한 액세스** 아래에서 **액세스 권한**의 경우 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.
**참고**  
콘솔을 사용하여 애플리케이션 리소스(예: CloudWatch Logs 또는 Amazon VPC)를 지정하면 콘솔은 애플리케이션 실행 역할을 수정하여 해당 리소스에 액세스할 권한을 부여합니다.

1. **속성**에서 **그룹 추가**를 선택합니다. 다음 속성을 입력합니다.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)
**참고**  
기본 인증서의 **ssl.truststore.password**는 “changeit”입니다. 기본 인증서를 사용하는 경우에는 이 값을 변경할 필요가 없습니다.

   **그룹 추가**를 다시 선택합니다. 다음 속성을 입력합니다.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

   애플리케이션 코드는 위의 애플리케이션 속성을 읽고 VPC 및 Amazon MSK 클러스터와 상호 작용하는 데 사용되는 소스 및 싱크를 구성합니다. 클러스터 속성 사용에 대한 자세한 내용은 [런타임 속성 사용](how-properties.md) 섹션을 참조하세요.

1. **스냅샷**에서 **비활성화**를 선택합니다. 이렇게 하면 잘못된 애플리케이션 상태 데이터를 로드하지 않고도 애플리케이션을 더 쉽게 업데이트할 수 있습니다.

1. **모니터링**에서 **지표 수준 모니터링**이 **애플리케이션**으로 설정되어 있는지 확인합니다.

1. **CloudWatch 로깅**에서 **활성화** 확인란을 선택합니다.

1. **Virtual Private Cloud(VPC)** 섹션에서 애플리케이션과 연결할 VPC를 선택합니다. 애플리케이션이 VPC 리소스에 액세스하는 데 사용할 VPC와 연결된 서브넷 및 보안 그룹을 선택합니다.

1. **업데이트**를 선택합니다.

**참고**  
CloudWatch 로깅을 활성화하도록 선택하면 Managed Service for Apache Flink에서 로그 그룹 및 로그 스트림을 생성합니다. 이러한 리소스의 이름은 다음과 같습니다.  
로그 그룹: `/aws/kinesis-analytics/MyApplication`
로그 스트림: `kinesis-analytics-log-stream`
이 로그 스트림은 애플리케이션을 모니터링하는 데 사용됩니다.

##### 애플리케이션을 실행합니다
<a name="example-msk-run"></a>

애플리케이션을 실행하고 Apache Flink 대시보드를 연 다음 원하는 Flink 작업을 선택하면 Flink 작업 그래프를 볼 수 있습니다.

##### 애플리케이션 테스트
<a name="example-msk-test"></a>

이 섹션에서는 소스 주제에 레코드를 쓰기 합니다. 애플리케이션은 소스 주제에서 레코드를 읽고 대상 주제에 쓰기 합니다. 소스 주제에 레코드를 쓰고 대상 주제에서 레코드를 읽어 애플리케이션이 작동 중인지 확인합니다.

주제에서 레코드를 쓰고 읽으려면 [Amazon MSK 사용 시작하기](https://docs.aws.amazon.com/msk/latest/developerguide/getting-started.html) 자습서의 [6단계: 데이터 생성 및 소비](https://docs.aws.amazon.com/msk/latest/developerguide/produce-consume.html)의 단계를 따르세요.

대상 주제에서 읽으려면 클러스터에 대한 두 번째 연결에서 소스 주제 대신 대상 주제 이름을 사용하세요.

```
bin/kafka-console-consumer.sh --bootstrap-server BootstrapBrokerString --consumer.config client.properties --topic AWS KafkaTutorialTopicDestination --from-beginning
```

대상 주제에 레코드가 표시되지 않는 경우 [Managed Service for Apache Flink 문제 해결](troubleshooting.md) 주제의 [VPC에서 리소스에 액세스 불가능](troubleshooting-symptoms.md#troubleshooting-rt-vpc) 섹션을 참조하세요.

#### 예: Kinesis 데이터 스트림과 함께 EFO 소비자 사용
<a name="examples-efo"></a>

**참고**  
현재 예제는 [Managed Service for Apache Flink 애플리케이션 생성 및 사용 예제](examples-collapsibles.md) 섹션을 참조하세요.

이 연습에서는 [향상된 팬아웃(EFO)](https://docs.aws.amazon.com/streams/latest/dev/enhanced-consumers.html) 소비자를 사용하여 Kinesis 데이터 스트림에서 읽는 Managed Service for Apache Flink 애플리케이션을 생성합니다. Kinesis 컨슈머가 EFO를 사용하는 경우 Kinesis Data Streams 서비스는 컨슈머가 스트림에서 읽는 다른 컨슈머와 스트림의 고정 대역폭을 공유하지 않고 자체 전용 대역폭을 제공합니다.

Kinesis 소비자와 함께 EFO를 사용하는 방법에 대한 자세한 내용은 [FLIP-128: Kinesis 컨슈머를 위한 고급 팬아웃](https://cwiki.apache.org/confluence/display/FLINK/FLIP-128%3A+Enhanced+Fan+Out+for+AWS+Kinesis+Consumers)을 참조하세요.

이 예제에서 생성하는 애플리케이션은 AWS Kinesis 커넥터(flink-connector-kinesis) 1.15.3을 사용합니다.

**참고**  
이 연습에 필수 사전 조건을 설정하려면 먼저 [자습서: Managed Service for Apache Flink에서 DataStream API 사용 시작하기](getting-started.md) 연습을 완료하세요.

**Topics**
+ [종속 리소스 생성](#examples-efo-resources)
+ [샘플 레코드를 입력 스트림에 쓰기](#examples-efo-write)
+ [애플리케이션 코드 다운로드 및 검토](#examples-efo-download)
+ [애플리케이션 코드 컴파일](#examples-efo-compile)
+ [Apache Flink 스트리밍 Java 코드 업로드](#examples-efo-upload)
+ [Managed Service for Apache Flink 애플리케이션 생성 및 실행](#examples-efo-create-run)
+ [AWS 리소스 정리](#examples-efo-cleanup)

##### 종속 리소스 생성
<a name="examples-efo-resources"></a>

이 연습을 위해 Managed Service for Apache Flink 애플리케이션을 생성하기 전에 다음과 같은 종속 리소스를 생성해야 합니다.
+ 두 개의 Kinesis Data Streams(`ExampleInputStream` 및 `ExampleOutputStream`)
+ 애플리케이션 코드를 저장할 Amazon S3 버킷(`ka-app-code-<username>`) 

콘솔을 사용하여 Kinesis 스트림과 Amazon S3 버킷을 만들 수 있습니다. 이러한 리소스를 만드는 방법 설명은 다음 주제를 참조하세요.
+ *Amazon Kinesis Data Streams 개발자 안내서*의 [데이터 스트림 만들기 및 업데이트](https://docs.aws.amazon.com/kinesis/latest/dev/amazon-kinesis-streams.html). 데이터 스트림 **ExampleInputStream** 및 **ExampleOutputStream**의 이름을 지정합니다.
+ *Amazon Simple Storage Service 사용 설명서*의 [S3 버킷을 생성하려면 어떻게 해야 합니까?](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket.html) 로그인 명칭(예: **ka-app-code-*<username>***)을 추가하여 Amazon S3 버킷에 전역적으로 고유한 명칭을 지정합니다.

##### 샘플 레코드를 입력 스트림에 쓰기
<a name="examples-efo-write"></a>

이 섹션에서는 Python 스크립트를 사용하여 애플리케이션에서 처리할 샘플 레코드를 스트림에 쓰기 합니다.

**참고**  
이 섹션에서는 [AWS SDK for Python (Boto)](https://aws.amazon.com/developers/getting-started/python/)이 필요합니다.

1. 다음 콘텐츠를 가진 `stock.py`이라는 파일을 생성합니다:

   ```
    
       import datetime
       import json
       import random
       import boto3
   
       STREAM_NAME = "ExampleInputStream"
   
   
       def get_data():
           return {
               'event_time': datetime.datetime.now().isoformat(),
               'ticker': random.choice(['AAPL', 'AMZN', 'MSFT', 'INTC', 'TBV']),
               'price': round(random.random() * 100, 2)}
   
   
       def generate(stream_name, kinesis_client):
           while True:
               data = get_data()
               print(data)
               kinesis_client.put_record(
                   StreamName=stream_name,
                   Data=json.dumps(data),
                   PartitionKey="partitionkey")
   
   
       if __name__ == '__main__':
           generate(STREAM_NAME, boto3.client('kinesis', region_name='us-west-2'))
   ```

1. `stock.py` 스크립트를 실행합니다.

   ```
   $ python stock.py
   ```

   자습서의 나머지 부분을 완료하는 동안 스크립트가 계속 돌아가게 둡니다.

##### 애플리케이션 코드 다운로드 및 검토
<a name="examples-efo-download"></a>

이 예에 대한 Java 애플리케이션 코드는 GitHub에서 사용할 수 있습니다. 애플리케이션 코드를 다운로드하려면 다음을 수행하세요.

1. 아직 설치하지 않았다면 Git 클라이언트를 설치합니다. 자세한 정보는 [Git 설치](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)를 참조하세요.

1. 다음 명령을 사용하여 원격 리포지토리를 복제합니다:

   ```
   git clone https://github.com/aws-samples/amazon-kinesis-data-analytics-examples.git
   ```

1. `amazon-kinesis-data-analytics-java-examples/EfoConsumer` 디렉터리로 이동합니다.

애플리케이션 코드는 `EfoApplication.java` 파일에 있습니다. 애플리케이션 코드에 대해 다음을 유의하십시오:
+ Kinesis 소비자에 다음 파라미터를 설정하여 EFO 소비자를 활성화합니다.
  + **RECORD\$1PUBLISHER\$1TYPE:** 애플리케이션이 **EFO** 소비자를 사용하여 Kinesis Data Stream 데이터에 액세스하도록 이 파라미터를 EFO로 설정하세요.
  + **EFO\$1CONSUMER\$1NAME: ** 이 파라미터를 이 스트림의 소비자 간에 고유한 문자열 값으로 설정합니다. 동일한 Kinesis Data Stream에서 컨슈머 명칭을 재사용하면 해당 명칭을 사용하던 이전 컨슈머가 종료됩니다.
+ 다음 코드 예제는 EFO 소비자가 소스 스트림에서 읽을 수 있도록 소비자 구성 속성에 값을 할당하는 방법을 보여줍니다.

  ```
  consumerConfig.putIfAbsent(RECORD_PUBLISHER_TYPE, "EFO");
  consumerConfig.putIfAbsent(EFO_CONSUMER_NAME, "basic-efo-flink-app");
  ```

##### 애플리케이션 코드 컴파일
<a name="examples-efo-compile"></a>

애플리케이션을 컴파일하려면 다음을 수행하세요.

1. 아직 Java 및 Maven을 설치하지 않았으면 설치합니다. 자세한 정보는 [자습서: Managed Service for Apache Flink에서 DataStream API 사용 시작하기](getting-started.md)자습서의 [필수 사전 조건 완료](getting-started.md#setting-up-prerequisites) 섹션을 참조하세요.

1. 다음 명령을 사용하여 애플리케이션을 컴파일합니다.

   ```
   mvn package -Dflink.version=1.15.3
   ```
**참고**  
제공된 소스 코드는 Java 11의 라이브러리를 사용합니다.

애플리케이션을 컴파일하면 애플리케이션 JAR 파일(`target/aws-kinesis-analytics-java-apps-1.0.jar`)이 생성됩니다.

##### Apache Flink 스트리밍 Java 코드 업로드
<a name="examples-efo-upload"></a>

이 섹션에서는 [종속 리소스 생성](#examples-efo-resources) 섹션에서 생성한 Amazon S3 버킷에 애플리케이션 코드를 업로드합니다.

1. Amazon S3 콘솔에서 **ka-app-code-*<username>*** 버킷을 선택하고 **업로드**를 선택합니다.

1. **파일 선택** 단계에서 **파일 추가**를 선택합니다. 이전 단계에서 생성한 `aws-kinesis-analytics-java-apps-1.0.jar` 파일로 이동합니다.

1. 개체 정보에 대한 설정은 변경할 필요가 없으므로 **업로드**를 선택합니다.

이제 애플리케이션 코드가 애플리케이션에서 액세스할 수 있는 Amazon S3 버킷에 저장됩니다.

##### Managed Service for Apache Flink 애플리케이션 생성 및 실행
<a name="examples-efo-create-run"></a>

콘솔을 사용하여 애플리케이션을 생성, 구성, 업데이트 및 실행하려면 다음 단계를 수행하세요.

##### 애플리케이션 생성
<a name="examples-efo-create"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. **Managed Service for Apache Flink 대시보드에서 분석 애플리케이션 생성을 선택합니다.**

1. **Managed Service for Apache Flink - 애플리케이션 생성** 페이지에서 다음과 같이 애플리케이션 세부 정보를 제공합니다.
   + **애플리케이션 명칭**에 **MyApplication**을 입력합니다.
   + **런타임**에서 **Apache Flink**를 선택합니다.
**참고**  
Managed Service for Apache Flink는 Apache Flink 버전 1.15.2를 사용합니다.
   + 버전 풀다운은 **Apache Flink 버전 1.15.2(권장 버전)**로 그대로 두세요.

1. **액세스 권한**에서 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **애플리케이션 생성**을 선택합니다.

**참고**  
콘솔을 사용하여 Managed Service for Apache Flink 애플리케이션을 만들 때 내 애플리케이션에 대한 IAM 역할 및 정책을 둘 수 있는 옵션이 있습니다. 귀하의 애플리케이션은 이 역할 및 정책을 사용하여 종속 리소스에 액세스합니다. 이러한 IAM 리소스의 이름은 애플리케이션 명칭과 리전을 사용하여 다음과 같이 지정됩니다.  
정책: `kinesis-analytics-service-MyApplication-us-west-2`
역할: `kinesisanalytics-MyApplication-us-west-2`

##### IAM 정책 편집
<a name="get-started-exercise-7-console-iam"></a>

IAM 정책을 편집하여 Kinesis Data Streams에 액세스할 수 있는 권한을 추가합니다.

1. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 여세요.

1. **정책**을 선택하세요. 이전 섹션에서 콘솔이 생성한 **`kinesis-analytics-service-MyApplication-us-west-2`** 정책을 선택합니다.

1. **요약** 페이지에서 **정책 편집**을 선택합니다. **JSON** 탭을 선택합니다.

1. 다음 정책 예제의 강조 표시된 부분을 정책에 추가하세요. 샘플 계정 ID(*012345678901*)를 내 계정 ID로 바꿉니다.
**참고**  
이러한 권한은 애플리케이션에 EFO 소비자에 액세스할 수 있는 권한을 부여합니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ReadCode",
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "logs:DescribeLogGroups",
                   "s3:GetObjectVersion"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:*",
                   "arn:aws:s3:::ka-app-code-<username>/aws-kinesis-analytics-java-apps-1.0.jar"
               ]
           },
           {
               "Sid": "DescribeLogStreams",
               "Effect": "Allow",
               "Action": "logs:DescribeLogStreams",
               "Resource": "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:*"
           },
           {
               "Sid": "PutLogEvents",
               "Effect": "Allow",
               "Action": "logs:PutLogEvents",
               "Resource": "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:kinesis-analytics-log-stream"
           },
           {
               "Sid": "ListCloudwatchLogGroups",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogGroups"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:*"
               ]
           },
           {
               "Sid": "AllStreams",
               "Effect": "Allow",
               "Action": [
                   "kinesis:ListShards",
                   "kinesis:ListStreamConsumers",
                   "kinesis:DescribeStreamSummary"
               ],
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/*"
           },
           {
               "Sid": "Stream",
               "Effect": "Allow",
               "Action": [
                   "kinesis:DescribeStream",
                   "kinesis:RegisterStreamConsumer",
                   "kinesis:DeregisterStreamConsumer"
               ],
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleInputStream"
           },
           {
               "Sid": "WriteOutputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleOutputStream"
           },
           {
               "Sid": "Consumer",
               "Effect": "Allow",
               "Action": [
                   "kinesis:DescribeStreamConsumer",
                   "kinesis:SubscribeToShard"
               ],
               "Resource": [
                   "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleInputStream/consumer/my-efo-flink-app",
                   "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleInputStream/consumer/my-efo-flink-app:*"
               ]
           }
       ]
   }
   ```

------

##### 애플리케이션 구성
<a name="examples-efo-configure"></a>

1. **MyApplication** 페이지에서 **구성**을 선택합니다.

1. **애플리케이션 구성** 페이지에서 **코드 위치**를 입력합니다.
   + **Amazon S3 버킷**의 경우 **ka-app-code-*<username>***를 입력합니다.
   + **Amazon S3 객체 경로**에는 **aws-kinesis-analytics-java-apps-1.0.jar**를 입력합니다.

1. **애플리케이션 리소스에 대한 액세스** 아래에서 **액세스 권한**의 경우 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **속성**에서 **그룹 생성**을 선택합니다.

1. 다음 애플리케이션 속성 및 값을 입력합니다:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

1. **속성**에서 **그룹 생성**을 선택합니다.

1. 다음 애플리케이션 속성 및 값을 입력합니다:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

1. **모니터링**에서 **지표 수준 모니터링**이 **애플리케이션**으로 설정되어 있는지 확인합니다.

1. **CloudWatch 로깅**에서 **활성화** 확인란을 선택합니다.

1. **업데이트**를 선택합니다.

**참고**  
CloudWatch 로깅을 활성화하도록 선택하면 Managed Service for Apache Flink에서 로그 그룹 및 로그 스트림을 생성합니다. 이러한 리소스의 이름은 다음과 같습니다.  
로그 그룹: `/aws/kinesis-analytics/MyApplication`
로그 스트림: `kinesis-analytics-log-stream`
이 로그 스트림은 애플리케이션을 모니터링하는 데 사용됩니다. 이 로그 스트림은 애플리케이션이 결과를 전송하는 데 사용하는 로그 스트림과 다릅니다.

##### 애플리케이션을 실행합니다
<a name="examples-efo-run"></a>

애플리케이션을 실행하고 Apache Flink 대시보드를 연 다음 원하는 Flink 작업을 선택하면 Flink 작업 그래프를 볼 수 있습니다.

CloudWatch 콘솔에서 Managed Service for Apache Flink 지표를 확인하여 애플리케이션이 작동하는지 확인할 수 있습니다.

데이터 스트림의 **향상된 팬아웃** 탭에서 Kinesis Data Streams 콘솔을 확인하여 소비자 이름(*basic-efo-flink-app*)을 확인할 수도 있습니다.

##### AWS 리소스 정리
<a name="examples-efo-cleanup"></a>

이 단원에는 efo 창 자습서에서 생성된 AWS 리소스를 정리하는 절차가 포함되어 있습니다.

**Topics**
+ [Managed Service for Apache Flink 애플리케이션 삭제](#examples-efo-cleanup-app)
+ [Kinesis 데이터 스트림 삭제](#examples-efo-cleanup-stream)
+ [Amazon S3 객체 및 버킷 삭제](#examples-efo-cleanup-s3)
+ [IAM 리소스 삭제](#examples-efo-cleanup-iam)
+ [CloudWatch 리소스 삭제](#examples-efo-cleanup-cw)

##### Managed Service for Apache Flink 애플리케이션 삭제
<a name="examples-efo-cleanup-app"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. Managed Service for Apache Flink 패널에서 **MyApplication**을 선택합니다.

1. 애플리케이션 페이지에서 **삭제**를 선택한 다음 삭제를 확인합니다.

##### Kinesis 데이터 스트림 삭제
<a name="examples-efo-cleanup-stream"></a>

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

1. Kinesis Data Streams 패널에서 **ExampleInputStream**을 선택합니다.

1. **ExampleInputStream** 페이지에서 **Kinesis 스트림 삭제**를 선택한 다음 삭제를 확인합니다.

1. **Kinesis 스트림** 페이지에서 **ExampleOutputStream**을 선택하고, **작업**을 선택하고, **삭제**를 선택한 다음 삭제 여부를 확인합니다.

##### Amazon S3 객체 및 버킷 삭제
<a name="examples-efo-cleanup-s3"></a>

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

1. **ka-app-code-*<username>* 버킷을 선택합니다.**

1. **삭제**를 선택한 후 버킷 이름을 입력하여 삭제를 확인합니다.

##### IAM 리소스 삭제
<a name="examples-efo-cleanup-iam"></a>

1. IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))을 엽니다.

1. 탐색 바에서 **정책**을 선택합니다.

1. 필터 컨트롤에서 **kinesis**를 입력합니다.

1. **kinesis-analytics-service-MyApplication-us-west-2** 정책을 선택합니다.

1. **정책 작업**을 선택한 후 **삭제**를 선택합니다.

1. 탐색 모음에서 **역할**을 선택합니다.

1. **kinesis-analytics-MyApplication-us-west-2** 역할을 선택합니다.

1. **역할 삭제**를 선택하고 삭제를 확인합니다.

##### CloudWatch 리소스 삭제
<a name="examples-efo-cleanup-cw"></a>

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

1. 탐색 바에서 **로그**를 선택합니다.

1. **/aws/kinesis-analytics/MyApplication** 로그 그룹을 선택합니다.

1. **로그 그룹 삭제**를 선택한 다음 삭제를 확인합니다.

#### 예제: Firehose에 쓰기
<a name="get-started-exercise-fh"></a>

**참고**  
현재 예제는 [Managed Service for Apache Flink 애플리케이션 생성 및 사용 예제](examples-collapsibles.md) 섹션을 참조하세요.

이 연습에서는 Kinesis 데이터 스트림을 소스로 사용하고 Firehose 스트림을 싱크로 사용하는 Managed Service for Apache Flink 애플리케이션을 생성합니다. 싱크를 사용하여 Amazon S3 버킷의 애플리케이션 출력을 확인할 수 있습니다.

**참고**  
이 연습에 필수 사전 조건을 설정하려면 먼저 [자습서: Managed Service for Apache Flink에서 DataStream API 사용 시작하기](getting-started.md) 연습을 완료하세요.

**Topics**
+ [종속 리소스 생성](#get-started-exercise-fh-1)
+ [샘플 레코드를 입력 스트림에 쓰기](#get-started-exercise-fh-2)
+ [Apache Flink 스트리밍 Java 코드 다운로드 및 검사](#get-started-exercise-fh-5)
+ [애플리케이션 코드 컴파일](#get-started-exercise-fh-5.5)
+ [Apache Flink 스트리밍 Java 코드 업로드](#get-started-exercise-fh-6)
+ [Managed Service for Apache Flink 애플리케이션 생성 및 실행](#get-started-exercise-fh-7)
+ [AWS 리소스 정리](#getting-started-fh-cleanup)

##### 종속 리소스 생성
<a name="get-started-exercise-fh-1"></a>

이 연습을 위해 Managed Service for Apache Flink를 생성하기 전에 먼저 다음과 같은 종속 리소스를 생성해야 합니다.
+ Kinesis Data Streams(`ExampleInputStream`) 
+ 애플리케이션이 출력을 (`ExampleDeliveryStream`)에 기록하는 Firehose 스트림 
+ 애플리케이션 코드를 저장할 Amazon S3 버킷(`ka-app-code-<username>`)

콘솔을 사용하여 Kinesis 스트림, Amazon S3 버킷, Firehose 스트림을 생성할 수 있습니다. 이러한 리소스를 만드는 방법 설명은 다음 주제를 참조하세요.
+ *Amazon Kinesis Data Streams 개발자 안내서*의 [데이터 스트림 만들기 및 업데이트](https://docs.aws.amazon.com/kinesis/latest/dev/amazon-kinesis-streams.html). 데이터 스트림 **ExampleInputStream**의 이름을 지정합니다.
+ *Amazon Data Firehose 개발자 안내서*의 [Amazon Kinesis Data Firehose 전송 스트림 생성](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html). Firehose 스트림의 이름을 **ExampleDeliveryStream**으로 지정합니다. Firehose 스트림을 생성할 때는 Firehose 스트림의 **S3 대상**과 **IAM 역할**도 생성합니다.
+ *Amazon Simple Storage Service 사용 설명서*의 [S3 버킷을 생성하려면 어떻게 해야 합니까?](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket.html) 로그인 명칭(예: **ka-app-code-*<username>***)을 추가하여 Amazon S3 버킷에 전역적으로 고유한 명칭을 지정합니다.

##### 샘플 레코드를 입력 스트림에 쓰기
<a name="get-started-exercise-fh-2"></a>

이 섹션에서는 Python 스크립트를 사용하여 애플리케이션에서 처리할 샘플 레코드를 스트림에 쓰기 합니다.

**참고**  
이 섹션에서는 [AWS SDK for Python (Boto)](https://aws.amazon.com/developers/getting-started/python/)이 필요합니다.

1. 다음 콘텐츠를 가진 `stock.py`이라는 파일을 생성합니다:

   ```
    import datetime
       import json
       import random
       import boto3
   
       STREAM_NAME = "ExampleInputStream"
   
   
       def get_data():
           return {
               'event_time': datetime.datetime.now().isoformat(),
               'ticker': random.choice(['AAPL', 'AMZN', 'MSFT', 'INTC', 'TBV']),
               'price': round(random.random() * 100, 2)}
   
   
       def generate(stream_name, kinesis_client):
           while True:
               data = get_data()
               print(data)
               kinesis_client.put_record(
                   StreamName=stream_name,
                   Data=json.dumps(data),
                   PartitionKey="partitionkey")
   
   
       if __name__ == '__main__':
           generate(STREAM_NAME, boto3.client('kinesis', region_name='us-west-2'))
   ```

1. `stock.py` 스크립트를 실행합니다.

   ```
   $ python stock.py
   ```

   자습서의 나머지 부분을 완료하는 동안 스크립트가 계속 돌아가게 둡니다.

##### Apache Flink 스트리밍 Java 코드 다운로드 및 검사
<a name="get-started-exercise-fh-5"></a>

이 예에 대한 Java 애플리케이션 코드는 GitHub에서 사용할 수 있습니다. 애플리케이션 코드를 다운로드하려면 다음을 수행하세요.

1. 다음 명령을 사용하여 원격 리포지토리를 복제합니다:

   ```
   git clone https://github.com/aws-samples/amazon-kinesis-data-analytics-examples.git
   ```

1. `amazon-kinesis-data-analytics-java-examples/FirehoseSink` 디렉터리로 이동합니다.

애플리케이션 코드는 `FirehoseSinkStreamingJob.java` 파일에 있습니다. 애플리케이션 코드에 대해 다음을 유의하십시오:
+ 애플리케이션은 Kinesis 소스를 사용하여 소스 스트림에서 읽습니다. 다음 스니펫은 Kinesis 소스를 생성합니다.

  ```
  return env.addSource(new FlinkKinesisConsumer<>(inputStreamName,
                  new SimpleStringSchema(), inputProperties));
  ```
+ 애플리케이션은 Firehose 싱크를 사용하여 Firehose 스트림에 데이터를 씁니다. 다음 스니펫은 Firehose 싱크를 생성합니다.

  ```
  private static KinesisFirehoseSink<String> createFirehoseSinkFromStaticConfig() {
          Properties sinkProperties = new Properties();
          sinkProperties.setProperty(AWS_REGION, region);
  
          return KinesisFirehoseSink.<String>builder()
                  .setFirehoseClientProperties(sinkProperties)
                  .setSerializationSchema(new SimpleStringSchema())
                  .setDeliveryStreamName(outputDeliveryStreamName)
                  .build();
      }
  ```

##### 애플리케이션 코드 컴파일
<a name="get-started-exercise-fh-5.5"></a>

애플리케이션을 컴파일하려면 다음을 수행하세요.

1. 아직 Java 및 Maven을 설치하지 않았으면 설치합니다. 자세한 정보는 [자습서: Managed Service for Apache Flink에서 DataStream API 사용 시작하기](getting-started.md) 자습서의 [필수 사전 조건 완료](getting-started.md#setting-up-prerequisites) 섹션을 참조하세요.

1. **다음 애플리케이션에 Kinesis 커넥터를 사용하려면 Apache Maven을 다운로드, 빌드 및 설치해야 합니다. 자세한 내용은 단원을 참조하십시오[Apache Flink Kinesis 스트림 커넥터를 이전 Apache Flink 버전과 함께 사용](#how-creating-apps-building-kinesis).**

1. 다음 명령을 사용하여 애플리케이션을 컴파일합니다.

   ```
   mvn package -Dflink.version=1.15.3
   ```
**참고**  
제공된 소스 코드는 Java 11의 라이브러리를 사용합니다.

애플리케이션을 컴파일하면 애플리케이션 JAR 파일(`target/aws-kinesis-analytics-java-apps-1.0.jar`)이 생성됩니다.

##### Apache Flink 스트리밍 Java 코드 업로드
<a name="get-started-exercise-fh-6"></a>

이 섹션에서는 [종속 리소스 생성](#get-started-exercise-fh-1) 섹션에서 생성한 Amazon S3 버킷에 애플리케이션 코드를 업로드합니다.

**애플리케이션 코드를 업로드하려면**

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

1. 콘솔에서 **ka-app-code-*<username>*** 버킷을 선택하고 **업로드**를 선택합니다.

1. **파일 선택** 단계에서 **파일 추가**를 선택합니다. 이전 단계에서 생성한 `java-getting-started-1.0.jar` 파일로 이동합니다.

1. 개체 정보에 대한 설정은 변경할 필요가 없으므로 **업로드**를 선택합니다.

이제 애플리케이션 코드가 애플리케이션에서 액세스할 수 있는 Amazon S3 버킷에 저장됩니다.

##### Managed Service for Apache Flink 애플리케이션 생성 및 실행
<a name="get-started-exercise-fh-7"></a>

콘솔이나 AWS CLI를 사용하여 Managed Service for Apache Flink 애플리케이션을 생성하고 실행할 수 있습니다.

**참고**  
콘솔을 사용하여 애플리케이션을 생성하면 AWS Identity and Access Management (IAM) 및 Amazon CloudWatch Logs 리소스가 자동으로 생성됩니다. 를 사용하여 애플리케이션을 생성할 때 이러한 리소스를 별도로 AWS CLI생성합니다.

**Topics**
+ [애플리케이션 생성 및 실행(콘솔)](#get-started-exercise-fh-7-console)
+ [애플리케이션 생성 및 실행(AWS CLI)](#get-started-exercise-fh-7-cli)

##### 애플리케이션 생성 및 실행(콘솔)
<a name="get-started-exercise-fh-7-console"></a>

콘솔을 사용하여 애플리케이션을 생성, 구성, 업데이트 및 실행하려면 다음 단계를 수행하세요.

##### 애플리케이션 생성
<a name="get-started-exercise-fh-7-console-create"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. **Managed Service for Apache Flink 대시보드에서 분석 애플리케이션 생성을 선택합니다.**

1. **Managed Service for Apache Flink - 애플리케이션 생성** 페이지에서 다음과 같이 애플리케이션 세부 정보를 제공합니다.
   + **애플리케이션 명칭**에 **MyApplication**을 입력합니다.
   + **설명**에 **My java test app**를 입력합니다.
   + **런타임**에서 **Apache Flink**를 선택합니다.
**참고**  
Managed Service for Apache Flink는 Apache Flink 버전 1.15.2를 사용합니다.
   + 버전 풀다운은 **Apache Flink 버전 1.15.2(권장 버전)**로 그대로 두세요.

1. **액세스 권한**에서 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **애플리케이션 생성**을 선택합니다.

**참고**  
콘솔을 사용하여 애플리케이션을 만들 때 내 애플리케이션에 대한 IAM 역할 및 정책을 둘 수 있는 옵션이 있습니다. 애플리케이션은 이 역할 및 정책을 사용하여 종속 리소스에 액세스합니다. 이러한 IAM 리소스의 이름은 애플리케이션 명칭과 리전을 사용하여 다음과 같이 지정됩니다.  
정책: `kinesis-analytics-service-MyApplication-us-west-2`
역할: `kinesisanalytics-MyApplication-us-west-2`

##### IAM 정책 편집
<a name="get-started-exercise-fh-7-console-iam"></a>

IAM 정책을 편집하여 Kinesis 데이터 스트림과 Firehose 스트림에 액세스할 수 있는 권한을 추가합니다.

1. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 여세요.

1. **정책**을 선택하세요. 이전 섹션에서 콘솔이 생성한 **`kinesis-analytics-service-MyApplication-us-west-2`** 정책을 선택합니다.

1. **요약** 페이지에서 **정책 편집**을 선택합니다. **JSON** 탭을 선택합니다.

1. 다음 정책 예제의 강조 표시된 부분을 정책에 추가하세요. 샘플 계정 ID(*012345678901*)의 모든 인스턴스를 내 계정 아이디로 바꿉니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ReadCode",
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "s3:GetObjectVersion"
               ],
               "Resource": [
                   "arn:aws:s3:::ka-app-code-username/java-getting-started-1.0.jar"
               ]
           },
           {
               "Sid": "DescribeLogGroups",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogGroups"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:*"
               ]
           },
           {
               "Sid": "DescribeLogStreams",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogStreams"
              ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:*"
               ]
           },
           {
               "Sid": "PutLogEvents",
               "Effect": "Allow",
               "Action": [
                   "logs:PutLogEvents"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:kinesis-analytics-log-stream"
               ]
           },
           {
               "Sid": "ReadInputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleInputStream"
           },
           {
               "Sid": "WriteDeliveryStream",
               "Effect": "Allow",
               "Action": "firehose:*",
               "Resource": "arn:aws:firehose:us-west-2:012345678901:deliverystream/ExampleDeliveryStream"
           }
       ]
   }
   ```

------

##### 애플리케이션 구성
<a name="get-started-exercise-fh-7-console-configure"></a>

1. **MyApplication** 페이지에서 **구성**을 선택합니다.

1. **애플리케이션 구성** 페이지에서 **코드 위치**를 입력합니다.
   + **Amazon S3 버킷**의 경우 **ka-app-code-*<username>***를 입력합니다.
   + **Amazon S3 객체 경로**에는 **java-getting-started-1.0.jar**를 입력합니다.

1. **애플리케이션 리소스에 대한 액세스** 아래에서 **액세스 권한**의 경우 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **모니터링**에서 **지표 수준 모니터링**이 **애플리케이션**으로 설정되어 있는지 확인합니다.

1. **CloudWatch 로깅**에서 **활성화** 확인란을 선택합니다.

1. **업데이트**를 선택합니다.

**참고**  
CloudWatch 로깅을 활성화하도록 선택하면 Managed Service for Apache Flink에서 로그 그룹 및 로그 스트림을 생성합니다. 이러한 리소스의 이름은 다음과 같습니다.  
로그 그룹: `/aws/kinesis-analytics/MyApplication`
로그 스트림: `kinesis-analytics-log-stream`

##### 애플리케이션을 실행합니다
<a name="get-started-exercise-fh-7-console-run"></a>

애플리케이션을 실행하고 Apache Flink 대시보드를 연 다음 원하는 Flink 작업을 선택하면 Flink 작업 그래프를 볼 수 있습니다.

##### 애플리케이션 중지
<a name="get-started-exercise-fh-7-console-stop"></a>

**MyApplication** 페이지에서 **중지**를 선택합니다. 작업을 확인합니다.

##### 애플리케이션 업데이트
<a name="get-started-exercise-fh-7-console-update"></a>

콘솔을 사용하여 애플리케이션 속성, 모니터링 설정, 애플리케이션 JAR의 위치 또는 파일 명칭과 같은 애플리케이션 설정을 업데이트할 수 있습니다.

**MyApplication** 페이지에서 **구성**을 선택합니다. 애플리케이션 설정을 업데이트하고 **업데이트**를 선택합니다.

**참고**  
콘솔에서 애플리케이션 코드를 업데이트하려면 JAR의 객체 이름을 변경하거나, 다른 S3 버킷을 사용하거나, [애플리케이션 코드 업데이트](#get-started-exercise-fh-7-cli-update-code)섹션에 설명된 대로 AWS CLI 를 사용해야 합니다. 파일 이름이나 버킷이 변경되지 않으면 **구성** 페이지에서 **업데이트**를 선택할 때 애플리케이션 코드가 다시 로드되지 않습니다.

##### 애플리케이션 생성 및 실행(AWS CLI)
<a name="get-started-exercise-fh-7-cli"></a>

이 섹션에서는 AWS CLI 를 사용하여 Managed Service for Apache Flink 애플리케이션을 생성하고 실행합니다.

##### 권한 정책 생성
<a name="get-started-exercise-fh-7-cli-policy"></a>

먼저 소스 스트림에서 두 개의 명령문, 즉 `read` 작업에 대한 권한을 부여하는 명령문과 싱크 스트림에서 `write` 작업에 대한 권한을 부여하는 명령문이 있는 권한 정책을 만듭니다. 그런 다음 정책을 IAM 역할(다음 섹션에서 생성)에 연결합니다. 따라서 Managed Service for Apache Flink가 역할을 맡을 때 서비스는 소스 스트림에서 읽고 싱크 스트림에 쓸 수 있는 권한이 있습니다.

다음 코드를 사용하여 `AKReadSourceStreamWriteSinkStream`권한 정책을 생성합니다. *사용자 이름*을 애플리케이션 코드를 저장하기 위한 Amazon S3 버킷을 생성하는 데 사용한 사용자 이름으로 바꿉니다. Amazon 리소스 이름(ARN)의 계정 ID(`012345678901`)를 사용자의 계정 ID로 바꿉니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "S3",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": ["arn:aws:s3:::ka-app-code-username",
                "arn:aws:s3:::ka-app-code-username/*"
            ]
        },
        {
            "Sid": "ReadInputStream",
            "Effect": "Allow",
            "Action": "kinesis:*",
            "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleInputStream"
        },
        {
            "Sid": "WriteDeliveryStream",
            "Effect": "Allow",
            "Action": "firehose:*",
            "Resource": "arn:aws:firehose:us-west-2:012345678901:deliverystream/ExampleDeliveryStream"
        }
    ]
}
```

------

권한 정책을 생성하는 단계별 지침은 *IAM 사용자 가이드*의 [IAM 자습서: 첫 번째 고객 관리형 정책 만들기 및 연결](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_managed-policies.html#part-two-create-policy)을 참조하세요.

**참고**  
 AWS SDK for Java를 사용하여 다른 Amazon 서비스에 액세스할 수 있습니다. Managed Service for Apache Flink는 SDK에 필요한 자격 증명을 애플리케이션과 연결된 서비스 실행 IAM 역할의 자격 증명으로 자동 설정합니다. 추가 단계는 필요 없습니다.

##### IAM 역할 생성
<a name="get-started-exercise-fh-7-cli-role"></a>

이 섹션에서는 Managed Service for Apache Flink 애플리케이션이 소스 스트림을 읽고 싱크 스트림에 쓰기 위해 맡을 수 있는 IAM 역할을 생성합니다.

Managed Service for Apache Flink는 권한이 없는 경우 스트림에 액세스할 수 없습니다. IAM 역할을 통해 이러한 권한을 부여합니다. 각 IAM 역할에는 두 가지 정책이 연결됩니다. 신뢰 정책은 Apache Flink용 Managed Service for Apache Flink 역할을 맡을 권한을 부여합니다. 권한 정책은 Managed Service for Apache Flink가 역할을 맡은 후 수행할 수 있는 작업을 결정합니다.

이전 섹션에서 생성한 권한 정책을 이 역할에 연결합니다.

**IAM 역할을 생성하려면**

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

1. 탐색 창에서 **역할**, **역할 생성**을 선택합니다.

1. **신뢰할 수 있는 유형의 자격 증명 선택**에서 **AWS 서비스**를 선택합니다. **이 역할을 사용할 서비스 선택**에서 **Kinesis**를 선택합니다. **사용 사례 선택**에서 **Kinesis Analytics**를 선택합니다.

   **다음: 권한**을 선택합니다.

1. **권한 정책 연결** 페이지에서 **다음: 검토**를 선택합니다. 역할을 생성한 후에 권한 정책을 연결합니다.

1. **역할 생성** 페이지에서 **역할 이름**으로 **MF-stream-rw-role**을 입력합니다. **역할 생성**을 선택합니다.

   `MF-stream-rw-role`이라는 새 IAM 역할이 생성되었습니다. 그런 다음 역할의 신뢰 정책 및 권한 정책을 업데이트합니다.

1. 역할에 권한 정책을 연결합니다.
**참고**  
이 연습에서는 Managed Service for Apache Flink가 이 역할을 취하여 Kinesis 데이터 스트림(소스)에서 데이터를 읽고 출력을 다른 Kinesis 데이터 스트림에 씁니다. 따라서 이전 단계 [권한 정책 생성](#get-started-exercise-fh-7-cli-policy)에서 생성한 정책을 연결합니다.

   1. **요약** 페이지에서 **권한** 탭을 선택합니다.

   1. **정책 연결**을 선택합니다.

   1. 검색 상자에 **AKReadSourceStreamWriteSinkStream**(이전 섹션에서 생성한 정책)을 입력합니다.

   1. **AKReadSourceStreamWriteSinkStream** 정책을 선택하고 **정책 연결**을 선택합니다.

이제 애플리케이션에서 리소스에 액세스하는 데 사용할 서비스 실행 역할을 만들었습니다. 새 역할의 ARN을 기록합니다.

역할 생성에 대한 단계별 지침은 *IAM 사용 설명서*의 [IAM 역할 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html#roles-creatingrole-user-console)을 참조하세요.

##### Managed Service for Apache Flink 애플리케이션 생성
<a name="get-started-exercise-fh-7-cli-create"></a>

1. 다음 JSON 코드를 `create_request.json`이라는 파일에 저장합니다. 샘플 역할 ARN을 이전에 생성한 역할을 위한 ARN으로 바꿉니다. 버킷 ARN 접미사를 [종속 리소스 생성](#get-started-exercise-fh-1) 섹션에서 선택한 접미사(`ka-app-code-<username>`)로 바꿉니다. 서비스 실행 역할의 샘플 계정 ID(*012345678901*)를 사용자 계정 ID로 바꿉니다.

   ```
   {
       "ApplicationName": "test",
       "ApplicationDescription": "my java test app",
       "RuntimeEnvironment": "FLINK-1_15",
       "ServiceExecutionRole": "arn:aws:iam::012345678901:role/MF-stream-rw-role",
       "ApplicationConfiguration": {
           "ApplicationCodeConfiguration": {
               "CodeContent": {
                   "S3ContentLocation": {
                       "BucketARN": "arn:aws:s3:::ka-app-code-username",
                       "FileKey": "java-getting-started-1.0.jar"
                   }
               },
               "CodeContentType": "ZIPFILE"
           }
         }
       }
   }
   ```

1. 위의 요청과 함께 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html) 작업을 실행하여 애플리케이션을 생성합니다.

   ```
   aws kinesisanalyticsv2 create-application --cli-input-json file://create_request.json
   ```

애플리케이션이 생성되었습니다. 다음 단계에서는 애플리케이션을 시작합니다.

##### 애플리케이션 시작
<a name="get-started-exercise-fh-7-cli-start"></a>

이 섹션에서는 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html) 작업을 사용하여 애플리케이션을 시작합니다.

**애플리케이션을 시작하려면**

1. 다음 JSON 코드를 `start_request.json`이라는 파일에 저장합니다.

   ```
   {
       "ApplicationName": "test",
       "RunConfiguration": {
           "ApplicationRestoreConfiguration": { 
            "ApplicationRestoreType": "RESTORE_FROM_LATEST_SNAPSHOT"
            }
       }
   }
   ```

1. 위의 요청과 함께 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StartApplication.html) 작업을 실행하여 애플리케이션을 시작합니다.

   ```
   aws kinesisanalyticsv2 start-application --cli-input-json file://start_request.json
   ```

애플리케이션이 실행됩니다. Amazon CloudWatch 콘솔에서 Managed Service for Apache Flink 지표를 확인하여 애플리케이션이 작동하는지 확인할 수 있습니다.

##### 애플리케이션 중지
<a name="get-started-exercise-fh-7-cli-stop"></a>

이 섹션에서는 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StopApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StopApplication.html) 작업을 사용하여 애플리케이션을 중지합니다.

**애플리케이션을 중지하려면**

1. 다음 JSON 코드를 `stop_request.json`이라는 파일에 저장합니다.

   ```
   {
       "ApplicationName": "test"
   }
   ```

1. 다음 요청과 함께 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StopApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_StopApplication.html) 작업을 실행하여 애플리케이션을 중지합니다.

   ```
   aws kinesisanalyticsv2 stop-application --cli-input-json file://stop_request.json
   ```

애플리케이션이 중지됩니다.

##### CloudWatch 로깅 옵션 추가
<a name="get-started-exercise-fh-7-cli-cw"></a>

 AWS CLI 를 사용하여 애플리케이션에 Amazon CloudWatch 로그 스트림을 추가할 수 있습니다. 애플리케이션과 함께 CloudWatch Logs 사용하기에 대한 자세한 내용을 알아보려면 [Managed Service for Apache Flink 애플리케이션 로깅 설정](cloudwatch-logs.md) 섹션을 참조하세요.

##### 애플리케이션 코드 업데이트
<a name="get-started-exercise-fh-7-cli-update-code"></a>

새 버전의 코드 패키지로 애플리케이션 코드를 업데이트해야 하는 경우 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) AWS CLI 작업을 사용합니다.

를 사용하려면 Amazon S3 버킷에서 이전 코드 패키지를 AWS CLI삭제하고 새 버전을 업로드한 다음를 호출하여 동일한 Amazon S3 버킷과 객체 이름을 `UpdateApplication`지정합니다.

다음 예 `UpdateApplication` 작업 요청은 애플리케이션 코드를 다시 로드하고 애플리케이션을 다시 시작합니다. `CurrentApplicationVersionId`를 현재 애플리케이션 버전으로 업데이트하세요. `ListApplications` 또는 `DescribeApplication` 작업을 사용하여 현재 애플리케이션 버전을 확인할 수 있습니다. 버킷 명칭 접미사 (*<username>*)를 [종속 리소스 생성](#get-started-exercise-fh-1) 섹션에서 선택한 접미사로 업데이트하십시오.

```
{
    "ApplicationName": "test",
    "CurrentApplicationVersionId": 1,
    "ApplicationConfigurationUpdate": {
        "ApplicationCodeConfigurationUpdate": {
            "CodeContentUpdate": {
                "S3ContentLocationUpdate": {
                    "BucketARNUpdate": "arn:aws:s3:::ka-app-code-username",
                    "FileKeyUpdate": "java-getting-started-1.0.jar"
                }
            }
        }
    }
}
```

##### AWS 리소스 정리
<a name="getting-started-fh-cleanup"></a>

이 단원에는 시작하기 자습서에서 생성된 AWS 리소스를 정리하는 절차가 포함되어 있습니다.

**Topics**
+ [Managed Service for Apache Flink 애플리케이션 삭제](#getting-started-fh-cleanup-app)
+ [Kinesis 데이터 스트림 삭제](#getting-started-fh-cleanup-stream)
+ [Firehose 스트림 삭제](#getting-started-fh-cleanup-fh)
+ [Amazon S3 객체 및 버킷 삭제](#getting-started-fh-cleanup-s3)
+ [IAM 리소스 삭제](#getting-started-fh-cleanup-iam)
+ [CloudWatch 리소스 삭제](#getting-started-fh-cleanup-cw)

##### Managed Service for Apache Flink 애플리케이션 삭제
<a name="getting-started-fh-cleanup-app"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. Managed Service for Apache Flink 패널에서 **MyApplication**을 선택합니다.

1. **구성**을 선택합니다.

1. **스냅샷** 섹션에서 **비활성화**를 선택한 다음 **업데이트**를 선택합니다.

1. 애플리케이션 페이지에서 **삭제**를 선택한 다음 삭제를 확인합니다.

##### Kinesis 데이터 스트림 삭제
<a name="getting-started-fh-cleanup-stream"></a>

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

1. Kinesis Data Streams 패널에서 **ExampleInputStream**을 선택합니다.

1. **ExampleInputStream** 페이지에서 **Kinesis 스트림 삭제**를 선택한 다음 삭제를 확인합니다.

##### Firehose 스트림 삭제
<a name="getting-started-fh-cleanup-fh"></a>

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

1. Firehose 패널에서 **ExampleDeliveryStream**을 선택합니다.

1. **ExampleDeliveryStream** 페이지에서 **Firehose 스트림 삭제**를 선택한 다음, 삭제를 확인합니다.

##### Amazon S3 객체 및 버킷 삭제
<a name="getting-started-fh-cleanup-s3"></a>

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

1. **ka-app-code-*<username>* 버킷을 선택합니다.**

1. **삭제**를 선택한 후 버킷 이름을 입력하여 삭제를 확인합니다.

1. Firehose 스트림의 대상에 대한 Amazon S3 버킷을 생성한 경우 해당 버킷도 삭제합니다.

##### IAM 리소스 삭제
<a name="getting-started-fh-cleanup-iam"></a>

1. IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))을 엽니다.

1. 탐색 바에서 **정책**을 선택합니다.

1. 필터 컨트롤에서 **kinesis**를 입력합니다.

1. **kinesis-analytics-service-MyApplication-us-west-2** 정책을 선택합니다.

1. **정책 작업**을 선택한 후 **삭제**를 선택합니다.

1. Firehose 스트림에 대한 새 정책을 생성한 경우 해당 정책도 삭제합니다.

1. 탐색 모음에서 **역할**을 선택합니다.

1. **kinesis-analytics-MyApplication-us-west-2** 역할을 선택합니다.

1. **역할 삭제**를 선택하고 삭제를 확인합니다.

1. Firehose 스트림에 대한 새 역할을 생성한 경우 해당 역할도 삭제합니다.

##### CloudWatch 리소스 삭제
<a name="getting-started-fh-cleanup-cw"></a>

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

1. 탐색 바에서 **로그**를 선택합니다.

1. **/aws/kinesis-analytics/MyApplication** 로그 그룹을 선택합니다.

1. **로그 그룹 삭제**를 선택한 다음 삭제를 확인합니다.

#### 예: 다른 계정의 Kinesis 스트림에서 읽기
<a name="examples-cross"></a>

**참고**  
현재 예제는 [Managed Service for Apache Flink 애플리케이션 생성 및 사용 예제](examples-collapsibles.md) 섹션을 참조하세요.

이 예제에서는 다른 계정의 Kinesis 스트림에서 데이터를 읽는 Managed Service for Apache Flink 애플리케이션을 만드는 방법을 보여줍니다. 이 예제에서는 소스 Kinesis 스트림에 계정 하나를 사용하고, Managed Service for Apache Flink 애플리케이션 및 싱크 Kinesis 스트림에 두 번째 계정을 사용합니다.

**Topics**
+ [사전 조건](#examples-cross-prerequisites)
+ [설정](#examples-cross-setup)
+ [소스 Kinesis 스트림 생성](#examples-cross-streams)
+ [IAM 역할 및 정책 생성 및 업데이트](#examples-cross-iam)
+ [Python 스크립트 업데이트](#examples-cross-python)
+ [JAVA 애플리케이션 업데이트](#examples-cross-app)
+ [애플리케이션 빌드, 업로드 및 실행](#examples-cross-run)

##### 사전 조건
<a name="examples-cross-prerequisites"></a>
+ 이 자습서에서는 다른 계정의 Kinesis 스트림에서 데이터를 읽도록 *시작하기* 예제를 수정합니다. 계속하기 전에 [자습서: Managed Service for Apache Flink에서 DataStream API 사용 시작하기](getting-started.md)자습서를 완료하세요.
+ 이 자습서를 완료하려면 두 개의 AWS 계정이 필요합니다. 하나는 소스 스트림용이고 다른 하나는 애플리케이션 및 싱크 스트림용입니다. 애플리케이션 및 싱크 스트림에 대한 시작하기 자습서에 사용한 AWS 계정을 사용합니다. 소스 스트림에는 다른 AWS 계정을 사용하세요.

##### 설정
<a name="examples-cross-setup"></a>

명명된 프로필을 사용하여 두 AWS 계정에 액세스합니다. 두 계정의 리전 및 연결 정보가 포함된 두 개의 프로필을 포함하도록 AWS 자격 증명 및 구성 파일을 수정합니다.

다음 예제 보안 인증 파일에는 두 개의 명명된 프로필, `ka-source-stream-account-profile` 및 `ka-sink-stream-account-profile`이(가) 포함되어 있습니다. 싱크 스트림 계정에는 시작하기 자습서에서 사용한 계정을 사용합니다.

```
[ka-source-stream-account-profile]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

[ka-sink-stream-account-profile]
aws_access_key_id=AKIAI44QH8DHBEXAMPLE
aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
```

다음 예제 구성 파일에는 리전 및 출력 형식 정보와 함께 이름이 지정된 동일한 프로필이 포함되어 있습니다.

```
[profile ka-source-stream-account-profile]
region=us-west-2
output=json

[profile ka-sink-stream-account-profile]
region=us-west-2
output=json
```

**참고**  
이 자습서에서는 `ka-sink-stream-account-profile`를 사용하지 않습니다. 프로필을 사용하여 서로 다른 두 AWS 계정에 액세스하는 방법의 예로 포함되어 있습니다.

에서 명명된 프로파일을 사용하는 방법에 대한 자세한 내용은 *AWS Command Line Interface* 설명서의 명명된 프로파일을 AWS CLI참조하세요. [https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) 

##### 소스 Kinesis 스트림 생성
<a name="examples-cross-streams"></a>

이 섹션에서는 소스 계정에 Kinesis 스트림을 생성합니다.

애플리케이션에서 입력에 사용할 Kinesis 스트림을 생성하려면 다음 명령을 입력합니다. 참고로 `--profile` 파라미터는 사용할 계정 프로필을 지정합니다.

```
$ aws kinesis create-stream \
--stream-name SourceAccountExampleInputStream \
--shard-count 1 \
--profile ka-source-stream-account-profile
```

##### IAM 역할 및 정책 생성 및 업데이트
<a name="examples-cross-iam"></a>

 AWS 계정 간에 객체 액세스를 허용하려면 소스 계정에서 IAM 역할 및 정책을 생성합니다. 그런 다음 싱크 계정에서 IAM 정책을 수정합니다. IAM 역할과 정책을 생성하고 관리하는 방법에 대한 자세한 내용은 *AWS Identity and Access Management 사용 설명서*에서 다음 주제를 참조하세요.
+ [IAM 역할 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html)
+ [IAM 정책 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)

##### 싱크 계정 역할 및 정책
<a name="examples-cross-iam-sink"></a>

1. 시작하기 자습서에서 `kinesis-analytics-service-MyApplication-us-west-2`정책을 편집하세요. 이 정책을 사용하면 소스 계정의 역할을 맡아 소스 스트림을 읽을 수 있습니다.
**참고**  
콘솔을 사용하여 애플리케이션을 만들면 콘솔에서 `kinesis-analytics-service-<application name>-<application region>`라는 정책과 `kinesisanalytics-<application name>-<application region>`이라는 역할을 생성합니다.

   아래에 강조 표시된 섹션을 정책에 추가하세요. 샘플 계정 ID(*SOURCE01234567*)를 소스 스트림에 사용할 계정 ID로 바꾸세요.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "AssumeRoleInSourceAccount",
               "Effect": "Allow",
               "Action": "sts:AssumeRole",
               "Resource": "arn:aws:iam::123456789012:role/KA-Source-Stream-Role"
           },
           {
               "Sid": "ReadCode",
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "s3:GetObjectVersion"
               ],
               "Resource": [
                   "arn:aws:s3:::ka-app-code-username/aws-kinesis-analytics-java-apps-1.0.jar"
               ]
           },
           {
               "Sid": "ListCloudwatchLogGroups",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogGroups"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:123456789012:log-group:*"
               ]
           },
           {
               "Sid": "ListCloudwatchLogStreams",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogStreams"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:123456789012:log-group:/aws/kinesis-analytics/MyApplication:log-stream:*"
               ]
           },
           {
               "Sid": "PutCloudwatchLogs",
               "Effect": "Allow",
               "Action": [
                   "logs:PutLogEvents"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:123456789012:log-group:/aws/kinesis-analytics/MyApplication:log-stream:kinesis-analytics-log-stream"
               ]
           }
       ]
   }
   ```

------

1. `kinesis-analytics-MyApplication-us-west-2` 역할을 열고 Amazon 리소스 이름(ARN)을 기록해 둡니다. 다음 섹션에서 이 값을 사용하게 됩니다. 역할 ARN 번호는 다음과 같습니다.

   ```
   arn:aws:iam::SINK012345678:role/service-role/kinesis-analytics-MyApplication-us-west-2
   ```

##### 소스 계정 역할 및 정책
<a name="examples-cross-iam-source"></a>

1. `KA-Source-Stream-Policy`라는 소스 계정에서 정책을 생성합니다. 정책에는 다음 JSON을 사용합니다. 샘플 계정 번호를 소스 계정의 계정 번호로 바꾸세요.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ReadInputStream",
               "Effect": "Allow",
               "Action": [
                   "kinesis:DescribeStream",
                   "kinesis:GetRecords",
                   "kinesis:GetShardIterator",
                   "kinesis:ListShards"
               ],
               "Resource": "arn:aws:kinesis:us-west-2:111122223333:stream/SourceAccountExampleInputStream"
           }
       ]
   }
   ```

------

1. `MF-Source-Stream-Role`라는 소스 계정에서 역할을 생성합니다. **Managed Flink** 사용 사례를 사용하여 역할을 만들려면 다음과 같이 하세요.

   1. IAM Managed Console에서 **역할 생성**을 선택합니다.

   1. **역할 생성** 페이지에서 **AWS 서비스**를 선택합니다. 서비스 목록에서 **Kinesis**를 선택합니다.

   1. **사용 사례 선택** 섹션에서 **Managed Service for Apache Flink를** 선택합니다.

   1. **다음: 권한**을 선택합니다.

   1. 이전 단계에서 만든 `KA-Source-Stream-Policy` 권한 정책을 추가합니다. **다음: 태그**를 선택합니다.

   1. **다음: 검토**를 선택합니다.

   1. 역할 이름을 `KA-Source-Stream-Role`로 지정합니다. 애플리케이션은 이 역할을 사용하여 소스 스트림에 액세스합니다.

1. 싱크 계정의 `kinesis-analytics-MyApplication-us-west-2` ARN을 소스 계정 내 `KA-Source-Stream-Role` 역할의 신뢰 관계에 추가합니다.

   1. IAM 콘솔에서 `KA-Source-Stream-Role`를 엽니다.

   1. **신뢰 관계(Trust Relationships)** 탭을 선택합니다.

   1. **신뢰 관계 편집(Edit trust relationship)**을 선택합니다.

   1. 신뢰 관계에 대해 다음 코드를 사용합니다. 샘플 계정 ID(**SINK012345678**)를 싱크 계정 ID로 바꿉니다.

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

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "AWS": "arn:aws:iam::111122223333:role/service-role/kinesis-analytics-MyApplication-us-west-2"
                  },
                  "Action": "sts:AssumeRole"
              }
          ]
      }
      ```

------

##### Python 스크립트 업데이트
<a name="examples-cross-python"></a>

이 섹션에서는 소스 계정 프로필을 사용하도록 샘플 데이터를 생성하는 Python 스크립트를 업데이트합니다.

다음과 같이 강조 표시된 변경 사항으로 `stock.py` 스크립트를 업데이트하세요.

```
import json
import boto3
import random
import datetime
import os

os.environ['AWS_PROFILE'] ='ka-source-stream-account-profile'
os.environ['AWS_DEFAULT_REGION'] = 'us-west-2'


kinesis = boto3.client('kinesis')
def getReferrer():
    data = {}
    now = datetime.datetime.now()
    str_now = now.isoformat()
    data['event_time'] = str_now
    data['ticker'] = random.choice(['AAPL', 'AMZN', 'MSFT', 'INTC', 'TBV'])
    price = random.random() * 100
    data['price'] = round(price, 2)
    return data

while True:
        data = json.dumps(getReferrer())
        print(data)
        kinesis.put_record(
                StreamName="SourceAccountExampleInputStream",
                Data=data,
                PartitionKey="partitionkey")
```

##### JAVA 애플리케이션 업데이트
<a name="examples-cross-app"></a>

이 섹션에서는 소스 스트림에서 읽을 때 소스 계정 역할을 맡도록 Java 애플리케이션 코드를 업데이트합니다.

`BasicStreamingJob.java` 파일을 다음과 같이 변경합니다. 예제 소스 계정 번호(*SOURCE01234567*)를 소스 계정 번호로 바꾸세요.

```
package com.amazonaws.services.managed-flink;

import com.amazonaws.services.managed-flink.runtime.KinesisAnalyticsRuntime;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.kinesis.FlinkKinesisConsumer;
import org.apache.flink.streaming.connectors.kinesis.FlinkKinesisProducer;
import org.apache.flink.streaming.connectors.kinesis.config.ConsumerConfigConstants;
import org.apache.flink.streaming.connectors.kinesis.config.AWSConfigConstants;

import java.io.IOException;
import java.util.Map;
import java.util.Properties;

 /**
 * A basic Managed Service for Apache Flink for Java application with Kinesis data streams
 * as source and sink.
 */
public class BasicStreamingJob {
    private static final String region = "us-west-2";
    private static final String inputStreamName = "SourceAccountExampleInputStream";
    private static final String outputStreamName = ExampleOutputStream;
    private static final String roleArn = "arn:aws:iam::SOURCE01234567:role/KA-Source-Stream-Role";
    private static final String roleSessionName = "ksassumedrolesession";

    private static DataStream<String> createSourceFromStaticConfig(StreamExecutionEnvironment env) {
        Properties inputProperties = new Properties();
        inputProperties.setProperty(AWSConfigConstants.AWS_CREDENTIALS_PROVIDER, "ASSUME_ROLE");
        inputProperties.setProperty(AWSConfigConstants.AWS_ROLE_ARN, roleArn);
        inputProperties.setProperty(AWSConfigConstants.AWS_ROLE_SESSION_NAME, roleSessionName);
        inputProperties.setProperty(ConsumerConfigConstants.AWS_REGION, region);
        inputProperties.setProperty(ConsumerConfigConstants.STREAM_INITIAL_POSITION, "LATEST");

        return env.addSource(new FlinkKinesisConsumer<>(inputStreamName, new SimpleStringSchema(), inputProperties));
    }

    private static KinesisStreamsSink<String> createSinkFromStaticConfig() {
        Properties outputProperties = new Properties();
        outputProperties.setProperty(AWSConfigConstants.AWS_REGION, region);

        return KinesisStreamsSink.<String>builder()
                .setKinesisClientProperties(outputProperties)
                .setSerializationSchema(new SimpleStringSchema())
                .setStreamName(outputProperties.getProperty("OUTPUT_STREAM", "ExampleOutputStream"))
                .setPartitionKeyGenerator(element -> String.valueOf(element.hashCode()))
                .build();
    }

    public static void main(String[] args) throws Exception {
        // set up the streaming execution environment
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        DataStream<String> input = createSourceFromStaticConfig(env);

        input.addSink(createSinkFromStaticConfig());

        env.execute("Flink Streaming Java API Skeleton");
    }
}
```

##### 애플리케이션 빌드, 업로드 및 실행
<a name="examples-cross-run"></a>

애플리케이션을 업데이트하고 실행하려면 다음을 수행합니다.

1. `pom.xml` 파일이 있는 디렉토리에서 다음 명령을 실행하여 애플리케이션을 다시 빌드합니다.

   ```
   mvn package -Dflink.version=1.15.3
   ```

1. Amazon Simple Storage Service(S3) 버킷에서 이전 JAR 파일을 삭제한 후 새 `aws-kinesis-analytics-java-apps-1.0.jar`파일을 S3 버킷으로 업로드합니다.

1. Managed Service for Apache Flink 콘솔의 애플리케이션 페이지에서 **구성**, **업데이트**를 선택하여 애플리케이션 JAR 파일을 다시 로드합니다.

1. `stock.py` 스크립트를 실행하여 소스 스트림으로 데이터를 전송합니다.

   ```
   python stock.py
   ```

이제 애플리케이션은 다른 계정의 Kinesis 스트림에서 데이터를 읽습니다.

애플리케이션이 작동하는지 확인하려면 `ExampleOutputStream` 스트림의 `PutRecords.Bytes` 지표를 확인하면 됩니다. 출력 스트림에 활동이 있는 경우 애플리케이션이 제대로 작동하는 것입니다.

#### 자습서: Amazon MSK에서 사용자 지정 트러스트 스토어 사용
<a name="example-keystore"></a>

**참고**  
현재 예제는 [Managed Service for Apache Flink 애플리케이션 생성 및 사용 예제](examples-collapsibles.md) 섹션을 참조하세요.

##### 현재 데이터 소스 API
<a name="example-keystore-test-new"></a>

현재 데이터 소스 API를 사용하는 경우 애플리케이션은 [여기](https://github.com/aws-samples/msk-config-providers)에 설명된 Amazon MSK Config Providers 유틸리티를 활용할 수 있습니다. 이렇게 하면 Kafka 소스 함수가 키스토어와 트러스트 스토어에 액세스하여 Amazon S3의 상호 TLS를 수행할 수 있습니다.

```
...
// define names of config providers:
builder.setProperty("config.providers", "secretsmanager,s3import");

// provide implementation classes for each provider:
builder.setProperty("config.providers.secretsmanager.class", "com.amazonaws.kafka.config.providers.SecretsManagerConfigProvider");
builder.setProperty("config.providers.s3import.class", "com.amazonaws.kafka.config.providers.S3ImportConfigProvider");

String region = appProperties.get(Helpers.S3_BUCKET_REGION_KEY).toString();
String keystoreS3Bucket = appProperties.get(Helpers.KEYSTORE_S3_BUCKET_KEY).toString();
String keystoreS3Path = appProperties.get(Helpers.KEYSTORE_S3_PATH_KEY).toString();
String truststoreS3Bucket = appProperties.get(Helpers.TRUSTSTORE_S3_BUCKET_KEY).toString();
String truststoreS3Path = appProperties.get(Helpers.TRUSTSTORE_S3_PATH_KEY).toString();
String keystorePassSecret = appProperties.get(Helpers.KEYSTORE_PASS_SECRET_KEY).toString();
String keystorePassSecretField = appProperties.get(Helpers.KEYSTORE_PASS_SECRET_FIELD_KEY).toString();

// region, etc..
builder.setProperty("config.providers.s3import.param.region", region);

// properties
builder.setProperty("ssl.truststore.location", "${s3import:" + region + ":" + truststoreS3Bucket + "/" + truststoreS3Path + "}");
builder.setProperty("ssl.keystore.type", "PKCS12");
builder.setProperty("ssl.keystore.location", "${s3import:" + region + ":" + keystoreS3Bucket + "/" + keystoreS3Path + "}");
builder.setProperty("ssl.keystore.password", "${secretsmanager:" + keystorePassSecret + ":" + keystorePassSecretField + "}");
builder.setProperty("ssl.key.password", "${secretsmanager:" + keystorePassSecret + ":" + keystorePassSecretField + "}");
...
```

자세한 내용 및 안내는 [여기](https://github.com/aws-samples/amazon-kinesisanalytics-examples/tree/master/CustomKeystoreWithConfigProviders)에서 확인할 수 있습니다.

##### 레거시 SourceFunction API
<a name="example-keystore-legacy"></a>

레거시 SourceFunction API를 사용하는 경우, 애플리케이션은 사용자 정의 직렬화 및 역직렬화 스키마를 사용하여 `open` 메서드를 재정의하여 사용자 정의 트러스트 스토어를 로드합니다. 이렇게 하면 애플리케이션이 다시 시작되거나 스레드를 교체한 후에 애플리케이션에서 트러스트 스토어를 사용할 수 있습니다.

사용자 지정 트러스트 스토어는 다음 코드를 사용하여 검색 및 저장됩니다.

```
public static void initializeKafkaTruststore() {
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    URL inputUrl = classLoader.getResource("kafka.client.truststore.jks");
    File dest = new File("/tmp/kafka.client.truststore.jks");

    try {
        FileUtils.copyURLToFile(inputUrl, dest);
    } catch (Exception ex) {
        throw new FlinkRuntimeException("Failed to initialize Kakfa truststore", ex);
    }
}
```

**참고**  
Apache Flink를 사용하려면 트러스트 스토어가 [JKS 형식](https://en.wikipedia.org/wiki/Java_KeyStore)이어야 합니다.

**참고**  
이 연습에 필수 사전 조건을 설정하려면 먼저 [자습서: Managed Service for Apache Flink에서 DataStream API 사용 시작하기](getting-started.md) 연습을 완료하세요.

다음 자습서에서는 사용자 지정, 사설 또는 자체 호스팅 CA(인증 기관)에서 발급한 서버 인증서를 사용하는 Kafka 클러스터에 안전하게 연결(전송 중 암호화)하는 방법을 설명합니다.

TLS를 통해 Kafka 클라이언트를 Kafka 클러스터에 안전하게 연결하려면, 예제 Flink 애플리케이션과 같은 Kafka 클라이언트는 Kafka 클러스터의 서버 인증서가 제시하는 전체 신뢰 체인(발급 CA부터 루트 수준 CA까지)을 신뢰해야 합니다. 사용자 지정 트러스트 스토어의 예로 상호 TLS(MTLS) 인증이 활성화된 Amazon MSK 클러스터를 사용하겠습니다. 이는 MSK 클러스터 노드가 계정 및 리전에 비공개이므로 Flink 애플리케이션을 실행하는 Java 가상 머신(JVM)의 기본 트러스트 스토어에서 신뢰하지 않는 AWS Certificate Manager Private Certificate Authority(ACM Private CA)에서 발급한 서버 인증서를 사용한다는 것을 의미합니다.

**참고**  
**키 스토어**는 애플리케이션이 검증을 위해 서버나 클라이언트 모두에 제공해야 하는 개인 키와 자격 증명 인증서를 저장하는 데 사용됩니다.
**트러스트 스토어**는 SSL 연결을 통해 서버가 제공한 인증서를 확인하는 인증 기관(CA)의 인증서를 저장하는 데 사용됩니다.

 이 자습서의 기법은 다음과 같이 Managed Service for Apache Flink 애플리케이션과 다른 Apache Kafka 소스 간의 상호 작용에도 사용할 수 있습니다.
+ 에서 호스팅되는 사용자 지정 Apache Kafka 클러스터 AWS ([Amazon EC2](https://aws.amazon.com/ec2/) 또는 [Amazon EKS](https://aws.amazon.com/eks/))
+ 에서 호스팅되는 [Confluent Kafka](https://www.confluent.io) 클러스터 AWS
+ [AWS Direct Connect](https://aws.amazon.com/directconnect/) 또는 VPN을 통해 액세스하는 온프레미스 Kafka 클러스터

**Topics**
+ [현재 데이터 소스 API](#example-keystore-test-new)
+ [레거시 SourceFunction API](#example-keystore-legacy)
+ [Amazon MSK 클러스터로 VPC 생성](#example-keystore-createcluster)
+ [사용자 지정 트러스트 스토어를 생성하여 클러스터에 적용](#example-keystore-cert)
+ [애플리케이션 코드 생성](#example-keystore-code)
+ [Apache Flink 스트리밍 Java 코드 업로드](#example-keystore-upload)
+ [애플리케이션 생성](#example-keystore-create)
+ [애플리케이션 구성](#example-keystore-configure)
+ [애플리케이션을 실행합니다](#example-keystore-run)
+ [애플리케이션 테스트](#example-keystore-test)

##### Amazon MSK 클러스터로 VPC 생성
<a name="example-keystore-createcluster"></a>

Managed Service for Apache Flink 애플리케이션에서 액세스할 샘플 VPC 및 Amazon MSK 클러스터를 생성하려면 Amazon MSK 사용 [시작하기](https://docs.aws.amazon.com/msk/latest/developerguide/getting-started.html) 자습서를 따르세요.

자습서를 완료할 때는 다음 작업도 수행하세요.
+ [3단계: 주제 만들기](https://docs.aws.amazon.com/msk/latest/developerguide/create-topic.html)에서 `kafka-topics.sh --create` 명령을 반복하여 `AWS KafkaTutorialTopicDestination`라는 이름의 대상 주제를 생성합니다.

  ```
  bin/kafka-topics.sh --create --bootstrap-server ZooKeeperConnectionString --replication-factor 3 --partitions 1 --topic AWSKafkaTutorialTopicDestination
  ```
**참고**  
`kafka-topics.sh` 명령이 `ZooKeeperClientTimeoutException`를 반환하는 경우 Kafka 클러스터의 보안 그룹에 클라이언트 인스턴스의 프라이빗 IP 주소에서 들어오는 모든 트래픽을 허용하는 인바운드 규칙이 있는지 확인하세요.
+ 클러스터의 부트스트랩 서버 목록을 기록합니다. 다음 명령을 사용하여 부트스트랩 서버 목록을 가져올 수 있습니다 (*ClusterArn*을 MSK 클러스터의 ARN으로 대체).

  ```
  aws kafka get-bootstrap-brokers --region us-west-2 --cluster-arn ClusterArn
  {...
      "BootstrapBrokerStringTls": "b-2.awskafkatutorialcluste.t79r6y.c4.kafka.us-west-2.amazonaws.com:9094,b-1.awskafkatutorialcluste.t79r6y.c4.kafka.us-west-2.amazonaws.com:9094,b-3.awskafkatutorialcluste.t79r6y.c4.kafka.us-west-2.amazonaws.com:9094"
  }
  ```
+ 이 자습서의 단계와 사전 조건 자습서를 따를 때는 코드, 명령 및 콘솔 항목에서 선택한 AWS 리전을 사용해야 합니다.

##### 사용자 지정 트러스트 스토어를 생성하여 클러스터에 적용
<a name="example-keystore-cert"></a>

이 섹션에서는 사용자 지정 CA(인증 기관)를 만들고, 이를 사용하여 사용자 지정 트러스트 스토어를 생성하고, 이를 MSK 클러스터에 적용합니다.

사용자 지정 트러스트 스토어를 생성하고 적용하려면 *Amazon Managed Streaming for Apache Kafka 개발자 안내서*의 [클라이언트 인증](https://docs.aws.amazon.com/msk/latest/developerguide/msk-authentication.html) 자습서를 따르세요.

##### 애플리케이션 코드 생성
<a name="example-keystore-code"></a>

이 섹션에서는 애플리케이션 JAR 파일을 다운로드하고 컴파일합니다.

이 예에 대한 Java 애플리케이션 코드는 GitHub에서 사용할 수 있습니다. 애플리케이션 코드를 다운로드하려면 다음을 수행하세요.

1. 아직 설치하지 않았다면 Git 클라이언트를 설치합니다. 자세한 정보는 [Git 설치](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)를 참조하세요.

1. 다음 명령을 사용하여 원격 리포지토리를 복제합니다:

   ```
   git clone https://github.com/aws-samples/amazon-kinesis-data-analytics-examples.git
   ```

1. 애플리케이션 코드는 `amazon-kinesis-data-analytics-java-examples/CustomKeystore`에 있습니다. 코드를 검토하여 Managed Service for Apache Flink 코드의 구조를 익힐 수 있습니다.

1. 명령줄 Maven 도구 또는 원하는 개발 환경을 사용하여 JAR 파일을 만드세요. 명령줄 Maven 도구를 사용하여 JAR 파일을 컴파일하려면 다음을 입력합니다.

   ```
   mvn package -Dflink.version=1.15.3
   ```

   빌드가 성공하면 다음 파일이 생성됩니다.

   ```
   target/flink-app-1.0-SNAPSHOT.jar
   ```
**참고**  
제공된 소스 코드는 Java 11의 라이브러리를 사용합니다.

##### Apache Flink 스트리밍 Java 코드 업로드
<a name="example-keystore-upload"></a>

이 섹션에서는 [자습서: Managed Service for Apache Flink에서 DataStream API 사용 시작하기](getting-started.md) 자습서에서 생성한 Amazon S3 버킷으로 애플리케이션 코드를 업로드합니다.

**참고**  
시작 자습서에서 Amazon S3 버킷을 삭제한 경우 [애플리케이션 코드 JAR 파일 업로드](get-started-exercise.md#get-started-exercise-6) 단계를 다시 수행하세요.

1. Amazon S3 콘솔에서 **ka-app-code-*<username>*** 버킷을 선택하고 **업로드**를 선택합니다.

1. **파일 선택** 단계에서 **파일 추가**를 선택합니다. 이전 단계에서 생성한 `flink-app-1.0-SNAPSHOT.jar` 파일로 이동합니다.

1. 개체 정보에 대한 설정은 변경할 필요가 없으므로 **업로드**를 선택합니다.

이제 애플리케이션 코드가 애플리케이션에서 액세스할 수 있는 Amazon S3 버킷에 저장됩니다.

##### 애플리케이션 생성
<a name="example-keystore-create"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. **Managed Service for Apache Flink 대시보드에서 분석 애플리케이션 생성을 선택합니다.**

1. **Managed Service for Apache Flink - 애플리케이션 생성** 페이지에서 다음과 같이 애플리케이션 세부 정보를 제공합니다.
   + **애플리케이션 명칭**에 **MyApplication**을 입력합니다.
   + **런타임**에서 **Apache Flink 버전 1.15.2**를 선택합니다.

1. **액세스 권한**에서 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **애플리케이션 생성**을 선택합니다.

**참고**  
콘솔을 사용하여 Managed Service for Apache Flink를 만들 때 내 애플리케이션에 대한 IAM 역할 및 정책을 둘 수 있는 옵션이 있습니다. 귀하의 애플리케이션은 이 역할 및 정책을 사용하여 종속 리소스에 액세스합니다. 이러한 IAM 리소스의 이름은 애플리케이션 명칭과 리전을 사용하여 다음과 같이 지정됩니다.  
정책: `kinesis-analytics-service-MyApplication-us-west-2`
역할: `kinesisanalytics-MyApplication-us-west-2`

##### 애플리케이션 구성
<a name="example-keystore-configure"></a>

1. **MyApplication** 페이지에서 **구성**을 선택합니다.

1. **애플리케이션 구성** 페이지에서 **코드 위치**를 입력합니다.
   + **Amazon S3 버킷**의 경우 **ka-app-code-*<username>***를 입력합니다.
   + **Amazon S3 객체 경로**에는 **flink-app-1.0-SNAPSHOT.jar**를 입력합니다.

1. **애플리케이션 리소스에 대한 액세스** 아래에서 **액세스 권한**의 경우 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.
**참고**  
콘솔을 사용하여 애플리케이션 리소스(예: 로그 또는 VPC)를 지정하면 콘솔은 애플리케이션 실행 역할을 수정하여 해당 리소스에 액세스할 권한을 부여합니다.

1. **속성**에서 **그룹 추가**를 선택합니다. 다음 속성을 입력합니다.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)
**참고**  
기본 인증서의 **ssl.truststore.password**는 “changeit”입니다. 기본 인증서를 사용하는 경우에는 이 값을 변경할 필요가 없습니다.

   **그룹 추가**를 다시 선택합니다. 다음 속성을 입력합니다.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

   애플리케이션 코드는 위의 애플리케이션 속성을 읽고 VPC 및 Amazon MSK 클러스터와 상호 작용하는 데 사용되는 소스 및 싱크를 구성합니다. 클러스터 속성 사용에 대한 자세한 내용은 [런타임 속성 사용](how-properties.md) 섹션을 참조하세요.

1. **스냅샷**에서 **비활성화**를 선택합니다. 이렇게 하면 잘못된 애플리케이션 상태 데이터를 로드하지 않고도 애플리케이션을 더 쉽게 업데이트할 수 있습니다.

1. **모니터링**에서 **지표 수준 모니터링**이 **애플리케이션**으로 설정되어 있는지 확인합니다.

1. **CloudWatch 로깅**에서 **활성화** 확인란을 선택합니다.

1. **Virtual Private Cloud(VPC)** 섹션에서 애플리케이션과 연결할 VPC를 선택합니다. 애플리케이션이 VPC 리소스에 액세스하는 데 사용할 VPC와 연결된 서브넷 및 보안 그룹을 선택합니다.

1. **업데이트**를 선택합니다.

**참고**  
CloudWatch 로깅을 활성화하도록 선택하면 Managed Service for Apache Flink에서 로그 그룹 및 로그 스트림을 생성합니다. 이러한 리소스의 이름은 다음과 같습니다.  
로그 그룹: `/aws/kinesis-analytics/MyApplication`
로그 스트림: `kinesis-analytics-log-stream`
이 로그 스트림은 애플리케이션을 모니터링하는 데 사용됩니다.

##### 애플리케이션을 실행합니다
<a name="example-keystore-run"></a>

애플리케이션을 실행하고 Apache Flink 대시보드를 연 다음 원하는 Flink 작업을 선택하면 Flink 작업 그래프를 볼 수 있습니다.

##### 애플리케이션 테스트
<a name="example-keystore-test"></a>

이 섹션에서는 소스 주제에 레코드를 쓰기 합니다. 애플리케이션은 소스 주제에서 레코드를 읽고 대상 주제에 쓰기 합니다. 소스 주제에 레코드를 쓰고 대상 주제에서 레코드를 읽어 애플리케이션이 작동 중인지 확인합니다.

주제에서 레코드를 쓰고 읽으려면 [Amazon MSK 사용 시작하기](https://docs.aws.amazon.com/msk/latest/developerguide/getting-started.html) 자습서의 [6단계: 데이터 생성 및 소비](https://docs.aws.amazon.com/msk/latest/developerguide/produce-consume.html)의 단계를 따르세요.

대상 주제에서 읽으려면 클러스터에 대한 두 번째 연결에서 소스 주제 대신 대상 주제 이름을 사용하세요.

```
bin/kafka-console-consumer.sh --bootstrap-server BootstrapBrokerString --consumer.config client.properties --topic AWS KafkaTutorialTopicDestination --from-beginning
```

대상 주제에 레코드가 표시되지 않는 경우 [Managed Service for Apache Flink 문제 해결](troubleshooting.md) 주제의 [VPC에서 리소스에 액세스 불가능](troubleshooting-symptoms.md#troubleshooting-rt-vpc) 섹션을 참조하세요.

### Python 예제
<a name="examples-python"></a>

다음 예제는 Apache Flink Table API와 함께 Python을 사용하여 애플리케이션을 만드는 방법을 보여줍니다.

**Topics**
+ [예: Python에서 텀블링 윈도우 생성](#examples-python-tumbling)
+ [예: Python에서 슬라이딩 윈도우 생성](#examples-python-sliding)
+ [예: Python에서 Amazon S3로 스트리밍 데이터 전송](#examples-python-s3)

#### 예: Python에서 텀블링 윈도우 생성
<a name="examples-python-tumbling"></a>

**참고**  
현재 예제는 [Managed Service for Apache Flink 애플리케이션 생성 및 사용 예제](examples-collapsibles.md) 섹션을 참조하세요.

이 연습에서는 텀블링 창을 사용하여 데이터를 집계하는 Python Managed Service for Apache Flink 애플리케이션을 생성합니다.

**참고**  
이 연습에 필수 사전 조건을 설정하려면 먼저 [자습서: Managed Service for Apache Flink에서 Python 사용 시작하기](gs-python.md) 연습을 완료하세요.

**Topics**
+ [종속 리소스 생성](#examples-python-tumbling-resources)
+ [샘플 레코드를 입력 스트림에 쓰기](#examples-python-tumbling-write)
+ [애플리케이션 코드 다운로드 및 검토](#examples-python-tumbling-download)
+ [Apache Flink 스트리밍 Python 코드 압축 및 업로드](#examples-python-tumbling-upload)
+ [Managed Service for Apache Flink 애플리케이션 생성 및 실행](#examples-python-tumbling-create-run)
+ [AWS 리소스 정리](#examples-python-tumbling-cleanup)

##### 종속 리소스 생성
<a name="examples-python-tumbling-resources"></a>

이 연습을 위해 Managed Service for Apache Flink 애플리케이션을 생성하기 전에 다음과 같은 종속 리소스를 생성해야 합니다.
+ 두 개의 Kinesis Data Streams(`ExampleInputStream` 및 `ExampleOutputStream`)
+ 애플리케이션 코드를 저장할 Amazon S3 버킷(`ka-app-code-<username>`) 

콘솔을 사용하여 Kinesis 스트림과 Amazon S3 버킷을 만들 수 있습니다. 이러한 리소스를 만드는 방법 설명은 다음 주제를 참조하세요.
+ *Amazon Kinesis Data Streams 개발자 안내서*의 [데이터 스트림 만들기 및 업데이트](https://docs.aws.amazon.com/kinesis/latest/dev/amazon-kinesis-streams.html). 데이터 스트림 **ExampleInputStream** 및 **ExampleOutputStream**에 명칭을 지정합니다.
+ *Amazon Simple Storage Service 사용 설명서*의 [S3 버킷을 생성하려면 어떻게 해야 합니까?](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket.html) 로그인 명칭(예: **ka-app-code-*<username>***)을 추가하여 Amazon S3 버킷에 전역적으로 고유한 명칭을 지정합니다.

##### 샘플 레코드를 입력 스트림에 쓰기
<a name="examples-python-tumbling-write"></a>

이 섹션에서는 Python 스크립트를 사용하여 애플리케이션에서 처리할 샘플 레코드를 스트림에 쓰기 합니다.

**참고**  
이 섹션에서는 [AWS SDK for Python (Boto)](https://aws.amazon.com/developers/getting-started/python/)이 필요합니다.

**참고**  
이 섹션의 Python 스크립트는 AWS CLI를 사용합니다. 계정 자격 증명과 기본 리전 AWS CLI 을 사용하도록를 구성해야 합니다. 를 구성하려면 다음을 AWS CLI입력합니다.  

```
aws configure
```

1. 다음 콘텐츠를 가진 `stock.py`이라는 파일을 생성합니다:

   ```
       import datetime
       import json
       import random
       import boto3
   
       STREAM_NAME = "ExampleInputStream"
   
   
       def get_data():
           return {
               'event_time': datetime.datetime.now().isoformat(),
               'ticker': random.choice(['AAPL', 'AMZN', 'MSFT', 'INTC', 'TBV']),
               'price': round(random.random() * 100, 2)}
   
   
       def generate(stream_name, kinesis_client):
           while True:
               data = get_data()
               print(data)
               kinesis_client.put_record(
                   StreamName=stream_name,
                   Data=json.dumps(data),
                   PartitionKey="partitionkey")
   
   
       if __name__ == '__main__':
           generate(STREAM_NAME, boto3.client('kinesis', region_name='us-west-2'))
   ```

1. `stock.py` 스크립트를 실행합니다.

   ```
   $ python stock.py
   ```

   자습서의 나머지 부분을 완료하는 동안 스크립트가 계속 돌아가게 둡니다.

##### 애플리케이션 코드 다운로드 및 검토
<a name="examples-python-tumbling-download"></a>

이 예제에 대한 Python 애플리케이션 코드는 GitHub에서 받을 수 있습니다. 애플리케이션 코드를 다운로드하려면 다음을 수행하세요.

1. 아직 설치하지 않았다면 Git 클라이언트를 설치합니다. 자세한 정보는 [Git 설치](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)를 참조하세요.

1. 다음 명령을 사용하여 원격 리포지토리를 복제합니다:

   ```
   git clone https://github.com/aws-samples/amazon-kinesis-data-analytics-examples.git
   ```

1. `amazon-kinesis-data-analytics-java-examples/python/TumblingWindow` 디렉터리로 이동합니다.

애플리케이션 코드는 `tumbling-windows.py` 파일에 있습니다. 애플리케이션 코드에 대해 다음을 유의하십시오:
+ 애플리케이션은 Kinesis 테이블 소스를 사용하여 소스 스트림에서 읽습니다. 다음 스니펫은 `create_table` 함수를 호출하여 Kinesis 테이블 소스를 생성합니다.

  ```
  table_env.execute_sql(
          create_input_table(input_table_name, input_stream, input_region, stream_initpos)
      )
  ```

  이 `create_table` 함수는 SQL 명령을 사용하여 스트리밍 소스가 지원하는 테이블을 생성합니다.

  ```
  def create_input_table(table_name, stream_name, region, stream_initpos):
      return """ CREATE TABLE {0} (
                  ticker VARCHAR(6),
                  price DOUBLE,
                  event_time TIMESTAMP(3),
                  WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND
                )
                PARTITIONED BY (ticker)
                WITH (
                  'connector' = 'kinesis',
                  'stream' = '{1}',
                  'aws.region' = '{2}',
                  'scan.stream.initpos' = '{3}',
                  'format' = 'json',
                  'json.timestamp-format.standard' = 'ISO-8601'
                ) """.format(table_name, stream_name, region, stream_initpos)
  ```
+ 애플리케이션은 `Tumble` 연산자를 사용하여 지정된 텀블링 윈도우 내에서 레코드를 집계하고 집계된 레코드를 테이블 객체로 반환합니다.

  ```
  tumbling_window_table = (
          input_table.window(
              Tumble.over("10.seconds").on("event_time").alias("ten_second_window")
          )
          .group_by("ticker, ten_second_window")
          .select("ticker, price.min as price, to_string(ten_second_window.end) as event_time")
  ```
+ 애플리케이션은 [https://mvnrepository.com/artifact/org.apache.flink/flink-sql-connector-kinesis/1.15.2](https://mvnrepository.com/artifact/org.apache.flink/flink-sql-connector-kinesis/1.15.2)의 Kinesis Flink 커넥터를 사용합니다.

##### Apache Flink 스트리밍 Python 코드 압축 및 업로드
<a name="examples-python-tumbling-upload"></a>

이 섹션에서는 [종속 리소스 생성](#examples-python-tumbling-resources) 섹션에서 생성한 Amazon S3 버킷에 애플리케이션 코드를 업로드합니다.

1. 선호하는 압축 애플리케이션을 사용하여 `tumbling-windows.py` 및 `flink-sql-connector-kinesis-1.15.2.jar` 파일을 압축합니다. 아카이브 이름은 `myapp.zip`라고 짓습니다.

1. Amazon S3 콘솔에서 **ka-app-code-*<username>*** 버킷을 선택하고 **업로드**를 선택합니다.

1. **파일 선택** 단계에서 **파일 추가**를 선택합니다. 이전 단계에서 생성한 `myapp.zip` 파일로 이동합니다.

1. 개체 정보에 대한 설정은 변경할 필요가 없으므로 **업로드**를 선택합니다.

이제 애플리케이션 코드가 애플리케이션에서 액세스할 수 있는 Amazon S3 버킷에 저장됩니다.

##### Managed Service for Apache Flink 애플리케이션 생성 및 실행
<a name="examples-python-tumbling-create-run"></a>

콘솔을 사용하여 애플리케이션을 생성, 구성, 업데이트 및 실행하려면 다음 단계를 수행하세요.

##### 애플리케이션 생성
<a name="examples-python-tumbling-create"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. **Managed Service for Apache Flink 대시보드에서 분석 애플리케이션 생성을 선택합니다.**

1. **Managed Service for Apache Flink - 애플리케이션 생성** 페이지에서 다음과 같이 애플리케이션 세부 정보를 제공합니다.
   + **애플리케이션 명칭**에 **MyApplication**을 입력합니다.
   + **런타임**에서 **Apache Flink**를 선택합니다.
**참고**  
Managed Service for Apache Flink는 Apache Flink 버전 1.15.2를 사용합니다.
   + 버전 풀다운은 **Apache Flink 버전 1.15.2(권장 버전)**로 그대로 두세요.

1. **액세스 권한**에서 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **애플리케이션 생성**을 선택합니다.

**참고**  
콘솔을 사용하여 Managed Service for Apache Flink 애플리케이션을 만들 때 내 애플리케이션에 대한 IAM 역할 및 정책을 둘 수 있는 옵션이 있습니다. 귀하의 애플리케이션은 이 역할 및 정책을 사용하여 종속 리소스에 액세스합니다. 이러한 IAM 리소스의 이름은 애플리케이션 명칭과 리전을 사용하여 다음과 같이 지정됩니다.  
정책: `kinesis-analytics-service-MyApplication-us-west-2`
역할: `kinesisanalytics-MyApplication-us-west-2`

##### 애플리케이션 구성
<a name="examples-python-tumbling-configure"></a>

1. **MyApplication** 페이지에서 **구성**을 선택합니다.

1. **애플리케이션 구성** 페이지에서 **코드 위치**를 입력합니다.
   + **Amazon S3 버킷**의 경우 **ka-app-code-*<username>***를 입력합니다.
   + **Amazon S3 객체 경로**에는 **myapp.zip**를 입력합니다.

1. **애플리케이션 리소스에 대한 액세스** 아래에서 **액세스 권한**의 경우 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **속성**에서 **그룹 추가**를 선택합니다.

1. 다음을 입력합니다:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

   **저장**을 선택합니다.

1. **속성**에서 **그룹 추가**를 다시 선택합니다.

1. 다음을 입력합니다:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

1. **속성**에서 **그룹 추가**를 다시 선택합니다. **그룹 ID**에 **kinesis.analytics.flink.run.options**를 입력합니다. 이 특수 속성 그룹은 애플리케이션에 코드 리소스를 찾을 수 있는 위치를 알려줍니다. 자세한 내용을 알아보려면 [코드 파일 지정](how-python-creating.md#how-python-creating-code) 섹션을 참조하세요.

1. 다음을 입력합니다:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

1. **모니터링**에서 **지표 수준 모니터링**이 **애플리케이션**으로 설정되어 있는지 확인합니다.

1. **CloudWatch 로깅**에서 **활성화** 확인란을 선택합니다.

1. **업데이트**를 선택합니다.

**참고**  
CloudWatch 로깅을 활성화하도록 선택하면 Managed Service for Apache Flink에서 로그 그룹 및 로그 스트림을 생성합니다. 이러한 리소스의 이름은 다음과 같습니다.  
로그 그룹: `/aws/kinesis-analytics/MyApplication`
로그 스트림: `kinesis-analytics-log-stream`
이 로그 스트림은 애플리케이션을 모니터링하는 데 사용됩니다. 이 로그 스트림은 애플리케이션이 결과를 전송하는 데 사용하는 로그 스트림과 다릅니다.

##### IAM 정책 편집
<a name="examples-python-tumbling-iam"></a>

IAM 정책을 편집하여 Kinesis Data Streams에 액세스할 수 있는 권한을 추가합니다.

1. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 여세요.

1. **정책**을 선택하세요. 이전 섹션에서 콘솔이 생성한 **`kinesis-analytics-service-MyApplication-us-west-2`** 정책을 선택합니다.

1. **요약** 페이지에서 **정책 편집**을 선택합니다. **JSON** 탭을 선택합니다.

1. 다음 정책 예제의 강조 표시된 부분을 정책에 추가하세요. 샘플 계정 ID(*012345678901*)를 내 계정 ID로 바꿉니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ReadCode",
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "logs:DescribeLogGroups",
                   "s3:GetObjectVersion"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:*",
                   "arn:aws:s3:::ka-app-code-<username>/myapp.zip"
               ]
           },
           {
               "Sid": "DescribeLogStreams",
               "Effect": "Allow",
               "Action": "logs:DescribeLogStreams",
               "Resource": "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:*"
           },
           {
               "Sid": "PutLogEvents",
               "Effect": "Allow",
               "Action": "logs:PutLogEvents",
               "Resource": "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:kinesis-analytics-log-stream"
           },
           {
               "Sid": "ListCloudwatchLogGroups",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogGroups"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:*"
               ]
           },
           {
               "Sid": "ReadInputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleInputStream"
           },
           {
               "Sid": "WriteOutputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleOutputStream"
           }
       ]
   }
   ```

------

##### 애플리케이션을 실행합니다
<a name="examples-python-tumbling-run"></a>

애플리케이션을 실행하고 Apache Flink 대시보드를 연 다음 원하는 Flink 작업을 선택하면 Flink 작업 그래프를 볼 수 있습니다.

CloudWatch 콘솔에서 Managed Service for Apache Flink 지표를 확인하여 애플리케이션이 작동하는지 확인할 수 있습니다.

##### AWS 리소스 정리
<a name="examples-python-tumbling-cleanup"></a>

이 단원에는 텀블링 윈도우 자습서에서 생성된 AWS 리소스를 정리하는 절차가 포함되어 있습니다.

**Topics**
+ [Managed Service for Apache Flink 애플리케이션 삭제](#examples-python-tumbling-cleanup-app)
+ [Kinesis 데이터 스트림 삭제](#examples-python-tumbling-cleanup-stream)
+ [Amazon S3 객체 및 버킷 삭제](#examples-python-tumbling-cleanup-s3)
+ [IAM 리소스 삭제](#examples-python-tumbling-cleanup-iam)
+ [CloudWatch 리소스 삭제](#examples-python-tumbling-cleanup-cw)

##### Managed Service for Apache Flink 애플리케이션 삭제
<a name="examples-python-tumbling-cleanup-app"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. Managed Service for Apache Flink 패널에서 **MyApplication**을 선택합니다.

1. 애플리케이션 페이지에서 **삭제**를 선택한 다음 삭제를 확인합니다.

##### Kinesis 데이터 스트림 삭제
<a name="examples-python-tumbling-cleanup-stream"></a>

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

1. Kinesis Data Streams 패널에서 **ExampleInputStream**을 선택합니다.

1. **ExampleInputStream** 페이지에서 **Kinesis 스트림 삭제**를 선택한 다음 삭제를 확인합니다.

1. **Kinesis 스트림** 페이지에서 **ExampleOutputStream**을 선택하고, **작업**을 선택하고, **삭제**를 선택한 다음 삭제 여부를 확인합니다.

##### Amazon S3 객체 및 버킷 삭제
<a name="examples-python-tumbling-cleanup-s3"></a>

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

1. **ka-app-code-*<username>* 버킷을 선택합니다.**

1. **삭제**를 선택한 후 버킷 이름을 입력하여 삭제를 확인합니다.

##### IAM 리소스 삭제
<a name="examples-python-tumbling-cleanup-iam"></a>

1. IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))을 엽니다.

1. 탐색 바에서 **정책**을 선택합니다.

1. 필터 컨트롤에서 **kinesis**를 입력합니다.

1. **kinesis-analytics-service-MyApplication-us-west-2** 정책을 선택합니다.

1. **정책 작업**을 선택한 후 **삭제**를 선택합니다.

1. 탐색 모음에서 **역할**을 선택합니다.

1. **kinesis-analytics-MyApplication-us-west-2** 역할을 선택합니다.

1. **역할 삭제**를 선택하고 삭제를 확인합니다.

##### CloudWatch 리소스 삭제
<a name="examples-python-tumbling-cleanup-cw"></a>

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

1. 탐색 바에서 **로그**를 선택합니다.

1. **/aws/kinesis-analytics/MyApplication** 로그 그룹을 선택합니다.

1. **로그 그룹 삭제**를 선택한 다음 삭제를 확인합니다.

#### 예: Python에서 슬라이딩 윈도우 생성
<a name="examples-python-sliding"></a>

**참고**  
현재 예제는 [Managed Service for Apache Flink 애플리케이션 생성 및 사용 예제](examples-collapsibles.md) 섹션을 참조하세요.

**참고**  
이 연습에 필수 사전 조건을 설정하려면 먼저 [자습서: Managed Service for Apache Flink에서 Python 사용 시작하기](gs-python.md) 연습을 완료하세요.

**Topics**
+ [종속 리소스 생성](#examples-python-sliding-resources)
+ [샘플 레코드를 입력 스트림에 쓰기](#examples-python-sliding-write)
+ [애플리케이션 코드 다운로드 및 검토](#examples-python-sliding-download)
+ [Apache Flink 스트리밍 Python 코드 압축 및 업로드](#examples-python-sliding-upload)
+ [Managed Service for Apache Flink 애플리케이션 생성 및 실행](#examples-python-sliding-create-run)
+ [AWS 리소스 정리](#examples-python-sliding-cleanup)

##### 종속 리소스 생성
<a name="examples-python-sliding-resources"></a>

이 연습을 위해 Managed Service for Apache Flink 애플리케이션을 생성하기 전에 다음과 같은 종속 리소스를 생성해야 합니다.
+ 두 개의 Kinesis Data Streams(`ExampleInputStream` 및 `ExampleOutputStream`)
+ 애플리케이션 코드를 저장할 Amazon S3 버킷(`ka-app-code-<username>`) 

콘솔을 사용하여 Kinesis 스트림과 Amazon S3 버킷을 만들 수 있습니다. 이러한 리소스를 만드는 방법 설명은 다음 주제를 참조하세요.
+ *Amazon Kinesis Data Streams 개발자 안내서*의 [데이터 스트림 만들기 및 업데이트](https://docs.aws.amazon.com/kinesis/latest/dev/amazon-kinesis-streams.html). 데이터 스트림 **ExampleInputStream** 및 **ExampleOutputStream**에 명칭을 지정합니다.
+ *Amazon Simple Storage Service 사용 설명서*의 [S3 버킷을 생성하려면 어떻게 해야 합니까?](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket.html) 로그인 명칭(예: **ka-app-code-*<username>***)을 추가하여 Amazon S3 버킷에 전역적으로 고유한 명칭을 지정합니다.

##### 샘플 레코드를 입력 스트림에 쓰기
<a name="examples-python-sliding-write"></a>

이 섹션에서는 Python 스크립트를 사용하여 애플리케이션에서 처리할 샘플 레코드를 스트림에 쓰기 합니다.

**참고**  
이 섹션에서는 [AWS SDK for Python (Boto)](https://aws.amazon.com/developers/getting-started/python/)이 필요합니다.

**참고**  
이 섹션의 Python 스크립트는 AWS CLI를 사용합니다. 계정 자격 증명과 기본 리전 AWS CLI 을 사용하도록를 구성해야 합니다. 를 구성하려면 다음을 AWS CLI입력합니다.  

```
aws configure
```

1. 다음 콘텐츠를 가진 `stock.py`이라는 파일을 생성합니다:

   ```
       import datetime
       import json
       import random
       import boto3
   
       STREAM_NAME = "ExampleInputStream"
   
   
       def get_data():
           return {
               'event_time': datetime.datetime.now().isoformat(),
               'ticker': random.choice(['AAPL', 'AMZN', 'MSFT', 'INTC', 'TBV']),
               'price': round(random.random() * 100, 2)}
   
   
       def generate(stream_name, kinesis_client):
           while True:
               data = get_data()
               print(data)
               kinesis_client.put_record(
                   StreamName=stream_name,
                   Data=json.dumps(data),
                   PartitionKey="partitionkey")
   
   
       if __name__ == '__main__':
           generate(STREAM_NAME, boto3.client('kinesis', region_name='us-west-2'))
   ```

1. `stock.py` 스크립트를 실행합니다.

   ```
   $ python stock.py
   ```

   자습서의 나머지 부분을 완료하는 동안 스크립트가 계속 돌아가게 둡니다.

##### 애플리케이션 코드 다운로드 및 검토
<a name="examples-python-sliding-download"></a>

이 예제에 대한 Python 애플리케이션 코드는 GitHub에서 받을 수 있습니다. 애플리케이션 코드를 다운로드하려면 다음을 수행하세요.

1. 아직 설치하지 않았다면 Git 클라이언트를 설치합니다. 자세한 정보는 [Git 설치](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)를 참조하세요.

1. 다음 명령을 사용하여 원격 리포지토리를 복제합니다:

   ```
   git clone https://github.com/aws-samples/>amazon-kinesis-data-analytics-java-examples
   ```

1. `amazon-kinesis-data-analytics-java-examples/python/SlidingWindow` 디렉터리로 이동합니다.

애플리케이션 코드는 `sliding-windows.py` 파일에 있습니다. 애플리케이션 코드에 대해 다음을 유의하십시오:
+ 애플리케이션은 Kinesis 테이블 소스를 사용하여 소스 스트림에서 읽습니다. 다음 스니펫은 `create_input_table` 함수를 호출하여 Kinesis 테이블 소스를 생성합니다.

  ```
  table_env.execute_sql(
          create_input_table(input_table_name, input_stream, input_region, stream_initpos)
      )
  ```

  이 `create_input_table` 함수는 SQL 명령을 사용하여 스트리밍 소스가 지원하는 테이블을 생성합니다.

  ```
  def create_input_table(table_name, stream_name, region, stream_initpos):
      return """ CREATE TABLE {0} (
                  ticker VARCHAR(6),
                  price DOUBLE,
                  event_time TIMESTAMP(3),
                  WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND
                )
                PARTITIONED BY (ticker)
                WITH (
                  'connector' = 'kinesis',
                  'stream' = '{1}',
                  'aws.region' = '{2}',
                  'scan.stream.initpos' = '{3}',
                  'format' = 'json',
                  'json.timestamp-format.standard' = 'ISO-8601'
                ) """.format(table_name, stream_name, region, stream_initpos)
   }
  ```
+ 애플리케이션은 `Slide` 연산자를 사용하여 지정된 슬라이딩 윈도우 내에서 레코드를 집계하고 집계된 레코드를 테이블 객체로 반환합니다.

  ```
  sliding_window_table = (
          input_table
              .window(
                  Slide.over("10.seconds")
                  .every("5.seconds")
                  .on("event_time")
                  .alias("ten_second_window")
              )
              .group_by("ticker, ten_second_window")
              .select("ticker, price.min as price, to_string(ten_second_window.end) as event_time")
      )
  ```
+ 이 애플리케이션은 [flink-sql-connector-kinesis-1.15.2.jar](https://mvnrepository.com/artifact/org.apache.flink/flink-sql-connector-kinesis/1.15.2) 파일의 Kinesis Flink 커넥터를 사용합니다.

##### Apache Flink 스트리밍 Python 코드 압축 및 업로드
<a name="examples-python-sliding-upload"></a>

이 섹션에서는 [종속 리소스 생성](#examples-python-sliding-resources) 섹션에서 생성한 Amazon S3 버킷에 애플리케이션 코드를 업로드합니다.

이 섹션에서는 Python 애플리케이션을 패키징하는 방법을 설명합니다.

1. 선호하는 압축 애플리케이션을 사용하여 `sliding-windows.py` 및 `flink-sql-connector-kinesis-1.15.2.jar`파일을 압축합니다. 아카이브 이름은 `myapp.zip`라고 짓습니다.

1. Amazon S3 콘솔에서 **ka-app-code-*<username>*** 버킷을 선택하고 **업로드**를 선택합니다.

1. **파일 선택** 단계에서 **파일 추가**를 선택합니다. 이전 단계에서 생성한 `myapp.zip` 파일로 이동합니다.

1. 개체 정보에 대한 설정은 변경할 필요가 없으므로 **업로드**를 선택합니다.

이제 애플리케이션 코드가 애플리케이션에서 액세스할 수 있는 Amazon S3 버킷에 저장됩니다.

##### Managed Service for Apache Flink 애플리케이션 생성 및 실행
<a name="examples-python-sliding-create-run"></a>

콘솔을 사용하여 애플리케이션을 생성, 구성, 업데이트 및 실행하려면 다음 단계를 수행하세요.

##### 애플리케이션 생성
<a name="examples-python-sliding-create"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. **Managed Service for Apache Flink 대시보드에서 분석 애플리케이션 생성을 선택합니다.**

1. **Managed Service for Apache Flink - 애플리케이션 생성** 페이지에서 다음과 같이 애플리케이션 세부 정보를 제공합니다.
   + **애플리케이션 명칭**에 **MyApplication**을 입력합니다.
   + **런타임**에서 **Apache Flink**를 선택합니다.
**참고**  
Managed Service for Apache Flink는 Apache Flink 버전 1.15.2를 사용합니다.
   + 버전 풀다운은 **Apache Flink 버전 1.15.2(권장 버전)**로 그대로 두세요.

1. **액세스 권한**에서 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **애플리케이션 생성**을 선택합니다.

**참고**  
콘솔을 사용하여 Managed Service for Apache Flink 애플리케이션을 만들 때 내 애플리케이션에 대한 IAM 역할 및 정책을 둘 수 있는 옵션이 있습니다. 귀하의 애플리케이션은 이 역할 및 정책을 사용하여 종속 리소스에 액세스합니다. 이러한 IAM 리소스의 이름은 애플리케이션 명칭과 리전을 사용하여 다음과 같이 지정됩니다.  
정책: `kinesis-analytics-service-MyApplication-us-west-2`
역할: `kinesisanalytics-MyApplication-us-west-2`

##### 애플리케이션 구성
<a name="examples-python-sliding-configure"></a>

1. **MyApplication** 페이지에서 **구성**을 선택합니다.

1. **애플리케이션 구성** 페이지에서 **코드 위치**를 입력합니다.
   + **Amazon S3 버킷**의 경우 **ka-app-code-*<username>***를 입력합니다.
   + **Amazon S3 객체 경로**에는 **myapp.zip**를 입력합니다.

1. **애플리케이션 리소스에 대한 액세스** 아래에서 **액세스 권한**의 경우 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **속성**에서 **그룹 추가**를 선택합니다.

1. 다음 애플리케이션 속성 및 값을 입력합니다:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

   **저장**을 선택합니다.

1. **속성**에서 **그룹 추가**를 다시 선택합니다.

1. 다음 애플리케이션 속성 및 값을 입력합니다:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

1. **속성**에서 **그룹 추가**를 다시 선택합니다. **그룹 ID**에 **kinesis.analytics.flink.run.options**를 입력합니다. 이 특수 속성 그룹은 애플리케이션에 코드 리소스를 찾을 수 있는 위치를 알려줍니다. 자세한 내용을 알아보려면 [코드 파일 지정](how-python-creating.md#how-python-creating-code) 섹션을 참조하세요.

1. 다음 애플리케이션 속성 및 값을 입력합니다:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

1. **모니터링**에서 **지표 수준 모니터링**이 **애플리케이션**으로 설정되어 있는지 확인합니다.

1. **CloudWatch 로깅**에서 **활성화** 확인란을 선택합니다.

1. **업데이트**를 선택합니다.

**참고**  
CloudWatch 로깅을 활성화하도록 선택하면 Managed Service for Apache Flink에서 로그 그룹 및 로그 스트림을 생성합니다. 이러한 리소스의 이름은 다음과 같습니다.  
로그 그룹: `/aws/kinesis-analytics/MyApplication`
로그 스트림: `kinesis-analytics-log-stream`
이 로그 스트림은 애플리케이션을 모니터링하는 데 사용됩니다. 이 로그 스트림은 애플리케이션이 결과를 전송하는 데 사용하는 로그 스트림과 다릅니다.

##### IAM 정책 편집
<a name="examples-python-sliding-iam"></a>

IAM 정책을 편집하여 Kinesis Data Streams에 액세스할 수 있는 권한을 추가합니다.

1. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 여세요.

1. **정책**을 선택하세요. 이전 섹션에서 콘솔이 생성한 **`kinesis-analytics-service-MyApplication-us-west-2`** 정책을 선택합니다.

1. **요약** 페이지에서 **정책 편집**을 선택합니다. **JSON** 탭을 선택합니다.

1. 다음 정책 예제의 강조 표시된 부분을 정책에 추가하세요. 샘플 계정 ID(*012345678901*)를 내 계정 ID로 바꿉니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ReadCode",
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "logs:DescribeLogGroups",
                   "s3:GetObjectVersion"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:*",
                   "arn:aws:s3:::ka-app-code-<username>/myapp.zip"
               ]
           },
           {
               "Sid": "DescribeLogStreams",
               "Effect": "Allow",
               "Action": "logs:DescribeLogStreams",
               "Resource": "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:*"
           },
           {
               "Sid": "PutLogEvents",
               "Effect": "Allow",
               "Action": "logs:PutLogEvents",
               "Resource": "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:kinesis-analytics-log-stream"
           },
           {
               "Sid": "ListCloudwatchLogGroups",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogGroups"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:*"
               ]
           },
           {
               "Sid": "ReadInputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleInputStream"
           },
           {
               "Sid": "WriteOutputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleOutputStream"
           }
       ]
   }
   ```

------

##### 애플리케이션을 실행합니다
<a name="examples-python-sliding-run"></a>

애플리케이션을 실행하고 Apache Flink 대시보드를 연 다음 원하는 Flink 작업을 선택하면 Flink 작업 그래프를 볼 수 있습니다.

CloudWatch 콘솔에서 Managed Service for Apache Flink 지표를 확인하여 애플리케이션이 작동하는지 확인할 수 있습니다.

##### AWS 리소스 정리
<a name="examples-python-sliding-cleanup"></a>

이 섹션에는 슬라이딩 윈도우 자습서에서 생성된 AWS 리소스를 정리하는 절차가 포함되어 있습니다.

**Topics**
+ [Managed Service for Apache Flink 애플리케이션 삭제](#examples-python-sliding-cleanup-app)
+ [Kinesis 데이터 스트림 삭제](#examples-python-sliding-cleanup-stream)
+ [Amazon S3 객체 및 버킷 삭제](#examples-python-sliding-cleanup-s3)
+ [IAM 리소스 삭제](#examples-python-sliding-cleanup-iam)
+ [CloudWatch 리소스 삭제](#examples-python-sliding-cleanup-cw)

##### Managed Service for Apache Flink 애플리케이션 삭제
<a name="examples-python-sliding-cleanup-app"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. Managed Service for Apache Flink 패널에서 **MyApplication**을 선택합니다.

1. 애플리케이션 페이지에서 **삭제**를 선택한 다음 삭제를 확인합니다.

##### Kinesis 데이터 스트림 삭제
<a name="examples-python-sliding-cleanup-stream"></a>

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

1. Kinesis Data Streams 패널에서 **ExampleInputStream**을 선택합니다.

1. **ExampleInputStream** 페이지에서 **Kinesis 스트림 삭제**를 선택한 다음 삭제를 확인합니다.

1. **Kinesis 스트림** 페이지에서 **ExampleOutputStream**을 선택하고, **작업**을 선택하고, **삭제**를 선택한 다음 삭제 여부를 확인합니다.

##### Amazon S3 객체 및 버킷 삭제
<a name="examples-python-sliding-cleanup-s3"></a>

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

1. **ka-app-code-*<username>* 버킷을 선택합니다.**

1. **삭제**를 선택한 후 버킷 이름을 입력하여 삭제를 확인합니다.

##### IAM 리소스 삭제
<a name="examples-python-sliding-cleanup-iam"></a>

1. IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))을 엽니다.

1. 탐색 바에서 **정책**을 선택합니다.

1. 필터 컨트롤에서 **kinesis**를 입력합니다.

1. **kinesis-analytics-service-MyApplication-us-west-2** 정책을 선택합니다.

1. **정책 작업**을 선택한 후 **삭제**를 선택합니다.

1. 탐색 모음에서 **역할**을 선택합니다.

1. **kinesis-analytics-MyApplication-us-west-2** 역할을 선택합니다.

1. **역할 삭제**를 선택하고 삭제를 확인합니다.

##### CloudWatch 리소스 삭제
<a name="examples-python-sliding-cleanup-cw"></a>

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

1. 탐색 바에서 **로그**를 선택합니다.

1. **/aws/kinesis-analytics/MyApplication** 로그 그룹을 선택합니다.

1. **로그 그룹 삭제**를 선택한 다음 삭제를 확인합니다.

#### 예: Python에서 Amazon S3로 스트리밍 데이터 전송
<a name="examples-python-s3"></a>

**참고**  
현재 예제는 [Managed Service for Apache Flink 애플리케이션 생성 및 사용 예제](examples-collapsibles.md) 섹션을 참조하세요.

이 연습에서는 Amazon Simple Storage Service 싱크로 데이터를 스트리밍하는 Python Managed Service for Apache Flink 애플리케이션을 생성합니다.

**참고**  
이 연습에 필수 사전 조건을 설정하려면 먼저 [자습서: Managed Service for Apache Flink에서 Python 사용 시작하기](gs-python.md) 연습을 완료하세요.

**Topics**
+ [종속 리소스 생성](#examples-python-s3-resources)
+ [샘플 레코드를 입력 스트림에 쓰기](#examples-python-s3-write)
+ [애플리케이션 코드 다운로드 및 검토](#examples-python-s3-download)
+ [Apache Flink 스트리밍 Python 코드 압축 및 업로드](#examples-python-s3-upload)
+ [Managed Service for Apache Flink 애플리케이션 생성 및 실행](#examples-python-s3-create-run)
+ [AWS 리소스 정리](#examples-python-s3-cleanup)

##### 종속 리소스 생성
<a name="examples-python-s3-resources"></a>

이 연습을 위해 Managed Service for Apache Flink 애플리케이션을 생성하기 전에 다음과 같은 종속 리소스를 생성해야 합니다.
+ Kinesis Data Streams(`ExampleInputStream`)
+ 애플리케이션 코드와 출력을 저장할 Amazon S3 버킷(`ka-app-code-<username>`) 

**참고**  
Managed Service for Apache Flink는 Managed Service for Apache Flink에서 서버 측 암호화가 활성화된 상태에서는 Amazon S3에 데이터를 쓸 수 없습니다.

콘솔을 사용하여 Kinesis 스트림과 Amazon S3 버킷을 만들 수 있습니다. 이러한 리소스를 만드는 방법 설명은 다음 주제를 참조하세요.
+ *Amazon Kinesis Data Streams 개발자 안내서*의 [데이터 스트림 만들기 및 업데이트](https://docs.aws.amazon.com/kinesis/latest/dev/amazon-kinesis-streams.html). 데이터 스트림 **ExampleInputStream**의 이름을 지정합니다.
+ *Amazon Simple Storage Service 사용 설명서*의 [S3 버킷을 생성하려면 어떻게 해야 합니까?](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket.html) 로그인 명칭(예: **ka-app-code-*<username>***)을 추가하여 Amazon S3 버킷에 전역적으로 고유한 명칭을 지정합니다.

##### 샘플 레코드를 입력 스트림에 쓰기
<a name="examples-python-s3-write"></a>

이 섹션에서는 Python 스크립트를 사용하여 애플리케이션에서 처리할 샘플 레코드를 스트림에 쓰기 합니다.

**참고**  
이 섹션에서는 [AWS SDK for Python (Boto)](https://aws.amazon.com/developers/getting-started/python/)이 필요합니다.

**참고**  
이 섹션의 Python 스크립트는 AWS CLI를 사용합니다. 계정 자격 증명과 기본 리전 AWS CLI 을 사용하도록를 구성해야 합니다. 를 구성하려면 다음을 AWS CLI입력합니다.  

```
aws configure
```

1. 다음 콘텐츠를 가진 `stock.py`이라는 파일을 생성합니다:

   ```
       import datetime
       import json
       import random
       import boto3
   
       STREAM_NAME = "ExampleInputStream"
   
   
       def get_data():
           return {
               'event_time': datetime.datetime.now().isoformat(),
               'ticker': random.choice(['AAPL', 'AMZN', 'MSFT', 'INTC', 'TBV']),
               'price': round(random.random() * 100, 2)}
   
   
       def generate(stream_name, kinesis_client):
           while True:
               data = get_data()
               print(data)
               kinesis_client.put_record(
                   StreamName=stream_name,
                   Data=json.dumps(data),
                   PartitionKey="partitionkey")
   
   
       if __name__ == '__main__':
           generate(STREAM_NAME, boto3.client('kinesis', region_name='us-west-2'))
   ```

1. `stock.py` 스크립트를 실행합니다.

   ```
   $ python stock.py
   ```

   자습서의 나머지 부분을 완료하는 동안 스크립트가 계속 돌아가게 둡니다.

##### 애플리케이션 코드 다운로드 및 검토
<a name="examples-python-s3-download"></a>

이 예제에 대한 Python 애플리케이션 코드는 GitHub에서 받을 수 있습니다. 애플리케이션 코드를 다운로드하려면 다음을 수행하세요.

1. 아직 설치하지 않았다면 Git 클라이언트를 설치합니다. 자세한 정보는 [Git 설치](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)를 참조하세요.

1. 다음 명령을 사용하여 원격 리포지토리를 복제합니다:

   ```
   git clone https://github.com/aws-samples/amazon-kinesis-data-analytics-examples.git
   ```

1. `amazon-kinesis-data-analytics-java-examples/python/S3Sink` 디렉터리로 이동합니다.

애플리케이션 코드는 `streaming-file-sink.py` 파일에 있습니다. 애플리케이션 코드에 대해 다음을 유의하십시오:
+ 애플리케이션은 Kinesis 테이블 소스를 사용하여 소스 스트림에서 읽습니다. 다음 스니펫은 `create_source_table` 함수를 호출하여 Kinesis 테이블 소스를 생성합니다.

  ```
  table_env.execute_sql(
          create_source_table(input_table_name, input_stream, input_region, stream_initpos)
      )
  ```

  이 `create_source_table` 함수는 SQL 명령을 사용하여 스트리밍 소스가 지원하는 테이블을 생성합니다.

  ```
  import datetime
      import json
      import random
      import boto3
  
      STREAM_NAME = "ExampleInputStream"
  
  
      def get_data():
          return {
              'event_time': datetime.datetime.now().isoformat(),
              'ticker': random.choice(['AAPL', 'AMZN', 'MSFT', 'INTC', 'TBV']),
              'price': round(random.random() * 100, 2)}
  
  
      def generate(stream_name, kinesis_client):
          while True:
              data = get_data()
              print(data)
              kinesis_client.put_record(
                  StreamName=stream_name,
                  Data=json.dumps(data),
                  PartitionKey="partitionkey")
  
  
      if __name__ == '__main__':
          generate(STREAM_NAME, boto3.client('kinesis', region_name='us-west-2'))
  ```
+ 애플리케이션은 `filesystem` 커넥터를 사용하여 레코드를 Amazon S3 버킷으로 전송합니다.

  ```
  def create_sink_table(table_name, bucket_name):
      return """ CREATE TABLE {0} (
                  ticker VARCHAR(6),
                  price DOUBLE,
                  event_time VARCHAR(64)
                )
                PARTITIONED BY (ticker)
                WITH (
                    'connector'='filesystem',
                    'path'='s3a://{1}/',
                    'format'='json',
                    'sink.partition-commit.policy.kind'='success-file',
                    'sink.partition-commit.delay' = '1 min'
                ) """.format(table_name, bucket_name)
  ```
+ 이 애플리케이션은 [flink-sql-connector-kinesis-1.15.2.jar](https://mvnrepository.com/artifact/org.apache.flink/flink-sql-connector-kinesis/1.15.2) 파일의 Kinesis Flink 커넥터를 사용합니다.

##### Apache Flink 스트리밍 Python 코드 압축 및 업로드
<a name="examples-python-s3-upload"></a>

이 섹션에서는 [종속 리소스 생성](#examples-python-s3-resources) 섹션에서 생성한 Amazon S3 버킷에 애플리케이션 코드를 업로드합니다.

1. 선호하는 압축 애플리케이션을 사용하여 `streaming-file-sink.py`와 [flink-sql-connector-kinesis-1.15.2.jar](https://mvnrepository.com/artifact/org.apache.flink/flink-sql-connector-kinesis/1.15.2) 파일을 압축하세요. 아카이브 이름은 `myapp.zip`라고 짓습니다.

1. Amazon S3 콘솔에서 **ka-app-code-*<username>*** 버킷을 선택하고 **업로드**를 선택합니다.

1. **파일 선택** 단계에서 **파일 추가**를 선택합니다. 이전 단계에서 생성한 `myapp.zip` 파일로 이동합니다.

1. 개체 정보에 대한 설정은 변경할 필요가 없으므로 **업로드**를 선택합니다.

이제 애플리케이션 코드가 애플리케이션에서 액세스할 수 있는 Amazon S3 버킷에 저장됩니다.

##### Managed Service for Apache Flink 애플리케이션 생성 및 실행
<a name="examples-python-s3-create-run"></a>

콘솔을 사용하여 애플리케이션을 생성, 구성, 업데이트 및 실행하려면 다음 단계를 수행하세요.

##### 애플리케이션 생성
<a name="examples-python-s3-create"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. **Managed Service for Apache Flink 대시보드에서 분석 애플리케이션 생성을 선택합니다.**

1. **Managed Service for Apache Flink - 애플리케이션 생성** 페이지에서 다음과 같이 애플리케이션 세부 정보를 제공합니다.
   + **애플리케이션 명칭**에 **MyApplication**을 입력합니다.
   + **런타임**에서 **Apache Flink**를 선택합니다.
**참고**  
Managed Service for Apache Flink는 Apache Flink 버전 1.15.2를 사용합니다.
   + 버전 풀다운은 **Apache Flink 버전 1.15.2(권장 버전)**로 그대로 두세요.

1. **액세스 권한**에서 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **애플리케이션 생성**을 선택합니다.

**참고**  
콘솔을 사용하여 Managed Service for Apache Flink 애플리케이션을 만들 때 내 애플리케이션에 대한 IAM 역할 및 정책을 둘 수 있는 옵션이 있습니다. 귀하의 애플리케이션은 이 역할 및 정책을 사용하여 종속 리소스에 액세스합니다. 이러한 IAM 리소스의 이름은 애플리케이션 명칭과 리전을 사용하여 다음과 같이 지정됩니다.  
정책: `kinesis-analytics-service-MyApplication-us-west-2`
역할: `kinesisanalytics-MyApplication-us-west-2`

##### 애플리케이션 구성
<a name="examples-python-s3-configure"></a>

1. **MyApplication** 페이지에서 **구성**을 선택합니다.

1. **애플리케이션 구성** 페이지에서 **코드 위치**를 입력합니다.
   + **Amazon S3 버킷**의 경우 **ka-app-code-*<username>***를 입력합니다.
   + **Amazon S3 객체 경로**에는 **myapp.zip**를 입력합니다.

1. **애플리케이션 리소스에 대한 액세스** 아래에서 **액세스 권한**의 경우 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **속성**에서 **그룹 추가**를 선택합니다.

1. 다음 애플리케이션 속성 및 값을 입력합니다:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

   **저장**을 선택합니다.

1. **속성**에서 **그룹 추가**를 다시 선택합니다. **그룹 ID**에 **kinesis.analytics.flink.run.options**를 입력합니다. 이 특수 속성 그룹은 애플리케이션에 코드 리소스를 찾을 수 있는 위치를 알려줍니다. 자세한 내용을 알아보려면 [코드 파일 지정](how-python-creating.md#how-python-creating-code) 섹션을 참조하세요.

1. 다음 애플리케이션 속성 및 값을 입력합니다:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

1. **속성**에서 **그룹 추가**를 다시 선택합니다. **그룹 ID**에 **sink.config.0**를 입력합니다. 이 특수 속성 그룹은 애플리케이션에 코드 리소스를 찾을 수 있는 위치를 알려줍니다. 자세한 내용을 알아보려면 [코드 파일 지정](how-python-creating.md#how-python-creating-code) 섹션을 참조하세요.

1. 다음 애플리케이션 속성 및 값을 입력합니다(*bucket-name*을 실제 Amazon S3 버킷의 이름으로 바꿉니다).    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

1. **모니터링**에서 **지표 수준 모니터링**이 **애플리케이션**으로 설정되어 있는지 확인합니다.

1. **CloudWatch 로깅**에서 **활성화** 확인란을 선택합니다.

1. **업데이트**를 선택합니다.

**참고**  
CloudWatch 로깅을 활성화하도록 선택하면 Managed Service for Apache Flink에서 로그 그룹 및 로그 스트림을 생성합니다. 이러한 리소스의 이름은 다음과 같습니다.  
로그 그룹: `/aws/kinesis-analytics/MyApplication`
로그 스트림: `kinesis-analytics-log-stream`
이 로그 스트림은 애플리케이션을 모니터링하는 데 사용됩니다. 이 로그 스트림은 애플리케이션이 결과를 전송하는 데 사용하는 로그 스트림과 다릅니다.

##### IAM 정책 편집
<a name="examples-python-s3-iam"></a>

IAM 정책을 편집하여 Kinesis Data Streams에 액세스할 수 있는 권한을 추가합니다.

1. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 여세요.

1. **정책**을 선택하세요. 이전 섹션에서 콘솔이 생성한 **`kinesis-analytics-service-MyApplication-us-west-2`** 정책을 선택합니다.

1. **요약** 페이지에서 **정책 편집**을 선택합니다. **JSON** 탭을 선택합니다.

1. 다음 정책 예제의 강조 표시된 부분을 정책에 추가하세요. 샘플 계정 ID(*012345678901*)를 내 계정 ID로 바꿉니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ReadCode",
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "logs:DescribeLogGroups",
                   "s3:GetObjectVersion"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:*",
                   "arn:aws:s3:::ka-app-code-<username>/myapp.zip"
               ]
           },
           {
               "Sid": "DescribeLogStreams",
               "Effect": "Allow",
               "Action": "logs:DescribeLogStreams",
               "Resource": "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:*"
           },
           {
               "Sid": "PutLogEvents",
               "Effect": "Allow",
               "Action": "logs:PutLogEvents",
               "Resource": "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:kinesis-analytics-log-stream"
           },
           {
               "Sid": "ListCloudwatchLogGroups",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogGroups"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:*"
               ]
           },
           {
               "Sid": "ReadInputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleInputStream"
           },
           {
               "Sid": "WriteObjects",
               "Effect": "Allow",
               "Action": [
                   "s3:Abort*",
                   "s3:DeleteObject*",
                   "s3:GetObject*",
                   "s3:GetBucket*",
                   "s3:List*",
                   "s3:ListBucket",
                   "s3:PutObject"
               ],
               "Resource": [
                   "arn:aws:s3:::ka-app-code-<username>",
                   "arn:aws:s3:::ka-app-code-<username>/*"
               ]
           }
       ]
   }
   ```

------

##### 애플리케이션을 실행합니다
<a name="examples-python-s3-run"></a>

애플리케이션을 실행하고 Apache Flink 대시보드를 연 다음 원하는 Flink 작업을 선택하면 Flink 작업 그래프를 볼 수 있습니다.

CloudWatch 콘솔에서 Managed Service for Apache Flink 지표를 확인하여 애플리케이션이 작동하는지 확인할 수 있습니다.

##### AWS 리소스 정리
<a name="examples-python-s3-cleanup"></a>

이 섹션에는 슬라이딩 윈도우 자습서에서 생성된 AWS 리소스를 정리하는 절차가 포함되어 있습니다.

**Topics**
+ [Managed Service for Apache Flink 애플리케이션 삭제](#examples-python-s3-cleanup-app)
+ [Kinesis 데이터 스트림 삭제](#examples-python-s3-cleanup-stream)
+ [Amazon S3 객체 및 버킷 삭제](#examples-python-s3-cleanup-s3)
+ [IAM 리소스 삭제](#examples-python-s3-cleanup-iam)
+ [CloudWatch 리소스 삭제](#examples-python-s3-cleanup-cw)

##### Managed Service for Apache Flink 애플리케이션 삭제
<a name="examples-python-s3-cleanup-app"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. Managed Service for Apache Flink 패널에서 **MyApplication**을 선택합니다.

1. 애플리케이션 페이지에서 **삭제**를 선택한 다음 삭제를 확인합니다.

##### Kinesis 데이터 스트림 삭제
<a name="examples-python-s3-cleanup-stream"></a>

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

1. Kinesis Data Streams 패널에서 **ExampleInputStream**을 선택합니다.

1. **ExampleInputStream** 페이지에서 **Kinesis 스트림 삭제**를 선택한 다음 삭제를 확인합니다.

##### Amazon S3 객체 및 버킷 삭제
<a name="examples-python-s3-cleanup-s3"></a>

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

1. **ka-app-code-*<username>* 버킷을 선택합니다.**

1. **삭제**를 선택한 후 버킷 이름을 입력하여 삭제를 확인합니다.

##### IAM 리소스 삭제
<a name="examples-python-s3-cleanup-iam"></a>

1. IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))을 엽니다.

1. 탐색 바에서 **정책**을 선택합니다.

1. 필터 컨트롤에서 **kinesis**를 입력합니다.

1. **kinesis-analytics-service-MyApplication-us-west-2** 정책을 선택합니다.

1. **정책 작업**을 선택한 후 **삭제**를 선택합니다.

1. 탐색 모음에서 **역할**을 선택합니다.

1. **kinesis-analytics-MyApplication-us-west-2** 역할을 선택합니다.

1. **역할 삭제**를 선택하고 삭제를 확인합니다.

##### CloudWatch 리소스 삭제
<a name="examples-python-s3-cleanup-cw"></a>

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

1. 탐색 바에서 **로그**를 선택합니다.

1. **/aws/kinesis-analytics/MyApplication** 로그 그룹을 선택합니다.

1. **로그 그룹 삭제**를 선택한 다음 삭제를 확인합니다.

### Scala 예제
<a name="examples-scala"></a>

다음 예제는 Apache Flink와 함께 Scala를 사용하여 애플리케이션을 만드는 방법을 보여줍니다.

**Topics**
+ [예: Scala에서 텀블링 윈도우 생성](#examples-tumbling-scala)
+ [예: Scala에서 슬라이딩 윈도우 생성](#examples-sliding-scala)
+ [예: 스트리밍 데이터를 Scala의 Amazon S3로 전송](#examples-s3sink-scala)

#### 예: Scala에서 텀블링 윈도우 생성
<a name="examples-tumbling-scala"></a>

**참고**  
현재 예제는 [Managed Service for Apache Flink 애플리케이션 생성 및 사용 예제](examples-collapsibles.md) 섹션을 참조하세요.

**참고**  
Flink 버전 1.15부터 Scala는 무료입니다. 이제 애플리케이션은 모든 Scala 버전에서 Java API를 사용할 수 있습니다. Flink는 여전히 내부적으로 몇 가지 주요 구성 요소에서 Scala를 사용하지만 사용자 코드 클래스 로더에 Scala를 노출하지는 않습니다. 따라서 사용자는 자신의 jar-acrchive에 Scala 종속성을 추가해야 합니다.  
Flink 1.15의 Scala 변경 사항에 대한 자세한 내용은 [Scala Free in One Fifteen](https://flink.apache.org/2022/02/22/scala-free.html)을 참조하세요.

이 연습에서는 Scala 3.2.0과 플링크의 Java DataStream API를 사용하는 간단한 스트리밍 애플리케이션을 만들어 보겠습니다. 애플리케이션은 Kinesis 스트림에서 데이터를 읽고, 슬라이딩 윈도우를 사용하여 데이터를 집계하고, 결과를 Kinesis 스트림에 기록합니다.

**참고**  
이 연습에 필수 사전 조건을 설정하려면 먼저 [시작하기(Scala)](https://docs.aws.amazon.com/managed-flink/latest/java/examples-gs-scala.html) 연습을 완료하세요.

**Topics**
+ [애플리케이션 코드 다운로드 및 검토](#examples-tumbling-scala-download)
+ [애플리케이션 코드 컴파일 및 업로드](#examples-tumbling-scala-upload)
+ [애플리케이션 생성 및 실행(콘솔)](#scala-7)
+ [애플리케이션 생성 및 실행(CLI)](#examples-tumbling-scala-create-run-cli)
+ [애플리케이션 코드 업데이트](#examples-tumbling-scala-update-app-code)
+ [AWS 리소스 정리](#examples-tumbling-scala-cleanup)

##### 애플리케이션 코드 다운로드 및 검토
<a name="examples-tumbling-scala-download"></a>

이 예제에 대한 Python 애플리케이션 코드는 GitHub에서 받을 수 있습니다. 애플리케이션 코드를 다운로드하려면 다음을 수행하세요.

1. 아직 설치하지 않았다면 Git 클라이언트를 설치합니다. 자세한 정보는 [Git 설치](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)를 참조하세요.

1. 다음 명령을 사용하여 원격 리포지토리를 복제합니다:

   ```
   git clone https://github.com/aws-samples/amazon-kinesis-data-analytics-examples.git
   ```

1. `amazon-kinesis-data-analytics-java-examples/scala/TumblingWindow` 디렉터리로 이동합니다.

애플리케이션 코드에 대해 다음을 유의하십시오:
+ `build.sbt` 파일에는 Managed Service for Apache Flink 라이브러리를 포함하여 애플리케이션의 구성 및 종속성에 대한 정보가 들어 있습니다.
+ `BasicStreamingJob.scala` 파일에는 애플리케이션의 기능을 정의하는 주요 메서드가 들어 있습니다.
+ 애플리케이션은 Kinesis 소스를 사용하여 소스 스트림에서 읽습니다. 다음 스니펫은 Kinesis 소스를 생성합니다.

  ```
  private def createSource: FlinkKinesisConsumer[String] = {
    val applicationProperties = KinesisAnalyticsRuntime.getApplicationProperties
    val inputProperties = applicationProperties.get("ConsumerConfigProperties")
  
    new FlinkKinesisConsumer[String](inputProperties.getProperty(streamNameKey, defaultInputStreamName),
      new SimpleStringSchema, inputProperties)
  }
  ```

  또한 애플리케이션은 Kinesis 싱크를 사용하여 결과 스트림에 기록합니다. 다음 조각은 Kinesis 싱크를 생성합니다.

  ```
  private def createSink: KinesisStreamsSink[String] = {
    val applicationProperties = KinesisAnalyticsRuntime.getApplicationProperties
    val outputProperties = applicationProperties.get("ProducerConfigProperties")
  
    KinesisStreamsSink.builder[String]
      .setKinesisClientProperties(outputProperties)
      .setSerializationSchema(new SimpleStringSchema)
      .setStreamName(outputProperties.getProperty(streamNameKey, defaultOutputStreamName))
      .setPartitionKeyGenerator((element: String) => String.valueOf(element.hashCode))
      .build
  }
  ```
+ 이 애플리케이션은 윈도우 연산자를 사용하여 5초 동안의 텀블링 윈도우에서 각 주식 기호에 대한 값의 개수를 찾습니다. 다음 코드는 연산자를 생성하고 집계된 데이터를 새로운 Kinesis Data Streams 싱크로 전송합니다.

  ```
  environment.addSource(createSource)
    .map { value =>
      val jsonNode = jsonParser.readValue(value, classOf[JsonNode])
      new Tuple2[String, Int](jsonNode.get("ticker").toString, 1)
    }
    .returns(Types.TUPLE(Types.STRING, Types.INT))
    .keyBy(v => v.f0) // Logically partition the stream for each ticker 
    .window(TumblingProcessingTimeWindows.of(Time.seconds(10)))
    .sum(1) // Sum the number of tickers per partition
    .map { value => value.f0 + "," + value.f1.toString + "\n" }
    .sinkTo(createSink)
  ```
+ 애플리케이션은 StreamExecutionEnvironment 객체를 사용하여 외부 리소스에 액세스하기 위한 소스 및 싱크 커넥터를 생성합니다.
+ 애플리케이션은 동적 애플리케이션 속성을 사용하여 소스 및 싱크 커넥터를 만듭니다. 런타임 애플리케이션의 속성을 읽어 커넥터를 구성합니다. 런타임 속성에 대한 자세한 내용은 [런타임 속성](https://docs.aws.amazon.com/managed-flink/latest/java/how-properties.html)을 참조하세요.

##### 애플리케이션 코드 컴파일 및 업로드
<a name="examples-tumbling-scala-upload"></a>

이 섹션에서는 애플리케이션 코드를 컴파일하여 Amazon S3 버킷에 업로드합니다.

**애플리케이션 코드 컴파일**

[SBT](https://www.scala-sbt.org/) 빌드 도구를 사용하여 애플리케이션용 Scala 코드를 빌드합니다. SBT를 설치하려면 [cs 설정으로 sbt 설치](https://www.scala-sbt.org/download.html)를 참조하십시오. 또한 Java Devopment Kit(JDK)를 설치해야 합니다. [연습 완료를 위한 사전 조건](https://docs.aws.amazon.com/managed-flink/latest/java/getting-started.html#setting-up-prerequisites)을 참조하세요.

1. 애플리케이션 코드를 사용하려면 이를 컴파일하고 JAR 파일로 패키징합니다. SBT를 사용하여 코드를 컴파일하고 패키징할 수 있습니다.

   ```
   sbt assembly
   ```

1. 애플리케이션이 성공적으로 컴파일되면 다음 파일이 생성됩니다:

   ```
   target/scala-3.2.0/tumbling-window-scala-1.0.jar
   ```

**Apache Flink 스트리밍 Scala 코드 업로드**

이 섹션에서는 Amazon S3 버킷을 만들고 애플리케이션 코드를 업로드합니다.

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

1. **버킷 만들기**를 선택합니다.

1. **버킷 명칭** 필드에 `ka-app-code-<username>`을 입력합니다. 버킷 명칭에 사용자 이름 등의 접미사를 추가하여 전역적으로 고유하게 만듭니다. **다음**을 선택합니다.

1. **옵션 구성** 단계에서 설정을 기본값 그대로 두고 **다음**을 선택합니다.

1. **권한 설정** 단계에서 설정을 기본값 그대로 두고 **다음**을 선택합니다.

1. **버킷 생성**을 선택합니다.

1. `ka-app-code-<username>` 버킷을 선택한 다음 **업로드**를 선택합니다.

1. **파일 선택** 단계에서 **파일 추가**를 선택합니다. 이전 단계에서 생성한 `tumbling-window-scala-1.0.jar` 파일로 이동합니다.

1. 개체 정보에 대한 설정은 변경할 필요가 없으므로 **업로드**를 선택합니다.

이제 애플리케이션 코드가 애플리케이션에서 액세스할 수 있는 Amazon S3 버킷에 저장됩니다.

##### 애플리케이션 생성 및 실행(콘솔)
<a name="scala-7"></a>

콘솔을 사용하여 애플리케이션을 생성, 구성, 업데이트 및 실행하려면 다음 단계를 수행하세요.

##### 애플리케이션 생성
<a name="scala-7-console-create"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. **Managed Service for Apache Flink 대시보드에서 분석 애플리케이션 생성을 선택합니다.**

1. **Managed Service for Apache Flink - 애플리케이션 생성** 페이지에서 다음과 같이 애플리케이션 세부 정보를 제공합니다.
   + **애플리케이션 명칭**에 **MyApplication**을 입력합니다.
   + **설명**에 **My Scala test app**를 입력합니다.
   + **런타임**에서 **Apache Flink**를 선택합니다.
   + 버전은 **Apache Flink 버전 1.15.2(권장 버전)**로 그대로 둡니다.

1. **액세스 권한**에서 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **애플리케이션 생성**을 선택합니다.

**참고**  
콘솔을 사용하여 Managed Service for Apache Flink 애플리케이션을 만들 때 내 애플리케이션에 대한 IAM 역할 및 정책을 둘 수 있는 옵션이 있습니다. 귀하의 애플리케이션은 이 역할 및 정책을 사용하여 종속 리소스에 액세스합니다. 이러한 IAM 리소스의 이름은 애플리케이션 명칭과 리전을 사용하여 다음과 같이 지정됩니다.  
정책: `kinesis-analytics-service-MyApplication-us-west-2`
역할: `kinesisanalytics-MyApplication-us-west-2`

##### 애플리케이션 구성
<a name="scala-7-console-configure"></a>

애플리케이션을 구성하려면 다음 절차를 사용합니다.

**애플리케이션을 구성하려면**

1. **MyApplication** 페이지에서 **구성**을 선택합니다.

1. **애플리케이션 구성** 페이지에서 **코드 위치**를 입력합니다.
   + **Amazon S3 버킷**의 경우 **ka-app-code-*<username>***를 입력합니다.
   + **Amazon S3 객체 경로**에는 **tumbling-window-scala-1.0.jar**를 입력합니다.

1. **애플리케이션 리소스에 대한 액세스** 아래에서 **액세스 권한**의 경우 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **속성**에서 **그룹 추가**를 선택합니다.

1. 다음을 입력합니다:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

   **저장**을 선택합니다.

1. **속성**에서 **그룹 추가**를 다시 선택합니다.

1. 다음을 입력합니다:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

1. **모니터링**에서 **지표 수준 모니터링**이 **애플리케이션**으로 설정되어 있는지 확인합니다.

1. **CloudWatch 로깅**에서 **활성화** 확인란을 선택합니다.

1. **업데이트**를 선택합니다.

**참고**  
Amazon CloudWatch 로깅을 활성화하도록 선택하면 Managed Service for Apache Flink에서 로그 그룹 및 로그 스트림을 생성합니다. 이러한 리소스의 이름은 다음과 같습니다.  
로그 그룹: `/aws/kinesis-analytics/MyApplication`
로그 스트림: `kinesis-analytics-log-stream`

##### IAM 정책 편집
<a name="scala-7-console-iam"></a>

IAM 정책을 편집하여 Amazon S3 버킷에 액세스할 수 있는 권한을 추가합니다.

**IAM 정책을 편집하여 S3 버킷 권한을 추가하려면**

1. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 여세요.

1. **정책**을 선택하세요. 이전 섹션에서 콘솔이 생성한 **`kinesis-analytics-service-MyApplication-us-west-2`** 정책을 선택합니다.

1. **요약** 페이지에서 **정책 편집**을 선택합니다. **JSON** 탭을 선택합니다.

1. 다음 정책 예제의 강조 표시된 부분을 정책에 추가하세요. 샘플 계정 ID(*012345678901*)를 내 계정 ID로 바꿉니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ReadCode",
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "s3:GetObjectVersion"
               ],
               "Resource": [
                   "arn:aws:s3:::ka-app-code-username/tumbling-window-scala-1.0.jar"
               ]
           },
           {
               "Sid": "DescribeLogGroups",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogGroups"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:*"
               ]
           },
           {
               "Sid": "DescribeLogStreams",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogStreams"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:*"
               ]
           },
           {
               "Sid": "PutLogEvents",
               "Effect": "Allow",
               "Action": [
                   "logs:PutLogEvents"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:kinesis-analytics-log-stream"
               ]
           },
           {
               "Sid": "ReadInputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleInputStream"
           },
           {
               "Sid": "WriteOutputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleOutputStream"
           }
       ]
   }
   ```

------

##### 애플리케이션을 실행합니다
<a name="scala-7-console-run"></a>

애플리케이션을 실행하고 Apache Flink 대시보드를 연 다음 원하는 Flink 작업을 선택하면 Flink 작업 그래프를 볼 수 있습니다.

##### 애플리케이션 중지
<a name="scala-7-console-stop"></a>

애플리케이션을 중지하려면 **MyApplication** 페이지에서 **중지**를 선택합니다. 작업을 확인합니다.

##### 애플리케이션 생성 및 실행(CLI)
<a name="examples-tumbling-scala-create-run-cli"></a>

이 섹션에서는 AWS Command Line Interface 를 사용하여 Managed Service for Apache Flink 애플리케이션을 생성하고 실행합니다. *kinesisanalyticsv2* AWS CLI 명령을 사용하여 Managed Service for Apache Flink 애플리케이션을 생성하고 상호 작용합니다.

##### 권한 정책 생성
<a name="examples-tumbling-scala-permissions"></a>

**참고**  
애플리케이션에 대한 권한 정책 및 역할을 생성해야 합니다. 이러한 IAM 리소스를 생성하지 않으면 애플리케이션은 해당 데이터 및 로그 스트림에 액세스할 수 없습니다.

먼저 소스 스트림의 읽기 작업에 대한 권한을 부여하는 설명과 싱크 스트림의 쓰기 작업에 대한 권한을 부여하는 설명 두 개를 사용하여 권한 정책을 만듭니다. 그런 다음 정책을 IAM 역할(다음 섹션에서 생성)에 연결합니다. 따라서 Managed Service for Apache Flink가 역할을 맡을 때 서비스는 소스 스트림에서 읽고 싱크 스트림에 쓸 수 있는 권한이 있습니다.

다음 코드를 사용하여 `AKReadSourceStreamWriteSinkStream` 권한 정책을 생성합니다. **username**을 애플리케이션 코드를 저장하기 위해 Amazon S3 버킷을 만들 때 사용한 사용자 이름으로 바꿉니다. Amazon 리소스 이름(ARN)의 계정 ID(**(012345678901)**)를 사용자의 계정 ID로 바꿉니다. **MF-stream-rw-role** 서비스 실행 역할은 고객별 역할에 맞게 조정되어야 합니다.

```
{
    "ApplicationName": "tumbling_window",
    "ApplicationDescription": "Scala tumbling window application",
    "RuntimeEnvironment": "FLINK-1_15",
    "ServiceExecutionRole": "arn:aws:iam::012345678901:role/MF-stream-rw-role",
    "ApplicationConfiguration": {
        "ApplicationCodeConfiguration": {
            "CodeContent": {
                "S3ContentLocation": {
                    "BucketARN": "arn:aws:s3:::ka-app-code-username",
                    "FileKey": "tumbling-window-scala-1.0.jar"
                }
            },
            "CodeContentType": "ZIPFILE"
        },
        "EnvironmentProperties":  { 
         "PropertyGroups": [ 
            { 
               "PropertyGroupId": "ConsumerConfigProperties",
               "PropertyMap" : {
                    "aws.region" : "us-west-2",
                    "stream.name" : "ExampleInputStream",
                    "flink.stream.initpos" : "LATEST"
               }
            },
            { 
               "PropertyGroupId": "ProducerConfigProperties",
               "PropertyMap" : {
                    "aws.region" : "us-west-2",
                    "stream.name" : "ExampleOutputStream"
               }
            }
         ]
      }
    },
    "CloudWatchLoggingOptions": [ 
      { 
         "LogStreamARN": "arn:aws:logs:us-west-2:012345678901:log-group:MyApplication:log-stream:kinesis-analytics-log-stream"
      }
   ]
}
```

권한 정책을 생성하는 단계별 지침은 *IAM 사용자 가이드*의 [IAM 자습서: 첫 번째 고객 관리형 정책 만들기 및 연결](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_managed-policies.html#part-two-create-policy)을 참조하세요.

##### IAM 역할 생성
<a name="examples-tumbling-scala-iam-policy"></a>

이 섹션에서는 Managed Service for Apache Flink 애플리케이션이 소스 스트림을 읽고 싱크 스트림에 쓰기 위해 맡을 수 있는 IAM 역할을 생성합니다.

Managed Service for Apache Flink는 권한 없이 스트림에 액세스할 수 없습니다. IAM 역할을 통해 이러한 권한을 부여합니다. 각 IAM 역할에는 두 가지 정책이 연결됩니다. 신뢰 정책은 Managed Service for Apache Flink가 역할을 취할 수 있는 권한을 부여하고, 권한 정책은 역할을 취한 후 Managed Service for Apache Flink에서 수행할 수 있는 작업을 결정합니다.

이전 섹션에서 생성한 권한 정책을 이 역할에 연결합니다.

**IAM 역할을 생성하려면**

1. IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))을 엽니다.

1. 탐색 창에서 **역할**을 선택한 후 **역할 생성**을 선택합니다.

1. **신뢰할 수 있는 유형의 자격 증명 선택**에서 **AWS 서비스**를 선택합니다.

1. **이 역할을 사용할 서비스 선택**에서 **Kinesis**를 선택합니다.

1. **사용 사례 선택에서** **Managed Service for Apache Flink를** 선택합니다.

1. **다음: 권한**을 선택합니다.

1. **권한 정책 연결** 페이지에서 **다음: 검토**를 선택합니다. 역할을 생성한 후에 권한 정책을 연결합니다.

1. **역할 생성** 페이지에서 **역할 이름**으로 **MF-stream-rw-role**을 입력합니다. **역할 생성**을 선택합니다.

    `MF-stream-rw-role`이라는 새 IAM 역할이 생성되었습니다. 그런 다음 역할의 신뢰 정책 및 권한 정책을 업데이트합니다.

1. 역할에 권한 정책을 연결합니다.
**참고**  
이 연습에서는 Managed Service for Apache Flink가 이 역할을 취하여 Kinesis 데이터 스트림(소스)에서 데이터를 읽고 출력을 다른 Kinesis 데이터 스트림에 씁니다. 따라서 이전 단계인 [권한 정책 생성](https://docs.aws.amazon.com/managed-flink/latest/java/get-started-exercise.html#get-started-exercise-7-cli-policy)에서 만든 정책을 연결합니다.

   1. **요약** 페이지에서 **권한** 탭을 선택합니다.

   1. **정책 연결**을 선택합니다.

   1. 검색 상자에 **AKReadSourceStreamWriteSinkStream**(이전 섹션에서 생성한 정책)을 입력합니다.

   1. `AKReadSourceStreamWriteSinkStream` 정책을 선택한 후 **정책 연결**을 선택합니다.

이제 애플리케이션이 리소스에 액세스하는 데 사용하는 서비스 실행 역할이 생성되었습니다. 새 역할의 ARN을 기록합니다.

역할 생성에 대한 단계별 지침은 *IAM 사용 설명서*의 [IAM 역할 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html#roles-creatingrole-user-console)을 참조하세요.

##### 애플리케이션 생성
<a name="examples-tumbling-scala-create-application-cli"></a>

다음 JSON 코드를 `create_request.json`이라는 파일에 저장합니다. 샘플 역할 ARN을 이전에 생성한 역할을 위한 ARN으로 바꿉니다. 버킷 ARN 접미사(사용자 이름)를 이전 섹션에서 선택한 접미사로 바꿉니다. 서비스 실행 역할의 샘플 계정 ID(012345678901)를 사용자 계정 ID로 바꿉니다. `ServiceExecutionRole`에는 이전 섹션에서 만든 IAM 사용자 역할이 포함되어야 합니다.

```
"ApplicationName": "tumbling_window",
    "ApplicationDescription": "Scala getting started application",
    "RuntimeEnvironment": "FLINK-1_15",
    "ServiceExecutionRole": "arn:aws:iam::012345678901:role/MF-stream-rw-role",
    "ApplicationConfiguration": {
        "ApplicationCodeConfiguration": {
            "CodeContent": {
                "S3ContentLocation": {
                    "BucketARN": "arn:aws:s3:::ka-app-code-username",
                    "FileKey": "tumbling-window-scala-1.0.jar"
                }
            },
            "CodeContentType": "ZIPFILE"
        },
        "EnvironmentProperties":  { 
         "PropertyGroups": [ 
            { 
               "PropertyGroupId": "ConsumerConfigProperties",
               "PropertyMap" : {
                    "aws.region" : "us-west-2",
                    "stream.name" : "ExampleInputStream",
                    "flink.stream.initpos" : "LATEST"
               }
            },
            { 
               "PropertyGroupId": "ProducerConfigProperties",
               "PropertyMap" : {
                    "aws.region" : "us-west-2",
                    "stream.name" : "ExampleOutputStream"
               }
            }
         ]
      }
    },
    "CloudWatchLoggingOptions": [ 
      { 
         "LogStreamARN": "arn:aws:logs:us-west-2:012345678901:log-group:MyApplication:log-stream:kinesis-analytics-log-stream"
      }
   ]
}
```

다음 요청과 함께 [CreateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_CreateApplication.html)을 실행하여 애플리케이션을 생성합니다.

```
aws kinesisanalyticsv2 create-application --cli-input-json file://create_request.json
```

애플리케이션이 생성되었습니다. 다음 단계에서는 애플리케이션을 시작합니다.

##### 애플리케이션 시작
<a name="examples-tumbling-scala-start"></a>

이 섹션에서는 [StartApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_StartApplication.html) 작업을 사용하여 애플리케이션을 시작합니다.

**애플리케이션을 시작하려면**

1. 다음 JSON 코드를 `start_request.json`이라는 파일에 저장합니다.

   ```
   {
       "ApplicationName": "tumbling_window",
       "RunConfiguration": {
           "ApplicationRestoreConfiguration": { 
            "ApplicationRestoreType": "RESTORE_FROM_LATEST_SNAPSHOT"
            }
       }
   }
   ```

1. 위의 요청과 함께 `StartApplication` 작업을 실행하여 애플리케이션을 시작합니다.

   ```
   aws kinesisanalyticsv2 start-application --cli-input-json file://start_request.json
   ```

애플리케이션이 실행됩니다. Amazon CloudWatch 콘솔에서 Managed Service for Apache Flink 지표를 확인하여 애플리케이션이 작동하는지 확인할 수 있습니다.

##### 애플리케이션 중지
<a name="examples-tumbling-scala-stop"></a>

이 섹션에서는 [StopApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_StopApplication.html) 작업을 사용하여 애플리케이션을 중지합니다.

**애플리케이션을 중지하려면**

1. 다음 JSON 코드를 `stop_request.json`이라는 파일에 저장합니다.

   ```
   {
      "ApplicationName": "tumbling_window"
   }
   ```

1. 위의 요청과 함께 `StopApplication` 작업을 실행하여 애플리케이션을 중지합니다.

   ```
   aws kinesisanalyticsv2 stop-application --cli-input-json file://stop_request.json
   ```

애플리케이션이 중지됩니다.

##### CloudWatch 로깅 옵션 추가
<a name="examples-tumbling-scala-cw-option"></a>

 AWS CLI 를 사용하여 애플리케이션에 Amazon CloudWatch 로그 스트림을 추가할 수 있습니다. 애플리케이션에서 CloudWatch Logs를 사용하는 방법에 대한 자세한 내용은 [애플리케이션 로깅 설정](https://docs.aws.amazon.com/managed-flink/latest/java/cloudwatch-logs.html)을 참조하세요.

##### 환경 속성 업데이트
<a name="examples-tumbling-scala-update-environment-properties"></a>

이 섹션에서는 [UpdateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_UpdateApplication.html) 작업을 사용하여 애플리케이션 코드를 다시 컴파일하지 않고도 애플리케이션의 환경 속성을 변경할 수 있습니다. 이 예제에서는 원본 스트림과 대상 스트림의 리전을 변경합니다.

**애플리케이션의 환경 속성 업데이트**

1. 다음 JSON 코드를 `update_properties_request.json`이라는 파일에 저장합니다.

   ```
   {"ApplicationName": "tumbling_window",
      "CurrentApplicationVersionId": 1,
      "ApplicationConfigurationUpdate": { 
         "EnvironmentPropertyUpdates": { 
            "PropertyGroups": [ 
               { 
                  "PropertyGroupId": "ConsumerConfigProperties",
                  "PropertyMap" : {
                       "aws.region" : "us-west-2",
                       "stream.name" : "ExampleInputStream",
                       "flink.stream.initpos" : "LATEST"
                  }
               },
               { 
                  "PropertyGroupId": "ProducerConfigProperties",
                  "PropertyMap" : {
                       "aws.region" : "us-west-2",
                       "stream.name" : "ExampleOutputStream"
                  }
               }
            ]
         }
      }
   }
   ```

1. 이전 요청과 함께 `UpdateApplication` 작업을 실행하여 환경 속성을 업데이트하십시오.

   ```
   aws kinesisanalyticsv2 update-application --cli-input-json file://update_properties_request.json
   ```

##### 애플리케이션 코드 업데이트
<a name="examples-tumbling-scala-update-app-code"></a>

새 버전의 코드 패키지로 애플리케이션 코드를 업데이트해야 하는 경우 [UpdateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_UpdateApplication.html) CLI 작업을 사용합니다.

**참고**  
파일 이름이 같은 새 버전의 애플리케이션 코드를 로드하려면 새 객체 버전을 지정해야 합니다. Amazon S3 객체 버전 사용에 대한 자세한 내용을 알아보려면 [버전 관리 활성화 또는 비활성화](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/enable-versioning.html)를 참조하세요.

를 사용하려면 Amazon S3 버킷에서 이전 코드 패키지를 AWS CLI삭제하고 새 버전을 업로드한 다음 `UpdateApplication`를 호출하여 동일한 Amazon S3 버킷 및 객체 이름과 새 객체 버전을 지정합니다. 애플리케이션이 새 코드 패키지로 다시 시작됩니다.

다음 예 `UpdateApplication` 작업 요청은 애플리케이션 코드를 다시 로드하고 애플리케이션을 다시 시작합니다. `CurrentApplicationVersionId`를 현재 애플리케이션 버전으로 업데이트하세요. `ListApplications` 또는 `DescribeApplication` 작업을 사용하여 현재 애플리케이션 버전을 확인할 수 있습니다. 버킷 명칭 접미사(<username>)를 [종속 리소스 생성](examples-gs-scala.md#examples-gs-scala-resources) 섹션에서 선택한 접미사로 업데이트합니다.

```
{
    "ApplicationName": "tumbling_window",
    "CurrentApplicationVersionId": 1,
    "ApplicationConfigurationUpdate": {
        "ApplicationCodeConfigurationUpdate": {
            "CodeContentUpdate": {
                "S3ContentLocationUpdate": {
                    "BucketARNUpdate": "arn:aws:s3:::ka-app-code-username",
                    "FileKeyUpdate": "tumbling-window-scala-1.0.jar",
                    "ObjectVersionUpdate": "SAMPLEUehYngP87ex1nzYIGYgfhypvDU"
                }
            }
        }
    }
}
```

##### AWS 리소스 정리
<a name="examples-tumbling-scala-cleanup"></a>

이 단원에는 텀블링 윈도우 자습서에서 생성된 AWS 리소스를 정리하는 절차가 포함되어 있습니다.

**Topics**
+ [Managed Service for Apache Flink 애플리케이션 삭제](#examples-tumbling-scala-cleanup-app)
+ [Kinesis 데이터 스트림 삭제](#examples-tumbling-scala-cleanup-stream)
+ [Amazon S3 객체 및 버킷 삭제](#examples-tumbling-scala-cleanup-s3)
+ [IAM 리소스 삭제](#examples-tumbling-scala-cleanup-iam)
+ [CloudWatch 리소스 삭제](#examples-tumbling-scala-cleanup-cw)

##### Managed Service for Apache Flink 애플리케이션 삭제
<a name="examples-tumbling-scala-cleanup-app"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. Managed Service for Apache Flink 패널에서 **MyApplication**을 선택합니다.

1. 애플리케이션 페이지에서 **삭제**를 선택한 다음 삭제를 확인합니다.

##### Kinesis 데이터 스트림 삭제
<a name="examples-tumbling-scala-cleanup-stream"></a>

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

1. Kinesis Data Streams 패널에서 **ExampleInputStream**을 선택합니다.

1. **ExampleInputStream** 페이지에서 **Kinesis 스트림 삭제**를 선택한 다음 삭제를 확인합니다.

1. **Kinesis 스트림** 페이지에서 **ExampleOutputStream**을 선택하고, **작업**을 선택하고, **삭제**를 선택한 다음 삭제 여부를 확인합니다.

##### Amazon S3 객체 및 버킷 삭제
<a name="examples-tumbling-scala-cleanup-s3"></a>

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

1. **ka-app-code-*<username>* 버킷을 선택합니다.**

1. **삭제**를 선택한 후 버킷 이름을 입력하여 삭제를 확인합니다.

##### IAM 리소스 삭제
<a name="examples-tumbling-scala-cleanup-iam"></a>

1. IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))을 엽니다.

1. 탐색 바에서 **정책**을 선택합니다.

1. 필터 컨트롤에서 **kinesis**를 입력합니다.

1. **kinesis-analytics-service-MyApplication-us-west-2** 정책을 선택합니다.

1. **정책 작업**을 선택한 후 **삭제**를 선택합니다.

1. 탐색 모음에서 **역할**을 선택합니다.

1. **kinesis-analytics-MyApplication-us-west-2** 역할을 선택합니다.

1. **역할 삭제**를 선택하고 삭제를 확인합니다.

##### CloudWatch 리소스 삭제
<a name="examples-tumbling-scala-cleanup-cw"></a>

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

1. 탐색 바에서 **로그**를 선택합니다.

1. **/aws/kinesis-analytics/MyApplication** 로그 그룹을 선택합니다.

1. **로그 그룹 삭제**를 선택한 다음 삭제를 확인합니다.

#### 예: Scala에서 슬라이딩 윈도우 생성
<a name="examples-sliding-scala"></a>

**참고**  
현재 예제는 [Managed Service for Apache Flink 애플리케이션 생성 및 사용 예제](examples-collapsibles.md) 섹션을 참조하세요.

**참고**  
Flink 버전 1.15부터 Scala는 무료입니다. 이제 애플리케이션은 모든 Scala 버전에서 Java API를 사용할 수 있습니다. Flink는 여전히 내부적으로 몇 가지 주요 구성 요소에서 Scala를 사용하지만 사용자 코드 클래스 로더에 Scala를 노출하지는 않습니다. 따라서 사용자는 자신의 jar-acrchive에 Scala 종속성을 추가해야 합니다.  
Flink 1.15의 Scala 변경 사항에 대한 자세한 내용은 [Scala Free in One Fifteen](https://flink.apache.org/2022/02/22/scala-free.html)을 참조하세요.

이 연습에서는 Scala 3.2.0과 플링크의 Java DataStream API를 사용하는 간단한 스트리밍 애플리케이션을 만들어 보겠습니다. 애플리케이션은 Kinesis 스트림에서 데이터를 읽고, 슬라이딩 윈도우를 사용하여 데이터를 집계하고, 결과를 Kinesis 스트림에 기록합니다.

**참고**  
이 연습에 필수 사전 조건을 설정하려면 먼저 [시작하기(Scala)](https://docs.aws.amazon.com/managed-flink/latest/java/examples-gs-scala.html) 연습을 완료하세요.

**Topics**
+ [애플리케이션 코드 다운로드 및 검토](#examples-sliding-scala-download)
+ [애플리케이션 코드 컴파일 및 업로드](#examples-sliding-scala-upload)
+ [애플리케이션 생성 및 실행(콘솔)](#scala-7)
+ [애플리케이션 생성 및 실행(CLI)](#examples-sliding-scala-create-run-cli)
+ [애플리케이션 코드 업데이트](#examples-sliding-scala-update-app-code)
+ [AWS 리소스 정리](#examples-sliding-scala-cleanup)

##### 애플리케이션 코드 다운로드 및 검토
<a name="examples-sliding-scala-download"></a>

이 예제에 대한 Python 애플리케이션 코드는 GitHub에서 받을 수 있습니다. 애플리케이션 코드를 다운로드하려면 다음을 수행하세요.

1. 아직 설치하지 않았다면 Git 클라이언트를 설치합니다. 자세한 정보는 [Git 설치](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)를 참조하세요.

1. 다음 명령을 사용하여 원격 리포지토리를 복제합니다:

   ```
   git clone https://github.com/aws-samples/amazon-kinesis-data-analytics-examples.git
   ```

1. `amazon-kinesis-data-analytics-java-examples/scala/SlidingWindow` 디렉터리로 이동합니다.

애플리케이션 코드에 대해 다음을 유의하십시오:
+ `build.sbt` 파일에는 Managed Service for Apache Flink 라이브러리를 포함하여 애플리케이션의 구성 및 종속성에 대한 정보가 들어 있습니다.
+ `BasicStreamingJob.scala` 파일에는 애플리케이션의 기능을 정의하는 주요 메서드가 들어 있습니다.
+ 애플리케이션은 Kinesis 소스를 사용하여 소스 스트림에서 읽습니다. 다음 스니펫은 Kinesis 소스를 생성합니다.

  ```
  private def createSource: FlinkKinesisConsumer[String] = {
    val applicationProperties = KinesisAnalyticsRuntime.getApplicationProperties
    val inputProperties = applicationProperties.get("ConsumerConfigProperties")
  
    new FlinkKinesisConsumer[String](inputProperties.getProperty(streamNameKey, defaultInputStreamName),
      new SimpleStringSchema, inputProperties)
  }
  ```

  또한 애플리케이션은 Kinesis 싱크를 사용하여 결과 스트림에 기록합니다. 다음 조각은 Kinesis 싱크를 생성합니다.

  ```
  private def createSink: KinesisStreamsSink[String] = {
    val applicationProperties = KinesisAnalyticsRuntime.getApplicationProperties
    val outputProperties = applicationProperties.get("ProducerConfigProperties")
  
    KinesisStreamsSink.builder[String]
      .setKinesisClientProperties(outputProperties)
      .setSerializationSchema(new SimpleStringSchema)
      .setStreamName(outputProperties.getProperty(streamNameKey, defaultOutputStreamName))
      .setPartitionKeyGenerator((element: String) => String.valueOf(element.hashCode))
      .build
  }
  ```
+ 애플리케이션은 창 연산자를 사용하여 5초씩 미끄러지는 10초 동안 각 주식 종목의 값 수를 찾습니다. 다음 코드는 연산자를 생성하고 집계된 데이터를 새로운 Kinesis Data Streams 싱크로 전송합니다.

  ```
  environment.addSource(createSource)
      .map { value =>
        val jsonNode = jsonParser.readValue(value, classOf[JsonNode])
        new Tuple2[String, Double](jsonNode.get("ticker").toString, jsonNode.get("price").asDouble)
      }
      .returns(Types.TUPLE(Types.STRING, Types.DOUBLE))
      .keyBy(v => v.f0) // Logically partition the stream for each word
      .window(SlidingProcessingTimeWindows.of(Time.seconds(10), Time.seconds(5)))
      .min(1) // Calculate minimum price per ticker over the window
      .map { value => value.f0 + String.format(",%.2f", value.f1) + "\n" }
      .sinkTo(createSink)
  ```
+ 애플리케이션은 StreamExecutionEnvironment 객체를 사용하여 외부 리소스에 액세스하기 위한 소스 및 싱크 커넥터를 생성합니다.
+ 애플리케이션은 동적 애플리케이션 속성을 사용하여 소스 및 싱크 커넥터를 만듭니다. 런타임 애플리케이션의 속성을 읽어 커넥터를 구성합니다. 런타임 속성에 대한 자세한 내용은 [런타임 속성](https://docs.aws.amazon.com/managed-flink/latest/java/how-properties.html)을 참조하세요.

##### 애플리케이션 코드 컴파일 및 업로드
<a name="examples-sliding-scala-upload"></a>

이 섹션에서는 애플리케이션 코드를 컴파일하여 Amazon S3 버킷에 업로드합니다.

**애플리케이션 코드 컴파일**

[SBT](https://www.scala-sbt.org/) 빌드 도구를 사용하여 애플리케이션용 Scala 코드를 빌드합니다. SBT를 설치하려면 [cs 설정으로 sbt 설치](https://www.scala-sbt.org/download.html)를 참조하십시오. 또한 Java Devopment Kit(JDK)를 설치해야 합니다. [연습 완료를 위한 사전 조건](https://docs.aws.amazon.com/managed-flink/latest/java/getting-started.html#setting-up-prerequisites)을 참조하세요.

1. 애플리케이션 코드를 사용하려면 이를 컴파일하고 JAR 파일로 패키징합니다. SBT를 사용하여 코드를 컴파일하고 패키징할 수 있습니다.

   ```
   sbt assembly
   ```

1. 애플리케이션이 성공적으로 컴파일되면 다음 파일이 생성됩니다:

   ```
   target/scala-3.2.0/sliding-window-scala-1.0.jar
   ```

**Apache Flink 스트리밍 Scala 코드 업로드**

이 섹션에서는 Amazon S3 버킷을 만들고 애플리케이션 코드를 업로드합니다.

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

1. **버킷 만들기**를 선택합니다.

1. **버킷 명칭** 필드에 `ka-app-code-<username>`을 입력합니다. 버킷 명칭에 사용자 이름 등의 접미사를 추가하여 전역적으로 고유하게 만듭니다. **다음**을 선택합니다.

1. **옵션 구성** 단계에서 설정을 기본값 그대로 두고 **다음**을 선택합니다.

1. **권한 설정** 단계에서 설정을 기본값 그대로 두고 **다음**을 선택합니다.

1. **버킷 생성**을 선택합니다.

1. `ka-app-code-<username>` 버킷을 선택한 다음 **업로드**를 선택합니다.

1. **파일 선택** 단계에서 **파일 추가**를 선택합니다. 이전 단계에서 생성한 `sliding-window-scala-1.0.jar` 파일로 이동합니다.

1. 개체 정보에 대한 설정은 변경할 필요가 없으므로 **업로드**를 선택합니다.

이제 애플리케이션 코드가 애플리케이션에서 액세스할 수 있는 Amazon S3 버킷에 저장됩니다.

##### 애플리케이션 생성 및 실행(콘솔)
<a name="scala-7"></a>

콘솔을 사용하여 애플리케이션을 생성, 구성, 업데이트 및 실행하려면 다음 단계를 수행하세요.

##### 애플리케이션 생성
<a name="scala-7-console-create"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. **Managed Service for Apache Flink 대시보드에서 분석 애플리케이션 생성을 선택합니다.**

1. **Managed Service for Apache Flink - 애플리케이션 생성** 페이지에서 다음과 같이 애플리케이션 세부 정보를 제공합니다.
   + **애플리케이션 명칭**에 **MyApplication**을 입력합니다.
   + **설명**에 **My Scala test app**를 입력합니다.
   + **런타임**에서 **Apache Flink**를 선택합니다.
   + 버전은 **Apache Flink 버전 1.15.2(권장 버전)**로 그대로 둡니다.

1. **액세스 권한**에서 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **애플리케이션 생성**을 선택합니다.

**참고**  
콘솔을 사용하여 Managed Service for Apache Flink 애플리케이션을 만들 때 내 애플리케이션에 대한 IAM 역할 및 정책을 둘 수 있는 옵션이 있습니다. 귀하의 애플리케이션은 이 역할 및 정책을 사용하여 종속 리소스에 액세스합니다. 이러한 IAM 리소스의 이름은 애플리케이션 명칭과 리전을 사용하여 다음과 같이 지정됩니다.  
정책: `kinesis-analytics-service-MyApplication-us-west-2`
역할: `kinesisanalytics-MyApplication-us-west-2`

##### 애플리케이션 구성
<a name="scala-7-console-configure"></a>

애플리케이션을 구성하려면 다음 절차를 사용합니다.

**애플리케이션을 구성하려면**

1. **MyApplication** 페이지에서 **구성**을 선택합니다.

1. **애플리케이션 구성** 페이지에서 **코드 위치**를 입력합니다.
   + **Amazon S3 버킷**의 경우 **ka-app-code-*<username>***를 입력합니다.
   + **Amazon S3 객체 경로**에는 **sliding-window-scala-1.0.jar.**를 입력합니다.

1. **애플리케이션 리소스에 대한 액세스** 아래에서 **액세스 권한**의 경우 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **속성**에서 **그룹 추가**를 선택합니다.

1. 다음을 입력합니다:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

   **저장**을 선택합니다.

1. **속성**에서 **그룹 추가**를 다시 선택합니다.

1. 다음을 입력합니다:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

1. **모니터링**에서 **지표 수준 모니터링**이 **애플리케이션**으로 설정되어 있는지 확인합니다.

1. **CloudWatch 로깅**에서 **활성화** 확인란을 선택합니다.

1. **업데이트**를 선택합니다.

**참고**  
Amazon CloudWatch 로깅을 활성화하도록 선택하면 Managed Service for Apache Flink에서 로그 그룹 및 로그 스트림을 생성합니다. 이러한 리소스의 이름은 다음과 같습니다.  
로그 그룹: `/aws/kinesis-analytics/MyApplication`
로그 스트림: `kinesis-analytics-log-stream`

##### IAM 정책 편집
<a name="scala-7-console-iam"></a>

IAM 정책을 편집하여 Amazon S3 버킷에 액세스할 수 있는 권한을 추가합니다.

**IAM 정책을 편집하여 S3 버킷 권한을 추가하려면**

1. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 여세요.

1. **정책**을 선택하세요. 이전 섹션에서 콘솔이 생성한 **`kinesis-analytics-service-MyApplication-us-west-2`** 정책을 선택합니다.

1. **요약** 페이지에서 **정책 편집**을 선택합니다. **JSON** 탭을 선택합니다.

1. 다음 정책 예제의 강조 표시된 부분을 정책에 추가하세요. 샘플 계정 ID(*012345678901*)를 내 계정 ID로 바꿉니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ReadCode",
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "s3:GetObjectVersion"
               ],
               "Resource": [
                   "arn:aws:s3:::ka-app-code-username/sliding-window-scala-1.0.jar"
               ]
           },
           {
               "Sid": "DescribeLogGroups",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogGroups"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:*"
               ]
           },
           {
               "Sid": "DescribeLogStreams",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogStreams"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:*"
               ]
           },
           {
               "Sid": "PutLogEvents",
               "Effect": "Allow",
               "Action": [
                   "logs:PutLogEvents"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:kinesis-analytics-log-stream"
               ]
           },
           {
               "Sid": "ReadInputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleInputStream"
           },
           {
               "Sid": "WriteOutputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleOutputStream"
           }
       ]
   }
   ```

------

##### 애플리케이션을 실행합니다
<a name="scala-7-console-run"></a>

애플리케이션을 실행하고 Apache Flink 대시보드를 연 다음 원하는 Flink 작업을 선택하면 Flink 작업 그래프를 볼 수 있습니다.

##### 애플리케이션 중지
<a name="scala-7-console-stop"></a>

애플리케이션을 중지하려면 **MyApplication** 페이지에서 **중지**를 선택합니다. 작업을 확인합니다.

##### 애플리케이션 생성 및 실행(CLI)
<a name="examples-sliding-scala-create-run-cli"></a>

이 섹션에서는 AWS Command Line Interface 를 사용하여 Managed Service for Apache Flink 애플리케이션을 생성하고 실행합니다. *kinesisanalyticsv2* AWS CLI 명령을 사용하여 Managed Service for Apache Flink 애플리케이션을 생성하고 상호 작용합니다.

##### 권한 정책 생성
<a name="examples-sliding-scala-permissions"></a>

**참고**  
애플리케이션에 대한 권한 정책 및 역할을 생성해야 합니다. 이러한 IAM 리소스를 생성하지 않으면 애플리케이션은 해당 데이터 및 로그 스트림에 액세스할 수 없습니다.

먼저 소스 스트림의 읽기 작업에 대한 권한을 부여하는 설명과 싱크 스트림의 쓰기 작업에 대한 권한을 부여하는 설명 두 개를 사용하여 권한 정책을 만듭니다. 그런 다음 정책을 IAM 역할(다음 섹션에서 생성)에 연결합니다. 따라서 Managed Service for Apache Flink가 역할을 맡을 때 서비스는 소스 스트림에서 읽고 싱크 스트림에 쓸 수 있는 권한이 있습니다.

다음 코드를 사용하여 `AKReadSourceStreamWriteSinkStream` 권한 정책을 생성합니다. **username**을 애플리케이션 코드를 저장하기 위해 Amazon S3 버킷을 만들 때 사용한 사용자 이름으로 바꿉니다. Amazon 리소스 이름(ARN)의 계정 ID(**(012345678901)**)를 사용자의 계정 ID로 바꿉니다.

```
{
    "ApplicationName": "sliding_window",
    "ApplicationDescription": "Scala sliding window application",
    "RuntimeEnvironment": "FLINK-1_15",
    "ServiceExecutionRole": "arn:aws:iam::012345678901:role/MF-stream-rw-role",
    "ApplicationConfiguration": {
        "ApplicationCodeConfiguration": {
            "CodeContent": {
                "S3ContentLocation": {
                    "BucketARN": "arn:aws:s3:::ka-app-code-username",
                    "FileKey": "sliding-window-scala-1.0.jar"
                }
            },
            "CodeContentType": "ZIPFILE"
        },
        "EnvironmentProperties":  { 
         "PropertyGroups": [ 
            { 
               "PropertyGroupId": "ConsumerConfigProperties",
               "PropertyMap" : {
                    "aws.region" : "us-west-2",
                    "stream.name" : "ExampleInputStream",
                    "flink.stream.initpos" : "LATEST"
               }
            },
            { 
               "PropertyGroupId": "ProducerConfigProperties",
               "PropertyMap" : {
                    "aws.region" : "us-west-2",
                    "stream.name" : "ExampleOutputStream"
               }
            }
         ]
      }
    },
    "CloudWatchLoggingOptions": [ 
      { 
         "LogStreamARN": "arn:aws:logs:us-west-2:012345678901:log-group:MyApplication:log-stream:kinesis-analytics-log-stream"
      }
   ]
}
```

권한 정책을 생성하는 단계별 지침은 *IAM 사용자 가이드*의 [IAM 자습서: 첫 번째 고객 관리형 정책 만들기 및 연결](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_managed-policies.html#part-two-create-policy)을 참조하세요.

##### IAM 역할 생성
<a name="examples-sliding-scala-iam-policy"></a>

이 섹션에서는 Managed Service for Apache Flink 애플리케이션이 소스 스트림을 읽고 싱크 스트림에 쓰기 위해 맡을 수 있는 IAM 역할을 생성합니다.

Managed Service for Apache Flink는 권한 없이 스트림에 액세스할 수 없습니다. IAM 역할을 통해 이러한 권한을 부여합니다. 각 IAM 역할에는 두 가지 정책이 연결됩니다. 신뢰 정책은 Managed Service for Apache Flink가 역할을 취할 수 있는 권한을 부여하고, 권한 정책은 역할을 취한 후 Managed Service for Apache Flink에서 수행할 수 있는 작업을 결정합니다.

이전 섹션에서 생성한 권한 정책을 이 역할에 연결합니다.

**IAM 역할을 생성하려면**

1. IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))을 엽니다.

1. 탐색 창에서 **역할**을 선택한 후 **역할 생성**을 선택합니다.

1. **신뢰할 수 있는 유형의 자격 증명 선택**에서 **AWS 서비스**를 선택합니다.

1. **이 역할을 사용할 서비스 선택**에서 **Kinesis**를 선택합니다.

1. **사용 사례 선택에서** **Managed Service for Apache Flink를** 선택합니다.

1. **다음: 권한**을 선택합니다.

1. **권한 정책 연결** 페이지에서 **다음: 검토**를 선택합니다. 역할을 생성한 후에 권한 정책을 연결합니다.

1. **역할 생성** 페이지에서 **역할 이름**으로 **MF-stream-rw-role**을 입력합니다. **역할 생성**을 선택합니다.

    `MF-stream-rw-role`이라는 새 IAM 역할이 생성되었습니다. 그런 다음 역할의 신뢰 정책 및 권한 정책을 업데이트합니다.

1. 역할에 권한 정책을 연결합니다.
**참고**  
이 연습에서는 Managed Service for Apache Flink가 이 역할을 취하여 Kinesis 데이터 스트림(소스)에서 데이터를 읽고 출력을 다른 Kinesis 데이터 스트림에 씁니다. 따라서 이전 단계인 [권한 정책 생성](https://docs.aws.amazon.com/managed-flink/latest/java/get-started-exercise.html#get-started-exercise-7-cli-policy)에서 만든 정책을 연결합니다.

   1. **요약** 페이지에서 **권한** 탭을 선택합니다.

   1. **정책 연결**을 선택합니다.

   1. 검색 상자에 **AKReadSourceStreamWriteSinkStream**(이전 섹션에서 생성한 정책)을 입력합니다.

   1. `AKReadSourceStreamWriteSinkStream` 정책을 선택한 후 **정책 연결**을 선택합니다.

이제 애플리케이션이 리소스에 액세스하는 데 사용하는 서비스 실행 역할이 생성되었습니다. 새 역할의 ARN을 기록합니다.

역할 생성에 대한 단계별 지침은 *IAM 사용 설명서*의 [IAM 역할 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html#roles-creatingrole-user-console)을 참조하세요.

##### 애플리케이션 생성
<a name="examples-sliding-scala-create-application-cli"></a>

다음 JSON 코드를 `create_request.json`이라는 파일에 저장합니다. 샘플 역할 ARN을 이전에 생성한 역할을 위한 ARN으로 바꿉니다. 버킷 ARN 접미사(사용자 이름)를 이전 섹션에서 선택한 접미사로 바꿉니다. 서비스 실행 역할의 샘플 계정 ID(012345678901)를 사용자 계정 ID로 바꿉니다.

```
{
    "ApplicationName": "sliding_window",
    "ApplicationDescription": "Scala sliding_window application",
    "RuntimeEnvironment": "FLINK-1_15",
    "ServiceExecutionRole": "arn:aws:iam::012345678901:role/MF-stream-rw-role",
    "ApplicationConfiguration": {
        "ApplicationCodeConfiguration": {
            "CodeContent": {
                "S3ContentLocation": {
                    "BucketARN": "arn:aws:s3:::ka-app-code-username",
                    "FileKey": "sliding-window-scala-1.0.jar"
                }
            },
            "CodeContentType": "ZIPFILE"
        },
        "EnvironmentProperties":  { 
         "PropertyGroups": [ 
            { 
               "PropertyGroupId": "ConsumerConfigProperties",
               "PropertyMap" : {
                    "aws.region" : "us-west-2",
                    "stream.name" : "ExampleInputStream",
                    "flink.stream.initpos" : "LATEST"
               }
            },
            { 
               "PropertyGroupId": "ProducerConfigProperties",
               "PropertyMap" : {
                    "aws.region" : "us-west-2",
                    "stream.name" : "ExampleOutputStream"
               }
            }
         ]
      }
    },
    "CloudWatchLoggingOptions": [ 
      { 
         "LogStreamARN": "arn:aws:logs:us-west-2:012345678901:log-group:MyApplication:log-stream:kinesis-analytics-log-stream"
      }
   ]
}
```

다음 요청과 함께 [CreateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_CreateApplication.html)을 실행하여 애플리케이션을 생성합니다.

```
aws kinesisanalyticsv2 create-application --cli-input-json file://create_request.json
```

애플리케이션이 생성되었습니다. 다음 단계에서는 애플리케이션을 시작합니다.

##### 애플리케이션 시작
<a name="examples-sliding-scala-start"></a>

이 섹션에서는 [StartApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_StartApplication.html) 작업을 사용하여 애플리케이션을 시작합니다.

**애플리케이션을 시작하려면**

1. 다음 JSON 코드를 `start_request.json`이라는 파일에 저장합니다.

   ```
   {
       "ApplicationName": "sliding_window",
       "RunConfiguration": {
           "ApplicationRestoreConfiguration": { 
            "ApplicationRestoreType": "RESTORE_FROM_LATEST_SNAPSHOT"
            }
       }
   }
   ```

1. 위의 요청과 함께 `StartApplication` 작업을 실행하여 애플리케이션을 시작합니다.

   ```
   aws kinesisanalyticsv2 start-application --cli-input-json file://start_request.json
   ```

애플리케이션이 실행됩니다. Amazon CloudWatch 콘솔에서 Managed Service for Apache Flink 지표를 확인하여 애플리케이션이 작동하는지 확인할 수 있습니다.

##### 애플리케이션 중지
<a name="examples-sliding-scala-stop"></a>

이 섹션에서는 [StopApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_StopApplication.html) 작업을 사용하여 애플리케이션을 중지합니다.

**애플리케이션을 중지하려면**

1. 다음 JSON 코드를 `stop_request.json`이라는 파일에 저장합니다.

   ```
   {
      "ApplicationName": "sliding_window"
   }
   ```

1. 위의 요청과 함께 `StopApplication` 작업을 실행하여 애플리케이션을 중지합니다.

   ```
   aws kinesisanalyticsv2 stop-application --cli-input-json file://stop_request.json
   ```

애플리케이션이 중지됩니다.

##### CloudWatch 로깅 옵션 추가
<a name="examples-sliding-scala-cw-option"></a>

 AWS CLI 를 사용하여 애플리케이션에 Amazon CloudWatch 로그 스트림을 추가할 수 있습니다. 애플리케이션에서 CloudWatch Logs를 사용하는 방법에 대한 자세한 내용은 [애플리케이션 로깅 설정](https://docs.aws.amazon.com/managed-flink/latest/java/cloudwatch-logs.html)을 참조하세요.

##### 환경 속성 업데이트
<a name="examples-sliding-scala-update-environment-properties"></a>

이 섹션에서는 [UpdateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_UpdateApplication.html) 작업을 사용하여 애플리케이션 코드를 다시 컴파일하지 않고도 애플리케이션의 환경 속성을 변경할 수 있습니다. 이 예제에서는 원본 스트림과 대상 스트림의 리전을 변경합니다.

**애플리케이션의 환경 속성 업데이트**

1. 다음 JSON 코드를 `update_properties_request.json`이라는 파일에 저장합니다.

   ```
   {"ApplicationName": "sliding_window",
      "CurrentApplicationVersionId": 1,
      "ApplicationConfigurationUpdate": { 
         "EnvironmentPropertyUpdates": { 
            "PropertyGroups": [ 
               { 
                  "PropertyGroupId": "ConsumerConfigProperties",
                  "PropertyMap" : {
                       "aws.region" : "us-west-2",
                       "stream.name" : "ExampleInputStream",
                       "flink.stream.initpos" : "LATEST"
                  }
               },
               { 
                  "PropertyGroupId": "ProducerConfigProperties",
                  "PropertyMap" : {
                       "aws.region" : "us-west-2",
                       "stream.name" : "ExampleOutputStream"
                  }
               }
            ]
         }
      }
   }
   ```

1. 이전 요청과 함께 `UpdateApplication` 작업을 실행하여 환경 속성을 업데이트하십시오.

   ```
   aws kinesisanalyticsv2 update-application --cli-input-json file://update_properties_request.json
   ```

##### 애플리케이션 코드 업데이트
<a name="examples-sliding-scala-update-app-code"></a>

새 버전의 코드 패키지로 애플리케이션 코드를 업데이트해야 하는 경우 [UpdateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_UpdateApplication.html) CLI 작업을 사용합니다.

**참고**  
파일 이름이 같은 새 버전의 애플리케이션 코드를 로드하려면 새 객체 버전을 지정해야 합니다. Amazon S3 객체 버전 사용에 대한 자세한 내용을 알아보려면 [버전 관리 활성화 또는 비활성화](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/enable-versioning.html)를 참조하세요.

를 사용하려면 Amazon S3 버킷에서 이전 코드 패키지를 AWS CLI삭제하고 새 버전을 업로드한 다음 `UpdateApplication`를 호출하여 동일한 Amazon S3 버킷 및 객체 이름과 새 객체 버전을 지정합니다. 애플리케이션이 새 코드 패키지로 다시 시작됩니다.

다음 예 `UpdateApplication` 작업 요청은 애플리케이션 코드를 다시 로드하고 애플리케이션을 다시 시작합니다. `CurrentApplicationVersionId`를 현재 애플리케이션 버전으로 업데이트하세요. `ListApplications` 또는 `DescribeApplication` 작업을 사용하여 현재 애플리케이션 버전을 확인할 수 있습니다. 버킷 명칭 접미사(<username>)를 [종속 리소스 생성](examples-gs-scala.md#examples-gs-scala-resources) 섹션에서 선택한 접미사로 업데이트합니다.

```
{
    "ApplicationName": "sliding_window",
    "CurrentApplicationVersionId": 1,
    "ApplicationConfigurationUpdate": {
        "ApplicationCodeConfigurationUpdate": {
            "CodeContentUpdate": {
                "S3ContentLocationUpdate": {
                    "BucketARNUpdate": "arn:aws:s3:::ka-app-code-username",
                    "FileKeyUpdate": "-1.0.jar",
                    "ObjectVersionUpdate": "SAMPLEUehYngP87ex1nzYIGYgfhypvDU"
                }
            }
        }
    }
}
```

##### AWS 리소스 정리
<a name="examples-sliding-scala-cleanup"></a>

이 단원에는 슬라이딩 윈도우 자습서에서 생성된 AWS 리소스를 정리하는 절차가 포함되어 있습니다.

**Topics**
+ [Managed Service for Apache Flink 애플리케이션 삭제](#examples-sliding-scala-cleanup-app)
+ [Kinesis 데이터 스트림 삭제](#examples-sliding-scala-cleanup-stream)
+ [Amazon S3 객체 및 버킷 삭제](#examples-sliding-scala-cleanup-s3)
+ [IAM 리소스 삭제](#examples-sliding-scala-cleanup-iam)
+ [CloudWatch 리소스 삭제](#examples-sliding-scala-cleanup-cw)

##### Managed Service for Apache Flink 애플리케이션 삭제
<a name="examples-sliding-scala-cleanup-app"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. Managed Service for Apache Flink 패널에서 **MyApplication**을 선택합니다.

1. 애플리케이션 페이지에서 **삭제**를 선택한 다음 삭제를 확인합니다.

##### Kinesis 데이터 스트림 삭제
<a name="examples-sliding-scala-cleanup-stream"></a>

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

1. Kinesis Data Streams 패널에서 **ExampleInputStream**을 선택합니다.

1. **ExampleInputStream** 페이지에서 **Kinesis 스트림 삭제**를 선택한 다음 삭제를 확인합니다.

1. **Kinesis 스트림** 페이지에서 **ExampleOutputStream**을 선택하고, **작업**을 선택하고, **삭제**를 선택한 다음 삭제 여부를 확인합니다.

##### Amazon S3 객체 및 버킷 삭제
<a name="examples-sliding-scala-cleanup-s3"></a>

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

1. **ka-app-code-*<username>* 버킷을 선택합니다.**

1. **삭제**를 선택한 후 버킷 이름을 입력하여 삭제를 확인합니다.

##### IAM 리소스 삭제
<a name="examples-sliding-scala-cleanup-iam"></a>

1. IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))을 엽니다.

1. 탐색 바에서 **정책**을 선택합니다.

1. 필터 컨트롤에서 **kinesis**를 입력합니다.

1. **kinesis-analytics-service-MyApplication-us-west-2** 정책을 선택합니다.

1. **정책 작업**을 선택한 후 **삭제**를 선택합니다.

1. 탐색 모음에서 **역할**을 선택합니다.

1. **kinesis-analytics-MyApplication-us-west-2** 역할을 선택합니다.

1. **역할 삭제**를 선택하고 삭제를 확인합니다.

##### CloudWatch 리소스 삭제
<a name="examples-sliding-scala-cleanup-cw"></a>

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

1. 탐색 바에서 **로그**를 선택합니다.

1. **/aws/kinesis-analytics/MyApplication** 로그 그룹을 선택합니다.

1. **로그 그룹 삭제**를 선택한 다음 삭제를 확인합니다.

#### 예: 스트리밍 데이터를 Scala의 Amazon S3로 전송
<a name="examples-s3sink-scala"></a>

**참고**  
현재 예제는 [Managed Service for Apache Flink 애플리케이션 생성 및 사용 예제](examples-collapsibles.md) 섹션을 참조하세요.

**참고**  
Flink 버전 1.15부터 Scala는 무료입니다. 이제 애플리케이션은 모든 Scala 버전에서 Java API를 사용할 수 있습니다. Flink는 여전히 내부적으로 몇 가지 주요 구성 요소에서 Scala를 사용하지만 사용자 코드 클래스 로더에 Scala를 노출하지는 않습니다. 따라서 사용자는 자신의 jar-acrchive에 Scala 종속성을 추가해야 합니다.  
Flink 1.15의 Scala 변경 사항에 대한 자세한 내용은 [Scala Free in One Fifteen](https://flink.apache.org/2022/02/22/scala-free.html)을 참조하세요.

이 연습에서는 Scala 3.2.0과 플링크의 Java DataStream API를 사용하는 간단한 스트리밍 애플리케이션을 만들어 보겠습니다. 애플리케이션은 Kinesis 스트림에서 데이터를 읽고, 슬라이딩 윈도우를 사용하여 데이터를 집계하고, 결과를 S3에 기록합니다.

**참고**  
이 연습에 필수 사전 조건을 설정하려면 먼저 [시작하기(Scala)](https://docs.aws.amazon.com/managed-flink/latest/java/examples-gs-scala.html) 연습을 완료하세요. <username>Amazon S3 버킷 (예: *앱* 코드) **data/**에 추가 폴더를 생성하기만 하면 됩니다.

**Topics**
+ [애플리케이션 코드 다운로드 및 검토](#examples-s3sink-scala-download)
+ [애플리케이션 코드 컴파일 및 업로드](#examples-s3sink-scala-upload)
+ [애플리케이션 생성 및 실행(콘솔)](#scala-7)
+ [애플리케이션 생성 및 실행(CLI)](#examples-s3sink-scala-create-run-cli)
+ [애플리케이션 코드 업데이트](#examples-s3sink-scala-update-app-code)
+ [AWS 리소스 정리](#examples-s3sink-scala-cleanup)

##### 애플리케이션 코드 다운로드 및 검토
<a name="examples-s3sink-scala-download"></a>

이 예제에 대한 Python 애플리케이션 코드는 GitHub에서 받을 수 있습니다. 애플리케이션 코드를 다운로드하려면 다음을 수행하세요.

1. 아직 설치하지 않았다면 Git 클라이언트를 설치합니다. 자세한 정보는 [Git 설치](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)를 참조하세요.

1. 다음 명령을 사용하여 원격 리포지토리를 복제합니다:

   ```
   git clone https://github.com/aws-samples/amazon-kinesis-data-analytics-examples.git
   ```

1. `amazon-kinesis-data-analytics-java-examples/scala/S3Sink` 디렉터리로 이동합니다.

애플리케이션 코드에 대해 다음을 유의하십시오:
+ `build.sbt` 파일에는 Managed Service for Apache Flink 라이브러리를 포함하여 애플리케이션의 구성 및 종속성에 대한 정보가 들어 있습니다.
+ `BasicStreamingJob.scala` 파일에는 애플리케이션의 기능을 정의하는 주요 메서드가 들어 있습니다.
+ 애플리케이션은 Kinesis 소스를 사용하여 소스 스트림에서 읽습니다. 다음 스니펫은 Kinesis 소스를 생성합니다.

  ```
  private def createSource: FlinkKinesisConsumer[String] = {
    val applicationProperties = KinesisAnalyticsRuntime.getApplicationProperties
    val inputProperties = applicationProperties.get("ConsumerConfigProperties")
  
    new FlinkKinesisConsumer[String](inputProperties.getProperty(streamNameKey, defaultInputStreamName),
      new SimpleStringSchema, inputProperties)
  }
  ```

  또한 이 애플리케이션은 StreamingFileSink를 사용하여 Amazon S3 버킷에 작성합니다.

  ```
  def createSink: StreamingFileSink[String] = {
    val applicationProperties = KinesisAnalyticsRuntime.getApplicationProperties
    val s3SinkPath = applicationProperties.get("ProducerConfigProperties").getProperty("s3.sink.path")
  
    StreamingFileSink
      .forRowFormat(new Path(s3SinkPath), new SimpleStringEncoder[String]("UTF-8"))
      .build()
  }
  ```
+ 애플리케이션은 StreamExecutionEnvironment 객체를 사용하여 외부 리소스에 액세스하기 위한 소스 및 싱크 커넥터를 생성합니다.
+ 애플리케이션은 동적 애플리케이션 속성을 사용하여 소스 및 싱크 커넥터를 만듭니다. 런타임 애플리케이션의 속성을 읽어 커넥터를 구성합니다. 런타임 속성에 대한 자세한 내용은 [런타임 속성](https://docs.aws.amazon.com/managed-flink/latest/java/how-properties.html)을 참조하세요.

##### 애플리케이션 코드 컴파일 및 업로드
<a name="examples-s3sink-scala-upload"></a>

이 섹션에서는 애플리케이션 코드를 컴파일하여 Amazon S3 버킷에 업로드합니다.

**애플리케이션 코드 컴파일**

[SBT](https://www.scala-sbt.org/) 빌드 도구를 사용하여 애플리케이션용 Scala 코드를 빌드합니다. SBT를 설치하려면 [cs 설정으로 sbt 설치](https://www.scala-sbt.org/download.html)를 참조하십시오. 또한 Java Devopment Kit(JDK)를 설치해야 합니다. [연습 완료를 위한 사전 조건](https://docs.aws.amazon.com/managed-flink/latest/java/getting-started.html#setting-up-prerequisites)을 참조하세요.

1. 애플리케이션 코드를 사용하려면 이를 컴파일하고 JAR 파일로 패키징합니다. SBT를 사용하여 코드를 컴파일하고 패키징할 수 있습니다.

   ```
   sbt assembly
   ```

1. 애플리케이션이 성공적으로 컴파일되면 다음 파일이 생성됩니다:

   ```
   target/scala-3.2.0/s3-sink-scala-1.0.jar
   ```

**Apache Flink 스트리밍 Scala 코드 업로드**

이 섹션에서는 Amazon S3 버킷을 만들고 애플리케이션 코드를 업로드합니다.

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

1. **버킷 만들기**를 선택합니다.

1. **버킷 명칭** 필드에 `ka-app-code-<username>`을 입력합니다. 버킷 명칭에 사용자 이름 등의 접미사를 추가하여 전역적으로 고유하게 만듭니다. **다음**을 선택합니다.

1. **옵션 구성** 단계에서 설정을 기본값 그대로 두고 **다음**을 선택합니다.

1. **권한 설정** 단계에서 설정을 기본값 그대로 두고 **다음**을 선택합니다.

1. **버킷 생성**을 선택합니다.

1. `ka-app-code-<username>` 버킷을 선택한 다음 **업로드**를 선택합니다.

1. **파일 선택** 단계에서 **파일 추가**를 선택합니다. 이전 단계에서 생성한 `s3-sink-scala-1.0.jar` 파일로 이동합니다.

1. 개체 정보에 대한 설정은 변경할 필요가 없으므로 **업로드**를 선택합니다.

이제 애플리케이션 코드가 애플리케이션에서 액세스할 수 있는 Amazon S3 버킷에 저장됩니다.

##### 애플리케이션 생성 및 실행(콘솔)
<a name="scala-7"></a>

콘솔을 사용하여 애플리케이션을 생성, 구성, 업데이트 및 실행하려면 다음 단계를 수행하세요.

##### 애플리케이션 생성
<a name="scala-7-console-create"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. **Managed Service for Apache Flink 대시보드에서 분석 애플리케이션 생성을 선택합니다.**

1. **Managed Service for Apache Flink - 애플리케이션 생성** 페이지에서 다음과 같이 애플리케이션 세부 정보를 제공합니다.
   + **애플리케이션 명칭**에 **MyApplication**을 입력합니다.
   + **설명**에 **My java test app**를 입력합니다.
   + **런타임**에서 **Apache Flink**를 선택합니다.
   + 버전은 **Apache Flink 버전 1.15.2(권장 버전)**로 그대로 둡니다.

1. **액세스 권한**에서 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **애플리케이션 생성**을 선택합니다.

**참고**  
콘솔을 사용하여 Managed Service for Apache Flink 애플리케이션을 만들 때 내 애플리케이션에 대한 IAM 역할 및 정책을 둘 수 있는 옵션이 있습니다. 귀하의 애플리케이션은 이 역할 및 정책을 사용하여 종속 리소스에 액세스합니다. 이러한 IAM 리소스의 이름은 애플리케이션 명칭과 리전을 사용하여 다음과 같이 지정됩니다.  
정책: `kinesis-analytics-service-MyApplication-us-west-2`
역할: `kinesisanalytics-MyApplication-us-west-2`

##### 애플리케이션 구성
<a name="scala-7-console-configure"></a>

애플리케이션을 구성하려면 다음 절차를 사용합니다.

**애플리케이션을 구성하려면**

1. **MyApplication** 페이지에서 **구성**을 선택합니다.

1. **애플리케이션 구성** 페이지에서 **코드 위치**를 입력합니다.
   + **Amazon S3 버킷**의 경우 **ka-app-code-*<username>***를 입력합니다.
   + **Amazon S3 객체 경로**에는 **s3-sink-scala-1.0.jar**를 입력합니다.

1. **애플리케이션 리소스에 대한 액세스** 아래에서 **액세스 권한**의 경우 **IAM 역할 `kinesis-analytics-MyApplication-us-west-2` 생성/업데이트**를 선택합니다.

1. **속성**에서 **그룹 추가**를 선택합니다.

1. 다음을 입력합니다:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

   **저장**을 선택합니다.

1. **속성**에서 **그룹 추가**를 선택합니다.

1. 다음을 입력합니다:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/earlier.html)

1. **모니터링**에서 **지표 수준 모니터링**이 **애플리케이션**으로 설정되어 있는지 확인합니다.

1. **CloudWatch 로깅**에서 **활성화** 확인란을 선택합니다.

1. **업데이트**를 선택합니다.

**참고**  
Amazon CloudWatch 로깅을 활성화하도록 선택하면 Managed Service for Apache Flink에서 로그 그룹 및 로그 스트림을 생성합니다. 이러한 리소스의 이름은 다음과 같습니다.  
로그 그룹: `/aws/kinesis-analytics/MyApplication`
로그 스트림: `kinesis-analytics-log-stream`

##### IAM 정책 편집
<a name="scala-7-console-iam"></a>

IAM 정책을 편집하여 Amazon S3 버킷에 액세스할 수 있는 권한을 추가합니다.

**IAM 정책을 편집하여 S3 버킷 권한을 추가하려면**

1. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 여세요.

1. **정책**을 선택하세요. 이전 섹션에서 콘솔이 생성한 **`kinesis-analytics-service-MyApplication-us-west-2`** 정책을 선택합니다.

1. **요약** 페이지에서 **정책 편집**을 선택합니다. **JSON** 탭을 선택합니다.

1. 다음 정책 예제의 강조 표시된 부분을 정책에 추가하세요. 샘플 계정 ID(*012345678901*)를 내 계정 ID로 바꿉니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ReadCode",
               "Effect": "Allow",
               "Action": [
                   "s3:Abort*", 
                   "s3:DeleteObject*", 
                   "s3:GetObject*", 
                   "s3:GetBucket*", 
                   "s3:List*", 
                   "s3:ListBucket", 
                   "s3:PutObject"
               ],
               "Resource": [ 
                   "arn:aws:s3:::ka-app-code-<username>", 
                   "arn:aws:s3:::ka-app-code-<username>/*" 
               ]
           },
           {
               "Sid": "DescribeLogGroups",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogGroups"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:*"
               ]
           },
           {
               "Sid": "DescribeLogStreams",
               "Effect": "Allow",
               "Action": [
                   "logs:DescribeLogStreams"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:*"
               ]
           },
           {
               "Sid": "PutLogEvents",
               "Effect": "Allow",
               "Action": [
                   "logs:PutLogEvents"
               ],
               "Resource": [
                   "arn:aws:logs:us-west-2:012345678901:log-group:/aws/kinesis-analytics/MyApplication:log-stream:kinesis-analytics-log-stream"
               ]
           },
           {
               "Sid": "ReadInputStream",
               "Effect": "Allow",
               "Action": "kinesis:*",
               "Resource": "arn:aws:kinesis:us-west-2:012345678901:stream/ExampleInputStream"
           }
       ]
   }
   ```

------

##### 애플리케이션을 실행합니다
<a name="scala-7-console-run"></a>

애플리케이션을 실행하고 Apache Flink 대시보드를 연 다음 원하는 Flink 작업을 선택하면 Flink 작업 그래프를 볼 수 있습니다.

##### 애플리케이션 중지
<a name="scala-7-console-stop"></a>

애플리케이션을 중지하려면 **MyApplication** 페이지에서 **중지**를 선택합니다. 작업을 확인합니다.

##### 애플리케이션 생성 및 실행(CLI)
<a name="examples-s3sink-scala-create-run-cli"></a>

이 섹션에서는 AWS Command Line Interface 를 사용하여 Managed Service for Apache Flink 애플리케이션을 생성하고 실행합니다. *kinesisanalyticsv2* AWS CLI 명령을 사용하여 Managed Service for Apache Flink 애플리케이션을 생성하고 상호 작용합니다.

##### 권한 정책 생성
<a name="examples-s3sink-scala-permissions"></a>

**참고**  
애플리케이션에 대한 권한 정책 및 역할을 생성해야 합니다. 이러한 IAM 리소스를 생성하지 않으면 애플리케이션은 해당 데이터 및 로그 스트림에 액세스할 수 없습니다.

먼저 소스 스트림의 읽기 작업에 대한 권한을 부여하는 설명과 싱크 스트림의 쓰기 작업에 대한 권한을 부여하는 설명 두 개를 사용하여 권한 정책을 만듭니다. 그런 다음 정책을 IAM 역할(다음 섹션에서 생성)에 연결합니다. 따라서 Managed Service for Apache Flink가 역할을 맡을 때 서비스는 소스 스트림에서 읽고 싱크 스트림에 쓸 수 있는 권한이 있습니다.

다음 코드를 사용하여 `AKReadSourceStreamWriteSinkStream` 권한 정책을 생성합니다. **username**을 애플리케이션 코드를 저장하기 위해 Amazon S3 버킷을 만들 때 사용한 사용자 이름으로 바꿉니다. Amazon 리소스 이름(ARN)의 계정 ID(**(012345678901)**)를 사용자의 계정 ID로 바꿉니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ReadCode",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::ka-app-code-username/getting-started-scala-1.0.jar"
            ]
        },
        {
            "Sid": "DescribeLogGroups",
            "Effect": "Allow",
            "Action": [
                "logs:DescribeLogGroups"
            ],
            "Resource": [
                "arn:aws:logs:us-west-2:123456789012:*"
            ]
        },
        {
            "Sid": "DescribeLogStreams",
            "Effect": "Allow",
            "Action": [
                "logs:DescribeLogStreams"
            ],
            "Resource": [
                "arn:aws:logs:us-west-2:123456789012:log-group:/aws/kinesis-analytics/MyApplication:log-stream:*"
            ]
        },
        {
            "Sid": "PutLogEvents",
            "Effect": "Allow",
            "Action": [
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:us-west-2:123456789012:log-group:/aws/kinesis-analytics/MyApplication:log-stream:kinesis-analytics-log-stream"
            ]
        },
        {
            "Sid": "ReadInputStream",
            "Effect": "Allow",
            "Action": "kinesis:*",
            "Resource": "arn:aws:kinesis:us-west-2:123456789012:stream/ExampleInputStream"
        },
        {
            "Sid": "WriteOutputStream",
            "Effect": "Allow",
            "Action": "kinesis:*",
            "Resource": "arn:aws:kinesis:us-west-2:123456789012:stream/ExampleOutputStream"
        }
    ]
}
```

------

권한 정책을 생성하는 단계별 지침은 *IAM 사용자 가이드*의 [IAM 자습서: 첫 번째 고객 관리형 정책 만들기 및 연결](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_managed-policies.html#part-two-create-policy)을 참조하세요.

##### IAM 역할 생성
<a name="examples-s3sink-scala-iam-policy"></a>

이 섹션에서는 Managed Service for Apache Flink 애플리케이션이 소스 스트림을 읽고 싱크 스트림에 쓰기 위해 맡을 수 있는 IAM 역할을 생성합니다.

Managed Service for Apache Flink는 권한 없이 스트림에 액세스할 수 없습니다. IAM 역할을 통해 이러한 권한을 부여합니다. 각 IAM 역할에는 두 가지 정책이 연결됩니다. 신뢰 정책은 Managed Service for Apache Flink가 역할을 취할 수 있는 권한을 부여하고, 권한 정책은 역할을 취한 후 Managed Service for Apache Flink에서 수행할 수 있는 작업을 결정합니다.

이전 섹션에서 생성한 권한 정책을 이 역할에 연결합니다.

**IAM 역할을 생성하려면**

1. IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))을 엽니다.

1. 탐색 창에서 **역할**을 선택한 후 **역할 생성**을 선택합니다.

1. **신뢰할 수 있는 유형의 자격 증명 선택**에서 **AWS 서비스**를 선택합니다.

1. **이 역할을 사용할 서비스 선택**에서 **Kinesis**를 선택합니다.

1. **사용 사례 선택에서** **Managed Service for Apache Flink를** 선택합니다.

1. **다음: 권한**을 선택합니다.

1. **권한 정책 연결** 페이지에서 **다음: 검토**를 선택합니다. 역할을 생성한 후에 권한 정책을 연결합니다.

1. **역할 생성** 페이지에서 **역할 이름**으로 **MF-stream-rw-role**을 입력합니다. **역할 생성**을 선택합니다.

    `MF-stream-rw-role`이라는 새 IAM 역할이 생성되었습니다. 그런 다음 역할의 신뢰 정책 및 권한 정책을 업데이트합니다.

1. 역할에 권한 정책을 연결합니다.
**참고**  
이 연습에서는 Managed Service for Apache Flink가 이 역할을 취하여 Kinesis 데이터 스트림(소스)에서 데이터를 읽고 출력을 다른 Kinesis 데이터 스트림에 씁니다. 따라서 이전 단계인 [권한 정책 생성](https://docs.aws.amazon.com/managed-flink/latest/java/get-started-exercise.html#get-started-exercise-7-cli-policy)에서 만든 정책을 연결합니다.

   1. **요약** 페이지에서 **권한** 탭을 선택합니다.

   1. **정책 연결**을 선택합니다.

   1. 검색 상자에 **AKReadSourceStreamWriteSinkStream**(이전 섹션에서 생성한 정책)을 입력합니다.

   1. `AKReadSourceStreamWriteSinkStream` 정책을 선택한 후 **정책 연결**을 선택합니다.

이제 애플리케이션이 리소스에 액세스하는 데 사용하는 서비스 실행 역할이 생성되었습니다. 새 역할의 ARN을 기록합니다.

역할 생성에 대한 단계별 지침은 *IAM 사용 설명서*의 [IAM 역할 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html#roles-creatingrole-user-console)을 참조하세요.

##### 애플리케이션 생성
<a name="examples-s3sink-scala-create-application-cli"></a>

다음 JSON 코드를 `create_request.json`이라는 파일에 저장합니다. 샘플 역할 ARN을 이전에 생성한 역할을 위한 ARN으로 바꿉니다. 버킷 ARN 접미사(사용자 이름)를 이전 섹션에서 선택한 접미사로 바꿉니다. 서비스 실행 역할의 샘플 계정 ID(012345678901)를 사용자 계정 ID로 바꿉니다.

```
{
    "ApplicationName": "s3_sink",
    "ApplicationDescription": "Scala tumbling window application",
    "RuntimeEnvironment": "FLINK-1_15",
    "ServiceExecutionRole": "arn:aws:iam::012345678901:role/MF-stream-rw-role",
    "ApplicationConfiguration": {
        "ApplicationCodeConfiguration": {
            "CodeContent": {
                "S3ContentLocation": {
                    "BucketARN": "arn:aws:s3:::ka-app-code-username",
                    "FileKey": "s3-sink-scala-1.0.jar"
                }
            },
            "CodeContentType": "ZIPFILE"
        },
        "EnvironmentProperties":  { 
         "PropertyGroups": [ 
            { 
               "PropertyGroupId": "ConsumerConfigProperties",
               "PropertyMap" : {
                    "aws.region" : "us-west-2",
                    "stream.name" : "ExampleInputStream",
                    "flink.stream.initpos" : "LATEST"
               }
            },
            { 
               "PropertyGroupId": "ProducerConfigProperties",
               "PropertyMap" : {
                    "s3.sink.path" : "s3a://ka-app-code-<username>/data"
               }
            }
         ]
      }
    },
    "CloudWatchLoggingOptions": [ 
      { 
         "LogStreamARN": "arn:aws:logs:us-west-2:012345678901:log-group:MyApplication:log-stream:kinesis-analytics-log-stream"
      }
   ]
}
```

다음 요청과 함께 [CreateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_CreateApplication.html)을 실행하여 애플리케이션을 생성합니다.

```
aws kinesisanalyticsv2 create-application --cli-input-json file://create_request.json
```

애플리케이션이 생성되었습니다. 다음 단계에서는 애플리케이션을 시작합니다.

##### 애플리케이션 시작
<a name="examples-s3sink-scala-start"></a>

이 섹션에서는 [StartApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_StartApplication.html) 작업을 사용하여 애플리케이션을 시작합니다.

**애플리케이션을 시작하려면**

1. 다음 JSON 코드를 `start_request.json`이라는 파일에 저장합니다.

   ```
   {{
       "ApplicationName": "s3_sink",
       "RunConfiguration": {
           "ApplicationRestoreConfiguration": { 
            "ApplicationRestoreType": "RESTORE_FROM_LATEST_SNAPSHOT"
            }
       }
   }
   ```

1. 위의 요청과 함께 `StartApplication` 작업을 실행하여 애플리케이션을 시작합니다.

   ```
   aws kinesisanalyticsv2 start-application --cli-input-json file://start_request.json
   ```

애플리케이션이 실행됩니다. Amazon CloudWatch 콘솔에서 Managed Service for Apache Flink 지표를 확인하여 애플리케이션이 작동하는지 확인할 수 있습니다.

##### 애플리케이션 중지
<a name="examples-s3sink-scala-stop"></a>

이 섹션에서는 [StopApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_StopApplication.html) 작업을 사용하여 애플리케이션을 중지합니다.

**애플리케이션을 중지하려면**

1. 다음 JSON 코드를 `stop_request.json`이라는 파일에 저장합니다.

   ```
   {
      "ApplicationName": "s3_sink"
   }
   ```

1. 위의 요청과 함께 `StopApplication` 작업을 실행하여 애플리케이션을 중지합니다.

   ```
   aws kinesisanalyticsv2 stop-application --cli-input-json file://stop_request.json
   ```

애플리케이션이 중지됩니다.

##### CloudWatch 로깅 옵션 추가
<a name="examples-s3sink-scala-cw-option"></a>

 AWS CLI 를 사용하여 애플리케이션에 Amazon CloudWatch 로그 스트림을 추가할 수 있습니다. 애플리케이션에서 CloudWatch Logs를 사용하는 방법에 대한 자세한 내용은 [애플리케이션 로깅 설정](https://docs.aws.amazon.com/managed-flink/latest/java/cloudwatch-logs.html)을 참조하세요.

##### 환경 속성 업데이트
<a name="examples-s3sink-scala-update-environment-properties"></a>

이 섹션에서는 [UpdateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_UpdateApplication.html) 작업을 사용하여 애플리케이션 코드를 다시 컴파일하지 않고도 애플리케이션의 환경 속성을 변경할 수 있습니다. 이 예제에서는 원본 스트림과 대상 스트림의 리전을 변경합니다.

**애플리케이션의 환경 속성 업데이트**

1. 다음 JSON 코드를 `update_properties_request.json`이라는 파일에 저장합니다.

   ```
   {"ApplicationName": "s3_sink",
      "CurrentApplicationVersionId": 1,
      "ApplicationConfigurationUpdate": { 
         "EnvironmentPropertyUpdates": { 
            "PropertyGroups": [ 
               { 
                  "PropertyGroupId": "ConsumerConfigProperties",
                  "PropertyMap" : {
                       "aws.region" : "us-west-2",
                       "stream.name" : "ExampleInputStream",
                       "flink.stream.initpos" : "LATEST"
                  }
               },
               { 
                  "PropertyGroupId": "ProducerConfigProperties",
                  "PropertyMap" : {
                       "s3.sink.path" : "s3a://ka-app-code-<username>/data"
                  }
               }
            ]
         }
      }
   }
   ```

1. 이전 요청과 함께 `UpdateApplication` 작업을 실행하여 환경 속성을 업데이트하십시오.

   ```
   aws kinesisanalyticsv2 update-application --cli-input-json file://update_properties_request.json
   ```

##### 애플리케이션 코드 업데이트
<a name="examples-s3sink-scala-update-app-code"></a>

새 버전의 코드 패키지로 애플리케이션 코드를 업데이트해야 하는 경우 [UpdateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_UpdateApplication.html) CLI 작업을 사용합니다.

**참고**  
파일 이름이 같은 새 버전의 애플리케이션 코드를 로드하려면 새 객체 버전을 지정해야 합니다. Amazon S3 객체 버전 사용에 대한 자세한 내용을 알아보려면 [버전 관리 활성화 또는 비활성화](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/enable-versioning.html)를 참조하세요.

를 사용하려면 Amazon S3 버킷에서 이전 코드 패키지를 AWS CLI삭제하고 새 버전을 업로드한 다음 `UpdateApplication`를 호출하여 동일한 Amazon S3 버킷 및 객체 이름과 새 객체 버전을 지정합니다. 애플리케이션이 새 코드 패키지로 다시 시작됩니다.

다음 예 `UpdateApplication` 작업 요청은 애플리케이션 코드를 다시 로드하고 애플리케이션을 다시 시작합니다. `CurrentApplicationVersionId`를 현재 애플리케이션 버전으로 업데이트하세요. `ListApplications` 또는 `DescribeApplication` 작업을 사용하여 현재 애플리케이션 버전을 확인할 수 있습니다. 버킷 명칭 접미사(<username>)를 [종속 리소스 생성](examples-gs-scala.md#examples-gs-scala-resources) 섹션에서 선택한 접미사로 업데이트합니다.

```
{
    "ApplicationName": "s3_sink",
    "CurrentApplicationVersionId": 1,
    "ApplicationConfigurationUpdate": {
        "ApplicationCodeConfigurationUpdate": {
            "CodeContentUpdate": {
                "S3ContentLocationUpdate": {
                    "BucketARNUpdate": "arn:aws:s3:::ka-app-code-username",
                    "FileKeyUpdate": "s3-sink-scala-1.0.jar",
                    "ObjectVersionUpdate": "SAMPLEUehYngP87ex1nzYIGYgfhypvDU"
                }
            }
        }
    }
}
```

##### AWS 리소스 정리
<a name="examples-s3sink-scala-cleanup"></a>

이 섹션에는 텀블링 윈도우 자습서에서 생성된 AWS 리소스를 정리하는 절차가 포함되어 있습니다.

**Topics**
+ [Managed Service for Apache Flink 애플리케이션 삭제](#examples-s3sink-scala-cleanup-app)
+ [Kinesis 데이터 스트림 삭제](#examples-s3sink-scala-cleanup-stream)
+ [Amazon S3 객체 및 버킷 삭제](#examples-s3sink-scala-cleanup-s3)
+ [IAM 리소스 삭제](#examples-s3sink-scala-cleanup-iam)
+ [CloudWatch 리소스 삭제](#examples-s3sink-scala-cleanup-cw)

##### Managed Service for Apache Flink 애플리케이션 삭제
<a name="examples-s3sink-scala-cleanup-app"></a>

1. 에 로그인 AWS Management Console하고 https://console.aws.amazon.com/flink Amazon MSF 콘솔을 엽니다.

1. Managed Service for Apache Flink 패널에서 **MyApplication**을 선택합니다.

1. 애플리케이션 페이지에서 **삭제**를 선택한 다음 삭제를 확인합니다.

##### Kinesis 데이터 스트림 삭제
<a name="examples-s3sink-scala-cleanup-stream"></a>

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

1. Kinesis Data Streams 패널에서 **ExampleInputStream**을 선택합니다.

1. **ExampleInputStream** 페이지에서 **Kinesis 스트림 삭제**를 선택한 다음 삭제를 확인합니다.

1. **Kinesis 스트림** 페이지에서 **ExampleOutputStream**을 선택하고, **작업**을 선택하고, **삭제**를 선택한 다음 삭제 여부를 확인합니다.

##### Amazon S3 객체 및 버킷 삭제
<a name="examples-s3sink-scala-cleanup-s3"></a>

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

1. **ka-app-code-*<username>* 버킷을 선택합니다.**

1. **삭제**를 선택한 후 버킷 이름을 입력하여 삭제를 확인합니다.

##### IAM 리소스 삭제
<a name="examples-s3sink-scala-cleanup-iam"></a>

1. IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))을 엽니다.

1. 탐색 바에서 **정책**을 선택합니다.

1. 필터 컨트롤에서 **kinesis**를 입력합니다.

1. **kinesis-analytics-service-MyApplication-us-west-2** 정책을 선택합니다.

1. **정책 작업**을 선택한 후 **삭제**를 선택합니다.

1. 탐색 모음에서 **역할**을 선택합니다.

1. **kinesis-analytics-MyApplication-us-west-2** 역할을 선택합니다.

1. **역할 삭제**를 선택하고 삭제를 확인합니다.

##### CloudWatch 리소스 삭제
<a name="examples-s3sink-scala-cleanup-cw"></a>

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

1. 탐색 바에서 **로그**를 선택합니다.

1. **/aws/kinesis-analytics/MyApplication** 로그 그룹을 선택합니다.

1. **로그 그룹 삭제**를 선택한 다음 삭제를 확인합니다.