

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

# Kinesis 데이터 스트림 생성 및 관리
<a name="working-with-streams"></a>

Amazon Kinesis Data Streams는 대량의 데이터를 실시간으로 수집하고 내구성을 고려하여 데이터를 저장하며 데이터를 소비할 수 있는 상태로 만듭니다. Kinesis Data Streams에서 저장하는 데이터의 단위는 **데이터 레코드입니다. *데이터 스트림*은 데이터 레코드 그룹을 나타냅니다. 데이터 스트림의 데이터 레코드는 샤드에 배포됩니다.

*샤드*에는 스트림의 데이터 레코드 시퀀스가 있습니다. Kinesis 데이터 스트림의 기본 처리량 단위 역할을 합니다. 샤드는 온디맨드 및 프로비저닝된 용량 모드 모두에서 쓰기의 경우 초당 1000개의 레코드 및 1MB/s를 지원하고 읽기의 경우 2MB/s를 지원합니다. 샤드 한도는 예측 가능한 성능을 보장하므로 매우 안정적인 데이터 스트리밍 워크플로를 쉽게 설계하고 운영할 수 있습니다.

이 섹션에서는 스트림의 용량 모드를 설정하는 방법과 AWS Management Console 또는 APIs를 사용하여 스트림을 생성하는 방법을 알아봅니다. 그런 다음 스트림에 대한 추가 작업을 수행할 수 있습니다.

**Topics**
+ [스트리밍할 올바른 모드 선택](how-do-i-size-a-stream.md)
+ [를 사용하여 스트림 생성 AWS Management Console](how-do-i-create-a-stream.md)
+ [API를 사용하여 스트림 생성](kinesis-using-sdk-java-create-stream.md)
+ [스트림 업데이트](updating-a-stream.md)
+ [스트림 나열](kinesis-using-sdk-java-list-streams.md)
+ [샤드 나열](kinesis-using-sdk-java-list-shards.md)
+ [스트림을 삭제](kinesis-using-sdk-java-delete-stream.md)
+ [스트림 리샤딩](kinesis-using-sdk-java-resharding.md)
+ [데이터 보존 기간 변경](kinesis-extended-retention.md)
+ [Amazon Kinesis Data Streams 리소스에 태그 지정](tagging.md)
+ [대형 레코드 처리](large-records.md)
+ [를 사용하여 복원력 테스트 수행 AWS Fault Injection Service](kinesis-fis.md)

# 스트리밍할 올바른 모드 선택
<a name="how-do-i-size-a-stream"></a>

다음 주제에서는 애플리케이션에 최적의 모드를 선택하는 방법과 필요한 경우 모드 간 전환하는 방법을 설명합니다.

**Topics**
+ [Kinesis Data Streams의 다양한 모드](#diff-modes-kds)
+ [온디맨드 표준 모드의 기능 및 사용 사례](#ondemandmode)
+ [온디맨드 어드밴티지 모드의 기능 및 사용 사례](#ondemand-advantage-mode)
+ [프로비저닝된 모드 기능 및 사용 사례](#provisionedmode)
+ [모드 간 전환](#switchingmodes)

## Kinesis Data Streams의 다양한 모드
<a name="diff-modes-kds"></a>

모드는 데이터 스트림의 용량이 관리되는 방식과 데이터 스트림 사용에 대한 요금이 청구되는 방식을 결정합니다. Amazon Kinesis Data Streams에서 데이터 스트림용 모드로 **온디맨드 표준**, **온디맨드 어드밴티지**, **프로비저닝된** 중에서 선택할 수 있습니다.
+ **온디맨드 표준** - 온디맨드 모드의 데이터 스트림은 용량 계획이 필요 없으며 분당 수 기가바이트의 쓰기 및 읽기 처리량을 처리하도록 자동으로 확장됩니다. 온디맨드 모드에서 Kinesis Data Streams는 필요한 처리량을 제공하기 위해 샤드를 자동으로 관리합니다.
+  **온디맨드 어드밴티지** - 더 많은 온디맨드 스트림 기능을 지원하고 요금 구조가 더 단순한 계정 수준 모드입니다. 이 모드에서는 언제든지 스트림의 쓰기 처리량 용량을 사전에 워밍할 수 있습니다. 요금의 경우 스트림당 고정 요금이 더 이상 부과되지 않으며, 모든 온디맨드 스트림에서 데이터 수집, 데이터 검색, 연장 보존 사용량이 **온디맨드 표준**보다 60% 이상 낮습니다.
+ **프로비저닝된** - 프로비저닝된 모드의 데이터 스트림의 경우 데이터 스트림의 샤드 수를 지정해야 합니다. 데이터 스트림의 총 용량은 해당 샤드 용량의 합계입니다. 필요한 만큼 데이터 스트림의 샤드 수를 늘리거나 줄일 수 있습니다.

Kinesis Data Streams `PutRecord` 및 `PutRecords` API를 사용하여 모든 모드에서 데이터 스트림에 데이터를 쓸 수 있습니다. 데이터 검색의 경우 세 가지 모드 모두 `GetRecords` API를 사용하는 기본 소비자와 `SubscribeToShard` API를 사용하는 향상된 팬아웃(EFO) 소비자를 지원합니다.

보존 모드, 암호화, 모니터링 지표 등을 포함한 모든 Kinesis Data Streams 기능은 온디맨드 모드와 프로비저닝된 모드 모두에 대해 지원됩니다. Kinesis Data Streams는 온디맨드 및 프로비저닝된 용량 모드 모두에서 높은 내구성과 가용성을 제공합니다.

## 온디맨드 표준 모드의 기능 및 사용 사례
<a name="ondemandmode"></a>

온디맨드 모드의 데이터 스트림은 용량 계획이 필요 없으며 분당 수 기가바이트의 쓰기 및 읽기 처리량을 처리하도록 자동으로 확장됩니다. 온디맨드 모드를 사용하면 서버, 스토리지 또는 처리량을 프로비저닝하고 관리할 필요가 없으므로 짧은 지연 시간으로 대용량 데이터를 간편하게 수집하고 저장할 수 있습니다. 운영 오버헤드 없이 하루에 수십억 개의 레코드를 수집할 수 있습니다.

온디맨드 모드는 매우 가변적이고 예측할 수 없는 애플리케이션 트래픽의 요구 사항을 해결하는 데 이상적입니다. 더 이상 최대 용량을 위해 이러한 워크로드를 프로비저닝하지 않아도 되므로 사용률이 낮아 비용이 증가할 수 있습니다. 온디맨드 모드는 예측할 수 없고 매우 가변적인 트래픽 패턴을 가진 워크로드에 적합합니다.

온디맨드 용량 모드를 사용하면 데이터 스트림에서 쓰고 읽은 데이터에 대해 GB당 요금을 지불합니다. 애플리케이션에서 수행할 것으로 예상되는 읽기 및 쓰기 처리량을 지정할 필요가 없습니다. Kinesis Data Streams는 워크로드가 증가하거나 감소할 때 즉시 워크로드를 수용합니다. 자세한 내용은 [Amazon Kinesis Data Streams 요금](https://aws.amazon.com/kinesis/data-streams/pricing/)을 참조하세요.

온디맨드 모드의 데이터 스트림은 지난 30일 동안 관찰된 최대 쓰기 처리량의 최대 2배를 수용합니다. 데이터 스트림의 쓰기 처리량이 최고치에 도달하면 Kinesis Data Streams는 데이터 스트림의 용량을 자동으로 조정합니다. 예를 들어, 데이터 스트림의 쓰기 처리량이 10MB/s에서 40MB/s 사이인 경우 Kinesis Data Streams를 사용하면 최대 피크 처리량의 2배인 80MB/s까지 쉽게 버스트할 수 있습니다. 동일한 데이터 스트림이 새로운 최대 처리량인 50MB/s를 유지하는 경우 Kinesis Data Streams는 100MB/s의 쓰기 처리량을 수집하기에 충분한 용량을 확보합니다. 하지만 15분 내에 트래픽이 이전 최고치의 2배 이상으로 증가하면 쓰기 제한이 발생할 수 있습니다. 제한된 이러한 요청을 다시 시도해야 합니다.

온디맨드 모드를 사용하는 데이터 스트림의 총 읽기 용량은 쓰기 처리량에 비례하여 증가합니다. 이를 통해 소비자 애플리케이션은 수신 데이터를 실시간으로 처리하는 데 필요한 적절한 읽기 처리량을 항상 확보할 수 있습니다. `GetRecords` API를 사용한 데이터 읽기에 비해 쓰기 처리량이 2배 이상 높습니다. `GetRecord` API와 함께 하나의 소비자 애플리케이션을 사용하여 애플리케이션이 다운타임에서 복구해야 할 때 이를 따라잡을 수 있는 충분한 공간을 확보하는 것이 좋습니다. 2개 이상의 소비자 애플리케이션을 추가해야 하는 시나리오에는 Kinesis Data Streams의 향상된 팬아웃 기능을 사용하는 것이 좋습니다. 향상된 팬아웃은 `SubscribeToShard` API 사용하여 데이터 스트림에 최대 20개의 소비자 애플리케이션을 추가할 수 있도록 지원하며, 각 소비자 애플리케이션에는 전용 처리량이 있습니다.

### 읽기 및 쓰기 처리량 예외 처리
<a name="hotshards"></a>

프로비저닝된 용량 모드와 마찬가지로 온디맨드 모드에서는 데이터 스트림에 데이터를 쓰려면 각 레코드에 파티션 키를 지정해야 합니다. Kinesis Data Streams는 파티션 키를 사용하여 샤드 전체에 데이터를 배포합니다. Kinesis Data Streams는 각 샤드의 트래픽을 모니터링합니다. 수신 트래픽이 샤드당 500KB/s를 초과하면 15분 내에 샤드를 분할합니다. 상위 샤드의 해시 키 값은 하위 샤드에 균등하게 재배포됩니다.

 수신 트래픽이 이전 최고치의 2배를 초과하는 경우 데이터가 샤드에 균등하게 배포되어 있더라도 약 15분 동안 읽기 또는 쓰기 예외가 발생할 수 있습니다. 모든 레코드가 Kinesis Data Streams에 제대로 저장되도록 이러한 요청을 모두 재시도하는 것이 좋습니다.

파티션 키를 사용하여 데이터가 고르지 않게 배포되고 특정 샤드에 할당된 레코드가 제한을 초과하는 경우 읽기 및 쓰기 예외가 발생할 수 있습니다. 온디맨드 모드에서는 파티션 키 하나가 샤드의 1MB/s 처리량과 초당 레코드 1,000개 제한을 초과하지 않는 한 데이터 스트림이 고르지 않은 데이터 배포 패턴을 처리하도록 자동으로 조정됩니다.

온디맨드 모드에서 Kinesis Data Streams는 트래픽 증가를 감지하면 샤드를 균등하게 분할합니다. 하지만 수신 트래픽의 더 많은 부분을 특정 샤드로 유도하는 해시 키를 탐지하고 격리하지는 않습니다. 매우 고르지 않은 파티션 키를 사용하는 경우 쓰기 예외가 계속 발생할 수 있습니다. 이러한 사용 사례에서는 세분화된 샤드 분할을 지원하는 프로비저닝된 용량 모드를 사용하는 것이 좋습니다.

## 온디맨드 어드밴티지 모드의 기능 및 사용 사례
<a name="ondemand-advantage-mode"></a>

온디맨드 어드밴티지는 더 많은 기능을 제공하며 해당 리전의 모든 온디맨드 스트림에 대해 요금 구조가 다른 계정 수준 설정입니다. 이 모드에서 온디맨드 스트림은 기능을 유지하고 실제 데이터 사용량에 따라 용량을 자동으로 조정합니다. 스트림의 쓰기 처리량 용량을 사전에 워밍하려는 경우 웜 처리량을 구성할 수 있습니다. 예를 들어 데이터 스트림의 쓰기 처리량이 10MB/s\$140MB/s인 경우 스로틀링 없이 최대 80MB/s의 즉각적인 처리량 증가를 처리할 수 있습니다. 그러나 예정된 이벤트가 최대 약 200MB/s의 트래픽에 도달할 것으로 예상되는 경우 데이터 처리량이 도착했을 때 용량을 사용할 수 있도록 스트림의 웜 처리량을 200MB/s로 구성할 수 있습니다. 웜 처리량을 사용해도 추가 요금이 발생하지 않습니다.

온디맨드 어드밴티지 모드의 또 다른 이점은 온디맨드 스트림이 더 단순한 요금 구조로 전환된다는 것입니다. 이 모드를 활성화하면 계정에 더 이상 고정된 스트림당 요금이 표시되지 않으며 데이터 수집, 데이터 검색, 선택 사항인 연장 보존 요금만 지불하면 됩니다. 또한 각 요금 차원은 온디맨드 표준의 해당 차원에 비해 상당한 수준의 할인이 적용됩니다. 자세한 내용은 [Amazon Kinesis Data Streams 요금](https://aws.amazon.com/kinesis/data-streams/pricing/)을 참조하세요.

향상된 팬아웃 데이터 검색 역시 이 모드의 표준 데이터 검색과 비교하여 가격 프리미엄이 없습니다. 또한 온디맨드 어드밴티지 모드를 사용하면 스트림당 최대 50명의 소비자를 등록하여 향상된 팬아웃을 사용할 수 있습니다. 온디맨드 어드밴티지를 활성화하면 계정이 모든 온디맨드 스트림에서 최소 25MiB/s의 데이터 수집 및 25MiB/s의 데이터 검색에 커밋됩니다. 최소 사용 요구 사항을 충족하는 계정의 경우 Kinesis Data Streams 콘솔에서 계정의 사용 패턴이 **온디맨드 어드밴티지 모드**를 사용하기에 적합한지 여부를 확인합니다.

계정의 데이터 사용량이 요구 사항보다 낮으면 차액이 부족액으로 청구되지만 동일한 할인율이 적용됩니다. 또한 온디맨드 어드밴티지를 활성화하면 최소 24시간 후에 이 모드를 비활성화할 수 있습니다. 전반적으로 온디맨드 어드밴티지는 일관된 처리량이 최소 약정 수준에 근접하거나 이를 초과하는 경우, 많은 팬아웃 소비자가 필요한 경우 또는 수백 개의 데이터 스트림을 작동하는 경우에 Kinesis Data Streams를 사용하여 스트리밍하기에 가장 좋은 방법입니다.

## 프로비저닝된 모드 기능 및 사용 사례
<a name="provisionedmode"></a>

프로비저닝된 모드에서는 데이터 스트림을 생성한 후 AWS Management Console 또는 [UpdateShardCount](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_UpdateShardCount.html) API를 사용하여 샤드 용량을 동적으로 늘리거나 줄일 수 있습니다. Kinesis Data Streams 생산자 또는 소비자 애플리케이션이 스트림에 데이터를 쓰거나 스트림에서 데이터를 읽는 동안 업데이트할 수 있습니다.

프로비저닝된 모드는 용량 요구 사항을 예측하기 쉬운 예측 가능한 트래픽에 적합합니다. 샤드에 데이터가 배포되는 방식을 세밀하게 제어하려는 경우 프로비저닝된 모드를 사용할 수 있습니다.

프로비저닝된 모드에서는 데이터 스트림의 샤드 수를 지정해야 합니다. 프로비저닝된 모드 사용 시 데이터 스트림의 크기를 결정하려면 다음 입력 값이 필요합니다.
+ 스트림에 쓰여지는 평균 데이터 레코드 크기(KB 단위), 가장 가까운 1KB로 반올림됨(`average_data_size_in_KB`)
+ 스트림에서 초당 쓰고 읽는 데이터 레코드 수(`records_per_second`)
+ 스트림과 동시에 독립적으로 데이터를 소비하는 Kinesis Data Streams 애플리케이션인 소비자 수(`number_of_consumers`)
+ KB 단위의 수신 쓰기 대역폭(`incoming_write_bandwidth_in_KB`)은 `average_data_size_in_KB`에 `records_per_second`를 곱한 값과 같습니다.
+ KB 단위의 발신 읽기 대역폭(`outgoing_read_bandwidth_in_KB`)은 `incoming_write_bandwidth_in_KB`에 `number_of_consumers`를 곱한 값과 같습니다.

다음 형식의 입력 값을 사용하여 스트림에 필요한 샤드 수(`number_of_shards`)를 계산할 수 있습니다.

```
number_of_shards = ceiling(max(incoming_write_bandwidth_in_KiB/1024, outgoing_read_bandwidth_in_KiB/2048))
```

최대 처리량을 처리하도록 데이터 스트림을 구성하지 않으면 프로비저닝된 모드에서 읽기 및 쓰기 처리량 예외가 계속 발생할 수 있습니다. 이 경우 데이터 트래픽을 수용할 수 있도록 데이터 스트림 규모를 수동으로 조정해야 합니다.

또한 파티션 키를 사용하여 데이터가 고르지 않게 배포되고 샤드에 할당된 레코드가 제한을 초과하는 경우 읽기 및 쓰기 예외가 발생할 수 있습니다. 프로비저닝된 모드에서 이 문제를 해결하려면 해당 샤드를 식별하고 트래픽을 더 잘 수용할 수 있도록 수동으로 분할합니다. 자세한 내용은 [스트림 리샤딩](https://docs.aws.amazon.com/streams/latest/dev/kinesis-using-sdk-java-resharding.html)을 참조하세요.

## 모드 간 전환
<a name="switchingmodes"></a>

의 각 데이터 스트림에 대해 24시간 이내에 온디맨드 모드와 프로비저닝된 모드 간에 두 번 전환할 AWS 계정수 있습니다. 모드를 전환해도 이 데이터 스트림을 사용하는 애플리케이션은 중단되지 않습니다. 이 데이터 스트림에서 계속 쓰고 읽을 수 있습니다. 온디맨드 모드와 프로비저닝된 모드 사이에서 전환할 때 스트림 상태는 *업데이트 중*으로 설정됩니다. 속성을 다시 수정하려면 데이터 스트림이 **활성 상태가 될 때까지 기다려야 합니다.

프로비저닝된 용량 모드에서 온디맨드 용량 모드로 전환하면 처음에는 데이터 스트림이 전환 전의 샤드 수를 유지하며, 이 시점부터 Kinesis Data Streams는 데이터 트래픽을 모니터링하고 쓰기 처리량에 따라 이 온디맨드 데이터 스트림의 샤드 수를 조정합니다. 온디맨드 모드에서 프로비저닝된 모드로 전환하면 처음에는 데이터 스트림에 전환 전의 샤드 수가 그대로 유지되지만, 이 때부터는 쓰기 처리량을 적절하게 수용할 수 있도록 이 데이터 스트림의 샤드 수를 모니터링하고 조정해야 합니다.

계정 수준 설정을 활성화하여 **온디맨드 표준** 모드에서 **온디맨드 어드밴티지** 모드로 전환할 수 있습니다. 활성화하면 계정이 해당 리전의 모든 온디맨드 스트림에서 최소 25MiB/s의 데이터 수집 및 25MiB/s의 데이터 검색 사용량에 커밋됩니다. 활성화 후에는 **온디맨드 어드밴티지**를 비활성화하기까지 최소 24시간을 기다려야 하지만 언제든지 변경을 요청할 수 있습니다. **온디맨드 어드밴티지**에서 **온디맨드 표준**으로 전환하려면 먼저 온디맨드 스트림으로 구성된 웜 처리량을 제거해야 합니다.

# 를 사용하여 스트림 생성 AWS Management Console
<a name="how-do-i-create-a-stream"></a>

Kinesis Data Streams 콘솔, Kinesis Data Streams API 또는 AWS Command Line Interface (AWS CLI)를 사용하여 스트림을 생성할 수 있습니다.

**콘솔을 사용하여 데이터 스트림을 만들려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/kinesis](https://console.aws.amazon.com/kinesis) Kinesis 콘솔을 엽니다.

1. 탐색 모음에서 리전 선택기를 확장하고 리전을 선택합니다.

1. **데이터 스트림 생성**을 선택합니다.

1. **Kinesis 스트림 생성** 페이지에서 데이터 스트림의 이름을 입력한 다음 **온디맨드** 또는 **프로비저닝된** 용량 모드를 선택합니다. **온디맨드** 모드가 기본적으로 선택됩니다. 자세한 내용은 [스트리밍할 올바른 모드 선택](how-do-i-size-a-stream.md) 단원을 참조하십시오.

   **온디맨드** 모드를 사용하면 **Kinesis 스트림 생성**을 선택하여 데이터 스트림을 생성할 수 있습니다. **프로비저닝된 모드**에서는 필요한 샤드 수를 지정한 다음 **Kinesis 스트림 생성**을 선택해야 합니다.

   스트림이 생성 중인 동안 **Kinesis streams(Kinesis 스트림)** 페이지에서 스트림의 **Status(상태)**는 **Creating(생성 중)**입니다. 스트림을 사용할 준비가 되면 **Status(상태)**가 **Active(활성)**로 변경됩니다.

1. 스트림 명칭을 선택합니다. **스트림 세부 정보** 페이지에 모니터링 정보와 함께 스트림 구성 요약이 표시됩니다.

**Kinesis Data Streams API를 사용하여 스트림 생성**
+ Kinesis Data Streams API를 사용하여 스트림을 생성하는 데 대한 자세한 내용은 [API를 사용하여 스트림 생성](kinesis-using-sdk-java-create-stream.md) 섹션을 참조하세요.

**를 사용하여 스트림을 생성하려면 AWS CLI**
+ 를 사용하여 스트림을 생성하는 방법에 대한 자세한 내용은 [create-stream](https://docs.aws.amazon.com/cli/latest/reference/kinesis/create-stream.html) 명령을 AWS CLI참조하세요.

# API를 사용하여 스트림 생성
<a name="kinesis-using-sdk-java-create-stream"></a>

다음 단계에 따라 Kinesis 데이터 스트림을 생성합니다.

## Kinesis Data Streams 클라이언트 구축
<a name="kinesis-using-sdk-java-create-client"></a>

Kinesis 데이터 스트림 작업을 수행하기 전에 클라이언트 객체를 구축해야 합니다. 다음 Java 코드는 클라이언트 빌더를 인스턴스화하고 이를 사용하여 리전, 자격 증명 및 클라이언트 구성을 설정합니다. 그리고 클라이언트 객체를 구축합니다.

```
AmazonKinesisClientBuilder clientBuilder = AmazonKinesisClientBuilder.standard();
        
clientBuilder.setRegion(regionName);
clientBuilder.setCredentials(credentialsProvider);
clientBuilder.setClientConfiguration(config);
        
AmazonKinesis client = clientBuilder.build();
```

자세한 내용은 **AWS 일반 참조의 [Kinesis Data Streams Regions and Endpoints](https://docs.aws.amazon.com/general/latest/gr/rande.html#ak_region)를 참조하세요.

## 스트림 생성
<a name="kinesis-using-sdk-java-create-the-stream"></a>

Kinesis Data Streams 클라이언트를 생성했으므로 콘솔을 사용하거나 프로그래밍 방식으로 스트림을 생성할 수 있습니다. 프로그래밍 방식으로 스트림을 생성하려면 `CreateStreamRequest` 객체를 인스턴스화하고 스트림의 이름을 지정합니다. 프로비저닝된 모드를 사용하려면 사용할 데이터 스트림의 샤드 수를 지정해야 합니다.
+ **온디맨드**:

  ```
  CreateStreamRequest createStreamRequest = new CreateStreamRequest();
  createStreamRequest.setStreamName( myStreamName );
  ```
+ **프로비저닝됨**:

  ```
  CreateStreamRequest createStreamRequest = new CreateStreamRequest();
  createStreamRequest.setStreamName( myStreamName );
  createStreamRequest.setShardCount( myStreamSize );
  ```

스트림 이름은 스트림을 식별합니다. 이름은 애플리케이션에서 사용하는 AWS 계정으로 범위가 지정됩니다. 또한 리전에 의해서도 범위가 지정됩니다. 즉, 서로 다른 두 AWS 계정의 두 스트림은 동일한 이름을 가질 수 있고, 동일한 AWS 계정의 두 스트림은 서로 다른 두 리전의 두 스트림은 동일한 이름을 가질 수 있지만 동일한 계정과 동일한 리전의 두 스트림은 가질 수 없습니다.

스트림의 처리량은 샤드 수의 함수입니다. 프로비저닝된 처리량을 높이려면 더 많은 샤드가 필요합니다. 샤드가 많을수록가 스트림에 대해 AWS 부과하는 비용도 증가합니다. 애플리케이션에 적절한 샤드 수 계산에 대한 자세한 내용은 [스트리밍할 올바른 모드 선택](how-do-i-size-a-stream.md) 단원을 참조하십시오.

 `createStreamRequest` 객체를 구성했으면 클라이언트에 대해 `createStream` 메서드를 호출하여 스트림을 생성합니다. `createStream`을 호출한 후, 스트림이 `ACTIVE` 상태에 도달할 때까지 기다린 다음 스트림에 대한 작업을 수행합니다. 스트림의 상태를 확인하려면 `describeStream` 메서드를 호출하십시오. 그러나 스트림이 존재하지 않는 경우 `describeStream`을 호출하면 예외가 발생합니다. 따라서 `describeStream` 호출을 `try/catch` 블록으로 묶으십시오.

```
client.createStream( createStreamRequest );
DescribeStreamRequest describeStreamRequest = new DescribeStreamRequest();
describeStreamRequest.setStreamName( myStreamName );

long startTime = System.currentTimeMillis();
long endTime = startTime + ( 10 * 60 * 1000 );
while ( System.currentTimeMillis() < endTime ) {
  try {
    Thread.sleep(20 * 1000);
  } 
  catch ( Exception e ) {}
  
  try {
    DescribeStreamResult describeStreamResponse = client.describeStream( describeStreamRequest );
    String streamStatus = describeStreamResponse.getStreamDescription().getStreamStatus();
    if ( streamStatus.equals( "ACTIVE" ) ) {
      break;
    }
    //
    // sleep for one second
    //
    try {
      Thread.sleep( 1000 );
    }
    catch ( Exception e ) {}
  }
  catch ( ResourceNotFoundException e ) {}
}
if ( System.currentTimeMillis() >= endTime ) {
  throw new RuntimeException( "Stream " + myStreamName + " never went active" );
}
```

# 스트림 업데이트
<a name="updating-a-stream"></a>

Kinesis Data Streams 콘솔, Kinesis Data Streams API 또는 AWS CLI를 사용하여 스트림의 세부 정보를 업데이트할 수 있습니다.

**참고**  
기존의 스트림이나 최근에 만든 스트림에 서버 측 암호화를 사용하도록 설정할 수 있습니다.

## 콘솔을 사용합니다.
<a name="update-stream-console"></a>

**콘솔을 사용하여 데이터 스트림을 업데이트하려면**

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

1. 탐색 모음에서 리전 선택기를 확장하고 리전을 선택합니다.

1. 목록에서 스트림 이름을 선택합니다. **Stream Details(스트림 세부 정보)** 페이지에 스트림 구성 요약과 모니터링 정보가 표시됩니다.

1. 데이터 스트림에 대한 온디맨드 용량 모드와 프로비저닝된 용량 모드 사이를 전환하려면 **구성** 탭에서 **용량 모드 편집**을 선택합니다. 자세한 내용은 [스트리밍할 올바른 모드 선택](how-do-i-size-a-stream.md) 단원을 참조하십시오.
**중요**  
 AWS 계정의 각 데이터 스트림에 대해 24시간 이내에 온디맨드 모드와 프로비저닝된 모드 간에 두 번 전환할 수 있습니다.

1. 프로비저닝된 모드를 사용하는 데이터 스트림의 경우 샤드 수를 편집하려면 **구성** 탭에서 **프로비저닝된 샤드 편집**을 선택한 다음 새 샤드 수를 입력합니다.

1. 데이터 레코드의 서버 측 암호화를 활성화하려면 **서버 측 암호화** 섹션에서 **편집**을 선택합니다. 암호화를 위한 마스터 키로 사용할 KMS 키를 선택하거나 Kinesis에서 관리하는 기본 마스터 키인 **aws/kinesis**를 사용합니다. 스트림에 대해 암호화를 활성화하고 자체 AWS KMS 마스터 키를 사용하는 경우 생산자 및 소비자 애플리케이션이 사용한 AWS KMS 마스터 키에 액세스할 수 있는지 확인합니다. 사용자가 생성한 AWS KMS 키에 액세스할 권한을 애플리케이션에 할당하려면 [사용자 생성 KMS 키 사용 권한](permissions-user-key-KMS.md)를 참조하십시오.

1. 데이터 보존 기간을 편집하려면 **데이터 보존 기간** 섹션에서 **편집**을 선택한 다음 새 데이터 보존 기간을 입력합니다.

1. 계정에서 사용자 지정 지표를 활성화한 경우 **샤드 수준 지표** 섹션에서 **편집**을 선택한 다음 스트림의 지표를 지정합니다. 자세한 내용은 [Amazon CloudWatch를 사용한 Amazon Kinesis Data Streams 서비스 모니터링](monitoring-with-cloudwatch.md) 단원을 참조하십시오.

## API 사용
<a name="update-stream-api"></a>

API를 사용하여 스트림 세부 정보를 업데이트하려면 다음 방법을 참조하십시오.
+ [AddTagsToStream](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_AddTagsToStream.html)
+ [DecreaseStreamRetentionPeriod](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_DecreaseStreamRetentionPeriod.html)
+ [DisableEnhancedMonitoring](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_DisableEnhancedMonitoring.html)
+ [EnableEnhancedMonitoring](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_EnableEnhancedMonitoring.html)
+ [IncreaseStreamRetentionPeriod](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_IncreaseStreamRetentionPeriod.html)
+ [RemoveTagsFromStream](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_RemoveTagsFromStream.html)
+ [StartStreamEncryption](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_StartStreamEncryption.html)
+ [StopStreamEncryption](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_StopStreamEncryption.html)
+ [UpdateShardCount](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_UpdateShardCount.html)

## 사용 AWS CLI
<a name="update-stream-cli"></a>

를 사용하여 스트림을 업데이트하는 방법에 대한 자세한 AWS CLI내용은 [Kinesis CLI 참조](https://docs.aws.amazon.com/cli/latest/reference/kinesis/index.html)를 참조하세요.

# 스트림 나열
<a name="kinesis-using-sdk-java-list-streams"></a>

스트림은 Kinesis Data Streams 클라이언트를 인스턴스화하는 데 사용되는 AWS 자격 증명과 연결된 AWS 계정과 클라이언트에 지정된 리전으로 범위가 지정됩니다. AWS 계정에서는 한 번에 여러 스트림이 활성 상태가 될 수 있습니다. Kinesis Data Streams 콘솔에서 또는 프로그래밍 방식으로 스트림을 나열할 수 있습니다. 이 섹션의 코드는 AWS 계정의 모든 스트림을 나열하는 방법을 보여줍니다.

```
ListStreamsRequest listStreamsRequest = new ListStreamsRequest();
listStreamsRequest.setLimit(20); 
ListStreamsResult listStreamsResult = client.listStreams(listStreamsRequest);
List<String> streamNames = listStreamsResult.getStreamNames();
```

이 코드 예제는 먼저 `ListStreamsRequest`의 새 인스턴스를 생성하고 해당 `setLimit` 메서드를 호출하여 각 호출에 대해 최대 20개의 스트림이 `listStreams`에 반환되도록 지정합니다. `setLimit`에 대한 값을 지정하지 않으면 Kinesis Data Streams에서는 계정의 수보다 작거나 같은 스트림 수를 반환합니다. 그런 다음 이 코드는 `listStreamsRequest`를 클라이언트의 `listStreams` 메서드로 전달합니다. 반환 값 `listStreams`는 `ListStreamsResult` 객체에 저장됩니다. 이 코드는 이 객체에 대해 `getStreamNames` 메서드를 호출하고 반환된 스트림 이름을 `streamNames` 목록에 저장합니다. Kinesis Data Streams는 계정 및 리전에서 더 많은 스트림이 있는 경우에도 지정된 한도에서 지정된 수보다 더 작은 스트림을 반환할 수 있습니다. 모든 스트림을 검색하려면 다음 코드 예제에 설명된 대로 `getHasMoreStreams` 메서드를 사용하십시오.

```
while (listStreamsResult.getHasMoreStreams()) 
{
    if (streamNames.size() > 0) {
      listStreamsRequest.setExclusiveStartStreamName(streamNames.get(streamNames.size() - 1));
    }
    listStreamsResult = client.listStreams(listStreamsRequest);
    streamNames.addAll(listStreamsResult.getStreamNames());
}
```

이 코드는 `getHasMoreStreams`에 대해 `listStreamsRequest` 메서드를 호출하여 `listStreams`에 대해 초기 호출에서 반환된 스트림 이외에 사용 가능한 추가 스트림이 있는지 여부를 확인합니다. 있는 경우 이 코드는 `setExclusiveStartStreamName`에 대해 이전 호출에서 반환된 마지막 스트림의 이름으로 `listStreams` 메서드를 호출합니다. `setExclusiveStartStreamName` 메서드는 `listStreams`에 대한 다음 호출이 해당 스트림 이후에 시작하도록 합니다. 이 호출에 의해 반환된 스트림 이름의 그룹은 `streamNames` 목록에 추가됩니다. 이 프로세스는 모든 스트림 이름이 목록에 수집될 때까지 계속 진행됩니다.

 `listStreams`에 의해 호출된 스트림은 다음 상태 중 하나일 수 있습니다.
+ `CREATING`
+ `ACTIVE`
+ `UPDATING`
+ `DELETING`

이전 단원인 `describeStream`에 표시된 대로 [API를 사용하여 스트림 생성](kinesis-using-sdk-java-create-stream.md) 메서드를 사용하여 스트림의 상태를 확인할 수 있습니다.

# 샤드 나열
<a name="kinesis-using-sdk-java-list-shards"></a>

한 데이터 스트림에는 하나 이상의 샤드가 있을 수 있습니다. 데이터 스트림에서 샤드를 나열하거나 검색하는 데 권장되는 방법은 [ListShards](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_ListShards.html) API를 사용하는 것입니다. 다음 예제에서는 데이터 스트림에서 샤드 목록을 가져오는 방법을 보여줍니다. 이 예제에 사용되는 기본 작업과 이 작업에 설정할 수 있는 모든 파라미터에 대한 완전한 설명은 [ListShards](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_ListShards.html)를 참조하십시오.

```
import software.amazon.awssdk.services.kinesis.KinesisAsyncClient;
import software.amazon.awssdk.services.kinesis.model.ListShardsRequest;
import software.amazon.awssdk.services.kinesis.model.ListShardsResponse;

import java.util.concurrent.TimeUnit;

public class ShardSample {

    public static void main(String[] args) {

        KinesisAsyncClient client = KinesisAsyncClient.builder().build();

        ListShardsRequest request = ListShardsRequest
                .builder().streamName("myFirstStream")
                .build();

        try {
            ListShardsResponse response = client.listShards(request).get(5000, TimeUnit.MILLISECONDS);
            System.out.println(response.toString());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}
```

이전 코드 예제를 실행하려면 다음과 같은 POM 파일을 사용할 수 있습니다.

```
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>kinesis.data.streams.samples</groupId>
    <artifactId>shards</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>kinesis</artifactId>
            <version>2.0.0</version>
        </dependency>
    </dependencies>
</project>
```

`ListShards` API를 사용하면 [ShardFilter](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_ShardFilter.html) 파라미터로 API의 응답을 필터링할 수 있습니다. 한 번에 하나의 필터만 지정할 수 있습니다.

ListShards API를 간접적으로 호출할 때 `ShardFilter` 파라미터를 사용하는 경우 `Type`는 필수 속성이므로 반드시 지정해야 합니다. `AT_TRIM_HORIZON`, `FROM_TRIM_HORIZON` 또는 `AT_LATEST` 유형을 지정하는 경우 `ShardId` 또는 `Timestamp` 선택적 속성을 지정할 필요가 없습니다.

`AFTER_SHARD_ID` 유형을 지정하는 경우 선택적 `ShardId` 속성의 값도 제공해야 합니다. `ShardId` 속성은 기능면에서 ListShards API의 `ExclusiveStartShardId` 파라미터와 동일합니다. `ShardId` 속성이 지정되면 제공된 `ShardId` 바로 뒤에 ID가 있는 샤드로 시작하는 샤드가 응답에 포함됩니다.

`AT_TIMESTAMP` 또는 `FROM_TIMESTAMP_ID` 유형을 지정하면 선택적 `Timestamp` 속성의 값도 제공해야 합니다. `AT_TIMESTAMP` 유형을 지정하면 제공된 타임스탬프에 열려 있던 모든 샤드가 반환됩니다. `FROM_TIMESTAMP` 유형을 지정하면 제공된 타임스탬프부터 TIP까지의 모든 샤드가 반환됩니다.

**중요**  
`DescribeStreamSummary` 및 `ListShard` API는 데이터 스트림에 대한 정보를 검색할 수 있는 보다 확장 가능한 방법을 제공합니다. 더 구체적으로 말하면, DescribeStream API에 대한 할당량으로 인해 제한이 발생할 수 있습니다. 자세한 내용은 [할당량 및 제한](service-sizes-and-limits.md) 단원을 참조하십시오. 또한 `DescribeStream` 할당량은 AWS 계정의 모든 데이터 스트림과 상호 작용하는 모든 애플리케이션에서 공유됩니다. 반면 ListShards API의 할당량은 단일 데이터 스트림에만 적용됩니다. 따라서 ListShards API를 사용하면 더 높은 TPS를 얻을 수 있을 뿐만 아니라 더 많은 데이터 스트림을 생성할수록 작업 규모가 더 잘 확장됩니다.  
DescribeStream API를 직접적으로 호출하는 모든 생산자와 소비자를 마이그레이션하여 대신 DescribeStreamSummary 및 ListShard API를 간접적으로 호출하는 것이 좋습니다. 이러한 생산자와 소비자를 식별하려면 API 호출에서 KPL 및 KCL용 사용자 에이전트가 캡처되므로 Athena를 사용하여 CloudTrail 로그를 구문 분석하는 것이 좋습니다.  

```
SELECT useridentity.sessioncontext.sessionissuer.username, 
useridentity.arn,eventname,useragent, count(*) FROM 
cloudtrail_logs WHERE Eventname IN ('DescribeStream')  AND 
eventtime
    BETWEEN ''
        AND ''
GROUP BY  useridentity.sessioncontext.sessionissuer.username,useridentity.arn,eventname,useragent
ORDER BY  count(*) DESC LIMIT 100
```
또한 `DescribeStream` API를 호출하는 Kinesis Data Streams와의 AWS Lambda 및 Amazon Firehose 통합을 재구성하여 통합이 대신 `DescribeStreamSummary` 및를 호출하도록 하는 것이 좋습니다`ListShards`. 특히 AWS Lambda의 경우 이벤트 소스 매핑을 업데이트해야 합니다. Amazon Firehose의 경우 `ListShards` IAM 권한이 포함되도록 해당 IAM 권한을 업데이트해야 합니다.

# 스트림을 삭제
<a name="kinesis-using-sdk-java-delete-stream"></a>

Kinesis Data Streams 콘솔 또는 프로그래밍 방식으로 스트림을 삭제할 수 있습니다. 프로그래밍 방식으로 스트림을 삭제하려면 다음 코드에 표시된 대로 `DeleteStreamRequest`를 사용하십시오.

```
DeleteStreamRequest deleteStreamRequest = new DeleteStreamRequest();
deleteStreamRequest.setStreamName(myStreamName);
client.deleteStream(deleteStreamRequest);
```

삭제하기 전에 스트림에서 작동 중인 모든 애플리케이션을 종료하십시오. 애플리케이션이 삭제된 스트림에서 작동을 시도하면 `ResourceNotFound` 예외가 발생합니다. 또한 이후에 이전 스트림과 이름이 동일한 새 스트림을 생성하고 이전 스트림에서 작동 중인 애플리케이션이 계속 실행되고 있는 경우 이러한 애플리케이션은 이전 스트림인 것처럼 새 스트림과 상호 작용하려고 시도할 수 있으며 이로 인해 예기치 않은 결과가 발생할 수 있습니다.

# 스트림 리샤딩
<a name="kinesis-using-sdk-java-resharding"></a>

**중요**  
[UpdateShardCount](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_UpdateShardCount.html) API를 사용하여 스트림을 리샤딩할 수 있습니다. 그렇지 않은 경우 여기에 설명된 대로 분할 및 병합을 계속 수행할 수 있습니다.

Amazon Kinesis Data Streams는 스트림을 통과하는 데이터 흐름 속도의 변화에 맞게 스트림의 샤드 수를 조정할 수 있는 **리샤딩을 지원합니다. 리샤딩은 고급 작업으로 간주됩니다. Kinesis Data Streams를 처음 사용하는 경우 Kinesis Data Streams의 다른 모든 측면을 숙지한 후 이 주제로 돌아오세요.

샤드 분할과 샤드 병합이라는 두 가지 유형의 리샤딩 작업이 있습니다. 샤드 분할에서는 단일 샤드를 샤드 두 개로 나눕니다. 샤드 병합에서는 샤드 두 개를 단일 샤드로 결합합니다. 리샤딩은 단일 작업으로 두 개를 초과하는 샤드로 분할할 수 없으며, 단일 작업으로 두 개를 초과하는 샤드를 병합할 수 없다는 의미에서 항상 *쌍으로* 이루어집니다. 리샤딩 작업이 실행되는 샤드 또는 샤드 쌍을 *상위* 샤드라고 합니다. 리샤딩 작업으로 인해 발생하는 샤드 또는 샤드 쌍을 *하위* 샤드라고 합니다.

분할로 인해 스트림에서 샤드 수가 증가하므로 스트림의 데이터 용량이 증가합니다. 샤드 수를 기준으로 요금이 부과되므로 분할하면 스트림의 비용이 증가합니다. 마찬가지로 병합하면 스트림의 샤드 수가 줄어들어 스트림의 데이터 용량과 비용이 감소합니다.

일반적으로 리샤딩은 생산자(넣기) 애플리케이션 및 소비자(가져오기) 애플리케이션과 구별되는 관리자 애플리케이션에 의해 수행됩니다. 이러한 관리자 애플리케이션은 Amazon CloudWatch에서 제공된 지표 또는 생산자와 소비자에서 수집된 지표에 따라 스트림의 전체 성능을 모니터링합니다. 또한 소비자 및 생산자는 일반적으로 리샤딩에 사용되는 API에 대한 액세스 권한이 필요하지 않으므로, 관리자 애플리케이션은 소비자 또는 생산자보다 광범위한 IAM 권한이 있어야 합니다. Kinesis Data Streams의 IAM 권한에 대한 자세한 내용은 [IAM을 사용하여 Amazon Kinesis Data Streams 리소스에 대한 액세스 제어](controlling-access.md) 섹션을 참조하세요.

리샤딩에 대한 자세한 내용은 [Kinesis Data Streams에서 열린 샤드 수를 변경하려면 어떻게 해야 합니까?](https://aws.amazon.com/premiumsupport/knowledge-center/kinesis-data-streams-open-shards/)를 참조하세요.

**Topics**
+ [리샤딩에 대한 전략 결정](kinesis-using-sdk-java-resharding-strategies.md)
+ [샤드 분할](kinesis-using-sdk-java-resharding-split.md)
+ [두 개의 샤드 병합](kinesis-using-sdk-java-resharding-merge.md)
+ [리샤딩 작업 완료](kinesis-using-sdk-java-after-resharding.md)

# 리샤딩에 대한 전략 결정
<a name="kinesis-using-sdk-java-resharding-strategies"></a>

Amazon Kinesis Data Streams의 리샤딩 목적은 데이터 흐름 속도의 변화에 따라 스트림을 조정할 수 있도록 하는 것입니다. 스트림의 용량(및 비용)을 늘리려면 샤드를 분할합니다. 스트림의 비용(및 용량)을 줄이려면 샤드를 병합합니다.

 리샤딩에 대한 한 가지 접근 방식은 스트림의 모든 샤드를 분할하는 것입니다. 이렇게 하면 스트림 용량이 2배가 됩니다. 그러나 이렇게 하면 실제로 필요한 용량보다 더 많은 추가 용량을 제공하므로 불필요한 비용이 발생합니다.

또한 지표를 사용하여 *핫* 또는 *콜드* 샤드, 즉 예상보다 더 많은 데이터 또는 더 적은 데이터를 받는 샤드를 결정할 수 있습니다. 그런 다음 선택적으로 핫 샤드를 분할하여 해당 샤드를 대상으로 지정하는 해시 키에 대한 용량을 늘릴 수 있습니다. 마찬가지로 콜드 샤드를 병합하여 사용하지 않은 용량을 유용하게 사용할 수 있습니다.

Kinesis Data Streams가 게시하는 Amazon CloudWatch 지표에서 스트림에 대한 몇 가지 성능 데이터를 얻을 수 있습니다. 그러나 스트림에 대한 고유한 측정치 중 일부를 수집할 수도 있습니다. 한 가지 접근 방법은 데이터 레코드에 대한 파티션 키에 의해 생성된 해시 키 값을 기록하는 것입니다. 스트림에 레코드를 추가할 때 파티션 키를 지정해야 함을 유의하십시오.

```
putRecordRequest.setPartitionKey( String.format( "myPartitionKey" ) );
```

Kinesis Data Streams는 [MD5](http://en.wikipedia.org/wiki/MD5)를 사용하여 파티션 키에서 해시 키를 계산합니다. 레코드에 대한 파티션 키를 지정하므로 MD5를 사용하여 해당 레코드에 대한 해시 키 값을 계산하고 기록할 수 있습니다.

또한 데이터 레코드가 할당된 샤드 ID도 기록할 수 있습니다. `getShardId` 메서드에 의해 반환된 `putRecordResults` 객체와 `putRecords` 메서드에 의해 반환된 `putRecordResult` 객체의 `putRecord` 메서드를 통해 샤드 ID를 사용할 수 있습니다.

```
String shardId = putRecordResult.getShardId();
```

샤드 ID와 해시 키 값을 사용하면 가장 많은 또는 가장 적은 트래픽을 받는 샤드 및 해시 키를 결정할 수 있습니다. 그런 다음 리샤딩을 사용하여 이러한 키에 적합하게 더 많은 또는 더 적은 용량을 제공할 수 있습니다.

# 샤드 분할
<a name="kinesis-using-sdk-java-resharding-split"></a>

Amazon Kinesis Data Streams에서 샤드를 분할하려면 해시 키 값을 상위 샤드에서 하위 샤드로 재배포하는 방법을 지정해야 합니다. 스트림에 데이터 레코드를 추가하면 해시 키 값에 따라 샤드에 할당됩니다. 해시 키 값은 스트림에 데이터 레코드를 추가할 때 데이터 레코드에 대해 지정하는 파티션 키의 [MD5](http://en.wikipedia.org/wiki/MD5) 해시입니다. 동일한 파티션 키가 있는 데이터 레코드에는 동일한 해시 키 값도 있습니다.

지정된 샤드에 대해 가능한 해시 키 값은 정렬된 연속적인 음수가 아닌 정수의 집합을 구성합니다. 가능한 해시 키 값의 범위는 다음에 의해 지정됩니다.

```
shard.getHashKeyRange().getStartingHashKey();
shard.getHashKeyRange().getEndingHashKey();
```

샤드를 분할할 때 이 범위의 값을 지정합니다. 해당 해시 키 값과 더 높은 모든 해시 키 값은 하위 샤드 중 하나로 배포됩니다. 더 낮은 모든 해시 키 값은 다른 하위 샤드로 배포됩니다.

다음 코드는 각 하위 샤드에서 해시 키를 고르게 재배포하고 기본적으로 상위 샤드를 절반으로 분할하는 샤드 분할 작업을 보여줍니다. 이는 상위 샤드를 분할할 수 있는 방법 중 하나일 뿐입니다. 예를 들어, 상위에서 키의 하위 3분의 1이 하위 샤드 하나로 이동하고, 키의 상위 3분의 2가 다른 하위 샤드로 이동하도록 샤드를 분할할 수 있습니다. 그러나 여러 애플리케이션의 경우 샤드를 절반으로 분할하는 것이 효과적인 방식입니다.

이 코드에서는 `myStreamName`이 스트림의 이름을 보유하고 객체 변수 `shard`가 분할할 샤드를 보유한다고 가정합니다. 먼저 새 `splitShardRequest` 객체를 인스턴스화하고 스트림 이름과 샤드 ID를 설정합니다.

```
SplitShardRequest splitShardRequest = new SplitShardRequest();
splitShardRequest.setStreamName(myStreamName);
splitShardRequest.setShardToSplit(shard.getShardId());
```

샤드에서 가장 낮은 값과 가장 높은 값의 절반으로 해시 키 값을 결정합니다. 이는 상위 샤드에서 해시 키의 상위 절반을 포함하는 하위 샤드에 대한 시작 해시 키 값입니다. `setNewStartingHashKey` 메서드에서 이 값을 지정합니다. 이 값만 지정하면 됩니다. Kinesis Data Streams가 분할에 의해 생성된 다른 하위 샤드에 이 값 미만의 해시 키를 자동으로 배포합니다. 마지막 단계는 Kinesis Data Streams 클라이언트에서 `splitShard` 메서드를 직접적으로 호출하는 것입니다.

```
BigInteger startingHashKey = new BigInteger(shard.getHashKeyRange().getStartingHashKey());
BigInteger endingHashKey   = new BigInteger(shard.getHashKeyRange().getEndingHashKey());
String newStartingHashKey  = startingHashKey.add(endingHashKey).divide(new BigInteger("2")).toString();

splitShardRequest.setNewStartingHashKey(newStartingHashKey);
client.splitShard(splitShardRequest);
```

이 절차 이후 첫 번째 단계는 [스트림이 다시 활성 상태가 될 때까지 대기](kinesis-using-sdk-java-after-resharding.md#kinesis-using-sdk-java-resharding-wait-until-active)에 표시됩니다.

# 두 개의 샤드 병합
<a name="kinesis-using-sdk-java-resharding-merge"></a>

 샤드 병합 작업은 지정된 샤드 두 개를 가져와 단일 샤드로 결합합니다. 병합 이후 단일 하위 샤드는 두 개의 상위 샤드가 포함하는 모든 해시 키 값에 대한 데이터를 받습니다.

**샤드 인접**  
두 개의 샤드를 병합하려면 샤드가 *인접*해야 합니다. 두 개의 샤드에 대한 해시 키 범위의 조합이 간격이 없는 연속적인 집합을 이룰 경우 두 개의 샤드는 인접했다고 간주됩니다. 예를 들어, 두 개의 샤드가 있으며 샤드 하나의 해시 키 범위가 276...381이고 다른 샤드 하나의 해시 키 범위가 382...454라고 가정하면, 이 두 개의 샤드를 해시 키 범위가 276...454인 단일 샤드로 병합할 수 있습니다.

또 다른 예를 들어, 두 개의 샤드가 있으며 샤드 하나의 해시 키 범위가 276...381이고 다른 샤드 하나의 해시 키 범위가 455...560이라고 가정하면, 이 두 개의 샤드 간에는 범위가 382..454인 하나 이상의 샤드가 있으므로 이 두 개의 샤드를 병합할 수 없습니다.

스트림의 모든 `OPEN` 샤드 세트(그룹)는 항상 MD5 해시 키 값의 전체 범위에 걸쳐 있습니다. `CLOSED`와 같은 샤드 상태에 대한 자세한 내용은 [리샤딩 후 데이터 라우팅, 데이터 지속성 및 샤드 상태 고려](kinesis-using-sdk-java-after-resharding.md#kinesis-using-sdk-java-resharding-data-routing) 섹션을 참조하세요.

병합을 위한 후보인 샤드를 식별하려면 `CLOSED` 상태의 모든 샤드를 필터링해야 합니다. `OPEN` 상태, 즉 `CLOSED` 상태가 아닌 샤드의 종료 시퀀스 번호는 `null`입니다. 다음을 사용하여 샤드에 대한 종료 시퀀스 번호를 테스트할 수 있습니다.

```
if( null == shard.getSequenceNumberRange().getEndingSequenceNumber() ) 
{
  // Shard is OPEN, so it is a possible candidate to be merged.
}
```

닫힌 샤드를 필터링한 후 각 샤드에 의해 지원되는 가장 높은 해시 키 값을 기준으로 남은 샤드를 정렬합니다. 다음을 사용하여 이 값을 검색할 수 있습니다.

```
shard.getHashKeyRange().getEndingHashKey();
```

 필터링되고 정렬된 목록에서 두 개의 샤드가 인접한 경우 해당 샤드를 병합할 수 있습니다.

**병합 작업에 대한 코드**  
 다음 코드는 두 개의 샤드를 병합합니다. 이 코드에서는 `myStreamName`이 스트림의 이름을 보유하고 객체 변수 `shard1` 및 `shard2`가 병합할 두 인접 샤드를 보유한다고 가정합니다.

병합 작업의 경우 먼저 새 `mergeShardsRequest` 객체를 인스턴스화합니다. `setStreamName` 메서드로 스트림 이름을 지정합니다. 그런 다음 `setShardToMerge` 및 `setAdjacentShardToMerge` 메서드를 사용하여 병합할 두 개의 샤드를 지정합니다. 마지막으로 Kinesis Data Streams 클라이언트에서 `mergeShards` 메서드를 직접적으로 호출하여 작업을 수행합니다.

```
MergeShardsRequest mergeShardsRequest = new MergeShardsRequest();
mergeShardsRequest.setStreamName(myStreamName);
mergeShardsRequest.setShardToMerge(shard1.getShardId());
mergeShardsRequest.setAdjacentShardToMerge(shard2.getShardId());
client.mergeShards(mergeShardsRequest);
```

이 절차 이후 첫 번째 단계는 [스트림이 다시 활성 상태가 될 때까지 대기](kinesis-using-sdk-java-after-resharding.md#kinesis-using-sdk-java-resharding-wait-until-active)에 표시됩니다.

# 리샤딩 작업 완료
<a name="kinesis-using-sdk-java-after-resharding"></a>

Amazon Kinesis Data Streams의 리샤딩 절차 이후 일반 레코드 처리를 재개하기 전에 다른 절차 및 고려 사항이 필요합니다. 다음 단원에서는 이에 대해 설명합니다.

**Topics**
+ [스트림이 다시 활성 상태가 될 때까지 대기](#kinesis-using-sdk-java-resharding-wait-until-active)
+ [리샤딩 후 데이터 라우팅, 데이터 지속성 및 샤드 상태 고려](#kinesis-using-sdk-java-resharding-data-routing)

## 스트림이 다시 활성 상태가 될 때까지 대기
<a name="kinesis-using-sdk-java-resharding-wait-until-active"></a>

`splitShard` 또는 `mergeShards`의 리샤딩 작업을 호출한 후 스트림이 다시 활성 상태가 될 때까지 기다려야 합니다. 사용할 코드는 [스트림 생성](kinesis-using-sdk-java-create-stream.md) 후 스트림이 활성화될 때까지 대기할 경우와 동일합니다. 코드는 다음과 같습니다.

```
DescribeStreamRequest describeStreamRequest = new DescribeStreamRequest();
describeStreamRequest.setStreamName( myStreamName );

long startTime = System.currentTimeMillis();
long endTime = startTime + ( 10 * 60 * 1000 );
while ( System.currentTimeMillis() < endTime ) 
{
  try {
    Thread.sleep(20 * 1000);
  } 
  catch ( Exception e ) {}
  
  try {
    DescribeStreamResult describeStreamResponse = client.describeStream( describeStreamRequest );
    String streamStatus = describeStreamResponse.getStreamDescription().getStreamStatus();
    if ( streamStatus.equals( "ACTIVE" ) ) {
      break;
    }
   //
    // sleep for one second
    //
    try {
      Thread.sleep( 1000 );
    }
    catch ( Exception e ) {}
  }
  catch ( ResourceNotFoundException e ) {}
}
if ( System.currentTimeMillis() >= endTime ) 
{
  throw new RuntimeException( "Stream " + myStreamName + " never went active" );
}
```

## 리샤딩 후 데이터 라우팅, 데이터 지속성 및 샤드 상태 고려
<a name="kinesis-using-sdk-java-resharding-data-routing"></a>

Kinesis Data Streams는 실시간 데이터 스트리밍 서비스입니다. 애플리케이션에서는 데이터가 스트림의 샤드를 통해 지속적으로 흐르고 있다고 가정해야 합니다. 리샤딩하면 상위 샤드로 이동하는 데이터 레코드가 데이터 레코드 파티션 키가 매핑되는 해시 키 값에 따라 하위 샤드로 이동하도록 다시 라우팅됩니다. 그러나 리샤딩 전에 상위 샤드에 있는 데이터 레코드는 해당 샤드에 유지됩니다. 리샤딩이 발생할 때 상위 샤드가 사라지지 않습니다. 리샤딩 전에 포함하는 데이터와 함께 유지됩니다. 상위 샤드의 데이터 레코드는 Kinesis Data Streams API의 [`getShardIterator` 및 `getRecords`](developing-consumers-with-sdk.md#kinesis-using-sdk-java-get-data) 작업을 사용하거나 Kinesis Client Library를 통해 액세스할 수 있습니다.

**참고**  
데이터 레코드가 스트림에 추가된 시점으로부터 현재 보존 기간까지 데이터 레코드에 액세스할 수 있습니다. 이는 해당 기간 동안 스트림의 샤드가 변경되는지 여부와 관계없이 마찬가지입니다. 스트림의 보존 기간에 대한 자세한 내용은 [데이터 보존 기간 변경](kinesis-extended-retention.md) 단원을 참조하십시오.

리샤딩 프로세스에서 상위 샤드가 `OPEN` 상태에서 `CLOSED` 상태로, `EXPIRED` 상태로 전환됩니다.
+  **OPEN**: 리샤딩 작업 전 상위 샤드는 `OPEN` 상태입니다. 즉, 데이터 레코드를 샤드에 추가하고 샤드에서 검색할 수 있습니다.
+  **CLOSED**: 리샤딩 작업 후 상위 샤드가 `CLOSED` 상태로 전환됩니다. 즉, 데이터 레코드가 더 이상 샤드에 추가되지 않습니다. 이 샤드에 추가된 데이터 레코드는 이제 하위 샤드에 대신 추가됩니다. 그러나 제한된 기간 동안 계속 샤드에서 데이터 레코드를 검색할 수 있습니다.
+  **EXPIRED**: 스트림의 보존 기간이 만료된 후 상위 샤드에 있는 모든 데이터 레코드가 만료되며 더 이상 액세스할 수 없습니다. 이때 샤드 자체는 `EXPIRED` 상태로 전환됩니다. 스트림에 샤드를 열거하기 위한 `getStreamDescription().getShards`를 호출하면 반환된 목록 샤드에 `EXPIRED` 샤드가 포함되지 않습니다. 스트림의 보존 기간에 대한 자세한 내용은 [데이터 보존 기간 변경](kinesis-extended-retention.md) 단원을 참조하십시오.

리샤딩이 발생하고 스트림이 다시 `ACTIVE` 상태가 된 후 즉시 하위 샤드에서 데이터를 읽기 시작할 수 있습니다. 그러나 리샤딩 후 남아 있는 상위 샤드는 리샤딩 전에 스트림에 추가되어 아직 읽지 않은 데이터를 계속 포함할 수 있습니다. 상위 샤드에서 모든 데이터를 읽기 전에 하위 샤드에서 데이터를 읽는 경우 데이터 레코드의 시퀀스 번호에 의해 지정된 순서가 아닌 다른 순서로 특정 해시 키에 대한 데이터를 읽을 수 있습니다. 따라서 데이터 순서가 중요하다고 간주하는 경우, 리샤딩 후 다 읽을 때까지 항상 상위 샤드에서 데이터를 계속 읽어야 합니다. 그런 다음 하위 샤드에서 데이터를 읽기 시작해야 합니다. `getRecordsResult.getNextShardIterator`가 `null`을 반환하면 상위 샤드에서 모든 데이터를 읽었음을 나타냅니다.

# 데이터 보존 기간 변경
<a name="kinesis-extended-retention"></a>

Amazon Kinesis Data Streams는 데이터 스트림의 데이터 레코드 보존 기간에 대한 변경을 지원합니다. Kinesis 데이터 스트림은 실시간으로 읽고 쓸 수 있는 정렬된 순서의 데이터 레코드입니다. 따라서 데이터 레코드는 스트림의 샤드에 일시적으로 저장됩니다. 데이터가 추가된 시점부터 더 이상 액세스할 수 없는 시점까지의 기간을 *보관 기간*이라고 합니다. Kinesis 데이터 스트림은 기본적으로 24시간부터 최대 8,760시간(365일)까지 레코드를 저장합니다.

Kinesis Data Streams 콘솔을 통해 또는 [IncreaseStreamRetentionPeriod](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_IncreaseStreamRetentionPeriod.html) 및 [DecreaseStreamRetentionPeriod](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_DecreaseStreamRetentionPeriod.html) 작업을 사용하여 보존 기간을 업데이트할 수 있습니다. Kinesis Data Streams 콘솔을 사용하면 둘 이상의 데이터 스트림의 보존 기간을 동시에 일괄 편집할 수 있습니다. [IncreaseStreamRetentionPeriod](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_IncreaseStreamRetentionPeriod.html) 작업 또는 Kinesis Data Streams 콘솔을 사용하여 보존 기간을 최대 8,760시간(365일)까지 늘릴 수 있습니다. [DecreaseStreamRetentionPeriod](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_DecreaseStreamRetentionPeriod.html) 작업 또는 Kinesis Data Streams 콘솔을 사용하여 보존 기간을 최소 24시간까지 줄일 수 있습니다. 두 작업에 대한 요청 구문에는 스트림 이름과 보존 기간(시간)이 포함됩니다. 마지막으로 [DescribeStream](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_DescribeStream.html) 작업을 직접적으로 호출하여 스트림의 현재 보관 기간을 확인할 수 있습니다.

다음은 AWS CLI를 사용하여 보존 기간을 변경하는 예제입니다.

```
aws kinesis increase-stream-retention-period --stream-name retentionPeriodDemo --retention-period-hours 72
```

Kinesis Data Streams는 보존 기간이 증가한 몇 분 내에 이전 보존 기간에서 레코드에 액세스할 수 있도록 합니다. 예를 들어, 보존 기간을 24시간에서 48시간으로 변경하면 23시간 55분 전에 스트림에 추가된 레코드는 24시간 후에도 계속 사용할 수 있습니다.

보존 기간이 감소되면 Kinesis Data Streams는 새 보존 기간보다 이전인 레코드를 즉시 액세스할 수 없도록 합니다. 따라서 [DecreaseStreamRetentionPeriod](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_DecreaseStreamRetentionPeriod.html) 작업을 직접적으로 호출할 때 각별히 주의하세요.

문제가 발생할 경우 데이터가 만료되기 전에 소비자가 데이터를 읽을 수 있도록 데이터 보존 기간을 설정하십시오. 레코드 처리 로직 문제 또는 장기간 동안 다운스트림 종속성이 중단된 문제 등 모든 가능성을 신중하게 고려해야 합니다. 보존 기간은 데이터 소비자가 복구하는 데 많은 시간을 허용하는 안전망으로 생각해야 합니다. 보존 기간 API 작업을 통해 이 기간을 사전에 설정하거나 운영 이벤트에 대해 사후 예방적으로 대응할 수 있습니다.

 24시간을 초과하여 보존 기간을 설정하면 스트림에 추가 요금이 적용됩니다. 자세한 내용은 [Amazon Kinesis Data Streams 요금](https://aws.amazon.com/kinesis/data-streams/pricing/)을 참조하십시오.

# Amazon Kinesis Data Streams 리소스에 태그 지정
<a name="tagging"></a>

Amazon Kinesis Data Streams에서 생성한 스트림 및 향상된 팬아웃 소비자에게 자체 메타데이터를 *태그* 형태로 할당할 수 있습니다. 태그는 스트림에 대해 정의된 키-값 페어입니다. 태그를 사용하는 것은 AWS 리소스를 관리하고 결제 데이터를 포함한 데이터를 구성하는 간단하지만 강력한 방법입니다.

**Topics**
+ [태그 기본 사항 검토](#tagging-basics)
+ [태그 지정을 사용하여 비용 추적](#tagging-billing)
+ [태그 제한 이해](#tagging-restrictions)
+ [Kinesis Data Streams 콘솔을 사용하여 스트림 태그 지정](#tagging-console)
+ [를 사용하여 스트림에 태그 지정 AWS CLI](#tagging-cli)
+ [Kinesis Data Streams API를 사용하여 스트림 태그 지정](#tagging-api)
+ [를 사용하여 소비자에게 태그 지정 AWS CLI](#tagging-consumers-cli)
+ [Kinesis Data Streams API를 사용하여 소비자 태그 지정](#tagging-consumers-api)

## 태그 기본 사항 검토
<a name="tagging-basics"></a>

태그를 지정할 수 있는 Kinesis Data Streams 리소스에는 데이터 스트림과 향상된 팬아웃 소비자가 포함됩니다. Kinesis Data Streams 콘솔 AWS CLI또는 Kinesis Data Streams API를 사용하여 다음 작업을 완료합니다.
+ 태그가 지정된 리소스 생성
+ 리소스에 태그 추가
+ 리소스에 대한 태그 나열
+ 리소스에서 태그 제거

**참고**  
Kinesis Data Streams 콘솔을 사용하여 향상된 팬아웃 소비자에게 태그를 적용할 수 없습니다. 소비자에게 태그를 적용하려면 AWS CLI 또는 Kinesis Data Streams API를 사용합니다.

 태그를 사용하여 리소스를 범주화할 수 있습니다. 예를 들어, 용도, 소유자 또는 환경 기준별로 리소스를 범주화할 수 있습니다. 각 태그에 대해 키와 값이 정의되기 때문에 특정 요구를 충족하는 사용자 지정 범주 세트를 생성할 수 있습니다. 예를 들어, 태그 세트를 정의하여 소유자 및 연관된 애플리케이션에 따라 리소스를 추적할 수 있습니다. 다음은 태그의 몇 가지 예제입니다.
+ 프로젝트: 프로젝트 이름
+ 소유자: 이름
+ 용도: 로드 테스트 
+ 애플리케이션: 애플리케이션 이름
+ 환경: 프로덕션 

**중요**  
스트림을 생성하는 동안 태그를 추가하려면 해당 스트림에 대한 `kinesis:CreateStream` 및 `kinesis:AddTagsToStream` 권한을 포함해야 합니다. 스트림을 생성하는 동안에는 `kinesis:TagResource` 권한을 **사용**하여 태그를 지정할 수 없습니다.
소비자 등록 중에 태그를 추가하려면 `kinesis:TagResource` 및 `kinesis:RegisterStreamConsumer` 권한을 포함해야 합니다.

## 태그 지정을 사용하여 비용 추적
<a name="tagging-billing"></a>

태그를 사용하여 AWS 비용을 분류하고 추적할 수 있습니다. Kinesis Data Streams 리소스에 태그를 적용하면 AWS 비용 할당 보고서에는 태그별로 집계된 사용량 및 비용이 포함됩니다. 비즈니스 범주를 나타내는 태그(예: 비용 센터, 애플리케이션 이름 또는 소유자)를 적용하여 여러 서비스에 대한 비용을 정리할 수 있습니다. 자세한 내용은 *AWS Billing 사용 설명서*의 [사용자 지정 결제 보고서에 비용 할당 태그 사용](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html) 섹션을 참조하세요.

## 태그 제한 이해
<a name="tagging-restrictions"></a>

태그에 적용되는 제한은 다음과 같습니다.

**기본 제한 사항**
+ 각 리소스의 최대 태그 수는 50입니다.
+ 태그 키와 값은 대/소문자를 구분합니다.
+ 삭제된 리소스에 대해 태그를 변경하거나 편집할 수 없습니다.

**태그 키 제한 사항**
+ 각 태그 키는 고유해야 합니다. 이미 사용 중인 키를 가진 태그를 추가하면 기존 키-값 쌍에 새 태그가 덮어쓰기 됩니다.
+ 이 접두사는 사용자 대신이 접두사로 시작하는 태그를 AWS AWS 생성하지만 편집하거나 삭제할 수는 `aws:` 없으므로 로 태그 키를 시작할 수 없습니다.
+ 태그 키의 길이는 유니코드 1\$1128자여야 합니다.
+ 태그 키의 문자로는 유니코드 문자, 숫자, 공백 그리고 `_ . / = + - @` 같은 특수 문자가 허용됩니다.

**태그 값 제한 사항**
+ 태그 값의 길이는 유니코드 0\$1255자여야 합니다.
+ 태그 값은 공백 상태로 둘 수 있습니다. 아니면 유니코드 문자, 숫자, 공백 그리고 `_ . / = + - @` 같은 특수 문자를 사용할 수 있습니다.

## Kinesis Data Streams 콘솔을 사용하여 스트림 태그 지정
<a name="tagging-console"></a>

Kinesis Data Streams 콘솔을 사용하여 스트림에 태그를 추가하고 이를 업데이트, 나열 및 제거할 수 있습니다.

**스트림에 대한 태그를 보려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/kinesis](https://console.aws.amazon.com/kinesis) Kinesis 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **데이터 스트림**을 선택합니다.

1. **데이터 스트림** 페이지에서 태그를 지정할 스트림을 선택합니다.

1. 스트림 세부 정보 페이지에서 **구성**을 선택합니다.

1. **태그** 섹션에서 스트림에 적용된 태그를 확인합니다.

**태그를 사용하여 데이터 스트림을 생성하려면**

1. Kinesis Data Streams 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **데이터 스트림**을 선택합니다.

1. **데이터 스트림 생성**을 선택합니다.

1. **데이터 스트림 생성** 페이지에서 데이터 스트림의 이름을 입력합니다.

1. **데이터 스트림 용량**에서 **온디맨드** 또는 **프로비저닝된** 용량 모드를 선택합니다.

   용량 모드에 대한 자세한 내용은 [스트리밍할 올바른 모드 선택](how-do-i-size-a-stream.md) 섹션을 참조하세요.

1. **태그** 섹션에서 다음을 수행합니다.

   1. **새로운 태그 추가**를 선택합니다.

   1. **키** 필드에서 태그를 입력한 다음 **값** 필드에서 선택적으로 값을 지정합니다.

      오류가 표시되면 지정한 태그 키 또는 값이 태그 제한을 충족하지 않는 것입니다. 자세한 내용은 [태그 제한 이해](#tagging-restrictions) 단원을 참조하십시오.

1. **데이터 스트림 생성**을 선택합니다.

**스트림의 태그를 추가하거나 업데이트하려면**

1. Kinesis Data Streams 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **데이터 스트림**을 선택합니다.

1. **데이터 스트림** 페이지에서 태그를 추가하거나 업데이트할 스트림을 선택합니다.

1. 스트림 세부 정보 페이지에서 **구성**을 선택합니다.

1. **태그** 섹션에서 **태그 관리**를 선택합니다.

1. **태그** 아래에서 다음 중 하나를 수행합니다.
   + 새 태그를 추가하려면 **새 태그 추가**를 선택한 다음 태그의 **키**와 **값** 데이터를 입력합니다. 이 단계를 필요한 만큼 반복합니다.

     각 스트림에 추가할 수 있는 최대 태그 수는 50개입니다.
   + 기존 태그를 업데이트하려면 해당 태그 **키**의 **값** 필드에 새 태그 값을 입력합니다.

   오류가 표시되면 지정한 태그 키 또는 값이 태그 제한을 충족하지 않는 것입니다. 자세한 내용은 [태그 제한 이해](#tagging-restrictions) 단원을 참조하십시오.

1. **변경 사항 저장**을 선택합니다.

**스트림에서 태그를 제거하려면**

1. Kinesis Data Streams 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **데이터 스트림**을 선택합니다.

1. **데이터 스트림** 페이지에서 태그를 제거할 스트림을 선택합니다.

1. 스트림 세부 정보 페이지에서 **구성**을 선택합니다.

1. **태그** 섹션에서 **태그 관리**를 선택합니다.

1. 제거할 태그의 **키** 및 **값** 페어를 찾습니다. 그런 다음 **제거**를 선택합니다.

1. **변경 사항 저장**을 선택합니다.

## 를 사용하여 스트림에 태그 지정 AWS CLI
<a name="tagging-cli"></a>

 AWS CLI를 사용하여 스트림의 태그를 추가, 나열 및 제거할 수 있습니다. 예제는 다음 설명서를 참조하십시오.

 [create-stream](https://docs.aws.amazon.com/cli/latest/reference/kinesis/create-stream.html)   
태그를 사용하여 스트림을 생성합니다.

 [add-tags-to-stream](https://docs.aws.amazon.com/cli/latest/reference/kinesis/add-tags-to-stream.html)   
지정된 스트림에 대한 태그를 추가 또는 업데이트합니다.

 [list-tags-for-stream](https://docs.aws.amazon.com/cli/latest/reference/kinesis/list-tags-for-stream.html)  
지정된 스트림에 대한 태그를 나열합니다.

 [remove-tags-from-stream](https://docs.aws.amazon.com/cli/latest/reference/kinesis/remove-tags-from-stream.html)  
지정된 스트림에 대한 태그를 제거합니다.

## Kinesis Data Streams API를 사용하여 스트림 태그 지정
<a name="tagging-api"></a>

Kinesis Data Streams API를 사용하여 스트림의 태그를 추가, 나열 및 제거할 수 있습니다. 예제는 다음 설명서를 참조하세요.

 [CreateStream](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_CreateStream.html)   
태그를 사용하여 스트림을 생성합니다.

 [AddTagsToStream](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_AddTagsToStream.html)   
지정된 스트림에 대한 태그를 추가 또는 업데이트합니다.

 [ListTagsForStream](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_ListTagsForStream.html)  
지정된 스트림에 대한 태그를 나열합니다.

 [RemoveTagsFromStream](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_RemoveTagsFromStream.html)  
지정된 스트림에 대한 태그를 제거합니다.

## 를 사용하여 소비자에게 태그 지정 AWS CLI
<a name="tagging-consumers-cli"></a>

 AWS CLI를 사용하여 소비자의 태그를 추가, 나열 및 제거할 수 있습니다. 예제는 다음 설명서를 참조하세요.

[register-stream-consumer](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/kinesis/register-stream-consumer.html)  
태그를 사용하여 Kinesis 데이터 스트림에 소비자를 등록합니다.

[tag-resource](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/kinesis/tag-resource.html)  
지정된 Kinesis 리소스에 대한 태그를 추가하거나 업데이트합니다.

[list-tags-for-resource](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/kinesis/list-tags-for-resource.html)  
지정된 Kinesis 리소스의 태그를 나열합니다.

[untag-resource](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/kinesis/untag-resource.html)  
지정된 Kinesis 리소스에서 태그를 제거합니다.

## Kinesis Data Streams API를 사용하여 소비자 태그 지정
<a name="tagging-consumers-api"></a>

Kinesis Data Streams API를 사용하여 소비자의 태그를 추가, 나열 및 제거할 수 있습니다. 예제는 다음 설명서를 참조하세요.

[RegisterStreamConsumer](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_RegisterStreamConsumer.html)  
태그를 사용하여 Kinesis 데이터 스트림에 소비자를 등록합니다.

[TagResource](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_TagResource.html)  
지정된 Kinesis 리소스에 대한 태그를 추가하거나 업데이트합니다.

[ListTagsForResource](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_ListTagsForResource.html)  
지정된 Kinesis 리소스의 태그를 나열합니다.

[UntagResource](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_UntagResource.html)  
지정된 Kinesis 리소스에서 태그를 제거합니다.

# 대형 레코드 처리
<a name="large-records"></a>

Amazon Kinesis Data Streams는 최대 10메비바이트(MiB)의 레코드를 지원합니다. 이 기능은 기본 1MiB 레코드 크기 제한을 초과하는 간헐적인 데이터 페이로드 처리 작업에 권장됩니다. 기존 스트림과 새로 생성된 스트림의 기본 최대 레코드 크기는 1MiB로 설정됩니다.

이 기능은 사물 인터넷(IoT) 애플리케이션, 변경 데이터 캡처(CDC) 파이프라인, 가끔 더 큰 데이터 페이로드를 처리해야 하는 기계 학습 워크플로에 유용합니다. 스트림에서 대형 레코드 사용을 시작하려면 스트림의 최대 레코드 크기 제한을 업데이트합니다.

**중요**  
쓰기의 경우 1MB/s, 읽기의 경우 2MB/s의 개별 샤드 처리량 제한은 더 큰 레코드 크기를 지원하더라도 변경되지 않습니다. Kinesis Data Streams는 1MiB 이하 레코드의 기준 트래픽과 함께 간헐적으로 대형 레코드를 수용하도록 설계되었습니다. 지속적으로 대량의 대형 레코드 수집을 수용하도록 설계되지 않았습니다.

## 대형 레코드를 사용하도록 스트림 업데이트
<a name="update-stream"></a>

**Kinesis Data Streams로 대용량 레코드를 처리하려면**

1. Kinesis Data Streams 콘솔로 이동합니다.

1. 스트림을 선택하고 **구성** 탭으로 이동합니다.

1. **최대 레코드 크기** 옆에 있는 **편집**을 클릭합니다.

1. 최대 레코드 크기(최대 10MiB)를 설정합니다.

1. 변경 내용을 저장합니다.

이 설정은 이 Kinesis Data Streams의 최대 레코드 크기만 조정합니다. 이 제한을 늘리기 전에 모든 다운스트림 애플리케이션이 더 큰 레코드를 처리할 수 있는지 확인합니다.

 AWS CLI를 사용하여이 설정을 업데이트할 수도 있습니다.

```
aws kinesis update-max-record-size \ --stream-arn  \
        --max-record-size-in-ki-b 5000
```

## 대형 레코드로 스트림 성능 최적화
<a name="optimizing-performance"></a>

대형 레코드는 전체 트래픽의 2% 미만으로 유지하는 것이 좋습니다. 스트림에서 각 샤드의 처리량 용량은 초당 1MiB입니다. 대형 레코드를 수용하기 위해 Kinesis Data Streams은 최대 10MiB까지 버스트하며 초당 평균은 1MiB 수준입니다. 대형 레코드를 지원하는 이 용량은 스트림에 지속적으로 다시 채워집니다. 리필 속도는 대형 레코드의 크기와 기준 레코드의 크기에 따라 달라집니다. 최상의 결과를 얻으려면 균일하게 분산된 파티션 키를 사용합니다. Kinesis 온디맨드 조정 방법에 대한 자세한 내용은 [On-demand mode features and use cases](how-do-i-size-a-stream.html#ondemandmode) 섹션을 참조하세요.

## 대형 레코드로 스로틀링 완화
<a name="mitigate-throttling"></a>

**스로틀링을 완화하려면**

1. 생산자 애플리케이션에서 지수 백오프를 사용하여 재시도 로직을 구현합니다.

1. 무작위 파티션 키를 사용하여 사용 가능한 샤드에 대형 레코드를 분산합니다.

1. Amazon S3에 페이로드를 저장하고 대형 레코드의 연속 스트림을 위해 스트림에 대한 메타데이터 참조만 전송합니다. 자세한 내용은 [Processing large records with Amazon Kinesis Data Streams](https://aws.amazon.com/blogs/big-data/processing-large-records-with-amazon-kinesis-data-streams/) 섹션을 참조하세요.

## Kinesis Data Streams API를 사용하여 대형 레코드 처리
<a name="records-apis"></a>

대형 레코드 지원은 하나의 새로운 API를 도입하고 두 개의 기존 컨트롤 플레인 API를 업데이트하여 최대 10MiB의 레코드를 처리합니다.

레코드 크기 수정을 위한 API:
+ `UpdateMaxRecordSize`: 기존 스트림의 최대 레코드 크기 제한을 최대 10MiB로 구성합니다.

기존 API 업데이트:
+ `CreateStream`: 스트림 생성 중에 레코드 크기 제한을 설정하기 위한 선택적 `MaxRecordSizeInKiB` 파라미터를 추가합니다.
+ `DescribeStreamSummary`: `MaxRecordSizeInKiB` 필드를 반환하여 현재 스트림 구성을 표시합니다.

나열된 모든 API는 기존 스트림에서 이전 버전과의 호환성을 유지합니다. 전체 API 설명서는 [Amazon Kinesis Data Streams Service API Reference](https://docs.aws.amazon.com/kinesis/latest/APIReference/Welcome.html) 섹션을 참조하세요.

## AWS 대용량 레코드와 호환되는 구성 요소
<a name="record-compatability"></a>

다음 AWS 구성 요소는 대용량 레코드와 호환됩니다.


| 구성 요소 | 설명 | 
| --- | --- | 
|  AWS SDK | AWS SDK는 대용량 레코드 처리를 지원합니다. SDK에서 사용 가능한 메서드를 사용하여 스트림의 최대 레코드 크기를 최대 10MiB까지 업데이트할 수 있습니다. AWS SDKs 자세한 내용은 [AWS SDK에서이 서비스 사용을 참조하세요](https://docs.aws.amazon.com/streams/latest/dev/sdk-general-information-section.html). | 
|  Kinesis Consumer Library(KCL) | KCL은 버전 2.x부터 대형 레코드 처리를 지원합니다. 대형 레코드 지원을 사용하려면 스트림의 `maxRecordSize`를 업데이트하고 KCL을 사용합니다. 자세한 내용은 [Use Kinesis Client Library](https://docs.aws.amazon.com/streams/latest/dev/kcl.html) 섹션을 참조하세요. | 
|  Kinesis Producer Library(KPL) | KPL은 버전 1.0.5부터 대형 레코드 처리를 지원합니다. 대형 레코드 지원을 사용하려면 스트림의 maxRecordSize를 업데이트하고 KPL을 사용합니다. 자세한 내용은 [Develop producers using the Amazon Kinesis Producer Library (KPL)](https://docs.aws.amazon.com/streams/latest/dev/developing-producers-with-kpl.html) 섹션을 참조하세요. | 
|  Amazon EMR | Apache Spark가 포함된 Amazon EMR을 Kinesis Data Streams 한도(10MiB)까지의 대형 레코드 처리를 지원합니다. 대형 레코드 지원을 사용하려면 `readStream` 함수를 사용합니다. 자세한 내용은 [Amazon EMR and Amazon Kinesis integration](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-kinesis.html) 섹션을 참조하십시오. | 
|  Amazon Data Firehose | Kinesis Data Streams와 함께 사용할 경우 Amazon Data Firehose의 대형 레코드 처리 동작은 전송 대상에 따라 달라집니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/streams/latest/dev/large-records.html) 대형 레코드를 Snowflake 또는 Redshift로 전송해야 하는 애플리케이션의 경우 먼저 Amazon S3로 데이터를 전송합니다. 그런 다음 추출, 변환, 로드(ETL) 프로세스를 사용하여 데이터를 로드합니다. 다른 모든 대상의 경우 프로덕션 사용량으로 조정하기 전에 개념 증명 환경에서 대형 레코드로 동작을 테스트합니다. 대형 레코드 처리는 대상에 따라 다릅니다.  | 
|  AWS Lambda | AWS Lambda 는 최대 6MiBs의 페이로드를 지원합니다. 이 제한에는 base-64 인코딩으로 변환된 Kinesis 페이로드와 이벤트 소스 매핑(ESM)과 연결된 메타데이터가 포함됩니다. 6MiB 미만의 레코드의 경우 Lambda는 ESM을 사용하여 레코드를 처리하며 추가 구성이 필요하지 않습니다. 6MiB보다 큰 레코드의 경우 Lambda는 실패 시 대상을 사용하여 레코드를 처리합니다. Lambda의 처리 한도를 초과하는 레코드를 처리하려면 ESM을 사용하여 실패 시 대상을 구성해야 합니다. 실패 시 대상으로 전송된 각 이벤트는 실패한 간접 호출에 대한 메타데이터를 포함하는 JSON 문서입니다. 레코드 크기와 관계없이 ESM에서 실패 시 대상을 생성하는 것이 좋습니다. 이렇게 하면 레코드가 폐기되지 않습니다. 자세한 내용은 [Configuring destinations for failed invocations](https://docs.aws.amazon.com/lambda/latest/dg/kinesis-on-failure-destination.html#kinesis-on-failure-destination-console) 섹션을 참조하세요. | 
|  Amazon Redshift | Amazon Redshift는 Kinesis Data Streams에서 데이터를 스트리밍할 때 1MiB 미만의 레코드 크기만 지원합니다. 이 한도를 초과하는 레코드는 처리되지 않습니다. 처리되지 않은 레코드는 `sys_stream_scan_errors`로 기록됩니다. 자세한 내용은 [SYS\$1STREAM\$1SCAN\$1ERRORS](https://docs.aws.amazon.com/redshift/latest/dg/r_SYS_STREAM_SCAN_ERRORS.html) 섹션을 참조하세요. | 
|  Kinesis Data Streams용 Flink 커넥터 | Kinesis Data Streams에서 데이터를 사용하는 방법으로 Kinesis 소스 커넥터와 Kinesis 싱크 커넥터라는 두 가지 방법이 있습니다. 소스 커넥터는 1MiB 미만, 최대 10MiB의 레코드 처리를 지원합니다. 1MiB보다 큰 레코드에는 싱크 커넥터를 사용하지 마세요. 자세한 내용은 [Use connectors to move data in Amazon Managed Service for Apache Flink with the DataStream API](https://docs.aws.amazon.com/managed-flink/latest/java/how-connectors.html) 섹션을 참조하세요. | 

## 대형 레코드가 지원되는 리전
<a name="supported-regions"></a>

이 Amazon Kinesis Data Streams 기능은 다음 AWS 리전에서만 사용할 수 있습니다.


| AWS 리전 | 리전 이름 | 
| --- | --- | 
|  eu-north-1 | 유럽(스톡홀름) | 
|  me-south-1 | Middle East (Bahrain) | 
|  ap-south-1 | 아시아 태평양(뭄바이) | 
|  eu-west-3 | 유럽(파리) | 
|  ap-southeast-3 | 아시아 태평양(자카르타) | 
|  us-east-2 | 미국 동부(오하이오) | 
|  af-south-1 | 아프리카(케이프타운) | 
|  eu-west-1 | 유럽(아일랜드) | 
|  me-central-1 | 중동(UAE) | 
|  eu-central-1 | 유럽(프랑크푸르트) | 
|  sa-east-1 | 남아메리카(상파울루) | 
|  ap-east-1 | 아시아 태평양(홍콩) | 
|  ap-south-2 | 아시아 태평양(하이데라바드) | 
|  us-east-1 | 미국 동부(버지니아 북부) | 
|  ap-northeast-2 | 아시아 태평양(서울) | 
|  ap-northeast-3 | 아시아 태평양(오사카) | 
|  eu-west-2 | 유럽(런던) | 
|  ap-southeast-4 | 아시아 태평양(멜버른) | 
|  ap-northeast-1 | 아시아 태평양(도쿄) | 
|  us-west-2 | 미국 서부(오리건) | 
|  us-west-1 | 미국 서부(캘리포니아 북부) | 
|  ap-southeast-1 | 아시아 태평양(싱가포르) | 
|  ap-southeast-2 | 아시아 태평양(시드니) | 
|  il-central-1 | 이스라엘(텔아비브) | 
|  ca-central-1 | 캐나다(중부) | 
|  ca-west-1 | 캐나다 서부(캘거리) | 
|  eu-south-2 | 유럽(스페인) | 
|  cn-northwest-1 | 중국(닝샤) | 
|  eu-central-2 | 유럽(취리히) | 
| us-gov-east-1 | AWS GovCloud(미국 동부) | 
| us-gov-west-1 | AWS GovCloud(미국 서부) | 

# 를 사용하여 복원력 테스트 수행 AWS Fault Injection Service
<a name="kinesis-fis"></a>

AWS Fault Injection Service 는 AWS 워크로드에서 오류 주입 실험을 수행하는 데 도움이 되는 완전 관리형 서비스입니다.Amazon Kinesis Data Streams와 AWS FIS 통합하면 제어된 환경에서 일반적인 Amazon Kinesis Data Streams API 오류에 대해 애플리케이션 복원력을 테스트할 수 있습니다. 이 기능을 사용하면 오류가 발생하기 전에 오류 처리, 재시도 로직, 모니터링 시스템을 검증할 수 있습니다. 자세한 내용은 [란 무엇입니까 AWS Fault Injection Service?](https://docs.aws.amazon.com/fis/latest/userguide/what-is.html)를 참조하세요.

**작업**
+ API 내부 오류: 대상 IAM 역할이 만든 요청에 내부 오류를 삽입합니다. 구체적인 응답은 각 서비스 및 API에 따라 달라집니다. `aws:fis:inject-api-internal-error` 작업은 `InternalFailure` 오류(HTTP 500)를 생성합니다.
+ API 스로틀링 오류: 대상 IAM 역할이 만든 요청에 내부 오류를 삽입합니다. 구체적인 응답은 각 서비스 및 API에 따라 달라집니다. `aws:fis:inject-api-throttle-error` 작업은 `ThrottlingException` 오류(HTTP 400)를 생성합니다.
+ API 사용 불가 오류: 대상 IAM 역할이 만든 요청에 내부 오류를 삽입합니다. 구체적인 응답은 각 서비스 및 API에 따라 달라집니다. `aws:fis:inject-api-unavailable-error` 작업은 `ServiceUnavailable` 오류(HTTP 503)를 생성합니다.
+ API의 프로비저닝된 처리량 예외: 대상 IAM 역할이 만든 요청에 내부 오류를 삽입합니다. 구체적인 응답은 각 서비스 및 API에 따라 달라집니다. `aws:kinesis:inject-api-provisioned-throughput-exception` 작업은 `ProvisionedThroughputExceededException` 오류(HTTP 400)를 생성합니다.
+ API의 만료된 반복자 예외: 대상 IAM 역할이 만든 요청에 내부 오류를 삽입합니다. 구체적인 응답은 각 서비스 및 API에 따라 달라집니다. `aws:kinesis:inject-api-expired-iterator-exception` 작업은 `ExpiredIteratorException` 오류(HTTP 400)를 생성합니다.

자세한 내용은 [Amazon Kinesis Data Streams 작업](https://docs.aws.amazon.com/fis/latest/userguide/fis-actions-reference.html#aws-kinesis-actions) 섹션을 참조하세요.

**고려 사항**
+ Amazon Kinesis Data Streams에서는 프로비저닝 방식과 온디맨드 방식 모두로 위의 작업을 사용할 수 있습니다.
+ 선택한 기간에 따라 실험이 완료되면 스트리밍이 재개됩니다. 실행 중인 실험이 완료되기 전에 중지할 수도 있습니다. 또는 중지 조건을 정의하여 Amazon CloudWatch Application Insights에서 애플리케이션 상태를 정의하는 경보를 기반으로 실험을 중지할 수 있습니다.
+ 최대 280개의 스트림을 테스트할 수 있습니다.

리전별 지원에 대한 자세한 내용은 [AWS Fault Injection Service 엔드포인트 및 할당량](https://docs.aws.amazon.com/general/latest/gr/fis.html) 섹션을 참조하세요.

# 프로비저닝된 처리량 예외 오류
<a name="kinesis-fis-provisioned-throughput"></a>

프로비저닝된 처리량 초과 예외 오류(HTTP 400)는 Kinesis 스트림의 요청 속도가 샤드 하나 이상의 처리량 제한을 초과할 때 발생합니다. 각 샤드에는 특정 읽기 및 쓰기 용량 제한이 있으며 이러한 제한을 초과하면 이 예외가 발생합니다. 이 예외가 발생하는 시나리오에는 데이터 수집 또는 소비의 급증, 처리 중인 데이터 볼륨에 대한 샤드 용량 부족 또는 파티션 키의 고르지 않은 배포가 포함됩니다.

**예외 처리에 대한 권장 사항**
+ 지수 백오프 및 재시도 메커니즘을 구현합니다.
+ 더 높은 처리량을 수용할 수 있도록 샤드 수를 늘립니다.
+ 파티션 키가 적절하게 배포되었는지 확인합니다.
+ 스트림 지표를 모니터링합니다.

또한 Kinesis 온디맨드 용량 모드를 사용하면 워크로드를 자동으로 조정하고 이 예외의 발생을 최소화할 수 있습니다. 자세한 내용은 [AWS Fault Injection Service란 무엇입니까?](https://docs.aws.amazon.com/fis/latest/userguide/what-is.html)를 참조하세요.

**참고**  
부적절한 배포 문제는 자동 조정의 온디맨드 모드 기능을 벗어납니다.

**기본 실험을 수행하려면**

1. 기준 지표 사용: 테스트 전에 정상 처리량 패턴을 기록합니다.

1. 실험 생성: `aws:kinesis:inject-api-provisioned-throughput-exception` 작업을 사용합니다.

1. 강도 구성: 25% 요청 스로틀링으로 시작합니다.

1. 응답 모니터링: 지수 백오프를 사용하여 재시도 로직을 확인합니다.

1. 조정 검증: 오토 스케일링이 활성화를 트리거하는지 확인합니다.

1. 경보 확인: `CloudWatch` 경보가 예상대로 실행되고 있는지 확인합니다.

애플리케이션은 적절한 백오프 전략을 구현하고, `WriteProvisionedThroughputExceeded` 및 `ReadProvisionedThroughputExceeded` 지표를 모니터링하고, 적절한 경우 샤드 조정을 트리거해야 합니다.

**작업 세부 정보**
+ **리소스 유형**: IAM 역할 ARN
+ **대상 작업**: `PutRecord`, `PutRecords`, `GetRecords` 
+ ****오류 코드****: `ProvisionedThroughputExceededException`(HTTP 400)
+ ****설명****: 요청 속도가 샤드 용량 제한을 초과하는 시나리오를 시뮬레이션하고 애플리케이션의 스로틀링 및 조정 응답을 테스트합니다.

**파라미터**
+ **IAM 역할 ARN**: 애플리케이션이 Kinesis Data Streams 작업에 사용하는 역할입니다.
+ **작업**: 대상 작업: `PutRecord`, `PutRecords`, `GetRecords`.
+ **리소스 목록**: 특정 스트림 이름 또는 샤드 식별자입니다.
+ **기간**: 실험 기간(1분\$112시간)입니다. AWS FIS API에서 값은 ISO 8601 형식의 문자열입니다. 예를 들어, PT1M은 1분을 나타냅니다. AWS FIS 콘솔에서 초, 분 또는 시간 수를 입력합니다.
+ **강도**: 스로틀링할 요청의 백분율입니다.

**필수 권한**
+ `kinesis:InjectApiError`

실험 템플릿 예시

 다음 예제에서는 지정된 태그가 있는 최대 5개의 Kinesis Data 스트림에 대한 모든 요청에 대해 프로비저닝된 처리량 예외를 보여줍니다.는 무작위로 영향을 미칠 스트림을 AWS FIS 선택합니다. 5분 후에 오류가 제거됩니다.

```
{
    "description": "Kinesis stream experiment",
    "targets": {
        "KinesisStreams-Target-1": {
            "resourceType": "aws:kinesis:stream",
            "resourceTags": {
                   "tag-key": "tag-value"
            },
            "selectionMode": "COUNT(5)"
        }
    },
    "actions": {
         "kinesis": {
              "actionId": "aws:kinesis:stream-provisioned-throughput-exception",
              "description": "my-stream",
              "parameters": {
                   "duration": "PT5M",
                   "percentage": "100",
                   "service": "kinesis"
              },
              "targets": {
                    "KinesisStreams": "KinesisStreams-Target-1"
              }
         }
   },
   "stopConditions": [
         {
              "source": "none"
         }
   ],
   "roleArn": "arn:aws:iam::111122223333:role/role-name",
   "tags": {},
   "experimentOptions": {
       "accountTargeting": "single-account",
       "emptyTargetResolutionMode": "fail"
   }    
}
```

실험 역할 권한 예제

다음 권한을 사용하면 요청의 50%에 영향을 미치는 특정 스트림에서 `aws:kinesis:stream-provisioned-throughput-exception` 및 `aws:kinesis:stream-expired-iterator-exception` 작업을 실행할 수 있습니다.

# 만료된 반복자 예외 오류
<a name="kinesis-fis-expired-iterator"></a>

 만료된 반복기 예외 오류(HTTP 400)는 샤드 반복기가 만료될 때 발생하며 `GetRecords`를 호출할 때 스트림 레코드를 검색하는 데 더 이상 사용되지 않습니다. 이 오류는 장기 실행 데이터 처리 작업, 네트워크 문제 또는 애플리케이션 가동 중지로 인해 읽기 작업 간에 지연이 있을 때 발생합니다.

**참고**  
샤드 반복자는 발행된 시간으로부터 5분 동안 유효합니다.

**예외 처리에 대한 권장 사항**
+ 만료되기 전에 샤드 반복자를 새로 고칩니다.
+ 오류 처리를 통합하여 새 반복자를 얻습니다.
+ 샤드 반복기 만료를 자동으로 관리하는 Kinesis Kinesis Client Library(KCL)를 사용합니다.

자세한 내용은 [란 무엇입니까 AWS Fault Injection Service?](https://docs.aws.amazon.com/fis/latest/userguide/what-is.html)를 참조하세요.

**기본 실험을 수행하려면**

1. 실험 템플릿 생성: AWS FIS 콘솔을 사용합니다.

1. 작업 선택: `aws:kinesis:inject-api-expired-iterator-exception` 작업을 사용합니다.

1. 대상 구성: IAM 역할과 Kinesis Data Streams 작업을 지정합니다.

1. 기간 설정: 초기 테스트의 경우 5\$110분으로 시작합니다.

1. 중지 조건 추가: [에 대한 중지 조건 AWS FIS](https://docs.aws.amazon.com/fis/latest/userguide/stop-conditions.html)입니다.

1. 실험 실행: 애플리케이션 동작을 모니터링합니다.

**작업 세부 정보**
+ **리소스 유형**: IAM 역할 ARN
+ **대상 작업**: `GetRecords`
+ ****오류 코드****: `ExpiredIteratorException`(HTTP 400)
+ ****설명****: 제공된 반복자가 허용되는 최대 수명을 초과하여 레코드 처리가 너무 느리거나 체크포인트 로직이 실패하는 시나리오를 시뮬레이션합니다.

**파라미터**
+ **IAM 역할 ARN**: 애플리케이션이 Kinesis Data Streams 작업에 사용하는 역할입니다.
+ **작업**: 대상 작업: `GetRecords`
+ **리소스 목록**: 특정 스트림 이름 또는 ARN입니다.
+ **기간**: 실험 기간입니다. 구성 가능합니다.
+ **강도**: 스로틀링할 요청의 백분율입니다.

**필수 권한**
+ `kinesis:InjectApiError`