Amazon Kinesis Streams - 開発者ガイド

Amazon Kinesis Streams
開発者ガイド
Amazon Kinesis Streams 開発者ガイド
Amazon Kinesis Streams: 開発者ガイド
Copyright © 2017 Amazon Web Services, Inc. and/or its affiliates. All rights reserved.
Amazon's trademarks and trade dress may not be used in connection with any product or service that is not Amazon's, in any
manner that is likely to cause confusion among customers, or in any manner that disparages or discredits Amazon. All other
trademarks not owned by Amazon are the property of their respective owners, who may or may not be affiliated with, connected to,
or sponsored by Amazon.
Amazon Kinesis Streams 開発者ガイド
Table of Contents
Amazon Kinesis Streams とは? ...................................................................................................... 1
Streams の機能 .................................................................................................................... 1
Streams のメリット .............................................................................................................. 2
関連サービス ........................................................................................................................ 2
主要なコンセプト .................................................................................................................. 2
アーキテクチャの概要 ................................................................................................... 2
用語 ............................................................................................................................ 3
Streams ............................................................................................................................... 5
Amazon Kinesis Stream の初期サイズを決定する .............................................................. 5
ストリームの作成 .......................................................................................................... 6
プロデューサー ..................................................................................................................... 6
コンシューマー ..................................................................................................................... 7
制限 .................................................................................................................................... 7
はじめに ...................................................................................................................................... 9
セットアップ ........................................................................................................................ 9
AWS にサインアップする .............................................................................................. 9
ライブラリとツールをダウンロードする ......................................................................... 10
開発環境を設定する ..................................................................................................... 10
チュートリアル: ウェブトラフィックの可視化 ......................................................................... 10
Streams のデータ可視化サンプルアプリケーション .......................................................... 11
前提条件 .................................................................................................................... 11
ステップ 1: サンプルアプリケーションを起動する ........................................................... 11
ステップ 2: サンプルアプリケーションのコンポーネントを表示する ................................... 12
ステップ 3: サンプルアプリケーションを削除する ........................................................... 15
ステップ 4: 次のステップ ............................................................................................. 16
チュートリアル: CLI を使用した作業の開始 ............................................................................ 16
AWS CLI のインストールと設定 .................................................................................... 16
基本的なストリームオペレーションの実行 ...................................................................... 18
Amazon Kinesis Streams 開発の学習 ............................................................................................. 24
第 1 部: ストリーム、プロデューサー、およびコンシューマー ................................................... 24
前提条件 .................................................................................................................... 25
ステップ 1: ストリームを作成する ................................................................................. 26
ステップ 2: IAM ポリシーとユーザーを作成する .............................................................. 27
ステップ 3: 実装コードをダウンロードおよびビルドする .................................................. 30
ステップ 4: プロデューサーを実装する ........................................................................... 30
ステップ 5: コンシューマーを実装する ........................................................................... 33
ステップ 6: (オプション)コンシューマーを拡張する ..................................................... 36
ステップ 7: 終了する ................................................................................................... 37
Amazon Kinesis Streams の使用 ................................................................................................... 39
ストリームへのデータの書き込み .......................................................................................... 39
KPL の使用 ................................................................................................................ 39
API の使用 ................................................................................................................. 49
エージェントの使用 ..................................................................................................... 54
トラブルシューティング ............................................................................................... 63
高度なトピック ........................................................................................................... 64
ストリームからのデータの読み取り ....................................................................................... 66
KCL の使用 ................................................................................................................ 66
API の使用 ................................................................................................................. 82
トラブルシューティング ............................................................................................... 86
高度なトピック ........................................................................................................... 89
ストリームの管理 ................................................................................................................ 96
ストリームの作成 ........................................................................................................ 96
ストリームのリスト ..................................................................................................... 98
ストリームからシャードを取得する ............................................................................... 99
ストリームを削除する .................................................................................................. 99
iii
Amazon Kinesis Streams 開発者ガイド
ストリームをリシャーディングする ..............................................................................
データ保持期間の変更 ................................................................................................
モニタリング ....................................................................................................................
CloudWatch によるサービスのモニタリング ..................................................................
CloudWatch によるエージェントのモニタリング ............................................................
CloudTrail を使用した API 呼び出しのログ記録 ..............................................................
CloudWatch による KCL のモニタリング ......................................................................
CloudWatch による KPL のモニタリング ......................................................................
ストリームのタグ付け ........................................................................................................
タグの基本 ...............................................................................................................
タグ付けを使用したコストの追跡 .................................................................................
タグの制限 ...............................................................................................................
Streams コンソールを使用したストリームのタグ付け .....................................................
AWS CLI を使用したストリームのタグ付け ...................................................................
Streams API を使用したストリームのタグ付け ..............................................................
アクセスの制御 .................................................................................................................
ポリシー構文 ............................................................................................................
Streams のアクション ................................................................................................
Streams 用の Amazon リソースネーム(ARN) .............................................................
Streams のポリシー例 ................................................................................................
ドキュメント履歴 ......................................................................................................................
AWS の用語集 ..........................................................................................................................
iv
100
105
105
106
114
114
118
126
130
130
131
131
131
132
132
133
133
134
134
135
138
140
Amazon Kinesis Streams 開発者ガイド
Streams の機能
Amazon Kinesis Streams とは?
Amazon Kinesis Streams を使用して、データレコードの大量のストリームをリアルタイムで収集し、
処理します。
「Amazon Kinesis Streams application」と呼ばれるデータ処理アプリケーションを作成します。一
般的な Amazon Kinesis Streams application は、データを Amazon Kinesis stream からデータレコー
ドとして読み込みます。これらのアプリケーションは Amazon Kinesis Client Library を使用すること
も、Amazon EC2 インスタンスで実行することもできます。処理されたレコードは、ダッシュボー
ドに送信してアラートの生成や、料金設定と広告戦略の動的変更に使用できます。また、他のさま
ざまな AWS サービスにデータを送信できます。Streams の機能と料金については、Amazon Kinesis
Streams を参照してください。
Streams は Amazon Kinesis Firehose と共にストリーミングデータ プラットフォーム、Amazon
Kinesis の一部です。詳細については、「Amazon Kinesis Firehose 開発者ガイド」を参照してくださ
い。AWS ビッグデータソリューションの詳細については、ビッグデータを参照してください。AWS
ストリーミングデータソリューションの詳細については、「ストリーミングデータとは?」を参照して
ください。
Streams の機能
Streams を使用して、高速かつ継続的にデータの取り込みと集約を行うことができます。使用される
データのタイプには、IT インフラストラクチャのログデータ、アプリケーションのログ、ソーシャル
メディア、マーケットデータフィード、ウェブのクリックストリームデータなどがあります。データ
の取り込みと処理の応答時間はリアルタイムであるため、処理は一般的に軽量です。
以下に示しているのは、Streams の一般的なユースケースです。
ログとデータフィードの取り込みと処理の高速化
プロデューサーからストリームにデータを直接プッシュさせることができます。たとえば、シス
テムとアプリケーションのログをプッシュすると、数秒で処理可能になります。これにより、フ
ロントエンドサーバーやアプリケーションサーバーに障害が発生した場合に、ログデータが失わ
れることを防止できます。Streams では、取り込み用にデータを送信する前にサーバーでバッチ
処理しないため、データフィードの取り込みが加速されます。
リアルタイムのメトリックスとレポート作成
Streams に取り込んだデータを使用して、リアルタイムのデータ分析とレポート作成を簡単に行
うことができます。たとえば、データ処理アプリケーションは、バッチデータを受け取るまで待
1
Amazon Kinesis Streams 開発者ガイド
Streams のメリット
つのではなく、データのストリーミング中にシステムおよびアプリケーションのログに関するメ
トリックスやレポート作成を操作できます。
リアルタイムデータ分析
これにより、並行処理の能力がリアルタイムデータの価値と同時に得られます。たとえば、ウェ
ブサイトのクリックストリームをリアルタイムで処理し、さらに並行して実行される複数の異な
る Streams アプリケーションを使用して、サイトの使いやすさの関与を分析します。
複雑なストリーム処理
Amazon Kinesis Streams application とデータストリームの Directed Acyclic Graphs(DAG)を作
成できます。一般的に、ここでは複数の Amazon Kinesis Streams application から別のストリー
ムにデータを出力して、別の Amazon Kinesis Streams application により下流処理が行われるよ
うにします。
Streams のメリット
Streams は、さまざまなデータストリーミングの問題解決に使用できるだけでなく、一般的にはデー
タのリアルタイム集計にも使用できます。集計データはその後でデータウェアハウスや MapReduce
クラスターに読み込むことができます。
データは Amazon Kinesis streamに取り込むことができ、それによって耐久性と適応性が確保されま
す。レコードがストリームに取り込まれてから取得されるまでの遅延(入力から取得までの遅延)は
通常、1 秒未満です。つまり、Amazon Kinesis Streams applicationはデータが追加されてからほぼ瞬
時にストリームのデータを利用し始めることができます。Streams はマネージド型サービスであるた
め、データ取り込みパイプラインの作成と実行にかかわる運用負荷が軽くなります。MapReduce 型
のストリーム処理アプリケーションを作成できること、さらに Streams に適応性があることで、スト
リームをスケールアップまたはダウンできるため、データレコードを有効期限になる前に失うことが
なくなります。
複数の Amazon Kinesis Streams application が 1 つのストリームからデータを消費できるため、アー
カイブや処理のような複数のアクションを同時に独立して実行できます。たとえば、2 つのアプリ
ケーションが、同じストリームからデータを読み取ることができます。最初のアプリケーションは、
集計を実行して計算し、DynamoDB テーブルを更新します。2 番目のアプリケーションは、データを
圧縮して Amazon S3 などのデータストアにアーカイブします。集計実行中の DynamoDB テーブル
は、その後、最新レポート用にダッシュボードによって読み取られます。
Amazon Kinesis Client Library を使用すると、耐障害性を維持しながらストリームからデータを消費す
ることができ、Amazon Kinesis Streams application に対するスケーリングも可能になります。
関連サービス
Amazon EMR クラスターを使用して Amazon Kinesis stream を直接読み取って処理する方法の例につ
いては、『Amazon EMR 開発者ガイド』の「Analyze Streams Data」を参照してください。
Amazon Kinesis Streams の主要なコンセプト
Amazon Kinesis Streams の使用を開始すると、アーキテクチャーと用語を理解していることが強みに
なります。
Streams のアーキテクチャの概要
以下の図に、Streams のアーキテクチャの概要を示します。プロデューサーは継続的にデータを
Streams にプッシュし、コンシューマーはリアルタイムでデータを処理します。コンシューマーは
2
Amazon Kinesis Streams 開発者ガイド
用語
Amazon DynamoDB、Amazon Redshift、Amazon S3 などの AWS サービスを使用してその結果を保
存できます。
Streams の用語
Amazon Kinesis Stream
Amazon Kinesis stream は、データレコードの順序付けられたシーケンスです。ストリーム内の各レ
コードには、Streams によってシーケンス番号 (p. 4)が割り当てられます。ストリーム内のデータ
レコードはシャード (p. 4)に配分されます。
データレコード
データレコードは、Amazon Kinesis stream (p. 3) に格納されるデータの単位です。データレコー
ドは、シーケンス番号 (p. 4)、パーティションキー (p. 4)、データ BLOB(変更不可のバイト
シーケンス)で構成されます。Streams では、BLOB 内のデータが検査、解釈、変更されることはあ
りません。データ BLOB は 最大 1 MB にすることができます。
保持期間
ストリームに追加された後の、データレコードにアクセス可能な期間。ストリームの保持期間は、デ
フォルトで作成後 24 時間に設定されます。IncreaseStreamRetentionPeriod オペレーションを使用
して、保持期間を最大 168 時間(7 日)まで増やしたり、DecreaseStreamRetentionPeriod オペレー
ションを使用して最短の 24 時間に短縮したりできます。追加料金は 24 時間を超えて保持されたスト
リームに適用されます。詳細については、「Amazon Kinesis Streams 料金表」を参照してください。
プロデューサー
プロデューサはレコードを Amazon Kinesis Streams に入れます。たとえば、ストリームにログデー
タを送信するウェブサーバーはプロデューサーです。
コンシューマー
コンシューマーは、Amazon Kinesis Streams からレコードを取得して処理します。これらのコン
シューマーは Amazon Kinesis Streams Applications (p. 4) と呼ばれます。
3
Amazon Kinesis Streams 開発者ガイド
用語
Amazon Kinesis Streams Applications
Amazon Kinesis Streams application はストリームのコンシューマーで、一般的に複数の EC2 インス
タンスで実行されます。
Amazon Kinesis Streams application は、Amazon Kinesis Client Library または Streams API を使用し
て開発できます。
Amazon Kinesis Streams application の出力を別のストリームの入力にすることで、リアルタイムで
データを処理する複雑なトポロジを作成できます。アプリケーションは、さまざまな他の AWS サー
ビスにデータを送信することもできます。複数のアプリケーションが 1 つのストリームを使用して、
各アプリケーションが同時にかつ独立してストリームからデータを消費できます。
シャード
シャードは、ストリーム内のデータレコードの一意に識別されたグループです。ストリームは複数の
シャードで構成され、各シャードが容量の 1 単位になります。各シャードは 読み取りは最大 1 秒あた
り 5 件のトランザクション、データ読み取りの最大合計レートは 1 秒あたり 2 MB と 書き込みについ
ては最大 1 秒あたり 1,000 レコード、データの最大書き込み合計レートは 1 秒あたり 1 MB (パーティ
ションキーを含む) をサポートできます。ストリームのデータ容量は、ストリームに指定したシャード
の数によって決まります。ストリームの総容量はシャードの容量の合計です。
データの流量が増えた場合は、シャードを追加してストリームのサイズを増やします。同様に、デー
タの流量が減った場合は、シャードを削除できます。
パーティションキー
パーティションキーは、ストリーム内のデータをシャード単位でグループ化するために使用されま
す。Streams サービスでは、ストリームに属するデータレコードを複数のシャードに配分するとき、
各データレコードに関連付けられたパーティションキーを使用して、配分先のシャードを決定しま
す。パーティションキーは最大 256 バイト長の Unicode 文字列です。MD5 ハッシュ関数を使用して
パーティションキーを 128 ビットの整数値にマッピングし、関連付けられたデータレコードをシャー
ドにマッピングします。パーティションキーは、ストリームにデータを入力するアプリケーションに
よって指定されます。
シーケンス番号
各データレコードには一意のシーケンス番号があります。シーケンス番号は、client.putRecords
または client.putRecord によってストリームに書き込んだ後に、Streams によって割り当てられ
ます。同じパーティションキーのシーケンス番号は一般的に、時間の経過とともに大きくなります。
書き込みリクエスト間の期間が長くなるほど、シーケンス番号は大きくなります。
Note
シーケンス番号は、同じストリーム内の一連のデータのインデックスとして使用すること
はできません。一連のデータを論理的に区別するには、パーティションキーを使用するか、
データセットごとに個別のストリームを作成します。
Amazon Kinesis Client Library
Amazon Kinesis Client Library をアプリケーションにコンパイルすることで、耐障害性を維持しながら
ストリームからデータを消費できます。Amazon Kinesis Client Library により、シャードごとにその実
行と処理用のレコードプロセッサが確保されます。また、ストリームからのデータの読み取りが簡素
化されます。Amazon Kinesis Client Library は Amazon DynamoDB テーブルを使用して制御データを
格納します。また、データを処理するアプリケーションごとに 1 つのテーブルを作成します。
4
Amazon Kinesis Streams 開発者ガイド
Streams
アプリケーション名
Amazon Kinesis Streams application 名はアプリケーションを識別します。各アプリケーションには、
アプリケーションが使用する AWS アカウントとリージョンに限定される一意の名前が必要です。こ
の名前は、Amazon DynamoDB では制御テーブルの名前として、Amazon CloudWatch では名前空間
メトリックとして使用されます。
Amazon Kinesis Stream
Amazon Kinesis Streams は、大量のデータをリアルタイムで取り込み、そのデータを永続的に保存し
て、消費できるようにします。Streams サービスによって保存されるデータの単位は、データレコー
ドです。ストリームは、データレコードの順序付けられたシーケンスを意味します。ストリーム内の
データレコードはシャードに配分されます。
シャードは、ストリーム内のデータレコードのグループです。ストリームを作成するときに、スト
リームのシャード数を指定します。各シャードは 読み取りは最大 1 秒あたり 5 件のトランザクショ
ン、データ読み取りの最大合計レートは 1 秒あたり 2 MB と 書き込みについては最大 1 秒あたり
1,000 レコード、データの最大書き込み合計レートは 1 秒あたり 1 MB (パーティションキーを含む)
をサポートできます。ストリームの総容量はシャードの容量の合計です。必要に応じて、ストリーム
のシャードの数を増減することができます。ただし、シャード単位で請求されることにご注意くださ
い。
プロデューサー (p. 6)はシャードにデータレコードを送信し、コンシューマー (p. 7)はシャー
ドからデータレコードを取得します。
Amazon Kinesis Stream の初期サイズを決定する
ストリームの作成前に、ストリームの初期サイズを決定する必要があります。ストリームを作成した
後、Amazon Kinesis Streams application がストリームからデータを消費している間も、ストリームの
サイズを動的に変更したり、シャードの追加ゃ削除を行うことができます。
ストリームの初期サイズを決定するには、以下の入力値が必要です。
• ストリームに書き込まれるデータレコードの平均サイズ(近似の KB 単位まで切り上げられま
す)。つまり、データサイズ(average_data_size_in_KB)です。
• 1 秒間にストリームで読み書きされるデータレコードの数(records_per_second)です。
• ストリームから同時にかつ独立してデータを消費する Amazon Kinesis Streams application、つまり
コンシューマーの数(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 = max(incoming_write_bandwidth_in_KB/1000,
outgoing_read_bandwidth_in_KB/2000)
5
Amazon Kinesis Streams 開発者ガイド
ストリームの作成
ストリームの作成
Streams コンソール、Streams API、または AWS CLI を使用してストリームを作成できます。
コンソールを使用してストリームを作成するには
1.
https://console.aws.amazon.com/kinesis/ にある Streams コンソールを開きます。
2.
ナビゲーションバーで、リージョンセレクターを展開し、リージョンを選択します。
3.
[Create Stream] をクリックします。
4.
[Create Stream] ページで、ストリームの名前と必要なシャードの数を入力し、[Create] をクリッ
クします。
ストリームの作成中、[Stream List] ページでは、ストリームの [Status] は、[] です。CREATINGス
トリームを使用する準備ができると、[Status] は [ACTIVE] に変わります。
5.
ストリームの名前をクリックします。[Stream Details] ページには、ストリーム設定の概要とモニ
タリング情報が表示されます。
Streams API を使用してストリームを作成するには
Streams API を使用したストリームの作成については、「ストリームの作成 (p. 96)」を参照してく
ださい。
AWS CLI を使用してストリームを作成するには
AWS CLI を使用したストリームの作成については、create-stream コマンドを参照してください。
Amazon Kinesis Streams のプロデューサー
プロデューサーは Amazon Kinesis stream にデータレコードを送信します。たとえば、Amazon
Kinesis stream にログデータを送信するウェブサーバーはプロデューサーです。コンシュー
マー (p. 7)はストリームのデータレコードを処理します。
Important
データレコードはストリームに追加されてからデフォルトでは 24 時間アクセス可能です。こ
の期間は、保持期間と呼ばれ、24 時間から 168 時間 (1~7 日) まで 1 時間単位で設定できま
す。ストリームの保持期間の詳細については、「データ保持期間の変更 (p. 105)」を参照し
てください。
ストリームにデータを送信するには、ストリームの名前、パーティションキー、ストリームに追加す
るデータ BLOB を指定する必要があります。パーティションキーは、データレコードが追加されるス
トリーム内のシャードを決定するために使用されます。
シャード内のすべてのデータは、そのシャードを処理する同じワーカーに送信されます。使用す
るパーティションキーはアプリケーションのロジックによって異なります。パーティションキーの
数は、通常、シャード数よりかなり大きくする必要があります。これは、データレコードを特定の
シャードにマッピングする方法を決定するために、パーティションキーが使用されるからです。十分
なパーティションキーがある場合、ストリーム内のシャードに均等にデータを分散することができま
す。
詳細については、「ストリームへのデータの追加 (p. 50)」(Java のコード例を含む)、Streams
API の PutRecords と PutRecord オペレーション、または put-record コマンドを参照してください。
6
Amazon Kinesis Streams 開発者ガイド
コンシューマー
Amazon Kinesis Streams のコンシューマー
コンシューマー (p. 6)は、Amazon Kinesis Streams application と呼ばれる Amazon Kinesis
stream からデータレコードを取得して、ストリームからのデータを処理します。
Important
データレコードはストリームに追加されてからデフォルトでは 24 時間アクセス可能です。こ
の期間は、保持期間と呼ばれ、24 時間から 168 時間 (1~7 日) まで 1 時間単位で設定できま
す。ストリームの保持期間の詳細については、「データ保持期間の変更 (p. 105)」を参照し
てください。
コンシューマーは、それぞれ特定のシャードから、シャードイテレーターを使用して読み込みま
す。シャードイテレーターは、ストリーム内の位置を表し、コンシューマーはそこから読み込みま
す。ストリームからの読み取りを開始すると、コンシューマーはシャードイテレーターを取得しま
す。これは、コンシューマーがストリームから読み取る場所を変更できます。コンシューマーが読
み込み操作を実行するときは、シャードイテレーターによって指定された位置に基づいて、データレ
コードのバッチを受け取ります。
各コンシューマーには、アプリケーションが使用する AWS アカウントとリージョンに限定される一
意の名前が必要です。この名前は、Amazon DynamoDB では制御テーブルの名前として、Amazon
CloudWatch では名前空間メトリックとして使用されます。アプリケーションを起動すると、アプリ
ケーションの状態を格納する Amazon DynamoDB テーブルを作成し、指定されたストリームに接続し
て、ストリームからデータを消費し始めます。Streams メトリックスは、CloudWatch コンソールを
使用して表示できます。
EC2 インスタンスにコンシューマーをデプロイするには、AMI のいずれか 1 つに追加します。Auto
Scaling グループの複数の EC2 インスタンスで実行することにより、コンシューマーを拡張できま
す。Auto Scaling グループを使用すると、EC2 インスタンスに障害が発生した場合に新しいインスタ
ンスを自動的に起動するようにしたり、アプリケーションの負荷の経時変化に応じてインスタンス数
を柔軟にスケーリングすることもできます。Auto Scaling グループは、一定数の EC2 インスタンスが
常に実行されているようにします。Auto Scaling グループのスケーリングイベントをトリガーするに
は、CPU やメモリの使用率などのメトリックスを指定して、ストリームからのデータを処理する EC2
インスタンスの数を増減させることができます。詳細については、「Auto Scaling ユーザーガイド」
を参照してください。
Amazon Kinesis Client Library(KCL)を使用して、複数の EC2 インスタンスで複数のワーカーを動
作させることにより、ストリームの並行処理を簡素化できます。KCL により、ストリーム内のシャー
ドからデータを読み込むコードをより簡単に記述できるようになり、ストリーム内の各シャードに
ワーカーが確実に割り当てられます。KCL は、耐障害性に役立つチェックポイント機能も提供しま
す。KCL の使用を開始する場合、まずは「Amazon Kinesis Client Library を使用した Amazon Kinesis
Streams コンシューマーの開発 (p. 66)」の例を確認することをお勧めします。
Amazon Kinesis Streams の制限
Streams には次の制限があります。
• デフォルトのシャード制限は、次のリージョンのみ 50 シャードです。
• 米国東部(バージニア北部)
• 米国西部 (オレゴン)
• 欧州 (アイルランド)
その他のリージョンでは、デフォルトのシャード制限は 25 です。
ストリームまたはアカウント内のシャードの数に上限はありません。シャード制限の増加をリクエ
ストするには、「Streams Limits form」を使用します。
7
Amazon Kinesis Streams 開発者ガイド
制限
• データレコードはストリームに追加されてからデフォルトでは 24 時間アクセス可能です。この期
間は、保持期間と呼ばれ、24 時間から 168 時間 (1~7 日) まで 1 時間単位で設定できます。スト
リームの保持期間の詳細については、「データ保持期間の変更 (p. 105)」を参照してください。
• データ BLOB(Base64 エンコーディング前のデータペイロード)の最大サイズは、最大 1 MB で
す。
• CreateStream、DeleteStream、ListStreams は、1 秒間に最大 5 件のトランザクションを提供でき
ます。
• MergeShards と SplitShard は、1 秒間に最大 5 件のトランザクションを提供できます。
• DescribeStream は、1 秒間に最大 10 件のトランザクションを提供できます。
• GetShardIterator は、各オープンシャードで 1 秒間に最大 5 件のトランザクションを提供できま
す。
• GetRecords は、10 MBのデータを取得できます。
• 各シャードは、読み取りは最大 1 秒あたり 5 件のトランザクション、データ読み取りの最大合計
レートは 1 秒あたり 2 MBをサポートできます。
• 各シャードは、書き込みについては最大 1 秒あたり 1,000 レコード、データの最大書き込み合計
レートは 1 秒あたり 1 MB (パーティションキーを含む)をサポートできます。この書き込みの制限
は、PutRecord や PutRecords などのオペレーションに適用されます。
• GetShardIterator によって返されたシャードイテレーターは、使用されない場合、5 分後にタイムア
ウトになります。
読み取り制限は OPEN 状態のシャードの数に基づきます。シャードの状態の詳細については、「リ
シャーディング後のデータのルーティング、データの永続化、シャードの状態 (p. 104)」を参照して
ください。
これらの制限の多くは API アクションに関連するものです。詳細については、『Amazon Kinesis API
Reference』を参照してください。
8
Amazon Kinesis Streams 開発者ガイド
セットアップ
Amazon Kinesis Streams の使用開
始
このドキュメントは Amazon Kinesis Streams を使い始めるのに役立ちます。Streams を初めて利用
する場合は、Amazon Kinesis Streams とは? (p. 1) で説明されている概念と用語について理解するこ
とから始めてください。
トピック
• Amazon Kinesis Streams のセットアップ (p. 9)
• チュートリアル: Amazon Kinesis Streams を使用したウェブトラフィックの可視化 (p. 10)
• チュートリアル: AWS CLI を使用した Amazon Kinesis Streams の使用開始 (p. 16)
Amazon Kinesis Streams のセットアップ
Amazon Kinesis Streams を初めて使用する場合は、事前に以下のタスクをすべて実行してください。
タスク
• AWS にサインアップする (p. 9)
• ライブラリとツールをダウンロードする (p. 10)
• 開発環境を設定する (p. 10)
AWS にサインアップする
アマゾン ウェブ サービス(AWS)にサインアップすると、AWS アカウントが AWS 内のすべての
サービス(Streams など)に自動的にサインアップされます。料金が発生するのは、実際に使用した
サービスの分のみです。
既に AWS アカウントをお持ちの場合は次のタスクに進んでください。AWS アカウントをお持ちでな
い場合は、次に説明する手順にしたがってアカウントを作成してください。
サインアップして AWS アカウントを作成するには
1.
https://aws.amazon.com/ を開き、[AWS アカウントの作成] を選択します。
9
Amazon Kinesis Streams 開発者ガイド
ライブラリとツールをダウンロードする
2.
オンラインの手順に従います。
サインアップ手順の一環として、通話呼び出しを受け取り、電話のキーパッドを用いて PIN を入
力することが求められます。
ライブラリとツールをダウンロードする
以下のライブラリとツールは Streams での作業に役立ちます。
• Amazon Kinesis API Reference は、Streams でサポートされている基本的なオペレーションのセッ
トです。Java コードを使用した基本的なオペレーションの実行の詳細については、次を参照してく
ださい。
• Amazon Kinesis Streams API と AWS SDK for Java を使用した Amazon Kinesis Streams プロ
デューサーの開発 (p. 49)
• Amazon Kinesis Streams API および AWS SDK for Java を使用した Amazon Kinesis Streams コ
ンシューマーの開発 (p. 82)
• Amazon Kinesis Stream の管理 (p. 96)
• Java、JavaScript、.NET、Node.js、PHP、Python、Ruby 用の AWS SDK は、Streams をサポート
しており、サンプルが含まれています。AWS SDK for Java のお使いのバージョンに Streams のサ
ンプルが含まれていない場合は、GitHub からダウンロードできます。
• Amazon Kinesis Client Library(KCL)には、データ処理用の使いやすいプログラミングモデルが
用意されています。KCL は、Streams で Java、Node.js、.NET、Python、Ruby をすぐに使い始め
るのに役立ちます。詳細については、「Amazon Kinesis Client Library を使用した Amazon Kinesis
Streams コンシューマーの開発 (p. 66)」を参照してください。
• AWS Command Line Interfaceでは、Streams がサポートされています。AWS CLI を使用すると、
複数の AWS サービスをコマンドラインから制御したり、スクリプトで自動化したりできます。
• (オプション)Amazon Kinesis Connector Libraryは、Streams を他の AWS サービスに統合するの
に役立ちます。たとえば、Amazon Kinesis Connector Library を KCL とともに使用して、Amazon
DynamoDB、Amazon Redshift、および Amazon S3 に Streams から確実にデータを移動できま
す。
開発環境を設定する
KCL を使用するには、Java 開発環境が以下の要件を満たしている必要があります。
• Java 1.7(Java SE 7 JDK)以降。最新の Java ソフトウェアは、Oracle のウェブサイトの Java SE
Downloads からダウンロードできます。
• Apache Commons パッケージ(コード、HTTP クライアント、ログ記録)。
• Jackson JSON プロセッサ
AWS SDK for Java では、サードパーティフォルダーに Apache Commons と Jackson が含まれて
いることに注意してください。ただし、SDK for Java は Java 1.6 で動作しますが、Amazon Kinesis
Client Libraryには Java 1.7 が必要です。
チュートリアル: Amazon Kinesis Streams を使用
したウェブトラフィックの可視化
このチュートリアルでは、Amazon Kinesis Streams の使用開始に役立つように、その重要なコン
ポーネントについて Streams ストリーム (p. 5)、データプロデューサー (p. 6)、データコンシュー
10
Amazon Kinesis Streams 開発者ガイド
Streams のデータ可視化サンプルアプリケーション
マー (p. 7)を中心に概説します。このチュートリアルでは、リアルタイムデータ分析の一般的なユース
ケース(「Amazon Kinesis Streams とは? (p. 1)」で紹介)に基づいたサンプルアプリケーションを使
用します。
このサンプルのウェブアプリケーションは、単純な JavaScript アプリケーションを使用して、スラ
イドウィンドウにわたるトップ N 分析の結果を格納している DynamoDB テーブルをポーリングしま
す。アプリケーションはこのデータを受け取り、結果を可視化します。
Streams のデータ可視化サンプルアプリケーション
このチュートリアルのデータ可視化サンプルアプリケーションでは、&AKS; を使用してリアルタイム
でデータを取り込み分析する方法を示します。このサンプルアプリケーションは、さまざまな URL か
らのシミュレート上の閲覧者の数を Amazon Kinesis stream に投入するデータプロデューサーを作成
します。ストリームはそれらのデータレコードを受け取った順に保持します。データコンシューマー
は、ストリームからこれらのレコードを取得し、特定の URL からの閲覧者の数を計算します。最後
に、単純なウェブアプリケーションは計算結果をリアルタイムでポーリングし、計算結果を可視化し
ます。
このサンプルアプリケーションは、ストリーム処理の一般的なユースケースとして、スライディング
ウィンドウ分析を10 秒間行います。先ほど示した可視化されたデータは、ストリームのスライディ
ングウィンドウ分析の結果を反映したものであり、継続的に更新されてグラフとして表示されていま
す。さらに、データコンシューマーはデータストリームに対してトップ N 分析を行って、上位 3 つ
の閲覧者を割り出します。その結果は、2 秒ごとに更新されてグラフのすぐ下に表として表示されま
す。
すぐに開始できるように、サンプルアプリケーションは AWS CloudFormation を使用します。AWS
CloudFormation では、テンプレートを作成して、AWS リソースおよびそのアプリケーションを実行
するために必要な関連するすべての依存関係や実行時のパラメータを記述できます。サンプルアプリ
ケーションはテンプレートを使用して、すべての必要なリソース、たとえば Amazon EC2 インスタ
ンスで実行されるプロデューサーとコンシューマーのアプリケーション、集計レコード数を格納する
Amazon DynamoDB テーブルをすばやく作成します。
Note
サンプルアプリケーションの起動後、Streams の使用に関するわずかな料金が発生します。
可能ならば、サンプルアプリケーションは AWS 無料利用枠 の対象となるリソースを使用
します。このチュートリアルを終了したら、AWS リソースを削除して料金が発生しない
ようにしてください。詳細については、「ステップ 3: サンプルアプリケーションを削除す
る (p. 15)」を参照してください。
前提条件
このチュートリアルでは、Streams のデータ可視化サンプルアプリケーションをセットアップして実
行し、その結果を表示する手順を示します。サンプルアプリケーションを使用するには、最初に以下
の作業をする必要があります。
• コンピュータをセットアップし、インターネット接続を有効にします。
• AWS アカウントにサインアップします。
• さらに、ストリーム (p. 5)、データプロデューサー (p. 6)、データコンシューマー (p. 7)の概念につ
いて入門セクションを参照します。
ステップ 1: サンプルアプリケーションを起動する
AWS によって提供された AWS CloudFormation テンプレートを 使用してサンプルアプリケーション
を起動します。このサンプルアプリケーションには、ランダムにレコードを生成して Amazon Kinesis
11
Amazon Kinesis Streams 開発者ガイド
ステップ 2: サンプルアプリケー
ションのコンポーネントを表示する
stream に送信するストリームライター、リソースに対する HTTPS リクエスト数をカウントするデー
タコンシューマー、およびストリーム処理データの出力を、継続的に更新されるグラフとして表示す
るウェブアプリケーションが含まれます。
アプリケーションを起動するには
1.
このチュートリアルの AWS CloudFormation テンプレート を開きます。
2.
[Select Template] ページで、テンプレートの URL が提供されます。[Next] を選択します。
3.
[Specify Details] ページでは、デフォルトのインスタンスタイプは t2.micro です。ただし、T2
インスタンスは VPC が必要です。AWS アカウントに us-east-1 リージョンのデフォルト VPC
がない場合は、インスタンスタイプを m3.medium などの別のインスタントタイプに変更する必
要があります。[Next] を選択します。
4.
[Options] ページで、タグのキーとタグの値を任意で入力できます。このタグは、EC2 インスタン
スなどのテンプレートによって作成されたリソースに追加されます。[Next] を選択します。
5.
[Review] ページで、[I acknowledge that this template might cause AWS CloudFormation to create
IAM resources] を選択し、[Create] を選択します。
まず、ステータス CREATE_IN_PROGRESS の KinesisDataVisSample という名前のスタックが表示さ
れます。スタックが作成されるまでに数分かかる場合があります。ステータスが CREATE_COMPLETE
の場合、次のステップに進みます。ステータスが更新されない場合は、ページを更新してください。
ステップ 2: サンプルアプリケーションのコンポー
ネントを表示する
コンポーネント
• Amazon Kinesis Stream (p. 12)
• データプロデューサー (p. 13)
• データコンシューマー (p. 14)
Amazon Kinesis Stream
ストリーム (p. 5)は、大量のプロデューサーからリアルタイムでデータを取り込み、データを保存し
て、複数のコンシューマーに提供します。ストリームは、データレコードの順序付けられたシーケン
スを意味します。ストリームの作成時に、ストリーム名とシャードの数を指定する必要があります。
ストリームは 1 つまたは複数のシャードで構成されます。各シャードはデータレコードのグループで
す。
AWS CloudFormation は自動的にサンプルアプリケーションのストリームを作成します。AWS
CloudFormation テンプレートのこのセクションは、CreateStream操作で使用されるパラメータを示し
ています。
ストリームの詳細を表示するには
1.
[KinesisDataVisSample] スタックを選択します。
2.
[Outputs] タブで、URL のリンクを選択します。URL の形式は「http://ec2-xx-xx-xxxx.compute-1.amazonaws.com」のようになります。
3.
アプリケーションスタックを作成し、データ解析グラフで表示する意味のあるデータにするに
は、10 分程度かかります。リアルタイムのデータ分析グラフは、[Streams Data Visualization
Sample] というタイトルの別のページに表示されます。このグラフは、10 秒間に参照元 URL か
ら送信されたリクエストの数を表示し、1 秒ごとに更新されます。グラフのスパンは直近の 2 分
間です。
12
Amazon Kinesis Streams 開発者ガイド
ステップ 2: サンプルアプリケー
ションのコンポーネントを表示する
ストリームの詳細を表示するには
1.
https://console.aws.amazon.com/kinesis にある Amazon Kinesis コンソールを開きます。
2.
名前に ( KinesisDataVisSampleApp-KinesisStream-[randomString]) のフォームがある
ストリームを選択します。
3.
ストリームの詳細を表示するにはストリーム名を選択します。
4.
それらのグラフを見ると、データプロデューサーのアクティビティがストリームにレコードを投
入し、データコンシューマーがストリームからデータを取得していることがわかります。
データプロデューサー
データプロデューサー (p. 6)は Amazon Kinesis stream にデータレコードを送信します。ストリーム
にデータを投入するために、プロデューサーはストリームに対して PutRecord オペレーションを呼び
出します。
PutRecord の呼び出しごとに、ストリーム名とパーティションキーのほか、プロデューサーがスト
リームに追加するデータレコードが必要になります。ストリーム名により、レコードが存在すること
13
Amazon Kinesis Streams 開発者ガイド
ステップ 2: サンプルアプリケー
ションのコンポーネントを表示する
になるストリームが決まります。パーティションキーは、データレコードが追加されるストリーム内
のシャードを決定するために使用されます。
使用するパーティションキーはアプリケーションのロジックによって異なります。パーティション
キーの数は、ほとんどの場合、シャード数よりかなり大きくする必要があります。シャードに対して
十分な数のパーティションキーがあることで、ストリームはデータレコードをストリーム内のシャー
ドに均等に分配できます。
データデータプロデューサーは一般的な 6 つの URL を、2 シャード構成のストリームに投入された各
レコードのパーティションキーとして使用します。これらの URL がシミュレート上のページ閲覧者を
表します。HttpReferrerKinesisPutter コードの行 99 ~ 136 は Streams にデータを送信しています。3
つの必要なパラメータを PutRecord の呼び出し前に設定しています。pair.getResource を使用
してパーティションキーを設定しています。そのために、HttpReferrerStreamWriter コードの行 85 ~
92 で作成される 6 つの URL のいずれかをランダムに選択しています。
Streams にデータを投入するデータプロデューサーとして使用できるのは、EC2 インスタンス、ク
ライアントブラウザー、モバイルデバイスなどです。サンプルアプリケーションでは、データプロ
デューサーとそのデータコンシューマーとして同じ EC2 インスタンスを使用しています。一方、実際
のシナリオでは、アプリケーションの各コンポーネントとして別々の EC2 インスタンスを使用するこ
とになります。以下の手順に従って、サンプルアプリケーションの EC2 インスタンスのデータを表示
できます。
コンソールでインスタンスのデータを表示するには
1.
https://console.aws.amazon.com/ec2/) にある Amazon EC2 コンソールを開きます。
2.
ナビゲーションペインで、[インスタンス] を選択します。
3.
サンプルアプリケーション用に作成されたインスタンスを選択します。インスタンスが不明な場
合、KinesisDataVisSample の名前で始まるセキュリティグループがあります。
4.
[Monitoring] タブに、サンプルアプリケーションのデータプロデューサーとデータコンシューマー
のリソース使用状況が表示されます。
データコンシューマー
データコンシューマー (p. 7)は Amazon Kinesis stream 内のシャードからデータレコードを取得して
処理します。各コンシューマーはそれぞれ特定のシャードからデータを読み取ります。コンシュー
マーは GetShardIterator および GetRecords オペレーションを使用してシャードからデータを取得し
ます。
シャードイテレーターは、ストリームの位置とコンシューマーが読み取るシャードを表します。コン
シューマーは、ストリームからのレコードの読み取りを開始したり、読み取り位置を変更したりする
ときは、このシャードイテレーターを取得します。シャードイテレーターを取得するには、ストリー
ム名、シャード ID、シャードイテレータ イプを提供する必要があります。シャードイテレーター型
により、コンシューマーがストリームのどこから読み取りを開始するかを指定できます。たとえば、
データがリアルタイムで到着する場合はストリームの先頭を指定できます。ストリームはレコードを
バッチにまとめて返します。バッチのサイズは必要に応じて制限パラメータを使用して制御できま
す。
データコンシューマーは、アプリケーションの状態情報 (チェックポイントやワーカーシャードマッピ
ングなど) を維持するためのテーブルを DynamoDB に作成します。各アプリケーションには、それぞ
れ DynamoDB テーブルがあります。
データコンシューマーは最後の 2 秒間に特定の各 URL からの閲覧者のリクエストをカウントしま
す。このタイプのリアルタイムアプリケーションはスライディングウィンドウにわたるトップ N 分析
を採用しています。この例では、上位 N 個はページリクエスト数で上位 3 つの閲覧者であり、スライ
ディングウィンドウは 2 秒です。これは、Streams を使用した実際のデータ分析を示す、一般的な処
理パターンです。この計算の結果は DynamoDB テーブルに保持されます。
14
Amazon Kinesis Streams 開発者ガイド
ステップ 3: サンプルアプリケーションを削除する
Amazon DynamoDB テーブルを表示するには
1.
https://console.aws.amazon.com/dynamodb/ にある DynamoDB コンソールを開きます。
2.
ナビゲーションペインで、[Tables] を選択します。
3.
サンプルアプリケーションによって作成された 2 つのテーブルがあります。
• KinesisDataVisSampleApp-KCLDynamoDBTable-[randomString]— は状態情報を管理します。
• KinesisDataVisSampleApp-CountsDynamoDBTable-[randomString]— はスライディングウィン
ドウにわたりトップ N 分析を持続します。
4.
Select the KinesisDataVisSampleApp-KCLDynamoDBTable-[randomString] テーブル。テーブル
には 2 つのエントリがあり、特定のシャード (leaseKey)、ストリーム内の位置 (checkpoint)、
データを読み取るアプリケーション (leaseOwner) を示します。
5.
Select the KinesisDataVisSampleApp-CountsDynamoDBTable-[randomString] テーブル。
データコンシューマーがスライディングウィンドウ分析の一部として計算した総閲覧者数
(referrerCounts)を確認できます。
Amazon Kinesis クライアントライブラリ (KCL)
コンシューマーアプリケーションは、Amazon Kinesis Client Library(KCL)を使用して、ストリー
ムの並列処理を簡素化できます。KCL は、分散コンピューティングに関連する多くの複雑なタスクを
処理します。たとえば、複数のインスタンス間での負荷分散、インスタンスの障害に対する応答、処
理済みのレコードのチェックポイント作成、リシャーディングへの対応が挙げられます。KCL によっ
て、レコード処理のロジックの記述に集中できます。
データコンシューマーは、読み取るストリーム内の位置を KCL に渡します。この例では、ストリー
ムの先頭からの最新のデータを読み取るように指定しています。KCL はこの位置を使用して、コ
ンシューマーに代わって GetShardIterator を呼び出します。コンシューマーコンポーネント
は、IRecordProcessor という重要な KCL インターフェイスにより、レコードに対してどのような
処理を行うかも KCL に指定します。KCL はコールコンシューマーに代わって GetRecords を呼び出
し、IRecordProcessor により指定されたようにそれらのレコードを処理します。
• HttpReferrerCounterApplication サンプルコードの行 92 ~ 98 は KCL を設定しています。これは、
データを読み取るストリーム内の位置の設定など、KCL の初期設定になります。
• HttpReferrerCounterApplication サンプルコードの行 104 〜 108 は、IRecordProcessor という
重要な KCL コンポーネントを使用してレコードを処理するためのロジックを KCL に通知していま
す。
• CountingRecordProcessor サンプルコードの行 186 ~ 203 は、IRecordProcessor を使用する
トップ N 分析のためのカウントロジックを含んでいます。
ステップ 3: サンプルアプリケーションを削除する
サンプルアプリケーションは、アプリケーションの実行中に、シャードの使用料が発生する 2 つの
シャードを作成します。AWS アカウントが請求し続けないように、サンプルアプリケーションを終了
したら AWS CloudFormation スタックを削除してください。
アプリケーションリソースを削除するには
1.
AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation/) を開きま
す。
2.
スタックを選択します。
3.
[ Actions] で、[Delete Stack] を選択します。
4.
確認を求めるメッセージが表示されたら、[Yes, Delete] を選択します。
15
Amazon Kinesis Streams 開発者ガイド
ステップ 4: 次のステップ
AWS CloudFormation でサンプルアプリケーションに関連付けられたリソースをクリーンアップして
いる間、ステータスが [DELETE_IN_PROGRESS] に変わります。AWS CloudFormation がリソースのク
リーンアップを終了したら、リストからスタックを削除します。
ステップ 4: 次のステップ
• GitHub で、データ可視化サンプルアプリケーションのソースコードを確認できます。
• Amazon Kinesis Streams API と AWS SDK for Java を使用した Amazon Kinesis Streams プロ
デューサーの開発 (p. 49)、Amazon Kinesis Streams API および AWS SDK for Java を使用した
Amazon Kinesis Streams コンシューマーの開発 (p. 82)、および Amazon Kinesis Stream の管
理 (p. 96) で Streams API の使用に関するより詳しい情報を見つけることができます。
• Streams からデータを取得する SDK を使用する AWS SDK for Java のサンプルアプリケーションを
確認できます。
チュートリアル: AWS CLI を使用した Amazon
Kinesis Streams の使用開始
このチュートリアルでは、AWS Command Line Interface を使用して基本的な Amazon Kinesis
Streams オペレーションを実行する方法を示します。基本的な Streams データフローの原則
と、Amazon Kinesis stream にデータを入力したり、ストリームからデータを取得したりするために
必要なステップについて説明します。
For CLI access, you need an access key ID and secret access key. Use IAM user access keys
instead of AWS root account access keys. IAM lets you securely control access to AWS services and
resources in your AWS account. For more information about creating access keys, see How Do I Get
Security Credentials? in the AWS General Reference.
IAM およびセキュリティキーの詳細なセットアップの手順については、「IAM ユーザーを作成する」
を参照してください。
このチュートリアルで説明する特定のコマンドは、特定の値が実行のたびに異なる場合を除き、その
まま使用します。また、例では 米国西部 (オレゴン) リージョンを使用していますが、Streams をサ
ポートするリージョンであればこのチュートリアルに使用できます。
トピック
• AWS CLI のインストールと設定 (p. 16)
• 基本的なストリームオペレーションの実行 (p. 18)
AWS CLI のインストールと設定
AWS CLI のインストール
このセクションでは、Windows 用と、Linux、OS X、UNIX オペレーティングシステム用の AWS CLI
のインストール方法について説明します。
Windows
1.
『AWS Command Line Interface ユーザーガイド』の「完全インストールの手順」の
「Windows」セクションから、適切な MSI インストーラをダウンロードします。
2.
ダウンロードした MSI インストーラを実行します。
3.
表示される手順に従います。
16
Amazon Kinesis Streams 開発者ガイド
AWS CLI のインストールと設定
Linux, macOS, or Unix
以下の手順では Python 2.6.3 以降が必要です。問題が発生した場合は、『AWS Command Line
Interface ユーザーガイド』の完全インストールの手順を参照してください。
1.
pip のウェブサイトからインストールスクリプトをダウンロードし実行します。
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
sudo python get-pip.py
2.
pip を使用して AWS CLI をインストールします。
sudo pip install awscli
使用可能なオプションとサービスのリストを表示するには、次のコマンドを使用します。
aws help
Streams サービスを使用しているため、次のコマンドを使用して、Streams に関連する AWS CLI サ
ブコマンドを確認できます。
aws kinesis help
このコマンドの出力には、使用できる Streams コマンドが含まれます。
AVAILABLE COMMANDS
o add-tags-to-stream
o create-stream
o delete-stream
o describe-stream
o get-records
o get-shard-iterator
o help
o list-streams
o list-tags-for-stream
o merge-shards
o put-record
o put-records
o remove-tags-from-stream
o split-shard
17
Amazon Kinesis Streams 開発者ガイド
基本的なストリームオペレーションの実行
o wait
このコマンドリストは、『Amazon Kinesis サービス API リファレンス』に記載されている Streams
API に対応しています。たとえば、create-stream コマンドは CreateStream API アクションに対
応します。
これで AWS CLI は正常にインストールされましたが、まだ設定されていません。これについては、
次のセクションで説明します。
AWS CLI の設定
一般的な使用の場合、aws configure コマンドが、AWS CLI のインストールをセットアップするた
めの最も簡単な方法です。AWS CLI ではセッション間で設定が保存されるため、ユーザー設定に変更
がない場合、このセットアップは 1 回限りです。
aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: json
AWS CLI によって、4 種類の情報の入力が求められます。AWS アクセスキー ID と AWS シークレッ
トアクセスキーは、アカウントの認証情報です。キーがない場合は、「アマゾン ウェブ サービスへの
サインアップ」を参照してください。
デフォルトのリージョンは、デフォルトで呼び出しを実行する対象のリージョンの名前です。これ
は、通常、お客様の最寄りのリージョンですが、どのリージョンでもかまいません。
Note
AWS CLI を使用するときは AWS リージョンを指定する必要があります。サービスと利用
可能なリージョンのリストについては、「リージョンとエンドポイント」を参照してくださ
い。
デフォルトの出力形式は json、text、table のいずれかです。出力形式を指定しない場合、json が使用
されます。
aws configure で作成されたファイル、追加の設定、名前付きプロファイルの詳細については、
『AWS Command Line Interface ユーザーガイド』の「AWS コマンドラインインターフェイスの設
定」を参照してください。
基本的なストリームオペレーションの実行
このセクションでは、AWS CLI を使用した、コマンドラインからの Amazon Kinesis stream の基本的
な使用方法について説明します。「Amazon Kinesis Streams の主要なコンセプト (p. 2)」と「チュー
トリアル: Amazon Kinesis Streams を使用したウェブトラフィックの可視化 (p. 10)」で説明されて
いる概念を理解している必要があります。
Note
Streams は AWS の無料利用枠の対象に該当しないため、ストリームを作成した後、Streams
の使用に関するわずかな料金が発生します。このチュートリアルを終了したら、AWS リソー
スを削除して料金が発生しないようにしてください。詳細については、「手順 4: クリーン
アップ (p. 23)」を参照してください。
トピック
18
Amazon Kinesis Streams 開発者ガイド
基本的なストリームオペレーションの実行
• ステップ 1: ストリームを作成する (p. 19)
• ステップ 2: レコードを入力する (p. 20)
• ステップ 3: レコードを取得する (p. 20)
• 手順 4: クリーンアップ (p. 23)
ステップ 1: ストリームを作成する
最初のステップは、ストリームを作成し、正常に作成されたことを確認することです。次のコマンド
を使用して、「Foo」という名前のストリームを作成します。
aws kinesis create-stream --stream-name Foo --shard-count 1
--shard-count パラメータは必須であり、チュートリアルのこの部分では、ストリームで 1 個の
シャードを使用しています。次に、次のコマンドを実行して、ストリーム作成の進行状況を確認しま
す。
aws kinesis describe-stream --stream-name Foo
次の例のような出力が得られます。
{
"StreamDescription": {
"StreamStatus": "CREATING",
"StreamName": "Foo",
"StreamARN": "arn:aws:kinesis:us-west-2:account-id:stream/Foo",
"Shards": []
}
}
この例では、ストリームのステータスは CREATING であり、使用する準備が完全には整っていない
ことを意味します。しばらくしてからもう一度調べると、次の例のような出力が表示されます。
{
"StreamDescription": {
"StreamStatus": "ACTIVE",
"StreamName": "Foo",
"StreamARN": "arn:aws:kinesis:us-west-2:account-id:stream/Foo",
"Shards": [
{
"ShardId": "shardId-000000000000",
"HashKeyRange": {
"EndingHashKey":
"170141183460469231731687303715884105727",
"StartingHashKey": "0"
},
"SequenceNumberRange": {
"StartingSequenceNumber":
"49546986683135544286507457935754639466300920667981217794"
}
}
]
}
}
19
Amazon Kinesis Streams 開発者ガイド
基本的なストリームオペレーションの実行
この出力には、このチュートリアルで気にする必要がない情報も含まれています。ここで重要な項目
は "StreamStatus": "ACTIVE" であり、ストリームを使用する準備ができたことと、リクエストし
た単一のシャードに関する情報が示されています。また、次に示すように、list-streams コマンド
を使用して新しいストリームの存在を確認することもできます。
aws kinesis list-streams
出力:
{
"StreamNames": [
"Foo"
]
}
ステップ 2: レコードを入力する
アクティブなストリームができたら、データを入力できます。このチュートリアルでは、最もシンプ
ルなコマンド put-record を使用して、"testdata" というテキストを含む単一のデータレコードをス
トリームに入力します。
aws kinesis put-record --stream-name Foo --partition-key 123 --data testdata
このコマンドが成功すると、出力は次の例のようになります。
{
"ShardId": "shardId-000000000000",
"SequenceNumber":
"49546986683135544286507457936321625675700192471156785154"
}
これで、ストリームにデータを追加できました。次にストリームからデータを取得する方法を説明し
ます。
ステップ 3: レコードを取得する
ストリームからデータを取得するには、対象となるシャードのシャードイテレーターを取得する必要
があります。シャードイテレーターは、コンシューマー(ここでは get-record コマンド)が読み取
るストリームとシャードの位置を表します。次のように get-shard-iterator コマンドを使用しま
す。
aws kinesis get-shard-iterator --shard-id shardId-000000000000 --sharditerator-type TRIM_HORIZON --stream-name Foo
aws kinesis のコマンドにはその背後に Streams API があります。示されているパラメータに関心
がある場合は、GetShardIterator API のリファレンスのトピックを参照してください。実行に成功
すると、出力は次の例のようになります(出力全体を表示するには、水平にスクロールします)。
{
"ShardIterator":
"AAAAAAAAAAHSywljv0zEgPX4NyKdZ5wryMzP9yALs8NeKbUjp1IxtZs1Sp
+KEd9I6AJ9ZG4lNR1EMi+9Md/nHvtLyxpfhEzYvkTZ4D9DQVz/
mBYWRO6OTZRKnW9gd+efGN2aHFdkH1rJl4BL9Wyrk
+ghYG22D2T1Da2EyNSH1+LAbK33gQweTJADBdyMwlo5r6PqcP2dzhg="
20
Amazon Kinesis Streams 開発者ガイド
基本的なストリームオペレーションの実行
}
ランダムに見える長い文字列がシャードイテレーターです(お客様のシャードイテレーターはこれと
は異なります)。このシャードイテレーターをコピーして、次に示す get コマンドに貼り付ける必要
があります。シャードイテレーターの有効期間は 300 秒です。これは、シャードイテレーターをコ
ピーして次のコマンドに貼り付けるのに十分な時間です。次のコマンドに貼り付ける前に、シャード
イテレーターから改行を削除する必要があることに注意してください。シャードイテレーターが有効
ではないことを示すエラーメッセージが表示された場合は、もう一度 get-shard-iterator コマン
ドを実行します。
get-records コマンドは、ストリームからデータを取得し、Streams API の GetRecords 呼
び出しとして解決されます。シャードイテレーターは、データレコードの逐次読み取りを開始す
る、シャード内の位置を指定します。イテレーターが指定するシャードの位置にレコードがない場
合、GetRecords は空のリストを返します。シャード内のレコードが含まれる位置に到達するため
に、複数の呼び出しが必要になる場合があることに注意してください。
get-records コマンドの例を次に示します(出力全体を表示するには、水平にスクロールしま
す)。
aws kinesis get-records --shard-iterator
AAAAAAAAAAHSywljv0zEgPX4NyKdZ5wryMzP9yALs8NeKbUjp1IxtZs1Sp
+KEd9I6AJ9ZG4lNR1EMi+9Md/nHvtLyxpfhEzYvkTZ4D9DQVz/
mBYWRO6OTZRKnW9gd+efGN2aHFdkH1rJl4BL9Wyrk
+ghYG22D2T1Da2EyNSH1+LAbK33gQweTJADBdyMwlo5r6PqcP2dzhg=
bash など Unix タイプのコマンドプロセッサからこのチュートリアルを実行する場合は、次のように
入れ子にしたコマンドを使用して、シャードイテレーターの取得を自動化できます(横方向にスク
ロールしてコマンド全体を表示)。
SHARD_ITERATOR=$(aws kinesis get-shard-iterator --shard-id
shardId-000000000000 --shard-iterator-type TRIM_HORIZON --stream-name Foo -query 'ShardIterator')
aws kinesis get-records --shard-iterator $SHARD_ITERATOR
Powershell をサポートするシステムからこのチュートリアルを実行する場合、次のようなコマンドを
使用してシャードのイテレータの取得を自動化できます(横方向にスクロールしてコマンド全体を表
示)。
aws kinesis get-records --shard-iterator ((aws kinesis get-shard-iterator -shard-id shardId-000000000000 --shard-iterator-type TRIM_HORIZON --streamname Foo).split('"')[4])
get-records コマンドが正常に終了すると、次の例のように、シャードイテレーターを取得すると
きに指定したシャードに対応するストリーム内のレコードがリクエストされます(出力全体を表示す
るには、水平にスクロールします)。
{
"Records":[ {
"Data":"dGVzdGRhdGE=",
"PartitionKey":"123”,
"ApproximateArrivalTimestamp": 1.441215410867E9,
"SequenceNumber":"49544985256907370027570885864065577703022652638596431874"
} ],
"MillisBehindLatest":24000,
21
Amazon Kinesis Streams 開発者ガイド
基本的なストリームオペレーションの実行
"NextShardIterator":"AAAAAAAAAAEDOW3ugseWPE4503kqN1yN1UaodY8unE0sYslMUmC6lX9hlig5+t4RtZM0/
tALfiI4QGjunVgJvQsjxjh2aLyxaAaPr
+LaoENQ7eVs4EdYXgKyThTZGPcca2fVXYJWL3yafv9dsDwsYVedI66dbMZFC8rPMWc797zxQkv4pSKvPOZvrUIudb8Uk
}
上記で get-records を "リクエスト" と説明しましたが、これは、ストリーム内にレコードが存在
する場合もゼロ件以上のレコードが返される可能性があり、返されたどのレコードも現在ストリーム
内にあるすべてのレコードを表していない可能性があることを意味します。これは完全に正常で、本
稼働用のコードではストリームに対し、適切な間隔でレコードに対するポーリングを行います(この
ポーリング速度は、個々のアプリケーションの設計要件によって異なります)。
チュートリアルのこのパートで、レコードについて最初に気付くのは、データが文字化けのように
見える点でしょう。送信した testdata のクリアテキストではありません。これは、バイナリデー
タを送信できるように、put-record では Base64 エンコーディングを使用しているためです。た
だし、AWS CLI での Streams のサポートでは、Base64 デコーディングを提供していません。これ
は、Base64 デコーディングされた raw バイナリコンテンツを stdout に出力すると、特定のプラッ
トフォームやターミナルで、意図しない動作やセキュリティ上の問題が発生する可能性があるためで
す。Base64 デコーダ(https://www.base64decode.org/ など)を使用して手動で dGVzdGRhdGE= をデ
コードすると、これが実際に testdata であることを確認できます。このチュートリアルではこれで
問題ありません。なぜなら、実際には、AWS CLI を使用してデータを利用することはまれであり、通
常は前に示したように(describe-stream および list-streams)、ストリームの状態をモニタリ
ングしたり、情報を取得したりするために使用されるからです。後のチュートリアルでは、Amazon
Kinesis クライアントライブラリ (KCL) を使用して、本稼働品質のコンシューマーアプリケーション
を構築する方法を示し、Base64 の処理も検討します。KCL の詳細については、「Amazon Kinesis
Client Library を使用した Amazon Kinesis Streams コンシューマーの開発 (p. 66)」を参照してくだ
さい。
get-records によって、常にストリーム/シャード内のすべてのレコードが返されるわけではありま
せん。このような場合は、最後の結果から NextShardIterator を使用して、次のレコードのセッ
トを取得します。したがって、大量のデータがストリームに入力されていた場合(本稼働アプリケー
ションでの通常の状況)、毎回 get-records を使用してデータのポーリングを継続できます。た
だし、300 秒のシャードイテレーターの有効期間内に次のシャードイテレーターを使用して getrecords を呼び出した場合、エラーメッセージが表示され、get-shard-iterator コマンドを使用
して最新のシャードイテレーターを取得する必要があります。
この出力には、MillisBehindLatest も含まれています。これは、GetRecords オペレーションの
ストリームの末尾からの応答をミリ秒で表した数値であり、コンシューマーの時間の現在の時刻から
の遅れを示します。値ゼロはレコード処理が追いついて、現在処理する新しいレコードは存在しない
ことを示します。このチュートリアルの場合は、作業を進めるのに時間をかけていると、この数値が
かなり大きくなる可能性があります。これは問題ではなく、データレコードはストリームに 24 時間
留まり、取得されるのを待ちます。この期間は保持期間と呼ばれ、168 時間(7 日)まで設定可能で
す。
get-records が成功したときの結果は、現在ストリームにこれ以上レコードが見つからない場合で
も常に NextShardIterator です。これは、プロデューサーがどの時点でもストリームにレコードを
入力している可能性があることを前提としたポーリングモデルです。独自のポーリングルーチンを記
述することもできますが、開発中のコンシューマーアプリケーションで、前に説明した KCL を使用し
ている場合、このポーリングによって処理が実行されます。
レコードをプルする対象のストリームまたはシャードにそれ以上レコードがなくなるまで getrecords を呼び出すと、次の例のような空のレコードの出力が表示されます(出力全体を表示するに
は、水平にスクロールします)。
{
"Records": [],
"NextShardIterator": "AAAAAAAAAAGCJ5jzQNjmdhO6B/YDIDE56jmZmrmMA/r1WjoHXC/
kPJXc1rckt3TFL55dENfe5meNgdkyCRpUPGzJpMgYHaJ53C3nCAjQ6s7ZupjXeJGoUFs5oCuFwhP
22
Amazon Kinesis Streams 開発者ガイド
基本的なストリームオペレーションの実行
+Wul/EhyNeSs5DYXLSSC5XCapmCAYGFjYER69QSdQjxMmBPE/hiybFDi5qtkT6/
PsZNz6kFoqtDk="
}
手順 4: クリーンアップ
最後に、ストリームを削除してリソースを解放し、前に説明したように、アカウントに対する意図し
ない料金が発生することを回避できます。ストリームを作成したが、使用する予定がない場合は、必
ず実際にこれを行ってください。ストリームでデータを入力および取得したかどうかにかかわらず、
ストリームごとに料金が発生するためです。クリーンアップコマンドはシンプルです。
aws kinesis delete-stream --stream-name Foo
成功しても出力はないため、describe-stream を使用して削除の進行状況を確認できます。
aws kinesis describe-stream --stream-name Foo
delete コマンドの直後にこのコマンドを実行する場合、次の例のような出力が表示されます。
{
"StreamDescription": {
"StreamStatus": "DELETING",
"StreamName": "Foo",
"StreamARN": "arn:aws:kinesis:us-west-2:account-id:stream/Foo",
"Shards": []
}
}
ストリームが完全に削除されると、describe-stream は「not found」エラーを返します。
A client error (ResourceNotFoundException) occurred when calling the
DescribeStream operation:
Stream Foo under account 112233445566 not found.
これで、これで、AWS CLI を使用した Streams の基礎に関するこのチュートリアルは終了です。
23
Amazon Kinesis Streams 開発者ガイド
第 1 部: ストリーム、プロデュー
サー、およびコンシューマー
Amazon Kinesis Streams 開発の学
習
これらのモジュールは、Streams 開発をよく理解するために必要な内容を学習することを目的として
います。どのストリーミングサービスがお客様に適切なものであるか不明な場合は、「ストリーミン
グデータとは?」の比較情報を参照してください。開始する前に、「Amazon Kinesis Streams の主要
なコンセプト (p. 2)」と「チュートリアル: Amazon Kinesis Streams を使用したウェブトラフィック
の可視化 (p. 10)」で説明されている概念、特にストリーム、シャード、プロデューサー、コンシュー
マーについて理解している必要があります。また、「チュートリアル: Amazon Kinesis Streams を
使用したウェブトラフィックの可視化 (p. 10)」と「チュートリアル: AWS CLI を使用した Amazon
Kinesis Streams の使用開始 (p. 16)」を完了していると役立ちます。
トピック
• 第 1 部: ストリーム、プロデューサー、およびコンシューマー (p. 24)
第 1 部: ストリーム、プロデューサー、およびコ
ンシューマー
Amazon Kinesis Streams 向けに Java で開発を行う方法をシリーズで説明します。これは、その第 1
部です。どのストリーミングサービスがお客様に適切なものであるか不明な場合は、「ストリーミン
グデータとは?」の比較情報を参照してください。
このモジュールのシナリオでは、株式取引をストリームに取り込み、ストリーム上で計算を実行する
シンプルなアプリケーションを記述します。第 1 部では、レコードのストリームを Streams に送信
し、ほぼリアルタイムにレコードを消費および処理するアプリケーションを実装する方法を説明しま
す。このシリーズの続きの部分では、このシナリオを拡張して、より高度な設計を行い、ほとんどの
Streams ビジネスアプリケーションに当てはまる、株式取引分析モデルのプログラミングに関する考
慮事項について説明します。
Important
Streams は AWS の無料利用枠の対象に該当しないため、ストリームを作成した後、Streams
の使用に関するわずかな料金が発生します。コンシューマーアプリケーションの起動後に
も、DynamoDB の使用に関するわずかな料金が発生します。DynamoDB は、コンシューマー
アプリケーションが処理状態を追跡する際に使用されます。このアプリケーションを終了し
たら、AWS リソースを削除して料金が発生しないようにしてください。詳細については、
「ステップ 7: 終了する (p. 37)」を参照してください。
24
Amazon Kinesis Streams 開発者ガイド
前提条件
このコードでは、実際の株式市場データにアクセスする代わりに、株式取引のストリームをシミュ
レートします。シミュレーションには、2015 年 2 月時点における時価総額上位 25 社の株式に関す
る実際の市場データを基にしたランダム株式取引ジェネレーターが使用されています。リアルタイム
の株式取引のストリームにアクセスできるとしたら、そのときに必要としている便利な統計を取得し
たいと思われるかもしれません。たとえば、スライディングウィンドウ分析を実行して、過去 5 分間
に購入された最も人気のある株式を調べたいと思われるかもしれません。または、大規模な売り注文
(膨大な株式が含まれる売り注文)が発生したときに通知を受けたいと思われるかもしれません。こ
のシリーズで示されるコードを拡張することで、これらの機能を提供することもできます。
このモジュールにある手順をデスクトップまたはノート PC で実施したら、同じマシンまたは定義さ
れた要件を満たした任意のプラットフォーム(Amazon EC2 など)で、プロデューサーおよびコン
シューマーコードの両方を実行することができます。
例では、米国西部 (オレゴン) リージョンが使用されていますが、Streams がサポートされたリージョ
ンであれば、いずれのリージョンでも動作します。
トピック
• 前提条件 (p. 25)
• ステップ 1: ストリームを作成する (p. 26)
• ステップ 2: IAM ポリシーとユーザーを作成する (p. 27)
• ステップ 3: 実装コードをダウンロードおよびビルドする (p. 30)
• ステップ 4: プロデューサーを実装する (p. 30)
• ステップ 5: コンシューマーを実装する (p. 33)
• ステップ 6: (オプション)コンシューマーを拡張する (p. 36)
• ステップ 7: 終了する (p. 37)
前提条件
Amazon Web Services アカウント
開始する前に、「Amazon Kinesis Streams の主要なコンセプト (p. 2)」と「チュートリアル: Amazon
Kinesis Streams を使用したウェブトラフィックの可視化 (p. 10)」で説明されている概念、特にス
トリーム、シャード、プロデューサー、コンシューマーについて理解している必要があります。ま
た、「チュートリアル: Amazon Kinesis Streams を使用したウェブトラフィックの可視化 (p. 10)」と
「チュートリアル: AWS CLI を使用した Amazon Kinesis Streams の使用開始 (p. 16)」を完了してい
ると役立ちます。
AWS マネジメントコンソール にアクセスするときに、AWS アカウントとウェブブラウザが必要にな
ります。
コンソールにアクセスするには、IAM ユーザー名とパスワードを使用し、IAM サインインページ か
らAWS マネジメントコンソールにサインインします。IAM では、AWS アカウントでの AWS サー
ビスとリソースへのアクセスを安全に制御できます。 アクセスキーの作成の詳細については、AWS
General Reference の「How Do I Get Security Credentials?」を参照してください。
IAM の詳細およびセキュリティキーのセットアップ手順については、「IAM ユーザーを作成する」を
参照してください。
システムソフトウェア要件
アプリケーションを実行するシステムには、Java 7 以上がインストールされている必要があります。
最新の JDK をダウンロードおよびインストールするには、Oracle 社の Java SE インストールサイ
トを参照してください。
25
Amazon Kinesis Streams 開発者ガイド
ステップ 1: ストリームを作成する
Eclipse などの Java IDE をお持ちの場合は、ソースコードを開いて、ソースコードを編集、ビルド、
および実行することができます。
最新バージョンの AWS SDK for Java が必要です。Eclipse を IDE として使用している場合は、AWS
Toolkit for Eclipse を代わりにインストールすることができます。
コンシューマーアプリケーションには、バージョン 1.2.1 以上の Kinesis クライアントライブラリ
(KCL)が必要です。このクライアントライブラリは、Amazon Kinesis Client Library (Java) の
Github から入手することができます。
ステップ 1: ストリームを作成する
このステップでは、次のステップで使用するストリームを作成します。
ストリームを作成するには
1.
AWS マネジメントコンソール にサインインし、https://console.aws.amazon.com/kinesis にある
Amazon Kinesis コンソールを開きます。
2.
ナビゲーションバーで、リージョンセレクターを展開し、リージョンを選択します。
3.
[Create Stream] を選択します。
4.
[Create Stream] ページで、ストリーム名(例: StockTradeStream)を入力します。
5.
シャードの数として 1 を入力します。このとき、[Help me decide how many shards I need]
フィールドは、オフにしたままにします。
6.
[Create] を選択します。
ストリームの作成中、[Stream List] ページのストリームの [Status] の値は、[CREATING] です。スト
リームを使用する準備ができると、[Status] は [ACTIVE] に変わります。ストリームの名前を選択しま
す。[Stream Details] ページには、ストリーム設定の概要とモニタリング情報が表示されます。
シャードに関する追加情報
この学習モジュール以外で初めて Streams を使用するときには、もっと慎重にストリーム作成プロセ
スを計画する必要がある場合があります。シャードをプロビジョニングするときには、予想される最
大需要を考慮する必要があります。このシナリオを例として使用すると、米国の株式市場の取引トラ
フィックは、昼間(東部標準時)にピークを迎えます。その時刻をサンプルとして需要の予測を行う
必要があります。その後、予想される最大需要に合わせてプロビジョニングするか、需要の変動に応
じてストリームを拡大または縮小することができます。
シャードは、スループット容量の単位です。[Create Stream] ページで、[Help me decide how many
shards I need] チェックボックスをオンにします。次のガイドラインに従って、平均レコードサイ
ズ、1 秒間に書き込まれる最大レコード数、コンシューマーアプリケーションの数を入力します。
平均レコードサイズ
計算される平均レコードサイズの予測。この値がわからない場合は、予測される最大レコードサ
イズを使用します。
1 秒間に書き込まれる最大レコード数
データを提供するエンティティの数と各エンティティで 1 秒間に生成されるおよそのレコード数
を考慮に入れます。たとえば、20 台の取引サーバーから株式取引データを取得し、各サーバーで
1 秒間に 250 個の取引が生成される場合、1 秒あたりの合計取引数(レコード数)は 5,000 にな
ります。
コンシューマーアプリケーションの数
独立してストリームを読み取り、ストリームを固有の方法で処理し、固有の出力を生成するアプ
リケーションの数。各アプリケーションは、複数のインスタンスを異なるマシン上で実行するこ
と(クラスターで実行すること)ができます。このため、ストリームが大量でも遅れることなく
処理できます。
26
Amazon Kinesis Streams 開発者ガイド
ステップ 2: IAM ポリシーとユーザーを作成する
表示された予測シャードが現在のシャード制限を超えた場合は、その数のシャードを持つストリー
ムを作成する前に、制限を増加させるようにリクエストを送信する必要がある場合があります。
シャード制限の増加をリクエストするには、「Streams Limits form」を使用します。ストリームおよ
びシャードの詳細については、「Amazon Kinesis Stream (p. 5)」および「Amazon Kinesis Stream の
管理 (p. 96)」を参照してください。
ステップ 2: IAM ポリシーとユーザーを作成する
AWS では、セキュリティのベストプラクティスとして、アクセス権限を細分化して、各リソースへの
アクセスを制御することが勧められています。AWS Identity and Access Management を使用すること
で、AWS のユーザーとユーザーアクセス権限を管理できます。IAM ポリシーには、許可されているア
クションとそれらのアクションが適用されるリソースが明示的にリストされています。
一般的に、Streams プロデューサーおよびコンシューマーには、次の最小アクセス権限が必要になり
ます。
プロデューサー:
アクション
リソース
目的
DescribeStream
Amazon Kinesis レコードを書き込む前に、プロデューサーは、ストリームが存在し、アク
stream
であることを確認する必要があります。
PutRecord、PutRecords Amazon Kinesis
stream
レコードを Streams に書き込みます。
コンシューマー:
アクション
リソース
目的
DescribeStream
Amazon Kinesis レコードを読み取る前に、コンシューマーは、ストリームが存在し、アク
stream
であることを確認し、ストリームにシャードが含まれることを確認します
GetRecords、GetShardIterator
Amazon Kinesis
stream
Streams シャードからレコードを読み込みます。
CreateTable、DescribeTable
Amazon
、GetItem、
Kinesis
PutItem
クライアントライブラリ(KCL)を使用してコンシューマーが開
、PutMetricData、Scan、UpdateItem
DynamoDB
ている場合は、アプリケーションの処理状態を追跡するときに DynamoD
テーブル
ブルにアクセスする必要があります。テーブルは、最初に開始したコンシ
マーによって作成されます。
DeleteItem
Amazon
DynamoDB
テーブル
コンシューマーが Streams シャードで分割と結合のオペレーションを実行
合。
PutMetricData
Amazon
CloudWatch ロ
グ
KCL は、アプリケーションをモニタリングするのに便利なメトリックスを
CloudWatch にアップロードします。
このアプリケーションでは、上記のすべてをアクセス権限を付与する IAM ポリシーを作成します。実
際には、プロデューサーとコンシューマーに 1 つずつ、2 つのポリシーを作成することになるかもし
れません。ここで設定したポリシーは、このシリーズの以降の学習モジュールで再利用できます。
IAM ポリシーを作成するには
1.
新しいストリームの Amazon リソースネーム(ARN)を確認します。ARN 形式は次のとおりで
す。
27
Amazon Kinesis Streams 開発者ガイド
ステップ 2: IAM ポリシーとユーザーを作成する
arn:aws:kinesis:region:account:stream/name
region
リージョンコード(例: us-west-2)。リージョンコードの詳細については、「リージョンと
アベイラビリティーゾーンに関する概念」を参照してください。
account
AWS アカウント ID(「アカウント設定」を参照してください)。
name
ステップ 1: ストリームを作成する (p. 26) からのストリームの名前
(StockTradeStream)。
2.
コンシューマーによって使用される(最初のコンシューマーインスタンスによって作成され
た)DynamoDB テーブルの ARN を確認します。ARN 形式は次のようになります。
arn:aws:dynamodb:region:account:table/name
リージョンとアカウントは前の手順と同じ場所のものですが、name はコンシューマーアプリケー
ションによって作成および使用されるテーブルの名前となります。コンシューマーによって使用
される KCL では、アプリケーション名がテーブル名として使用されます。後で使用されるアプリ
ケーション名である StockTradesProcessor を使用します。
3.
IAM コンソールで、[Policies] ノード (https://console.aws.amazon.com/iam/home#policies) を参照
し、[Create Policy] を選択します。IAM ポリシーを初めて使用する場合は、[Get Started] を選択
します。次に、[Create Policy] を選択します。
4.
[Policy Generator] の横の [Select] をクリックします。
5.
AWS サービスとして [Amazon Kinesis] を選択します。
6.
許可されるアクションとし
て、DescribeStream、GetShardIterator、GetRecords、PutRecord、および
PutRecords を選択します。
7.
ステップ 1 で作成した ARN を入力します。
8.
以下の各項目について、[Add Statement] を使用します。
AWS サービス
アクション
ARN
Amazon DynamoDB
CreateTable、DeleteItem
ステップ
、DescribeTable
2 で作成した 、GetItem、PutItem、PutMetricD
ARN
Amazon CloudWatch
PutMetricData
*
ARN を指定する必要がない場合は、アスタリスク(*)を使用します。CloudWatch に
PutMetricData アクションが呼び出される特定のリソースが存在しない場合などがこれに該当
します。
9.
[Next Step] を選択します。
10. [Policy Name] を StockTradeStreamPolicy に変更し、コードを確認したら、[Create Policy]
を選択します。
その結果コンソールに表示されるポリシードキュメントは、次のようになります。
{
"Version": "2012-10-17",
"Statement": [
{
28
Amazon Kinesis Streams 開発者ガイド
ステップ 2: IAM ポリシーとユーザーを作成する
"Sid": "Stmt123",
"Effect": "Allow",
"Action": [
"kinesis:DescribeStream",
"kinesis:PutRecord",
"kinesis:PutRecords",
"kinesis:GetShardIterator",
"kinesis:GetRecords"
],
"Resource": [
"arn:aws:kinesis:us-west-2:123:stream/StockTradeStream"
]
},
{
"Sid": "Stmt456",
"Effect": "Allow",
"Action": [
"dynamodb:*"
],
"Resource": [
"arn:aws:dynamodb:us-west-2:123:table/StockTradesProcessor"
]
},
{
"Sid": "Stmt789",
"Effect": "Allow",
"Action": [
"cloudwatch:PutMetricData"
],
"Resource": [
"*"
]
}
]
}
IAM ユーザーを作成するには
1.
https://console.aws.amazon.com/iam/ で Identity and Access Management (IAM) コンソールを開
きます。
2.
[Users] ページで、[Create New Users] を選択します。
3.
StockTradeStreamUser と入力し、[Create] を選択します。
4.
[Show User Security Credentials] ノードを展開し、自分しかアクセスできない安全な場所にある
ローカルファイルにアクセスキーとシークレットキーを保存します。このアプリケーションで
は、アクセス権限を厳しく制限した ~/.aws/credentials という名前のファイルを作成しま
す。ファイル形式は次のようになります。
aws_access_key_id=<access key>
aws_secret_access_key=<secret key>
IAM ポリシーをユーザーにアタッチするには
1.
IAM コンソールで、ポリシーページを参照し、[Policy Actions] を選択します。
2.
[StockTradeStreamPolicy] を選択し、[Attach] を選択します。
29
Amazon Kinesis Streams 開発者ガイド
ステップ 3: 実装コードをダウンロードおよびビルドする
3.
StockTradeStreamUser を選択し、[Attach Policy] を選択します。
ステップ 3: 実装コードをダウンロードおよびビル
ドする
株式取引ストリームの取り込み(プロデューサー)およびデータの処理(コンシューマー)用のスタ
ブ実装が含まれたスケルトンコードが提供されています。次の手順は、実装を完了する方法を示して
います。
実装コードをダウンロードおよびビルドするには
1.
ソースコードをコンピューターにダウンロードします。
2.
ソースコード、AWS SDK、ライブラリとしてプロジェクトに追加された Kinesis クライアントラ
イブラリを使用して、お好きな IDE でプロジェクトを作成します。
3.
IDE によっては、プロジェクトが自動的にビルドされる場合があります。自動的にビルドされな
い場合は、IDE に適切なステップを使用してプロジェクトをビルドします。
これらのステップを正常に完了できたら、次のセクションに進むことができます。ビルドのいずれか
の段階でエラーが発生した場合は、先に進む前に、原因を調査および解決する必要があります。
ステップ 4: プロデューサーを実装する
このアプリケーションでは、株式市場取引をモニタリングする実際のシナリオが使用されます。次の
原理によって、このシナリオをプロデューサーおよびサポートコード構造にマッピングすることがで
きます。
ソースコードを参照し、次の情報を確認してください。
StockTrade クラス
個々の株式取引は、StockTrade クラスのインスタンスによって表されます。このクラスには、
ティッカーシンボル、株価、株数、取引のタイプ(買いまたは売り)、取引を一意に識別する ID
などの属性が含まれています。このクラスは、既に実装されています。
ストリームレコード
ストリームとは、一連のレコードのことです。レコードとは、JSON 形式による連続する
StockTrade インスタンスの 1 つを表しています。以下に例を示します。
{"tickerSymbol": "AMZN",
"tradeType": "BUY",
"price": 395.87,
"quantity": 16,
"id": 3567129045}
StockTradeGenerator クラス
StockTradeGenerator には、呼び出されるたびにランダムに生成された新しい株式取引を返
す、getRandomTrade() と呼ばれるメソッドが含まれています。このクラスは、既に実装されて
います。
StockTradesWriter クラス
プロデューサーのメインクラスである、StockTradesWriter は、次のタスクを実行すること
で、継続的にランダム取引を取得し、それらを Streams に送信します。
1. ストリーム名とリージョン名を入力として読み取ります。
2. ~/.aws/credentials から認証情報を読み取ります。
3. それらの認証情報を使用して、AmazonKinesisClient を作成します。
30
Amazon Kinesis Streams 開発者ガイド
ステップ 4: プロデューサーを実装する
4. ストリームが存在し、アクティブであることを確認します(そうでない場合は、エラーで終了
します)。
5. 連続ループで、StockTradeGenerator.getRandomTrade() と sendStockTrade メソッド
を呼び出し、100 ミリ秒ごとに取引をストリームに送信します。
sendStockTrade メソッドは実装されていません。このメソッドは、次のセクション(「プロ
デューサーを実装するには (p. 31)」)で実装します。
プロデューサーを実装するには
•
StockTradesWriter クラスの sendStockTrade メソッドに、次のコードを追加します。
private static void sendStockTrade(StockTrade trade, AmazonKinesis
kinesisClient, String streamName) {
byte[] bytes = trade.toJsonAsBytes();
// The bytes could be null if there is an issue with the JSON
serialization by the Jackson JSON library.
if (bytes == null) {
LOG.warn("Could not get JSON bytes for stock trade");
return;
}
LOG.info("Putting trade: " + trade.toString());
PutRecordRequest putRecord = new PutRecordRequest();
putRecord.setStreamName(streamName);
// We use the ticker symbol as the partition key, explained in the
Supplemental Information section below.
putRecord.setPartitionKey(trade.getTickerSymbol());
putRecord.setData(ByteBuffer.wrap(bytes));
try {
kinesisClient.putRecord(putRecord);
} catch (AmazonClientException ex) {
LOG.warn("Error sending record to Amazon Kinesis.", ex);
}
}
次のコードの詳細を参照してください。
• PutRecord API はバイト配列を想定するため、trade を JSON 形式に変換する必要があります。
この操作は、次の 1 行のコードによって行われます。
byte[] bytes = trade.toJsonAsBytes();
• 取引を送信する前に、新しい PutRecordRequest インスタンス(この場合、putRecord と呼ばれ
る)を作成する必要があります。
PutRecordRequest putRecord = new PutRecordRequest();
各 PutRecord の呼び出しには、ストリーム名、パーティションキー、およびデータ BLOB が必要
です。次のコードによって、setXxxx() メソッドを使用して、これらのフィールドを putRecord
オブジェクトに追加します。
putRecord.setStreamName(streamName);
putRecord.setPartitionKey(trade.getTickerSymbol());
31
Amazon Kinesis Streams 開発者ガイド
ステップ 4: プロデューサーを実装する
putRecord.setData(ByteBuffer.wrap(bytes));
この例では、株式チケットをパーティションキーとして使用することで、レコードを特定のシャー
ドにマッピングしています。実際には、レコードがストリーム全体に均等に分散するように、
シャード 1 つあたりに数百個または数千個のパーティションキーを用意する必要があります。スト
リームにデータを追加する方法の詳細については、「ストリームへのデータの追加 (p. 50)」を参
照してください。
次に、putRecord をクライアントに送信(put オペレーション)することができます。
kinesisClient.putRecord(putRecord);
• エラーチェックとログ記録は、いつでも追加して損はありません。次のコードによって、エラー状
態を記録します。
if (bytes == null) {
LOG.warn("Could not get JSON bytes for stock trade");
return;
}
put オペレーションの前後に try/catch ブロックを追加します。
try {
kinesisClient.putRecord(putRecord);
} catch (AmazonClientException ex) {
LOG.warn("Error sending record to Amazon Kinesis.", ex);
}
これは、ネットワークエラーや、ストリームがスループット限界を超えて抑制されたために
Streams put オペレーションが失敗することがあるためです。データが失われることがないよう
に、単純な再試行として使用するなど、put オペレーションの再試行ポリシーを慎重に検討するこ
とをお勧めします。
• ステータスのログ記録(
LOG.info("Putting trade: " + trade.toString());
)は有益ですが、オプションです。
ここに示されているプロデューサーでは、Streams API のシングルレコード機能(PutRecord)が使
用されています。実際には、個々のプロデューサーで大量のレコードが生成される場合があります。
その場合、PutRecords のマルチレコード機能を頻繁に使用して、レコードのバッチを一度に送信す
る方が効率的です。詳細については、「ストリームへのデータの追加 (p. 50)」を参照してくださ
い。
プロデューサーを実行するには
1.
前のステップ(IAM ユーザーを作成したとき)で取得したアクセスキーとシークレットキーのペ
アがファイル ~/.aws/credentials に保存されていることを確認します。
2.
次の引数を指定して StockTradeWriter クラスを実行します。
StockTradeStream us-west-2
32
Amazon Kinesis Streams 開発者ガイド
ステップ 5: コンシューマーを実装する
us-west-2 以外のリージョンにストリームを作成した場合は、代わりにそのリージョンをここで
指定する必要があります。
次のような出力が表示されます。
Feb 16, 2015 3:53:00 PM
com.amazonaws.services.kinesis.samples.stocktrades.writer.StockTradesWriter
sendStockTrade
INFO: Putting trade: ID 8: SELL 996 shares of BUD for $124.18
Feb 16, 2015 3:53:00 PM
com.amazonaws.services.kinesis.samples.stocktrades.writer.StockTradesWriter
sendStockTrade
INFO: Putting trade: ID 9: BUY 159 shares of GE for $20.85
Feb 16, 2015 3:53:01 PM
com.amazonaws.services.kinesis.samples.stocktrades.writer.StockTradesWriter
sendStockTrade
INFO: Putting trade: ID 10: BUY 322 shares of WMT for $90.08
Streams によって株式取引ストリームが取り込まれます。
ステップ 5: コンシューマーを実装する
ここでは、「ステップ 4: プロデューサーを実装する (p. 30)」で作成した株式取引ストリームを
継続的に処理し、1 分間ごとに売買されている最も人気のある株式を出力するコンシューマーアプリ
ケーションを開発します。KCL 上に構築されたこのアプリケーションは、コンシューマーアプリケー
ションにありがちな多くの面倒な作業を行います。詳細については、「Amazon Kinesis Client Library
を使用した Amazon Kinesis Streams コンシューマーの開発 (p. 66)」を参照してください。
ソースコードを参照し、次の情報を確認してください。
StockTradesProcessor クラス
事前に用意されているコンシューマーのメインクラスで、次のタスクを実行します。
• 引数として渡されたアプリケーション、ストリーム、およびリージョン名を読み取ります。
• ~/.aws/credentials から認証情報を読み取ります。
• RecordProcessor のインスタンスとして機能し、StockTradeRecordProcessor インスタ
ンスによって実装される、RecordProcessorFactory インスタンスを作成します。
• RecordProcessorFactory インスタンスおよび標準設定(ストリーム名、認証情報、アプリ
ケーション名など)が指定された KCL ワーカーを作成します。
• このワーカーは、(このコンシューマーインスタンスに割り当てられた)各シャードに新しい
スレッドを作成し、継続的に Streams からレコードを読み取り、RecordProcessor インスタ
ンスを呼び出して受信したレコードのバッチを処理します。
StockTradeRecordProcessor クラス
RecordProcessor インスタンスを実装したら、次に
initialize、processRecords、shutdown の 3 つの必須メソッドを実装します。
KCL によって使用される initialize および shutdown は、名前が示すとおり、レコードの受
信がいつ開始し、いつ終了するかをレコードプロセッサに知らせます。これにより、レコードプ
ロセッサは、アプリケーションに固有の設定および終了タスクを行うことができます。これらの
コードは事前に用意されています。主な処理は processRecords メソッドで行われ、そこでは
各レコードの processRecord が使用されます。後者のメソッドは、ほとんどの場合、空のス
ケルトンコードとして提供されます。次のステップでは、これを実装する方法について説明しま
す。詳細は、次のステップを参照してください。
また、processRecord のサポートメソッドである reportStats および resetStats の実装に
も注目してください。これらのメソッドは、元のソースコードでは空になっています。
33
Amazon Kinesis Streams 開発者ガイド
ステップ 5: コンシューマーを実装する
processsRecords メソッドは既に実装されており、次のステップを実行します。
• 渡された各レコードについて、レコード上で processRecord を呼び出します。
• 最後のレポートから 1 分間以上経過すると、reportStats() を呼び出して最新の統計を出力
し、次の間隔に新しいレコードだけが含まれるように resetStats() を呼び出して統計を消去
します。
• 次のレポート時間を設定します。
• 最後のチェックポイントから 1 分間以上経過すると、checkpoint() を呼び出します。
• 次のチェックポイント時間を設定します。
このメソッドでは、60 秒間間隔でレポートおよびチェックポイント時間が設定されています。
チェックポイントの詳細については、「コンシューマーに関する追加情報 (p. 35)」を参照して
ください。
StockStats クラス
このクラスでは、データを保持し、最も人気のある株式の経時的な統計を示すことができます。
このコードは、事前に用意されており、次のメソッドが含まれています。
• addStockTrade(StockTrade): 指定された StockTrade を実行中の統計に取り込みます。
• toString(): 特定の形式の文字列として統計を返します。
このクラスは、各株式の合計取引数と最大取引数を継続的にカウントすることによって、最も人
気のある株式を追跡します。このクラスは、株式取引を受信するたびにこれらの数を更新しま
す。
次のステップに示されているコードを StockTradeRecordProcessor クラスのメソッドに追加しま
す。
コンシューマーを実装するには
1.
processRecord メソッドを実装するには、サイズの正しい StockTrade オブジェクトを開始
し、それにレコードデータを追加します。また、問題が発生した場合に警告がログに記録される
ようにします。
StockTrade trade = StockTrade.fromJsonAsBytes(record.getData().array());
if (trade == null) {
LOG.warn("Skipping record. Unable to parse record into StockTrade.
Partition Key: " + record.getPartitionKey());
return;
}
stockStats.addStockTrade(trade);
2.
簡単な reportStats メソッドを実装します。出力形式は好みに応じて自由に変更することがで
きます。
System.out.println("****** Shard " + kinesisShardId + " stats for last 1
minute ******\n" +
stockStats + "\n" +
"****************************************************************\n");
3.
最後に、新しい stockStats インスタンスを作成する resetStats メソッドを実装します。
stockStats = new StockStats();
34
Amazon Kinesis Streams 開発者ガイド
ステップ 5: コンシューマーを実装する
コンシューマーを実行するには
1.
2.
3.
前のモジュールで記述したプロデューサーを実行し、シミュレートした株式取引レコードをスト
リームに取り込みます。
前のステップ(IAM ユーザーを作成したとき)で取得したアクセスキーとシークレットキーのペ
アがファイル ~/.aws/credentials に保存されていることを確認します。
次の引数を指定して StockTradesProcessor クラスを実行します。
StockTradesProcessor StockTradeStream us-west-2
us-west-2 以外のリージョンにストリームを作成した場合は、代わりにそのリージョンをここで
指定する必要があります。
1 分後、次のような出力が表示されます。その後、1 分間ごとに出力が更新されます。
****** Shard shardId-000000000001 stats for last 1 minute ******
Most popular stock being bought: WMT, 27 buys.
Most popular stock being sold: PTR, 14 sells.
****************************************************************
コンシューマーに関する追加情報
「Amazon Kinesis Client Library を使用した Amazon Kinesis Streams コンシューマーの開
発 (p. 66)」などで説明されている KCL のメリットに詳しい方であれば、それをここで使用する必
要があるのはなぜだろうかと思われるかもしれません。1 つのシャードストリームとそれを処理する
1 つのコンシューマーインスタンスしか使用しない場合でも、KCL を使用してコンシューマーを実装
する方が簡単です。プロデューサーセクションとコンシューマーセクションのコードの実装手順を比
較すると、コンシューマーの実装の方が比較的に簡単であることがわかります。これは、KCL で提供
されているサービスが大きく関係しています。
このアプリケーションでは、個別のレコードを処理できるレコードプロセッサクラスの実装に焦点を
合わせてきました。新しいレコードを取得できるようになると、KCL がレコードを取得し、レコード
プロセッサを呼び出すため、レコードを Streams から取得する方法を心配しなくて済みます。また、
発生するシャードやコンシューマーインスタンスの数について心配しなくて済みます。ストリームが
大きくなっても、複数のシャードまたはコンシューマーインスタンスを処理できるようにアプリケー
ションを書き直す必要はありません。
チェックポイントとは、ストリームにおける特定のポイントのことで、それまでに消費および処理さ
れたデータレコードが記録されます。このため、アプリケーションがクラッシュしても、ストリーム
の始めからではなく、そのポイントからストリームが読み取られます。チェックポイント、チェック
ポイントのさまざまな設計パターンおよびベストプラクティスは、この章の範囲外ですが、本番環境
ではこれらの問題に直面することがあります。
「ステップ 4: プロデューサーを実装する (p. 30)」で学習したように、Streams API の put オペ
レーションは、パーティションキーを入力として受け取ります。パーティションキーは、Streams が
レコードを複数のシャードに分割する場合に使用します(複数のシャードがストリームに含まれる場
合)。同じパーティションキーは、常に同じシャードにルーティングされます。このため、同じパー
ティションキーを持つレコードはそのコンシューマーにのみ送信され、他のコンシューマーに送信
されることはないと仮定して、特定のシャードを処理するコンシューマーを設計できます。したがっ
て、コンシューマーのワーカーは、必要なデータが欠落しているかもしれないと心配することなく、
同じパーティションキーを持つすべてのレコードを集計できます。
このアプリケーションでは、コンシューマーによるレコードの処理が大変でないため、1 つのシャー
ドを使用し、KCL スレッドと同じスレッドで処理を行うことができます。実際には、まずシャード
の数を増やすことを検討する必要があるかもしれません。この点については、このシリーズの次のモ
ジュールで説明されます。レコードの処理が大変になることが予想される場合は、異なるスレッドに
35
Amazon Kinesis Streams 開発者ガイド
ステップ 6: (オプション)コンシューマーを拡張する
処理を切り替えたり、スレッドプールを使用したりする必要があるかもしれません。このように、そ
の他のスレッドがレコードを並列処理していても、KCL は新しいレコードを迅速に取得できます。一
般的に、マルチスレッド設計は簡単ではなく高度な技術が必要になるため、シャードの数を増やすこ
とが最も効果的で簡単な拡張方法です。
ステップ 6: (オプション)コンシューマーを拡張
する
ここに示すアプリケーションは、すでに目的を十分に果たしているかもしれません。このオプション
のセクションでは、少し複雑なシナリオにも対応できるようにコンシューマーコードを拡張する方法
について説明します。
1 分ごとに最大の売り注文を知りたい場合、3 箇所の StockStats クラスを変更し、新しい優先順位
を組み込むだけで行うことができます。
カスタマーを拡張するには
1.
新しいインスタンス変数を追加します。
// Ticker symbol of the stock that had the largest quantity of shares
sold
private String largestSellOrderStock;
// Quantity of shares for the largest sell order trade
private long largestSellOrderQuantity;
2.
次のコードを addStockTrade に追加します。
if (type == TradeType.SELL) {
if (largestSellOrderStock == null || trade.getQuantity() >
largestSellOrderQuantity) {
largestSellOrderStock = trade.getTickerSymbol();
largestSellOrderQuantity = trade.getQuantity();
}
}
3.
toString メソッドを変更し、追加情報を出力します。
public String toString() {
return String.format(
"Most popular stock being bought: %s, %d buys.%n" +
"Most popular stock being sold: %s, %d sells.%n" +
"Largest sell order: %d shares of %s.",
getMostPopularStock(TradeType.BUY),
getMostPopularStockCount(TradeType.BUY),
getMostPopularStock(TradeType.SELL),
getMostPopularStockCount(TradeType.SELL),
largestSellOrderQuantity, largestSellOrderStock);
}
コンシューマーを今すぐ実行すると(プロデューサーも忘れずに実行してください)、次のような出
力が表示されます。
****** Shard shardId-000000000001 stats for last 1 minute ******
Most popular stock being bought: WMT, 27 buys.
Most popular stock being sold: PTR, 14 sells.
36
Amazon Kinesis Streams 開発者ガイド
ステップ 7: 終了する
Largest sell order: 996 shares of BUD.
****************************************************************
ステップ 7: 終了する
Amazon Kinesis stream の使用には料金がかかるため、作業が終わったら、必ずストリームとそれに
対応する DynamoDB テーブルを削除してください。レコードを送信したり取得したりしていなくて
も、ストリームがアクティブなだけでわずかな料金が発生します。その理由として、アクティブなス
トリームでは、受信レコードを継続的に "リッスン" し、レコードを取得するようにリクエストするこ
とにリソースが使用されるためです。
ストリームおよびテーブルを削除するには
1.
実行しているプロデューサーおよびコンシューマーをすべてシャットダウンします。
2.
https://console.aws.amazon.com/kinesis にある Amazon Kinesis コンソールを開きます。
3.
ストリームリストで、このアプリケーション(StockTradeStream)に作成したストリームを選
択し、[Delete Stream] を選択します。
4.
https://console.aws.amazon.com/dynamodb/ にある DynamoDB コンソールを開きます。
5.
StockTradesProcessor テーブルを削除します。
概要
ほぼリアルタイムで大量のデータを処理するために、魔法のコードを記述したり、大規模なインフラ
ストラクチャを開発したりする必要はありません。Streams を使用すれば、少量のデータを処理する
ロジックを記述する(processRecord(Record) を記述する)場合と同じくらい簡単に、大量のス
トリーミングデータにも対応できるように拡張することができます。Streams が代わりに処理してく
れるため、処理を拡張する方法を心配しなくて済みます。することと言えば、ストリームレコードを
Streams に送信し、受信した新しい各レコードを処理するロジックを記述するだけです。
このアプリケーションについて考えられる拡張機能は、次のとおりです。
すべてのシャードで集計する
現在、単一のワーカーおよび単一のシャードから取得したデータレコードを集計した統計が表示
されています(単一のアプリケーションでは、シャードを複数のワーカーによって同時に処理
することはできません)。拡張するときに複数のシャードがある場合、すべてのシャードで集
計したいと思われるかもしれません。その場合、パイプラインアーキテクチャを用意することが
できます。パイプラインアーキテクチャでは、各ワーカーの出力が単一のシャードを持つ別のス
トリームに供給され、第 1 段階の出力を集計するワーカーによってそのストリームが処理され
ます。第 1 段階のデータが制限(シャードおよび 1 分間あたり 1 つのサンプル)されるため、
シャードごとに処理しやすくなります。
処理の拡張
多数のシャードが含まれるようにストリームを拡張する場合(多数のプロデューサーがデータを
送信している場合)、処理を拡張するには、より多くのワーカーを追加します。ワーカーを EC2
インスタンスで実行し、Auto Scaling グループを活用することができます。
S3/DynamoDB/Redshift/Storm までのコネクタを活用する
ストリームは継続的に処理されるため、出力を他の保存先に送信することができます。AWS に
は、Streams を他の AWS サービスおよびサードパーティ製ツールと統合するためのコネクタが
用意されています。
次のステップ
• Streams API オペレーションの使用方法については、「Amazon Kinesis Streams API と AWS SDK
for Java を使用した Amazon Kinesis Streams プロデューサーの開発 (p. 49)」、「Amazon
37
Amazon Kinesis Streams 開発者ガイド
ステップ 7: 終了する
Kinesis Streams API および AWS SDK for Java を使用した Amazon Kinesis Streams コンシュー
マーの開発 (p. 82)」、および「Amazon Kinesis Stream の管理 (p. 96)」を参照してくださ
い。
• Kinesis クライアントライブラリの詳細については、「Amazon Kinesis Client Library を使用した
Amazon Kinesis Streams コンシューマーの開発 (p. 66)」を参照してください。
• アプリケーションを最適化する方法については、「高度なトピック (p. 89)」を参照してくださ
い。
38
Amazon Kinesis Streams 開発者ガイド
ストリームへのデータの書き込み
Amazon Kinesis Streams の使用
このドキュメントでは、Amazon Kinesis Streams を使用するための情報を示します。Streams を初
めて利用する場合は、Amazon Kinesis Streams とは? (p. 1) と Amazon Kinesis Streams の使用開
始 (p. 9) に説明されている概念と用語について理解することから始めてください。
トピック
• Amazon Kinesis Streams へのデータの書き込み (p. 39)
• Amazon Kinesis Streams からのデータの読み取り (p. 66)
• Amazon Kinesis Stream の管理 (p. 96)
• Amazon Kinesis Streams のモニタリング (p. 105)
• Amazon Kinesis Streams でのストリームのタグ付け (p. 130)
• IAM により Amazon Kinesis Streams リソースへのアクセスを制御する (p. 133)
Amazon Kinesis Streams へのデータの書き込み
プロデューサーは、Amazon Kinesis Streams にデータを書き込むアプリケーションです。Streams
のプロデューサーを構築できます 。Streams を初めて利用する場合は、Amazon Kinesis Streams と
は? (p. 1) と Amazon Kinesis Streams の使用開始 (p. 9) に説明されている概念と用語について理解す
ることから始めてください。
トピック
• Amazon Kinesis プロデューサライブラリ を使用した Amazon Kinesis Streams プロデューサーの
開発 (p. 39)
• Amazon Kinesis Streams API と AWS SDK for Java を使用した Amazon Kinesis Streams プロ
デューサーの開発 (p. 49)
• Amazon Kinesis エージェントを使用して Amazon Kinesis Streams への書き込み (p. 54)
• Amazon Kinesis Streams プロデューサーのトラブルシューティング (p. 63)
• Amazon Kinesis Streams プロデューサーについての高度なトピック (p. 64)
Amazon Kinesis プロデューサライブラリ を使用し
た Amazon Kinesis Streams プロデューサーの開発
Amazon Kinesis Streams プロデューサーは、ユーザーデータレコードを Amazon Kinesis stream に
配置するアプリケーションです(データ取り込みとも呼ばれます)。Amazon Kinesis プロデューサ
39
Amazon Kinesis Streams 開発者ガイド
KPL の使用
ライブラリ(KPL)を使用すると、プロデューサーアプリケーションの開発が簡素化され、開発者は
Amazon Kinesis stream に対する優れた書き込みスループットを実現できます。
Amazon CloudWatch を使用して KPL をモニタリングできます。詳細については、「Amazon
CloudWatch による Amazon Kinesis プロデューサーライブラリのモニタリング (p. 126)」を参照し
てください。
目次
• KPL の役割 (p. 40)
• KPL を使用するメリット (p. 40)
• KPL の使用が適さない場合 (p. 41)
• インストール (p. 41)
• サポートされているプラットフォーム (p. 42)
• 主要なコンセプト (p. 42)
• プロデューサーコードとの統合 (p. 44)
• KPL を使用した Streams ストリームへの書き込み (p. 45)
• KPL の設定 (p. 46)
• コンシューマーの集約解除 (p. 47)
KPL の役割
KPL は使いやすく、Amazon Kinesis stream への書き込みに役立つ、高度な設定が可能なライブラリ
です。これは、プロデューサーアプリケーションのコードと Streams API アクション間の仲介として
機能します。KPL は次の主要なタスクを実行します。
• 自動的で設定可能な再試行メカニズムにより 1 つ以上の Amazon Kinesis stream へ書き込む
• レコードを収集し、PutRecords を使用して、リクエストごとに複数シャードへ複数レコードを書
き込む
• ユーザーレコードを集約し、ペイロードサイズを増加させ、スループットを改善する
• コンシューマーで Amazon Kinesis Client Library(KCL)とシームレスに統合して、バッチ処理され
たレコードを集約解除する
• Amazon CloudWatch メトリックスをユーザーに代わって送信し、プロデューサーのパフォーマン
スを確認可能にする
KPL は AWS SDK で使用できる Streams API とは異なることに注意してください。Streams API は
Streams の多くの要素(ストリームの作成、リシャーディング、レコードの入力と取得など)を管
理するのに役立ちます。一方、KPL はデータの取り込みに特化した抽象化層を提供します。Streams
API の詳細については、Amazon Kinesis API Reference を参照してください。
KPL を使用するメリット
Streams プロデューサーを開発するために KPL を使用するいくつかの主な利点を次のリストに示しま
す。
KPL は、同期または非同期のユースケースで使用できます。同期動作を使用する特別な理由がない
かぎり、非同期インターフェイスの優れたパフォーマンスを使用することを推奨します。これら 2 つ
のユースケースの詳細とコード例については、「KPL を使用した Streams ストリームへの書き込み
(p. 45)」を参照してください。
パフォーマンスのメリット
KPL は、高性能のプロデューサーの構築に役立ちます。Amazon EC2 インスタンスをプロキ
シとして、100 バイトのイベントを数百または数千の低電力デバイスから収集し、レコードを
Amazon Kinesis stream に書き込む状況を考えてみます。これらの EC2 インスタンスはそれぞ
40
Amazon Kinesis Streams 開発者ガイド
KPL の使用
れ、毎秒数千イベントを Amazon Kinesis stream に書き込む必要があります。必要なスループッ
トを実現するには、お客様の側で、再試行ロジックとレコード集約解除に加え、バッチ処理やマ
ルチスレッドなどの複雑なロジックをプロデューサーに実装する必要があります。KPL が、これ
らのタスクをすべて実行します。
コンシューマー側の使いやすさ
コンシューマー側の開発者が Java で KCL 使用する場合、追加作業なしで KPL が統合されま
す。KCL で、複数の KPL ユーザーレコードで構成されている集約された Streams レコードを取
得するときは、自動的に KPL が呼び出され、個々のユーザーレコードが抽出され、ユーザーに返
されます。
KCL を使用せずに API オペレーション GetRecords を直接使用するコンシューマー側の開発者
の場合、KPL Java ライブラリを使用して個々のユーザーレコードを抽出してから、それらのレ
コードをユーザーに返すことができます。
プロデューサーのモニタリング
Amazon CloudWatch と KPL を使用して、Streams プロデューサーを収集、モニタリング、分析
できます。KPL は、スループット、エラー、およびその他のメトリックスをユーザーに代わって
CloudWatch に送信し、ストリーム、シャード、またはプロデューサーレベルでモニタリングす
るように設定できます。
非同期アーキテクチャ
KPL は、レコードを Streams に送信する前にそれらのレコードをバッファ処理する場合がある
ため、実行を続行する前にレコードがサーバーに到着したことを確認するために、発信者アプリ
ケーションを強制的にブロックし待機させることはしません。レコードを KPL に配置する呼び出
しは、必ずすぐに処理が戻り、レコードの送信やサーバーからの応答の受信を待ちません。代わ
りに、レコードを Streams に送信した結果を後で受信するための Future オブジェクトが作成さ
れます。これは、AWS SDK の非同期クライアントと同じ動作です。
KPL の使用が適さない場合
KPL では、ライブラリ内で最大 RecordMaxBufferedTime まで追加の処理遅延が生じる場合があ
ります(ユーザーが設定可能)。RecordMaxBufferedTime の値が大きいほど、パッキング効率と
パフォーマンスが向上します。この追加的な遅延を許容できないアプリケーションは、AWS SDK を
直接使用することが必要になる場合があります。AWS SDK を Streams と組み合わせて使用する方
法については、「Amazon Kinesis Streams API と AWS SDK for Java を使用した Amazon Kinesis
Streams プロデューサーの開発 (p. 49)」を参照してください。RecordMaxBufferedTime などの
KPL のユーザー設定可能なプロパティの詳細については、「KPL の設定 (p. 46)」を参照してくだ
さい。
インストール
Amazon では、OS X と Windows、そして最新の Linux ディストリビューション向けに C++ KPL のビ
ルド済みバイナリを提供しています(サポートされているプラットフォームの詳細については、次の
セクションを参照してください)。 これらのバイナリは、Java の .jar ファイルの一部としてパッケー
ジ化されており、Maven を使用してパッケージをインストールする場合、自動的に呼び出され、使用
されます。KPL と KCL の最新バージョンを確認するには、次の Maven サーチリンクをご利用くださ
い。
• KPL
• KCL
Linux のバイナリは、GCC でコンパイルされ、Linux の libstdc++ に静的にリンクされています。 こ
れらのバイナリは、glibc バージョン 2.5 以降を含むすべての 64 ビット Linux ディストリビューショ
ンで動作することが推定されています。
以前のバージョンの Linux ディストリビューションのユーザーは、Github のソースとともに提供さ
れるビルド手順で KPL をビルドできます。 KPL を GitHub からダウンロードするには、「Amazon
Kinesis プロデューサライブラリ」を参照してください。
41
Amazon Kinesis Streams 開発者ガイド
KPL の使用
サポートされているプラットフォーム
KPL は、C++ で書かれており、メインユーザープロセスの子プロセスとして実行されます。プリコ
ンパイルされている 64 ビットのネイティブバイナリは、Java ベースにバンドルされており、Java
wrapper によって管理されます。
次のオペレーティングシステムでは、追加ライブラリをインストールすることなく Java のパッケー
ジを実行できます。
• カーネルバージョン 2.6.18(2006 年 9 月)の Linux ディストリビューション以降
• Apple OS X 10.9 以降
• Windows Server 2008 以降
KPL は、64 ビット版のみであることに注意してください。
ソースコード
KPL のインストールで提供されるバイナリがお客様の環境に適さない場合は、KPL のコアが C+
+ のモジュールとして書き込まれます。C++ モジュールと Java インターフェイスのソースコード
は、Amazon パブリックライセンスの下で公開され、GitHub の Amazon Kinesis プロデューサライブ
ラリ で入手できます。KPL は、最近の規格に準拠した C++ コンパイラと JRE を使用できるすべての
プラットフォームで使用できますが、Amazon では、サポートされるプラットフォームの一覧にない
プラットフォームを正式にはサポートしません。
主要なコンセプト
以下のセクションでは、KPL を理解し、そのメリットを引き出すために必要な概念と用語について説
明します。
トピック
• レコード (p. 42)
• バッチ処理 (p. 42)
• 集約 (p. 43)
• Collection (p. 43)
レコード
このガイドでは、KPL ユーザーレコードと Streams レコードを区別します。修飾語を付けずにレコー
ドという用語を使用する場合は、KPL ユーザーレコードを意味します。Streams レコードを意味する
ときは、明示的に Streams レコードと表現します。
KPL ユーザーレコードは、ユーザーにとって特定の意味のあるデータの BLOB です。たとえば、ウェ
ブサイトの UI イベントまたはウェブサーバーのログエントリを表す JSON BLOB がそれに該当しま
す。
Streams レコードは、Streams サービス API で定義された Record データ構造のインスタンスです。
これには、パーティションキー、シーケンス番号、データの BLOB が含まれています。
バッチ処理
バッチ処理は、各項目に対して単一のアクションを繰り返し実行する代わりに、複数の項目に対して
そのアクションを実行することを意味します。
ここでは、「項目」はレコードに対応し、「アクション」はレコードを Streams に送信することに対
応します。バッチ処理を使用しない場合、各レコードを別々の Streams レコードに配置し、それぞれ
42
Amazon Kinesis Streams 開発者ガイド
KPL の使用
を Streams に送信するたびに HTTP リクエストを実行します。バッチ処理では、各 HTTP リクエスト
により、1 つではなく複数のレコードを処理できます。
KPL では、2 種類のバッチ処理がサポートされます。
• 集約 – 複数のレコードを単一の Streams レコードに格納します。
• 収集 – API オペレーション PutRecords を使用して、Amazon Kinesis stream 内の 1 つ以上の
シャードに複数の Streams レコードを送信します。
2 種類の KPL バッチ処理は、共存できるように設計されており、互いに独立して有効または無効にで
きます。デフォルトでは、どちらも有効です。
集約
集約は、複数レコードを 1 つの Streams レコードに保存することを意味します。集約を使用する
と、API 呼び出しごとに送信されるレコード数を増やすことができ、効率的にプロデューサーのス
ループットを高めることができます。
Streams シャードは、1 秒あたり最大で 1,000 Streams レコードまたは 1 MB のスループットをサ
ポートします。1 秒あたりの Streams レコードの制限により、お客様のレコードは 1 KB 未満に制限
されます。レコードの集約を使用すると、複数のレコードを単一の Streams レコードに結合できま
す。そのため、お客様はシャードあたりのスループットを改善することができます。
リージョンが us-east-1 の 1 つのシャードで、1 つが 512 バイトのレコードを 1 秒あたり 1,000
レコードの一定割合で処理する場合を考えます。KPL の集約を使用すると、1,000 レコードを 10
Streams レコードに詰めることができ、RPS を 10 に減らすことができます(それぞれ 50 KB)。
Collection
収集は、各 Streams レコードをそれぞれの HTTP リクエストで送信するのではなく、複数の Streams
レコードをバッチ処理し、API オペレーション PutRecords を呼び出して単一の HTTP リクエストで
それらを送信することを意味します。
これにより、個別の HTTP リクエストを多数実行するオーバーヘッドが減るため、収集を使用しない
場合に比べスループットが向上します。実際、PutRecords 自体が、この目的のために設計されてい
ます。
収集は、Streams レコードのグループを使用している点で集約と異なります。収集された Streams レ
コードには、ユーザーの複数のレコードをさらに含めることができます。この関係は、次のように図
示できます。
record 0 --|
record 1
|
[ Aggregation ]
...
|--> Amazon Kinesis record 0 --|
...
|
|
record A --|
|
|
...
...
|
|
record K --|
|
record L
|
|
[ Collection ]
...
|--> Amazon Kinesis record C --|--> PutRecords Request
...
|
|
record S --|
|
|
...
...
|
|
43
Amazon Kinesis Streams 開発者ガイド
KPL の使用
record AA--|
|
record BB |
|
...
|--> Amazon Kinesis record M --|
...
|
record ZZ--|
プロデューサーコードとの統合
KPL は独立したプロセスで実行され、IPC を使用して親ユーザープロセスと通信します。このアーキ
テクチャは、マイクロサービスと呼ばれる場合があり、次の 2 つの主な理由からこれが選択されま
す。
1) KPL がクラッシュしても、ユーザープロセスはクラッシュしません
プロセスには Streams と無関係なタスクが含まれている場合があり、KPL がクラッシュしてもオペ
レーションを続行できます。また、親ユーザープロセスが KPL を再起動し、完全に機能する状態に復
旧することもできます(この機能は、正式なラッパーに含まれています)。
メトリックスを Streams に送信するウェブサーバーがその例です。このサーバーは、Streams 部分
が動作を停止してもページの提供を続行できます。そのため、KPL のバグが原因でサーバー全体がク
ラッシュすると、不要なサービス停止が発生します。
2) 任意のクライアントをサポートできます
正式にサポートされている言語以外の言語を使用するお客様もいます。これらのお客様も KPL を簡単
に使用できます。
推奨される使用状況
使用状況の異なるユーザーに推奨される設定を次の表に示します。この表を参考に、KPL を使用でき
るかどうか、どのように使用できるかを判断できます。集約が有効な場合、コンシューマー側で集約
解除を使用してレコードを抽出する必要があることにも注意してください。
プロデュー
サー側の言語
コンシュー
マー側の
KCL バージョ
ン
チェックポイ
ントロジック
KPL の使用可
否
注意
言語
Java 以外
*
*
*
いいえ
該当なし
Java
Java
Java SDK を直
接使用
該当なし
はい
集約を使
用する場
合、GetRecords
を呼び出した
後に、提供さ
れた集約解除
ライブラリを
使用する必要
があります。
Java
Java 以外
SDK を直接使
用
該当なし
はい
集約を無効に
する必要があ
ります。
Java
Java
1.3.x
該当なし
はい
集約を無効に
する必要があ
ります。
44
Amazon Kinesis Streams 開発者ガイド
KPL の使用
Java
Java
1.4.x
引数なしで
チェックポイ
ントを呼び出
す
はい
なし
Java
Java
1.4.x
明示的なシー
ケンス番号
を使用して
チェックポイ
ントを呼び出
す
はい
集約を無効に
するかコー
ドを変更し、
チェックポ
イント作成用
の拡張された
シーケンス番
号を使用しま
す。
Java
Java 以外
1.3.x + 複数
言語デーモン
+ 言語固有の
ラッパー
該当なし
はい
集約を無効に
する必要があ
ります。
KPL を使用した Streams ストリームへの書き込み
以下のセクションでは、最もシンプルな「最低限」のプロデューサーから完全に非同期なコードまで
順にサンプルコードを示します。
最低限のプロデューサーコード
次のコードは、最小限の機能するプロデューサーを書くために必要なものがすべて含まれていま
す。KPL ユーザーレコードはバックグラウンドで処理されます。
// KinesisProducer gets credentials automatically like
// DefaultAWSCredentialsProviderChain.
// It also gets region automatically from the EC2 metadata service.
KinesisProducer kinesis = new KinesisProducer();
// Put some records
for (int i = 0; i < 100; ++i) {
ByteBuffer data = ByteBuffer.wrap("myData".getBytes("UTF-8"));
// doesn't block
kinesis.addUserRecord("myStream", "myPartitionKey", data);
}
// Do other stuff ...
結果に対する同期的な応答
前のコード例では、KPL ユーザーレコードが成功したかどうかをチェックしませんでした。KPL
は、失敗に対処するために必要な再試行を実行しますが、結果を確認する必要がある場合には、次
の例(分かりやすくするため前の例を使用しています)のように、addUserRecord から返される
Future オブジェクトを使用して結果を確認します。
KinesisProducer kinesis = new KinesisProducer();
// Put some records and save the Futures
List<Future<UserRecordResult>> putFutures = new
LinkedList<Future<UserRecordResult>>();
for (int i = 0; i < 100; i++) {
45
Amazon Kinesis Streams 開発者ガイド
KPL の使用
ByteBuffer data = ByteBuffer.wrap("myData".getBytes("UTF-8"));
// doesn't block
putFutures.add(
kinesis.addUserRecord("myStream", "myPartitionKey", data));
}
// Wait for puts to finish and check the results
for (Future<UserRecordResult> f : putFutures) {
UserRecordResult result = f.get(); // this does block
if (result.isSuccess()) {
System.out.println("Put record into shard " +
result.getShardId());
} else {
for (Attempt attempt : result.getAttempts()) {
// Analyze and respond to the failure
}
}
}
結果に対する非同期的な応答
前の例では、Future オブジェクトに対して get() を呼び出しているため、実行がブロックされま
す。実行のブロックを避ける必要がある場合には、次の例に示すように非同期コールバックを使用で
きます。
KinesisProducer kinesis = new KinesisProducer();
FutureCallback<UserRecordResult> myCallback =
new FutureCallback<UserRecordResult>() {
@Override public void onFailure(Throwable t) {
/* Analyze and respond to the failure */
};
@Override
public void onSuccess(UserRecordResult result) {
/* Respond to the success */
};
};
for (int i = 0; i < 100; ++i) {
ByteBuffer data = ByteBuffer.wrap("myData".getBytes("UTF-8"));
ListenableFuture<UserRecordResult> f =
kinesis.addUserRecord("myStream", "myPartitionKey", data);
// If the Future is complete by the time we call addCallback,
//the callback will be invoked immediately.
Futures.addCallback(f, myCallback);
}
KPL の設定
デフォルト設定のままで、ほとんどのユースケースに問題なく使用できますが、デフォルト設定の一
部を変更することで、ニーズに合わせて KinesisProducer の動作を調整することができます。それ
には、KinesisProducerConfiguration クラスのインスタンスを KinesisProducer コンストラ
クタに渡します。たとえば、次のようにします。
KinesisProducerConfiguration config = new KinesisProducerConfiguration()
.setRecordMaxBufferedTime(3000)
.setMaxConnections(1)
.setRequestTimeout(60000)
46
Amazon Kinesis Streams 開発者ガイド
KPL の使用
.setRegion("us-west-1");
final KinesisProducer kinesisProducer = new KinesisProducer(config);
プロパティファイルから設定をロードすることもできます。
KinesisProducerConfiguration config =
KinesisProducerConfiguration.fromPropertiesFile("default_config.properties");
ユーザープロセスがアクセスできる任意のパスとファイル名に置き換えることができます。さらに、
このようにして作成した KinesisProducerConfiguration インスタンスに対して設定メソッドを
呼び出して、設定をカスタマイズできます。
プロパティファイルでは、PascalCase 内の名前を使用してパラメータを指定する必要があります。そ
の名前は、KinesisProducerConfiguration クラスの設定メソッドで使用されるものと一致しま
す。以下に例を示します。
RecordMaxBufferedTime = 100
MaxConnections = 4
RequestTimeout = 6000
Region = us-west-1
設定パラメータの使用方法と値の制限の詳細については、「GitHub のサンプル設定プロパティファイ
ル」を参照してください。
KinesisProducer を初期化した後、使用した KinesisProducerConfiguration インスタンスを
変更しても何の効果もないことに注意してください。KinesisProducer は現在、動的再設定をサ
ポートしていません。
コンシューマーの集約解除
KCL は、リリース 1.4.0 から KPL ユーザーレコードの自動集計解除をサポートしています。以前の
バージョンの KCL で書かれたコンシューマーアプリケーションのコードは、KCL を更新した後、
コードを何も修正せずにコンパイルできます。ただし、プロデューサー側で KPL の集約を使用してい
る場合、チェックポイントが多少関係してきます。集約されたレコード内のすべてのサブレコードは
同じシーケンス番号を持っているため、サブレコード間の区別が必要な場合、チェックポイントを使
用して追加のデータを保存する必要があります。この追加データは、サブシーケンス番号と呼ばれま
す。
以前のバージョンの KCL からの移行
集約とともにチェックポイントを作成する既存の呼び出しを変更する必要はありません。Streams に
保存されているすべてのレコードを正しく取得できることが保証されています。以下で説明する特定
のユースケースをサポートするために、現在 KCL には、2 つの新しいチェックポイントオペレーショ
ンが用意されています。
既存のコードが KPL サポート以前の KCL 用に書かれていて、チェックポイントオペレーションが
引数なしで呼び出される場合、そのコードの動作は、バッチ内にある最後の KPL ユーザーレコード
のシーケンス番号に対するチェックポイントの作成と同等です。シーケンス番号文字列を使用して
チェックポイントオペレーションを呼び出す場合は、暗黙的なサブシーケンス番号 0(ゼロ)を伴
う、バッチの指定されたシーケンス番号に対するチェックポイントの作成と同等です。
引数なしで新しい KCL チェックポイントオペレーション checkpoint() を呼び出すことは、暗黙的
なサブシーケンス番号 0(ゼロ)を伴う、バッチ内の最後の Record 呼び出しのシーケンス番号に対
するチェックポイントの作成と意味的に同等です。
47
Amazon Kinesis Streams 開発者ガイド
KPL の使用
新しい KCL チェックポイントオペレーション checkpoint(Record record) を呼び出すことは、
暗黙的なサブシーケンス番号 0(ゼロ)を伴う、指定された Record のシーケンス番号に対する
チェックポイントの作成と意味的に同等です。Record 呼び出しが実際には UserRecord である場
合、UserRecord のシーケンス番号とサブシーケンス番号にチェックポイントが作成されます。
新しい KCL チェックポイントオペレーション checkpoint(String sequenceNumber, long
subSequenceNumber) を呼び出すと、指定されたシーケンス番号とサブシーケンス番号に明示的に
チェックポイントが作成されます。
これらのどの場合も、チェックポイントが Amazon DynamoDB チェックポイントテーブルに保存され
た後は、アプリケーションがクラッシュして再起動した場合、KCL により、レコードの取得が正常に
再開されます。さらにレコードがシーケンス内に含まれている場合は、最後にチェックポイントが作
成されたシーケンス番号が付けられているレコード内の次のサブシーケンス番号のレコードから取得
が開始されます。前のシーケンス番号のレコードにある最後のサブシーケンス番号が、最新のチェッ
クポイントに含まれている場合、その次のシーケンス番号が付けられているレコードから取得が開始
されます。
次のセクションでは、レコードのスキップや重複を避けるために必要な、コンシューマーのシーケン
スとサブシーケンスのチェックポイントの詳細について説明します。コンシューマーのレコード処理
を停止し再起動するときに、レコードのスキップや重複が重要でない場合は、変更せずに既存のコー
ドを実行してかまいません。
KPL の集約解除のための KCL の拡張
すでに説明したように、KPL の集約解除ではサブシーケンスチェックポイントを使用できます。サブ
シーケンスチェックポイントを使いやすくするために、UserRecord クラスが KCL に追加されていま
す。
public class UserRecord extends Record {
public long getSubSequenceNumber() {
/* ... */
}
@Override
public int hashCode() {
/* contract-satisfying implementation */
}
@Override
public boolean equals(Object obj) {
/* contract-satisfying implementation */
}
}
このクラスは、現在 Record の代わりに使用されています。これは Record のサブクラスであるた
め、既存のコードは影響を受けません。UserRecord クラスは、実際のサブレコードと通常の集約さ
れていないレコードの両方を表します。集約されていないレコードは、サブレコードを 1 つだけ含む
集約されたレコードと考えることができます。
さらに、2 つの新しいオペレーションが IRecordProcessorCheckpointer に追加されています。
public void checkpoint(Record record);
public void checkpoint(String sequenceNumber, long subSequenceNumber);
サブシーケンス番号チェックポイントの使用を開始するには、次の変更を行います。次のフォーム
コードを変更します。
checkpointer.checkpoint(record.getSequenceNumber());
48
Amazon Kinesis Streams 開発者ガイド
API の使用
新しいフォームコードは次のようになります。
checkpointer.checkpoint(record);
サブシーケンスチェックポイントでは、checkpoint(Record record) フォームを使用することを
お勧めします。ただし、チェックポイントの作成で使用する文字列にすでに sequenceNumbers を保
存している場合は、次の例に示すように、subSequenceNumber も保存する必要があります。
String sequenceNumber = record.getSequenceNumber();
long subSequenceNumber = ((UserRecord) record).getSubSequenceNumber();
// ... do other processing
checkpointer.checkpoint(sequenceNumber, subSequenceNumber);
この実装では内部で UserRecord を必ず使用するため、Record から UserRecord へのキャストは必
ず成功します。シーケンス番号の計算を実行する必要がない場合、この方法はお勧めしません。
KPL ユーザーレコードの処理中に、KCL は、サブシーケンス番号を Amazon DynamoDB に各行の追
加フィールドとして書き込みます。以前のバージョンの KCL では、チェックポイントを再開するとき
に AFTER_SEQUENCE_NUMBER を使用してレコードを取得していました。KPL サポートを含む現在の
KCL では、代わりに AT_SEQUENCE_NUMBER を使用します。チェックポイントが作成されたシーケン
ス番号のレコードを取得するとき、チェックポイントが作成されたサブシーケンス番号がチェックさ
れ、サブレコードが必要に応じて削除されます(最後のサブレコードにチェックポイントが作成され
ている場合、すべてのサブレコードが削除されます)。ここでも、集約されていないレコードは、単
一のサブレコードを含む集約されたレコードと考えることができ、集約されたレコードと集約されて
いないレコードの両方で同じアルゴリズムを使用できます。
GetRecords の直接的な使用
KCL の使用を選択せずに、API オペレーション GetRecords を直接呼び出して Streams レコード
を取得することもできます。これらの取得したレコードを元の KPL ユーザーレコードに解凍するに
は、UserRecord.java にある次の静的なオペレーションの 1 つを呼び出します。
public static List<Record> deaggregate(List<Record> records)
public static List<UserRecord> deaggregate(List<UserRecord> records,
BigInteger startingHashKey, BigInteger endingHashKey)
最初のオペレーションでは、startingHashKey についてデフォルト値 0(ゼロ)を使用
し、endingHashKey についてデフォルト値 2^128 -1 を使用します。
これらの各オペレーションは、Streams レコードの指定されたリストを KPL ユーザーレコードのリ
ストに集約解除します。明示的なハッシュキーまたはパーティションキーが startingHashKey と
endingHashKey の範囲(境界を含む)の外にある KPL ユーザーレコードは、返されるレコードのリ
ストから破棄されます。
Amazon Kinesis Streams API と AWS SDK for Java
を使用した Amazon Kinesis Streams プロデュー
サーの開発
Amazon Kinesis Streams API と AWS SDK for Java を使用してプロデューサーを開発できま
す。Streams を初めて利用する場合は、Amazon Kinesis Streams とは? (p. 1) と Amazon Kinesis
Streams の使用開始 (p. 9) に説明されている概念と用語について理解することから始めてください。
49
Amazon Kinesis Streams 開発者ガイド
API の使用
次の例では、Streams API について説明し、AWS SDK for Java を使用してストリームにデータを追加
(入力)します。ただし、ほとんどのユースケースでは、Streams KPL ライブラリを使用します。詳
細については、「Amazon Kinesis プロデューサライブラリ を使用した Amazon Kinesis Streams プロ
デューサーの開発 (p. 39)」を参照してください。
この章で紹介する Java サンプルコードは、基本的な Streams API オペレーションを実行する方法を
示しており、オペレーションタイプ別に論理的に分割されています。これらのサンプルは、すべての
例外を確認しているわけではなく、すべてのセキュリティやパフォーマンスの側面を考慮しているわ
けでもない点で、本稼働環境に使用できるコードを表すものではありません。また、他のプログラミ
ング言語を使用して Streams API を呼び出すこともできます。利用可能なすべての AWS SDK の詳細
については、「アマゾン ウェブ サービスを使用した開発の開始」を参照してください。
各タスクには前提条件があります。たとえば、ストリームを作成するまではストリームにデータを
追加できず、ストリームを作成するにはクライアントを作成する必要があります。詳細については、
「Amazon Kinesis Stream の管理 (p. 96)」を参照してください。
ストリームへのデータの追加
ストリームを作成したら、レコードの形式でストリームにデータを追加できます。レコードは
データ BLOB の形式で処理するデータを格納するデータ構造です。データをレコードに格納した
後、Streams ではいずれの方法でもデータが検査、解釈、または変更されることはありません。各レ
コードにはシーケンス番号とパーティションキーも関連付けられます。
Streams API には、ストリームにデータを追加するオペレーションとして、PutRecords と
PutRecord の 2 つの異なるオペレーションがあります。PutRecords オペレーションは HTTP リク
エストごとストリームに複数のレコードを送信し、単数形の PutRecord オペレーションは一度に 1
つずつストリームにレコードを送信します(各レコードについて個別の HTTP リクエストが必要で
す)。データプロデューサーあたりのスループットが向上するため、ほとんどのアプリケーションで
は PutRecords を使用してください。これらの各オペレーションの詳細については、後のそれぞれの
サブセクションを参照してください。
トピック
• PutRecords を使用した複数のレコードの追加 (p. 50)
• PutRecord を使用した単一レコードの追加 (p. 53)
ソースアプリケーションは Streams API を使用してストリームにデータを追加するため、1 つ以上の
コンシューマーアプリケーションが同時にストリームからデータを取得して処理する可能性があるこ
とを常に念頭に置いてください。コンシューマーが Streams API を使用してデータを取得する方法の
詳細については、「ストリームからのデータの取得 (p. 82)」を参照してください。
Important
データレコードはストリームに追加されてからデフォルトでは 24 時間アクセス可能です。こ
の期間は、保持期間と呼ばれ、24 時間から 168 時間 (1~7 日) まで 1 時間単位で設定できま
す。ストリームの保持期間の詳細については、「データ保持期間の変更 (p. 105)」を参照し
てください。
PutRecords を使用した複数のレコードの追加
PutRecords オペレーションは、1 つのリクエストで Streams に複数のレコードを送信しま
す。PutRecords を使用することによって、プロデューサーは Amazon Kinesis stream にデータを
送信するときに高スループットを実現できます。各 PutRecords リクエストで、最大 500 レコー
ドをサポートできます。リクエストに含まれる各レコードは 1 MB のサイズ、リクエスト全体の上
限はパーティションキーを含めて最大 5 MB。 後で説明する単一の PutRecord オペレーションと
同様に、PutRecords はシーケンス番号とパーティションキーを使用します。ただし、PutRecord
の SequenceNumberForOrdering パラメータは、PutRecords の呼び出しには含まれませ
50
Amazon Kinesis Streams 開発者ガイド
API の使用
ん。PutRecords オペレーションでは、リクエストの自然な順序ですべてのレコードを処理するよう
試みます。
各データレコードには一意のシーケンス番号があります。シーケンス番号は、client.putRecords
を呼び出してストリームにデータレコードを追加した後に、Streams によって割り当てられま
す。同じパーティションキーのシーケンス番号は一般的に、時間の経過とともに大きくなりま
す。PutRecords リクエスト間の期間が長くなるほど、シーケンス番号は大きくなります。
Note
シーケンス番号は、同じストリーム内の一連のデータのインデックスとして使用すること
はできません。一連のデータを論理的に区別するには、パーティションキーを使用するか、
データセットごとに個別のストリームを作成します。
PutRecords リクエストには、異なるパーティションキーのレコードを含めることができます。リ
クエストのスコープはストリームです。各リクエストには、リクエストの制限まで、パーティショ
ンキーとレコードのあらゆる組み合わせを含めることができます。複数の異なるパーティションキー
を使用して、複数の異なるシャードを含むストリームに対して実行されたリクエストは、少数のパー
ティションキーを使用して少数のシャードに対して実行されたリクエストよりも一般的に高速です。
レイテンシーを低減し、スループットを最大化するには、パーティションキーの数をシャードの数よ
りも大きくする必要があります。
PutRecords の例
次のコードでは、シーケンシャルなパーティションキーを持つ 100 件のデータレコードを作成
し、DataStream という名前のストリームに格納しています。
AmazonKinesisClient amazonKinesisClient = new
AmazonKinesisClient(credentialsProvider);
PutRecordsRequest putRecordsRequest = new PutRecordsRequest();
putRecordsRequest.setStreamName("DataStream");
List <PutRecordsRequestEntry> putRecordsRequestEntryList = new
ArrayList<>();
for (int i = 0; i < 100; i++) {
PutRecordsRequestEntry putRecordsRequestEntry = new
PutRecordsRequestEntry();
putRecordsRequestEntry.setData(ByteBuffer.wrap(String.valueOf(i).getBytes()));
putRecordsRequestEntry.setPartitionKey(String.format("partitionKey-%d",
i));
putRecordsRequestEntryList.add(putRecordsRequestEntry);
}
putRecordsRequest.setRecords(putRecordsRequestEntryList);
PutRecordsResult putRecordsResult =
amazonKinesisClient.putRecords(putRecordsRequest);
System.out.println("Put Result" + putRecordsResult);
PutRecords のレスポンスには、レスポンスの Records の配列が含まれます。レスポンス配列の各
レコードは、リクエスト配列内のレコードと自然な順序(リクエストやレスポンスの上から下へ)で
直接相互に関連付けられます。レスポンスの Records 配列には、常にリクエスト配列と同じ数のレ
コードが含まれます。
PutRecords 使用時のエラーの処理
デフォルトでは、リクエスト内の個々のレコードでエラーが発生しても、PutRecords リクエスト内
のそれ以降のレコードの処理は停止されません。つまり、レスポンスの Records 配列には、正常に
51
Amazon Kinesis Streams 開発者ガイド
API の使用
処理されたレコードと、正常に処理されなかったレコードの両方が含まれていることを意味します。
正常に処理されなかったレコードを検出し、それ以降の呼び出しに含める必要があります。
正常に処理されたレコードには SequenceNumber 値と ShardID 値が、正常に処理されなかったレ
コードには ErrorCode 値と ErrorMessage 値が含まれます。ErrorCode パラメータはエラーのタ
イプを反映しており、ProvisionedThroughputExceededException または InternalFailure
のいずれかになります。ErrorMessage は、ProvisionedThroughputExceededException 例外
について、スロットリングされたレコードのアカウント ID、ストリーム名、シャード ID などの詳細
情報を提供します。次の例では、PutRecords リクエストに 3 つのレコードがあります。2 番目のレ
コードは失敗し、レスポンスに反映されます。
Example PutRecords リクエストの構文
{
"Records": [
{
"Data": "XzxkYXRhPl8w",
"PartitionKey": "partitionKey1"
},
{
"Data": "AbceddeRFfg12asd",
"PartitionKey": "partitionKey1"
},
{
"Data": "KFpcd98*7nd1",
"PartitionKey": "partitionKey3"
},
"StreamName": "myStream"
}
Example PutRecords レスポンスの構文
{
"FailedRecordCount”: 1,
"Records": [
{
"SequenceNumber": "21269319989900637946712965403778482371",
"ShardId": "shardId-000000000001"
},
{
“ErrorCode":”ProvisionedThroughputExceededException”,
“ErrorMessage": "Rate exceeded for shard shardId-000000000001 in stream
exampleStreamName under account 111111111111."
},
{
"SequenceNumber": "21269319989999637946712965403778482985",
"ShardId": "shardId-000000000002"
}
]
}
正常に処理されなかったレコードは、以降の PutRecords リクエストに含めることができます。最
初に、putRecordsResult の FailedRecordCount パラメータを調べて、リクエスト内にエラー
となったレコードがあるかどうかを確認します。このようなレコードがある場合は、ErrorCode が
null 以外である各 putRecordsEntry を、以降のリクエストに追加してください。このタイプのハ
ンドラーの例については、次のコードを参照してください。
52
Amazon Kinesis Streams 開発者ガイド
API の使用
Example PutRecords エラーハンドラー
PutRecordsRequest putRecordsRequest = new PutRecordsRequest();
putRecordsRequest.setStreamName(myStreamName);
List<PutRecordsRequestEntry> putRecordsRequestEntryList = new ArrayList<>();
for (int j = 0; j < 100; j++) {
PutRecordsRequestEntry putRecordsRequestEntry = new
PutRecordsRequestEntry();
putRecordsRequestEntry.setData(ByteBuffer.wrap(String.valueOf(j).getBytes()));
putRecordsRequestEntry.setPartitionKey(String.format("partitionKey-%d",
j));
putRecordsRequestEntryList.add(putRecordsRequestEntry);
}
putRecordsRequest.setRecords(putRecordsRequestEntryList);
PutRecordsResult putRecordsResult =
amazonKinesisClient.putRecords(putRecordsRequest);
while (putRecordsResult.getFailedRecordCount() > 0) {
final List<PutRecordsRequestEntry> failedRecordsList = new ArrayList<>();
final List<PutRecordsResultEntry> putRecordsResultEntryList =
putRecordsResult.getRecords();
for (int i = 0; i < putRecordsResultEntryList.size(); i++) {
final PutRecordsRequestEntry putRecordRequestEntry =
putRecordsRequestEntryList.get(i);
final PutRecordsResultEntry putRecordsResultEntry =
putRecordsResultEntryList.get(i);
if (putRecordsResultEntry.getErrorCode() != null) {
failedRecordsList.add(putRecordRequestEntry);
}
}
putRecordsRequestEntryList = failedRecordsList;
putRecordsRequest.setRecords(putRecordsRequestEntryList);
putRecordsResult = amazonKinesisClient.putRecords(putRecordsRequest);
}
PutRecord を使用した単一レコードの追加
PutRecord の各呼び出しは、1 つのレコードに対して動作します。アプリケーションで常にリクエ
ストごとに 1 つのレコードを送信する必要がある場合や、PutRecords を使用できないその他の理
由がある場合を除いて、「PutRecords を使用した複数のレコードの追加 (p. 50)」で説明している
PutRecords オペレーションを使用します。
各データレコードには一意のシーケンス番号があります。シーケンス番号は、client.putRecord
を呼び出してストリームにデータレコードが追加された後に、Streams によって割り当てられま
す。同じパーティションキーのシーケンス番号は一般的に、時間の経過とともに大きくなりま
す。PutRecord リクエスト間の期間が長くなるほど、シーケンス番号は大きくなります。
入力が立て続けに行われた場合、返されるシーケンス番号は大きくなるとは限りません。入力オペ
レーションが基本的に Streams に対して同時に実行されるためです。同じパーティションキーに対し
て厳密にシーケンス番号が大きくなるようにするには、「PutRecord の例 (p. 54)」のサンプルコー
ドに示しているように、SequenceNumberForOrdering パラメータを使用します。
SequenceNumberForOrdering を使用するかどうかにかかわらず、Streams が GetRecords の呼び
出しを通じて受け取るレコードは厳密にシーケンス番号順になります。
53
Amazon Kinesis Streams 開発者ガイド
エージェントの使用
Note
シーケンス番号は、同じストリーム内の一連のデータのインデックスとして使用すること
はできません。一連のデータを論理的に区別するには、パーティションキーを使用するか、
データセットごとに個別のストリームを作成します。
パーティションキーはストリーム内のデータをグループ化するために使用されます。データレコー
ドはそのパーティションキーに基づいてストリーム内でシャードに割り当てられます。具体的に
は、Streams ではパーティションキー(および関連するデータ)を特定のシャードにマッピングする
ハッシュ関数への入力として、パーティションキーを使用します。
このハッシュメカニズムの結果として、パーティションキーが同じすべてのデータレコードは、ス
トリーム内で同じシャードにマッピングされます。ただし、パーティションキーの数がシャードの
数を超えている場合、一部のシャードにパーティションキーが異なるレコードが格納されることが
あります。設計の観点から、すべてのシャードが適切に使用されるようにするには、シャードの数
(CreateStreamRequest の setShardCount メソッドで指定)を一意のパーティションキーの数よ
りも大幅に少なくする必要があります。また、1 つのパーティションキーへのデータの流量をシャー
ドの容量より大幅に小さくする必要があります。
PutRecord の例
以下のコードでは、2 つのパーティションキーに配分される 10 件のデータレコードを作成
し、myStreamName という名前のストリームに格納しています。
for (int j = 0; j < 10; j++)
{
PutRecordRequest putRecordRequest = new PutRecordRequest();
putRecordRequest.setStreamName( myStreamName );
putRecordRequest.setData(ByteBuffer.wrap( String.format( "testData-%d",
j ).getBytes() ));
putRecordRequest.setPartitionKey( String.format( "partitionKey-%d", j/5 ));
putRecordRequest.setSequenceNumberForOrdering( sequenceNumberOfPreviousRecord );
PutRecordResult putRecordResult = client.putRecord( putRecordRequest );
sequenceNumberOfPreviousRecord = putRecordResult.getSequenceNumber();
}
上記のコード例では、setSequenceNumberForOrdering を使用して、各パーティションキー内で
順番が厳密に増えるようにしています。このパラメーターを効果的に使用するには、現在のレコード
(レコード n)の SequenceNumberForOrdering を前のレコード(レコード n-1)のシーケンス番
号に設定します。ストリームに追加されたレコードのシーケンス番号を取得するには、putRecord の
結果に対して getSequenceNumber を呼び出します。
SequenceNumberForOrdering パラメーターを使用すると、同じクライアントが PutRecord を呼
び出したときに、パーティションキーが同じであっても、シーケンス番号は厳密に大きくなるよう
になります。SequenceNumberForOrdering を使用しても、複数の同時実行のアプリケーションか
ら追加されたレコード間、または複数のパーティションキー間では、順序が正しくなるとは限りませ
ん。
Amazon Kinesis エージェントを使用して Amazon
Kinesis Streams への書き込み
Amazon Kinesis エージェントはスタンドアロンの Java ソフトウェアアプリケーションで、データを
収集して Streams に送信する簡単な方法を提供します。このエージェントは一連のファイルを継続
54
Amazon Kinesis Streams 開発者ガイド
エージェントの使用
的に監視し、新しいデータをストリームに送信します。エージェントはファイルのローテーション、
チェックポイント、失敗時の再試行を処理します。タイムリーで信頼性の高い簡単な方法で、すべて
のデータを提供します。また、ストリーミング処理のモニタリングとトラブルシューティングに役立
つ Amazon CloudWatch メトリックスも出力します。
デフォルトでは、レコードは改行文字 ('\n') に基づいて各ファイルから解析されます。しかし、
複数行レコードを解析するよう、エージェントを設定することもできます (「エージェントの設
定 (p. 57)」を参照)。
このエージェントは、ウェブサーバー、ログサーバーおよびデータベースサーバーなど、Linux ベー
スのサーバー環境にインストールできます。エージェントをインストールした後で、モニタリング用
のファイルとデータストリームを指定して設定します。エージェントが設定されると、ファイルから
永続的にデータを収集して、ストリームに安全にデータを送信します。
トピック
• 前提条件 (p. 55)
• エージェントのダウンロードとインストール (p. 55)
• エージェントの設定と開始 (p. 56)
• エージェントの設定 (p. 57)
• 複数のファイルディレクトリを監視し、複数のストリームに書き込み (p. 59)
• エージェントを使用してデータを事前処理する (p. 59)
• エージェント CLI コマンド (p. 62)
前提条件
• オペレーティングシステムは Amazon Linux AMI バージョン 2015.09 以降、または Red Hat
Enterprise Linux バージョン 7 以降でなければなりません。
• Amazon EC2 を使用してエージェントを実行している場合は、EC2 インスタンスを起動します。
• 次のいずれかの方法を使用して、AWS 認証情報を管理します。
• EC2 インスタンスを起動する際に IAM ロールを指定します。
• エージェントを設定する際に AWS 認証情報を指定します (awsAccessKeyId (p.
awsSecretAccessKey (p.
) を参照してください)。
) および
• /etc/sysconfig/aws-kinesis-agent を編集して、リージョンと AWS アクセスキーを指定
します。
• 指定した IAM ロールまたは AWS 認証情報は、エージェントがストリームにデータを送信するた
めに、Streams PutRecords 操作を実行する権限が必要です。エージェントの CloudWatch モニタ
リングを有効にしている場合は、CloudWatch &link-cw-api-putmetricdata; 操作を実行する権限も必
要になります。詳細については、「IAM により Amazon Kinesis Streams リソースへのアクセスを
制御する (p. 133)」、「Amazon CloudWatch で Streams エージェントの状態をモニタリングす
る (p. 114)」および「CloudWatch のアクセスコントロール」を参照してください。
エージェントのダウンロードとインストール
最初に、インスタンスに接続します。詳細については、『Linux インスタンス用 Amazon EC2 ユー
ザーガイド』の「インスタンスへの接続」を参照してください。接続できない場合は、『Linux イン
スタンス用 Amazon EC2 ユーザーガイド』の「インスタンスへの接続に関するトラブルシューティン
グ」を参照してください。
Amazon Linux AMI を使用してエージェントを設定するには
次のコマンドを使用して、エージェントをダウンロードしてインストールします。
55
Amazon Kinesis Streams 開発者ガイド
エージェントの使用
sudo yum install –y aws-kinesis-agent
Red Hat Enterprise Linux を使用してエージェントを設定する
次のコマンドを使用して、エージェントをダウンロードしてインストールします。
sudo yum install –y https://s3.amazonaws.com/streaming-data-agent/awskinesis-agent-latest.amzn1.noarch.rpm
GitHubを使用してエージェントを設定する
1.
「awlabs/amazon-kinesis-agent」からエージェントをダウンロードしてください。
2.
ダウンロードしたディレクトリまで移動し、次のコマンドを実行してエージェントをインストー
ルします。
sudo ./setup --install
エージェントの設定と開始
エージェントを設定して開始するには
1.
(デフォルトのファイルアクセス権限を使用している場合、スーパーユーザーとして)設定ファ
イル (/etc/aws-kinesis/agent.json) を開き、編集します。
この設定ファイルで、エージェントがデータを集めるファイル ("filePattern") とエージェン
トがデータを送信するストリーム ("kinesisStream") を指定します。ファイル名はパターン
で、エージェントはファイルローテーションを確認する点に注意してください。1 秒あたりに一
度だけ、ファイルを交替または新しいファイルを作成できます。エージェントはファイル作成タ
イムスタンプを使用して、どのファイルを追跡してストリームに送信するかを判断します。新規
ファイルの作成やファイルの交換を 1 秒あたりに一度以上頻繁に交換すると、エージェントはそ
れらを適切に区別できません。
{
"flows": [
{
"filePattern": "/tmp/app.log*",
"kinesisStream": "yourkinesisstream"
}
]
}
2.
エージェントを手動で開始する:
sudo service aws-kinesis-agent start
3.
(オプション) システムスタートアップ時にエージェントを開始するように設定します。
sudo chkconfig aws-kinesis-agent on
エージェントは、システムのサービスとしてバックグラウンドで実行されます。継続的に指定ファイ
ルをモニタリングし、指定されたストリームにデータを送信します。エージェント活動は /var/log/
aws-kinesis-agent/aws-kinesis-agent.log に記録されます。
56
Amazon Kinesis Streams 開発者ガイド
エージェントの使用
エージェントの設定
エージェントは、2つの必須設定、filePattern と kinesisStream、さらに追加機能として任意の
設定をサポートしています。必須およびオプションの設定を /etc/aws-kinesis/agent.json で指
定できます。
設定ファイルを変更した場合は、次のコマンドを使用してエージェントを停止および起動する必要が
あります。
sudo service aws-kinesis-agent stop
sudo service aws-kinesis-agent start
または、次のコマンドを使用できます。
sudo service aws-kinesis-agent restart
全般設定は次のとおりです。
構成設定
説明
awsAccessKeyId
デフォルトの認証情報を上書きする AWS アクセスキー IDです。この設定
は、他のすべての認証情報プロバイダーに優先されます。
awsSecretAccessKey デフォルトの認証情報を上書きする AWS シークレットキーです。この設
定は、他のすべての認証情報プロバイダーに優先されます。
cloudwatch.emitMetrics
エージェントがメトリックスを CloudWatch に発行できるようにします
(true に設定された場合)。
デフォルト: true
cloudwatch.endpoint CloudWatch のリーションのエンドポイントです。
デフォルト: monitoring.us-east-1.amazonaws.com
kinesis.endpoint
Streams のリーションのエンドポイントです。
デフォルト: kinesis.us-east-1.amazonaws.com
フロー設定は次のとおりです。
構成設定
説明
dataProcessingOptions
ストリームに送信される前に解析された各レコードに適用されるの処理オ
プションの一覧。処理オプションは指定した順序で実行されます。詳細に
ついては、「エージェントを使用してデータを事前処理する (p. 59)」
を参照してください。
kinesisStream
[必須] ストリームの名前。
filePattern
[必須] エージェントによってモニタリングされる必要があるファイルの
globこのパターンに一致するすべてのファイルは、エージェントによって
自動的に選択され、モニタリングされます。このパターンに一致するすべ
てのファイルは、読み取り権限を aws-kinesis-agent-user に付与す
る必要があります。ファイルを含むディレクトリには、読み取りと実行権
限を aws-kinesis-agent-user に付与する必要があります。
57
Amazon Kinesis Streams 開発者ガイド
エージェントの使用
構成設定
説明
initialPosition
ファイルの解析が開始される最初の位置。有効な値は、START_OF_FILE
および END_OF_FILE です。
デフォルト: END_OF_FILE
maxBufferAgeMillis エージェントがストリームに送信する前にデータをバッファーする最大時
間 (ミリ秒)。
値の範囲: 1,000 ~ 900,000(1 秒~ 15 分)
デフォルト: 60,000(1 分)
maxBufferSizeBytes エージェントがストリームに送信する前にデータをバッファーする最大サ
イズ (バイト)。
値の範囲: 1 ~ 4,194,304(4 MB)
デフォルト: 4,194,304(4 MB)
maxBufferSizeRecordsエージェントがストリームに送信する前にデータをバッファーするレコー
ドの最大数。
値の範囲: 1 ~ 500
デフォルト: 500
minTimeBetweenFilePollsMillis
エージェントが新しいデータのモニタリング対象ファイルをポーリング
し、解析する時間間隔 (ミリ秒単位)。
値の範囲: 1 以上
デフォルト: 100
multiLineStartPattern
レコードの開始を識別するパターン。レコードは、パターンに一致する 1
行と、それに続くパターンに一致しない行で構成されます。有効な値は正
規表現です。デフォルトでは、ログファイルのそれぞれの改行は 1 つのレ
コードとして解析されます。
partitionKeyOption パーティションのキーを生成する方法。有効な値は RANDOM (ランダムに
生成される整数) と DETERMINISTIC (データから計算されるハッシュ値)
です。
デフォルト: RANDOM
skipHeaderLines
モニタリング対象ファイルの始めにエージェントが解析をスキップするの
行数。
値の範囲: 0 以上
デフォルト: 0 (ゼロ)
truncatedRecordTerminator
レコードのサイズが Streams レコードの許容サイズを超えたときに解析
されたレコードを切り捨てるために、エージェントが使用する文字列。
(1,000 KB)
デフォルト: '\n'(改行)
58
Amazon Kinesis Streams 開発者ガイド
エージェントの使用
複数のファイルディレクトリを監視し、複数のストリームに書
き込み
複数のフロー設定を指定することによって、エージェントが複数のファイルディレクトリを監視し、
複数のストリームにデータを送信するように設定できます。以下の構成例では、エージェントは 2 つ
のファイルディレクトリ監視し、それぞれ Amazon Kinesis ストリームおよび Firehose 配信ストリー
ムにデータを送信します。Amazon Kinesis ストリームと Firehose 配信ストリームが 同じリージョン
にある必要がないように Streams と Firehose に異なるエンドポイントを指定できます。
{
"cloudwatch.emitMetrics": true,
"kinesis.endpoint": "https://your/kinesis/endpoint",
"firehose.endpoint": "https://your/firehose/endpoint",
"flows": [
{
"filePattern": "/tmp/app1.log*",
"kinesisStream": "yourkinesisstream"
},
{
"filePattern": "/tmp/app2.log*",
"deliveryStream": "yourfirehosedeliverystream"
}
]
}
Firehose でエージェントを使用に関する詳細については、「Amazon Kinesis エージェントによる
Amazon Kinesis Firehose への書き込み」を参照してください。
エージェントを使用してデータを事前処理する
エージェントはストリームにレコードを送信する前に、モニタリング対象ファイルから解析したレ
コードを事前処理できます。ファイルフローに dataProcessingOptions 設定を追加することで、
この機能を有効にできます。1 つ以上の処理オプションを追加でき、また指定されている順序で実行
されます。
エージェントは、リストされた次の処理オプションに対応しています。エージェントはオープンソー
スであるため、処理オプションを開発および拡張できます。Amazon Kinesis エージェント からエー
ジェントをダウンロードできます。
処理オプション
SINGLELINE
改行文字、先頭のスペース、末尾のスペースを削除することで、複数行レコードを単一行レコー
ドに変換します。
{
"optionName": "SINGLELINE"
}
CSVTOJSON
区切り形式から JSON 形式にレコードを変換します。
{
"optionName": "CSVTOJSON",
"customFieldNames": [ "field1", "field2", ... ],
59
Amazon Kinesis Streams 開発者ガイド
エージェントの使用
"delimiter": "yourdelimiter"
}
customFieldNames
[必須] 各 JSON キー値のペアでキーとして使用されるフィールド名。たとえば、["f1",
"f2"] を指定した場合は、レコード「v1、v2」は {"f1":"v1","f2":"v2"} に変換されま
す。
delimiter
レコードで区切り記号として使用する文字列。デフォルトはカンマ (,) です。
LOGTOJSON
ログ形式から JSON 形式にレコードを変換します。サポートされているログ形式は、Apache
Common Log、 Apache Combined Log、Apache Error Log、 および RFC3164 Syslog です。
{
"optionName": "LOGTOJSON",
"logFormat": "logformat",
"matchPattern": "yourregexpattern",
"customFieldNames": [ "field1", "field2", … ]
}
logFormat
[必須] ログエントリ形式。以下の値を指定できます。
• COMMONAPACHELOG — Apache Common Log 形式各ログエントリは、デフォルトで次の
パターン「%{host} %{ident} %{authuser} [%{datetime}] \"%{request}\"
%{response} %{bytes}」になります。
• COMBINEDAPACHELOG — The Apache Combined Log 形式。各ログエントリは、デ
フォルトで次のパターン「%{host} %{ident} %{authuser} [%{datetime}]
\"%{request}\" %{response} %{bytes} %{referrer} %{agent}」になります。
• APACHEERRORLOG — Apache Error Log 形式。各ログエントリは、デフォルトで次のパ
ターン「[%{timestamp}] [%{module}:%{severity}] [pid %{processid}:tid
%{threadid}] [client: %{client}] %{message}」になります。
• SYSLOG — RFC3164 Syslog 形式。各ログエントリは、デフォルトで次のパターン
「%{timestamp} %{hostname} %{program}[%{processid}]: %{message}」にな
ります。
matchPattern
ログエントリから値を取得するために使用する正規表現パターン。この設定は、ログエント
リが定義されたログ形式の一つとして存在していない場合に使用されます。この設定を使用
する場合は、customFieldNames を指定する必要があります。
customFieldNames
JSON キー値のペアでキーとして使用されるカスタムフィールド名。matchPattern から抽
出した値のフィールド名を定義するために、または事前定義されたログ形式のデフォルトの
フィールド名を上書きするために、この設定を使用できます。
Example : LOGTOJSON 設定
JSON形式に変換された Apache Common Log エントリの LOGTOJSON 設定の一つの例を次に示しま
す。
{
"optionName": "LOGTOJSON",
"logFormat": "COMMONAPACHELOG"
}
変換前:
60
Amazon Kinesis Streams 開発者ガイド
エージェントの使用
64.242. 88.10 - - [07/Mar/2004:16:10:02 -0800] "GET /mailman/listinfo/
hsdivision HTTP/1.1" 200 6291
変換後:
{"host":"64.242.88.10","ident":null,"authuser":null,"datetime":"07/
Mar/2004:16:10:02 -0800","request":"GET /mailman/listinfo/hsdivision
HTTP/1.1","response":"200","bytes":"6291"}
Example : カスタムフィールドがある LOGTOJSON 設定
こちらは LOGTOJSON 設定の別の例です。
{
"optionName": "LOGTOJSON",
"logFormat": "COMMONAPACHELOG",
"customFieldNames": ["f1", "f2", "f3", "f4", "f5", "f6", "f7"]
}
この設定では、前の例からの同じ Apache Common Log エントリは、次のように JSON 形式に変換さ
れます。
{"f1":"64.242.88.10","f2":null,"f3":null,"f4":"07/
Mar/2004:16:10:02 -0800","f5":"GET /mailman/listinfo/hsdivision
HTTP/1.1","f6":"200","f7":"6291"}
Example : Apache Common Log エントリの変換
次のフロー設定は Apache Common Log エントリを JSON 形式の単一行レコードに変換します。
{
"flows": [
{
"filePattern": "/tmp/app.log*",
"kinesisStream": "my-stream",
"dataProcessingOptions": [
{
"optionName": "LOGTOJSON",
"logFormat": "COMMONAPACHELOG"
}
]
}
]
}
Example : 複数行レコードの変換
次のフロー設定は、最初の行が「[SEQUENCE=」で開始している複数行レコードを解析します。各レ
コードはまず単一行レコードに変換されます。次に、値はタブの区切り記号に基づいたレコードから
取得されます。取得された値は指定された customFieldNames 値にマッピングされ、JSON 形式の
単一行レコードを形成します。
{
"flows": [
61
Amazon Kinesis Streams 開発者ガイド
エージェントの使用
{
"filePattern": "/tmp/app.log*",
"kinesisStream": "my-stream",
"multiLineStartPattern": "\\[SEQUENCE=",
"dataProcessingOptions": [
{
"optionName": "SINGLELINE"
},
{
"optionName": "CSVTOJSON",
"customFieldNames": [ "field1", "field2", "field3" ],
"delimiter": "\\t"
}
]
}
]
}
Example : 一致パターンで LOGTOJSON 設定
こちらは、最後のフィールド (バイト) が省略された JSON 形式に変換された Apache Common Log
エントリの LOGTOJSON 設定の一例です。
{
"optionName": "LOGTOJSON",
"logFormat": "COMMONAPACHELOG",
"matchPattern": "^([\\d.]+) (\\S+) (\\S+) \\[([\\w:/]+\\s[+\\-]\\d{4})\\]
\"(.+?)\" (\\d{3})",
"customFieldNames": ["host", "ident", "authuser", "datetime", "request",
"response"]
}
変換前:
123.45.67.89 - - [27/Oct/2000:09:27:09 -0400] "GET /java/javaResources.html
HTTP/1.0" 200
変換後:
{"host":"123.45.67.89","ident":null,"authuser":null,"datetime":"27/
Oct/2000:09:27:09 -0400","request":"GET /java/javaResources.html
HTTP/1.0","response":"200"}
エージェント CLI コマンド
システムスタートアップ時のエージェントの自動的開始:
sudo chkconfig aws-kinesis-agent on
エージェントのステータスの確認:
sudo service aws-kinesis-agent status
エージェントの停止:
62
Amazon Kinesis Streams 開発者ガイド
トラブルシューティング
sudo service aws-kinesis-agent stop
この場所からエージェントのログファイルを読む:
/var/log/aws-kinesis-agent/aws-kinesis-agent.log
エージェントのアンインストール:
sudo yum remove aws-kinesis-agent
Amazon Kinesis Streams プロデューサーのトラブ
ルシューティング
以下のセクションでは、Amazon Kinesis Streams プロデューサーの操作中に発生する可能性がある一
般的な問題に対する解決策を示します。
• プロデューサーアプリケーションの書き込みの速度が予想よりも遅い (p. 63)
プロデューサーアプリケーションの書き込みの速度が予想より
も遅い
書き込みのスループットが予想よりも遅くなる最も一般的な理由は次のとおりです。
• サービスの制限を超過している (p. 63)
• プロデューサーの最適化 (p. 64)
サービスの制限を超過している
サービスの制限を超過しているかどうかを確認するには、プロデューサーがサービスからのスルー
プット例外をスローしており、どの API オペレーションがスロットリングされているかを確認しま
す。呼び出しによって制限が異なることに注意して、Amazon Kinesis Streams の制限 (p. 7) を確認し
てください。たとえば、書き込みと読み取りのシャードレベルの制限は最もよく知られていますが、
以下のようなストリームレベルの制限もあります。
• CreateStream
• DeleteStream
• ListStreams
• GetShardIterator
• MergeShards
• DescribeStream
CreateStream、DeleteStream、ListStreams、 GetShardIterator、MergeShards のオペ
レーションは、1 秒あたり 5 個の呼び出しに制限されます。DescribeStream オペレーションは、1
秒あたり 10 個の呼び出しに制限されます。
このような呼び出しが原因でない場合は、すべてのシャードで put オペレーションを均等にディスト
リビューションすることが可能なパーティションキーを選択しており、残りのサービスが制限に達
しない場合にサービスの制限に達してしまうような特定のパーティションキーがないことを確認しま
す。これには、ピークスループットを測定して、ストリームのシャードの数を考慮する必要がありま
す。ストリーム管理の詳細については、「Amazon Kinesis Stream の管理 (p. 96)」を参照してくだ
さい。
63
Amazon Kinesis Streams 開発者ガイド
高度なトピック
Tip
マルチレコードオペレーション PutRecords を使用するスループットスロットリングの
計算では各セルでレコードの累計を四捨五入しますが、シングルレコードオペレーショ
ン PutRecord では、最も近いキロバイト数に四捨五入するようにしてください。たとえ
ば、PutRecords は 1.1 KB になる 600 レコードのリクエストをスロットリングしません。
プロデューサーの最適化
プロデューサーの最適化を始める前に、完了しておかなければならない重要なタスクがいくつかあ
ります。最初に、レコードのサイズと 1 秒あたりのレコード数で必要となるスループットピークを
特定します。次に、制限要素としてのストリーム容量を除外します(サービスの制限を超過してい
る (p. 63))。ストリーム容量を除外している場合は、以下のプロデューサーの 2 つの一般的なタ
イプのトラブルシューティングのヒントと最適化のガイドラインを使用します。
ラージプロデューサー
ラージプロデューサーは、通常オンプレミスサーバーまたは Amazon EC2 インスタンスから実行さ
れます。ラージプロデューサーからより高いスループットを必要とするお客様は、通常レコードあた
りのレイテンシーに注意を払います。レイテンシーを処理する戦略には、以下の項目が含まれます。
マイクロバッチ/バッファレコードが可能なお客様は、Amazon Kinesis プロデューサライブラリ(高
度な集約ロジック)またはマルチレコードオペレーション PutRecords を使用するか、またはシング
ルレコードオペレーション PutRecord を使用する前にレコードをより大きいファイルに集約します。
バッチ/バッファを使用できない場合は、複数のスレッドを使用して Streams サービスに同時に書き込
みます。AWS SDK for Java とその他の SDK には、ごく少数のコードでこれを実行できる非同期クラ
イアントが含まれます。
スモールプロデューサー
スモールプロデューサーは、通常モバイルアプリケーション、IoT デバイス、またはウェブクライア
ントです。モバイルアプリケーションの場合は、PutRecords オペレーションまたは AWS モバイル
SDK で Amazon Kinesis レコーダーを使用することをお勧めします。詳細については、「AWS Mobile
SDK for Android 入門ガイド」および「AWS Mobile SDK for iOS Getting Started Guide」を参照してく
ださい。モバイルアプリケーションは、本来断続的な接続を処理する必要があり、PutRecords のよ
うなバッチ put タイプを必要とします。何らかの理由でバッチを使用できない場合は、上記のラージ
プロデューサーの情報を参照してください。プロデューサーがブラウザの場合、生成されるデータの
量は通常非常に小さなものとなります。ただし、アプリケーションの重要なパスに put オペレーショ
ンを配置することはお勧めしません。
Amazon Kinesis Streams プロデューサーについて
の高度なトピック
このセクションでは、Amazon Kinesis Streams プロデューサーを最適化する方法について説明しま
す。
目次
• KPL の再試行とレート制限 (p. 64)
• KPL 集約を使用するときの考慮事項 (p. 65)
KPL の再試行とレート制限
KPL addUserRecord() オペレーションを使用して KPL ユーザーレコードを追加する場合、レコー
ドにタイムスタンプが与えられ、RecordMaxBufferedTime 設定パラメータで期限が設定されたバッ
ファにそのレコードが追加されます。このタイムスタンプと期限の組み合わせにより、バッファの優
先順位が設定されます。レコードは、次の条件に基づいてバッファからフラッシュされます。
64
Amazon Kinesis Streams 開発者ガイド
高度なトピック
• バッファの優先度
• 集約設定
• 収集設定
バッファの動作に影響を与える集約および収集の設定パラメータは次のとおりです。
• AggregationMaxCount
• AggregationMaxSize
• CollectionMaxCount
• CollectionMaxSize
さらに、フラッシュされたレコードは Streams API オペレーション PutRecords への呼び出
しを使用して、Amazon Kinesis Streams レコードとして Amazon Kinesis stream に送信されま
す。PutRecords オペレーションはストリームにリクエストを送信しますが、すべての失敗または部
分的な失敗を示す場合があります。失敗したレコードは、自動的に KPL バッファに戻されます。新し
い期限は、次の 2 つの値のうち小さい方に基づいて設定されます。
• 現在の RecordMaxBufferedTime 設定の半分
• レコードの有効期限値
この戦略では、再試行する KPL ユーザーレコードをそれ以降の Streams API 呼び出しに含めることが
でき、Streams レコードの有効期限値を適用しながら、スループットを改善し、複雑さを減らすこと
ができます。バックオフアルゴリズムがないため、これは比較的積極的な再試行戦略です。過剰な再
試行による大量送信は、次のセクションで説明するレート制限により防止できます。
レート制限
KPL にはレート制限機能があり、1 つのプロデューサーからの送信されるシャード単位のスループッ
トを制限できます。レート制限は、Streams のレコードとバイトに別々のバケットを使用するトーク
ンバケットアルゴリズムを使用して実装されています。Amazon Kinesis stream への書き込みが成功
するたびに、特定のしきい値に達するまで、各バケットに 1 つまたは複数のトークンが追加されま
す。このしきい値は設定できますが、デフォルトでは実際のシャード制限より 50% 大きく設定され、
単一のプロデューサーによるシャードの飽和が許されています。
この制限を小さくすることにより、過剰な再試行による大量送信を抑制できます。ただし、ベストプ
ラクティスは、各プロデューサーについて、最大スループットまで積極的に再試行することと、スト
リームの容量を拡大し、適切なパーティションキー戦略を実装することにより、結果的に過剰と判断
されたスロットリングを適切に処理することです。
KPL 集約を使用するときの考慮事項
結果として得られた Amazon Kinesis Streams レコードのシーケンス番号方式は同じままですが、集
約された Streams レコードに含まれる KPL ユーザーレコードのインデックスは 0(ゼロ)から始ま
ります。ただし、シーケンス番号に依存しない方法で KPL ユーザーレコードを一意に識別するかぎ
り、集約(KPL ユーザーレコードの Streams レコードへの集約)とその後の集約解除(Streams レ
コードの KPL ユーザーレコードへの集約解除)で自動的に考慮されるため、このようにインデックス
が 0(ゼロ)から始まることをコード上は無視してかまいません。これは、コンシューマーが KCL と
AWS SDK のどちらを使用している場合でも適用されます。AWS SDK で提供される API を使用して
コンシューマーが書かれている場合、この集約機能を使用するには、KPL の Java 部分をビルドに組
み込む必要があります。
KPL ユーザーレコードの一意な識別子としてシーケンス番号を使用する場合、Record および
UserRecord に提供されている、契約に順守した public int hashCode() および public
boolean equals(Object obj) オペレーションを使用して、KPL ユーザーレコードの比較を有効
65
Amazon Kinesis Streams 開発者ガイド
ストリームからのデータの読み取り
にすることをお勧めします。さらに、KPL ユーザーレコードのサブシーケンス番号を調べる必要があ
る場合は、そのユーザーレコードを UserRecord インスタンスにキャストして、そのサブシーケンス
番号を取得することができます。
詳細については、「コンシューマーの集約解除 (p. 47)」を参照してください。
Amazon Kinesis Streams からのデータの読み取
り
コンシューマーは、Amazon Kinesis Streams からデータを読み取り、処理するアプリケーショ
ンです。コンシューマーを対象とした Streams を構築できます。Streams を初めて利用する場合
は、Amazon Kinesis Streams とは? (p. 1) と Amazon Kinesis Streams の使用開始 (p. 9) に説明されて
いる概念と用語について理解することから始めてください。
トピック
• Amazon Kinesis Client Library を使用した Amazon Kinesis Streams コンシューマーの開
発 (p. 66)
• Amazon Kinesis Streams API および AWS SDK for Java を使用した Amazon Kinesis Streams コ
ンシューマーの開発 (p. 82)
• Amazon Kinesis Streams コンシューマーのトラブルシューティング (p. 86)
• Amazon Kinesis Streams コンシューマーについての高度なトピック (p. 89)
Amazon Kinesis Client Library を使用した Amazon
Kinesis Streams コンシューマーの開発
Amazon Kinesis Client Library(KCL)を使用して、Amazon Kinesis Streams のコンシューマーアプ
リケーションを開発できます。Streams API を使用して Amazon Kinesis streamからデータを取得す
ることはできますが、KCLで提供するコンシューマーアプリケーションの設計パターンとコードを使
用することをお勧めします。
Amazon CloudWatch を使用して KCL をモニタリングできます。詳細については、「Amazon
CloudWatch による Amazon Kinesis クライアントライブラリのモニタリング (p. 118)」を参照して
ください。
目次
• Amazon Kinesis Client Library (p. 66)
• KCL のロール (p. 67)
• Java での Amazon Kinesis Client Library コンシューマーの開発 (p. 67)
• Node.js での Amazon Kinesis Client Library コンシューマーの開発 (p. 73)
• .NET での Amazon Kinesis Client Library コンシューマーの開発 (p. 76)
• Python での Amazon Kinesis Client Library コンシューマーの開発 (p. 79)
• Ruby での Amazon Kinesis Client Library コンシューマーの開発 (p. 81)
Amazon Kinesis Client Library
Amazon Kinesis Client Library(KCL)を使用して、Amazon Kinesis streamからデータを取得して処
理できます。このタイプのアプリケーションは、コンシューマーとも呼ばれます。KCL は、分散コ
66
Amazon Kinesis Streams 開発者ガイド
KCL の使用
ンピューティングに関連する多くの複雑なタスクを処理します。たとえば、複数のインスタンス間
での負荷分散、インスタンスの障害に対する応答、処理済みのレコードのチェックポイント作成、リ
シャーディングへの対応が挙げられます。KCL によって、レコード処理のロジックの記述に集中する
ことができます。
KCL は AWS SDK で使用できる Streams API とは異なることに注意してください。Streams API は
Streams の多くの要素(ストリームの作成、リシャーディング、レコードの入力と取得など)を管理
するのに役立ちます。一方、KCLはコンシューマーロールでデータの処理に特化した抽象化層を提供
します。Streams API の詳細については、Amazon Kinesis API Reference を参照してください。
KCL は Java ライブラリです。Java 以外の言語のサポートは、MultiLangDaemon という多言語イ
ンターフェイスを使用して提供されます。このデーモンは Java ベースで、Java 以外の KCL 言語
を使用するときに実行されます。 たとえば、KCL for Python をインストールして、コンシューマー
アプリケーションをすべて Python で書く場合でも、MultiLangDaemon を使用するために、Java
をシステムにインストールする必要があります。さらに、MultiLangDaemon には、接続先の AWS
リージョンなどの、ユースケースに合わせてカスタマイズする必要のあるデフォルト設定例がありま
す。MultiLangDaemon の詳細については、GitHub で「KCL MultiLangDaemon project」のページにア
クセスしてください。
KCLアプリケーションは、実行時に設定情報を使用してワーカーをインスタンス化し、次にレコー
ドプロセッサを使用して Amazon Kinesis streamから取得したデータを処理します。KCLアプリケー
ションは任意の数のインスタンスで実行できます。同じアプリケーションの複数のインスタンスが、
障害発生時に連係し、動的な負荷分散を行います。スループットの制限を条件として、複数の KCLア
プリケーションで同じストリームを処理することもできます。
KCL のロール
KCL は、レコード処理のロジックと Streams の仲介として機能します。
KCLアプリケーションは起動時に KCLを呼び出してワーカーをインスタンス化します。この呼び出し
は、アプリケーションの設定情報(ストリーム名や AWS の認証情報など)を KCL に提供します。
KCL は、次のタスクを実行します。
• ストリームに接続する
• シャードを列挙する
• シャードと他のワーカー(存在する場合)の関連付けを調整する
• レコードプロセッサで管理する各シャードのレコードプロセッサをインスタンス化する
• ストリームからデータレコードを取得する
• 対応するレコードプロセッサにレコードを送信する
• 処理されたレコードのチェックポイントを作成する
• ワーカーのインスタンス数が変化したときに、シャードとワーカーの関連付けを調整する
• シャードが分割またはマージされたときに、シャードとワーカーの関連付けを調整する
Java での Amazon Kinesis Client Library コンシューマーの開
発
Amazon Kinesis Client Library(KCL)を使用して Amazon Kinesis stream からデータを処理するアプ
リケーションを構築できます。Amazon Kinesis Client Library は、複数の言語で使用できます。このト
ピックでは、Java について説明します。javadoc レファレンスを表示するには、「AWS javadoc topic
for Class AmazonKinesisClient」を参照してください。
GitHub から Java KCL をダウンロードするには、「Amazon Kinesis Client Library (Java)」を参照し
てください。 Maven で Java KCL を検索するには、「KCLsearch results」参照してください。 Java
67
Amazon Kinesis Streams 開発者ガイド
KCL の使用
KCL コンシューマーアプリケーションのサンプルコードをダウンロードするには、GitHub の「KCL
for Java sample project」を参照してください。
このサンプルアプリケーションは Apache Commons Logging を使用しま
す。AmazonKinesisApplicationSample.java ファイルで定義されている静的メソッド
configure を使用して、ログ記録の設定を変更できます。Apache Commons Logging を Log4j
や AWS Java アプリケーションとともに使用する方法の詳細については、『AWS SDK for Java
Developer Guide』の「Log4j を使用したログ記録」を参照してください。
Java で KCLコンシューマーアプリケーションを実装する場合は、次のタスクを完了する必要がありま
す。
タスク
• IRecordProcessor メソッドを実装する (p. 68)
• IRecordProcessor インターフェイスのクラスファクトリを実装する (p. 70)
• ワーカーの作成 (p. 71)
• 設定プロパティを変更する (p. 71)
• レコードプロセッサインターフェイスのバージョン 2 への移行 (p. 72)
IRecordProcessor メソッドを実装する
KCL は現在、IRecordProcessor インターフェイスの 2 つのバージョンをサポートしています。最
初のインターフェースは KCL のファーストバージョンで、バージョン 2 は KCL 1.5.0 バージョンか
ら利用可能です。どちらのインターフェイスも完全にサポートされています。どちらにするかの選択
は、お使いのシナリオの要件によって異なります。 違いについての詳細は、ローカルの Java ビルド
の Java ドキュメント、あるいはソースコードを参照してください。 以下のセクションでは、使い始
めの最小限の実装を概説します。
IRecordProcessor バージョン
• オリジナルインターフェイス(バージョン 1) (p. 68)
• 更新されたインターフェイス(バージョン 2) (p. 70)
オリジナルインターフェイス(バージョン 1)
オリジナルな IRecordProcessor interface (package
com.amazonaws.services.kinesis.clientlibrary.interfaces) は、コンシューマーが実装
しているべき次のレコードプロセッサメソッドを公開します。 このサンプルでは、開始点として使用
できる実装を提供しています(AmazonKinesisApplicationSampleRecordProcessor.java を参
照してください)。
public void initialize(String shardId)
public void processRecords(List<Record> records, IRecordProcessorCheckpointer
checkpointer)
public void shutdown(IRecordProcessorCheckpointer checkpointer,
ShutdownReason reason)
initialize
public void initialize(String shardId)
KCL は、レコードプロセッサがインスタンス化されたときに、パラメータとして特定のシャード ID
を渡して、initialize メソッドを呼び出します。このレコードプロセッサはこのシャードのみを
処理し、通常、その逆も真です(このシャードはこのレコード プロセッサによってのみ処理されま
68
Amazon Kinesis Streams 開発者ガイド
KCL の使用
す)。 ただし、コンシューマーでは、データレコードが複数回処理される可能性に対応する必要があ
ります。Streams では「少なくとも 1 回」のセマンティクスを使用しています。これは、シャードか
ら取得されたすべてのデータレコードが、コンシューマーのワーカーによって少なくとも 1 回処理さ
れることを意味します。特定のシャードが複数のワーカーによって処理される可能性がある場合の詳
細については、「リシャーディング、拡張、並列処理 (p. 91)」を参照してください。
processRecords
public void processRecords(List<Record> records, IRecordProcessorCheckpointer
checkpointer)
KCL は、initialize(shardId) メソッドで指定されたシャードからのデータレコードのリストを渡
して、processRecords メソッドを呼び出します。 レコードプロセッサは、コンシューマーのセマ
ンティクスに従って、これらのレコードのデータを処理します。たとえば、ワーカーは、データ変換
を実行した後、Amazon S3 バケットに結果を格納できます。
データ自体に加えて、レコードにもシーケンス番号とパーティションキーが含まれます。ワーカー
はデータを処理するときに、これらの値を使用できます。たとえば、ワーカーは、パーティションの
キーの値に基づいて、データを格納する S3 バケットを選択できます。Record クラスは、レコードの
データ、シーケンス番号、およびパーティションキーへのアクセスを提供する次のメソッドを公開し
ます。
record.getData()
record.getSequenceNumber()
record.getPartitionKey()
サンプルでは、プライベートメソッド processRecordsWithRetries に、ワーカーでレコードの
データ、シーケンス番号、およびパーティションキーにアクセスする方法を示すコードが含まれてい
ます。
Streams では、シャードで既に処理されたレコードを追跡するためにレコードプロセッサが必要で
す。KCL は、チェックポインタ(IRecordProcessorCheckpointer)を processRecords に渡
すことで、この追跡を処理します。レコードプロセッサは、このインターフェイスの checkpoint メ
ソッドを呼び出して、シャード内のレコードの処理の進行状況を KCL に通知します。ワーカーでエ
ラーが発生した場合、KCL はこの情報を使用して、処理されたことが分かっている最後のレコードか
らシャードの処理を再開します。
分割または結合オペレーションの場合、KCL は、元のシャードのプロセッサが checkpoint を呼び出
して元のシャードの処理がすべて完了したことを通知するまで、新しいシャードの処理を開始しませ
ん。
パラメータを渡さない場合、KCL は、checkpoint が呼び出されるときは、レコードプロセッサに渡
された最後のレコードまで、すべてのレコードが処理されたと見なします。したがって、レコードプ
ロセッサは、渡されたリストにあるすべてのレコードの処理が完了した場合にのみ、checkpoint を
呼び出す必要があります。レコードプロセッサは、processRecords の各呼び出しで checkpoint
を呼び出す必要はありません。たとえば、プロセッサは、checkpoint を 3 回呼び出すたび
に、processRecords を呼び出すことができます。オプションでレコードの正確なシーケンス番号を
パラメータとして checkpoint に指定できます。この場合、KCL は、すべてのレコードがそのレコー
ドまで処理されたと見なします。
このサンプルでは、プライベートメソッド checkpoint で、適切な例外処理と再試行のロジックを使
用する IRecordProcessorCheckpointer.checkpoint を呼び出す方法を示しています。
KCL は、processRecords を使用して、データレコードの処理から発生するすべての例外を処理し
ます。例外が processRecords からスローされた場合、KCL は例外発生よりも前に渡されたデータ
レコードをスキップします。つまり、これらのレコードは、例外をスローしたレコードプロセッサ
や、コンシューマー内の他のレコードプロセッサには再送信されません。
69
Amazon Kinesis Streams 開発者ガイド
KCL の使用
shutdown
public void shutdown(IRecordProcessorCheckpointer checkpointer,
ShutdownReason reason)
KCL は、処理が終了した場合(シャットダウンの理由は TERMINATE)またはワーカーが応答してい
ない場合(シャットダウンの理由は ZOMBIE)、shutdown メソッドを呼び出します。
シャードが分割または結合されたか、ストリームが削除されたため、レコードプロセッサがシャード
からこれ以上レコードを受信しない場合は、処理が終了します。
KCL はまた、IRecordProcessorCheckpointer インターフェイスを shutdown に渡します。
シャットダウンの理由が TERMINATE である場合、レコードプロセッサはすべてのデータレコードの
処理を終了し、このインターフェイスの checkpoint メソッドを呼び出します。
更新されたインターフェイス(バージョン 2)
更新された IRecordProcessor interface (package
com.amazonaws.services.kinesis.clientlibrary.interfaces.v2) は、コンシューマーが
実装しているべき次のレコードプロセッサメソッドを公開します。
void initialize(InitializationInput initializationInput)
void processRecords(ProcessRecordsInput processRecordsInput)
void shutdown(ShutdownInput shutdownInput)
コンテナオブジェクトのメソッドの呼び出しで、インターフェイスのオリジナルバージョンのす
べての引数にアクセスできます。 たとえば、processRecords() でレコードのリストを取得に
は、processRecordsInput.getRecords() が使用できます。
このインターフェイスのバージョン 2(KCL 1.5.0 以降)0では、オリジナルインターフェースで提供
される入力に加えて次の新しい入力が使用できます。
シーケンス番号の開始
initialize() オペレーションへ渡される InitializationInput オブジェクトでは、開始
シーケンス番号はレコードプロセッサのインスタンスに配信されるレコードです。 このシーケン
ス番号は、同じシャードで処理されたレコードプロセッサインスタンスの最後のチェックポイン
トです。 これは、アプリケーションでこの情報が必要になる場合のために提供されます。
保留チェックポイントシーケンス番号
initialize() オペレーションへ渡される InitializationInput オブジェクトの保留チェッ
クポイントシーケンス番号(ある場合)とは、前のレコードプロセッサが停止する以前に実行で
きなかったものを示します。
IRecordProcessor
インターフェイスのクラスファクトリを実装する
レコードプロセッサのメソッドを実装するクラスのファクトリも実装する必要があります。コン
シューマーは、ワーカーをインスタンス化するときに、このファクトリへの参照を渡します。
サンプルでは、オリジナルのレコードプロセッサインターフェースを使用し
た、AmazonKinesisApplicationSampleRecordProcessorFactory.java ファイルのファク
トリクラスを実装します。 クラスファクトリでバージョン 2 レコードプロセッサを作成する場合に
は、com.amazonaws.services.kinesis.clientlibrary.interfaces.v2 とい名のパッケージ
を使用してください。
public class SampleRecordProcessorFactory implements
IRecordProcessorFactory {
70
Amazon Kinesis Streams 開発者ガイド
KCL の使用
/**
* Constructor.
*/
public SampleRecordProcessorFactory() {
super();
}
/**
* {@inheritDoc}
*/
@Override
public IRecordProcessor createProcessor() {
return new SampleRecordProcessor();
}
}
ワーカーの作成
「IRecordProcessor メソッドを実装する (p. 68)」で説明されるように、KCL レコードプロセッサ
には選択できる 2 バージョンがあり、ワーカーを作成する方法に影響します。 オリジナルレコードプ
ロセッサインターフェイスは、次のコードストラクチャを使用してワーカーを作成します。
final KinesisClientLibConfiguration config = new
KinesisClientLibConfiguration(...)
final IRecordProcessorFactory recordProcessorFactory = new
RecordProcessorFactory();
final Worker worker = new Worker(recordProcessorFactory, config);
レコード プロセッサインターフェイスのバージョン 2 では、Worker.Builder を使用してワーカを
作成でき、どのコンストラクタを使うかや引数の順序を考慮する必要はありません。 更新されたレ
コードプロセッサインターフェイスは、次のコードストラクチャを使用してワーカーを作成します。
final KinesisClientLibConfiguration config = new
KinesisClientLibConfiguration(...)
final IRecordProcessorFactory recordProcessorFactory = new
RecordProcessorFactory();
final Worker worker = new Worker.Builder()
.recordProcessorFactory(recordProcessorFactory)
.config(config)
.build();
設定プロパティを変更する
このサンプルでは、設定プロパティのデフォルト値を提供します。ワーカーのこの設定データは
KinesisClientLibConfiguration オブジェクトにまとめられています。ワーカーをインスタンス
化する呼び出しで、このオブジェクトと IRecordProcessor のクラスファクトリへの参照が渡され
ます。Java の properties ファイルを使用してこれらのプロパティを独自の値にオーバーライドできま
す(AmazonKinesisApplicationSample.java を参照してください)。
アプリケーション名
KCL には、ユーザーのアプリケーション間、および同じリージョン内の DynamoDB テーブル間で一
意のアプリケーション名が必要です。次のようにアプリケーション名の設定値を使用します。
• このアプリケーション名と関連付けられたすべてのワーカーは、連係して同じストリームを処理し
ていると見なされます。これらのワーカーは複数のインスタンスに分散している場合もあります。
同じアプリケーションコードの追加のインスタンスを実行するときに、アプリケーション名が異な
71
Amazon Kinesis Streams 開発者ガイド
KCL の使用
る場合、KCL は 2 番目のインスタンスを、同じストリームで動作するまったく別のアプリケーショ
ンと見なします。
• KCL はアプリケーション名を使用して DynamoDB テーブルを作成し、このテーブルを使用してア
プリケーションの状態情報(チェックポイントやワーカーとシャードのマッピングなど)を保存
します。各アプリケーションには、それぞれ DynamoDB テーブルがあります。詳細については、
「Amazon Kinesis Streams Applicationの状態の追跡 (p. 89)」を参照してください。
認証情報の設定
デフォルトの認証情報プロバイダチェーンのいずれかの認証情報プロバイダで AWS の認証情報を使
用できるようにする必要があります。たとえば、EC2 インスタンスでコンシューマーを実行してい
る場合は、IAM ロールでインスタンスを起動することをお勧めします。この IAM ロールに関連付け
られたアクセス許可を反映する AWS の認証情報は、インスタンスメタデータを通じて、インスタン
ス上のアプリケーションで使用できるようになります。これは、EC2 インスタンスで実行されるコン
シューマーの認証情報を管理するための最も安全な方法です。
サンプルアプリケーションは、最初にインスタンスメタデータから IAM の認証情報を取得しようとし
ます。
credentialsProvider = new InstanceProfileCredentialsProvider();
サンプルアプリケーションは、インスタンスメタデータから認証情報を取得できない場合、properties
ファイルから認証情報を取得しようとします。
credentialsProvider = new ClasspathPropertiesFileCredentialsProvider();
インスタンスメタデータの詳細については、『Linux インスタンス用 Amazon EC2 ユーザーガイド』
の「インスタンスメタデータ」を参照してください。
複数のインスタンスへのワーカー ID の使用
サンプルの初期化コードは、次のコードスニペットに示すように、ローカルコンピュータ名にグロー
バル一意識別子を追加して、ワーカーの ID(workerId)を作成します。このアプローチによって、1
台のコンピュータでコンシューマーアプリケーションの複数のインスタンスを実行するシナリオに対
応できます。
String workerId = InetAddress.getLocalHost().getCanonicalHostName() + ":" +
UUID.randomUUID();
レコードプロセッサインターフェイスのバージョン 2 への移行
オリジナルインターフェースで使われるコードを移行するためには、上記のステップに加えて、次の
手順が必要となります。
1.
レコードプロセッサのクラスを変更して、バージョン 2 レコードプロセッサインターフェイスに
インポートします。
import
com.amazonaws.services.kinesis.clientlibrary.interfaces.v2.IRecordProcessor;
2.
入力するレファレンスを変更して、コンテナオブジェクトでメソッドの呼び出
しを使います。 たとえば、shutdown() オペレーションで、checkpointer を
shutdownInput.getCheckpointer() に変更します。
3.
レコードプロセッサのファクトリークラスを変更して、バージョン 2 レコードプロセッサファク
トリーインターフェイスにインポートします。
72
Amazon Kinesis Streams 開発者ガイド
KCL の使用
import
com.amazonaws.services.kinesis.clientlibrary.interfaces.v2.IRecordProcessorFactory;
4.
ワーカーのコンストラクチャを変更して、Worker.Builder を使います。 以下に例を示しま
す。
final Worker worker = new Worker.Builder()
.recordProcessorFactory(recordProcessorFactory)
.config(config)
.build();
Node.js での Amazon Kinesis Client Library コンシューマーの
開発
Amazon Kinesis Client Library(KCL)を使用して Amazon Kinesis stream からデータを処理するアプ
リケーションを構築できます。Amazon Kinesis Client Library は、複数の言語で使用できます。このト
ピックでは、Node.js について説明します。
KCL は Java ライブラリです。Java 以外の言語のサポートは、MultiLangDaemon という多言語イン
ターフェイスを使用して提供されます。このデーモンは Java ベースで、Java 以外の KCL 言語を使用
するときに実行されます。 そのため、KCL for Node.js をインストールして、コンシューマーアプリ
ケーションをすべて Node.js で書く場合でも、MultiLangDaemon を使用するために、Java をシステ
ムにインストールする必要があります。さらに、MultiLangDaemon には、接続先の AWS リージョン
などの、ユースケースに合わせてカスタマイズする必要のあるデフォルト設定例があります。GitHub
の MultiLangDaemon の詳細については「KCL MultiLangDaemon project」のページを参照してくださ
い。
GitHub から Node.js KCL をダウンロードするには、「Amazon Kinesis Client Library (Node.js)」を参
照してください。
サンプルコードのダウンロード
Node.js の KCL で使用可能な 2 つのサンプルコードがあります。
• 基本サンプル
Node.js で KCLコンシューマーアプリケーションを構築する方法の基本を説明する次のセクション
で使用されます。
• click-stream-sample
基本サンプルコードを理解したあとの、やや上級で実際のシナリオを使用したサンプル。このサン
プルはここでは説明しませんが、詳細を説明した README ファイルがあります。
Node.js で KCLコンシューマーアプリケーションを実装する場合は、次のタスクを完了する必要があ
ります。
タスク
• レコードプロセッサを実装する (p. 73)
• 設定プロパティを変更する (p. 75)
レコードプロセッサを実装する
KCL for Node.js を使用した最もシンプルなコンシューマーは、recordProcessor 関数を実装する必
要があります。この関数には、initialize、processRecords、および shutdown 関数が含まれま
73
Amazon Kinesis Streams 開発者ガイド
KCL の使用
す。このサンプルでは、開始点として使用できる実装を提供しています(sample_kcl_app.js を参
照してください)。
function recordProcessor() {
// return an object that implements initialize, processRecords and shutdown
functions.}
initialize
initialize: function(initializeInput, completeCallback)
レコードプロセッサが開始するときに、KCL が initialize 関数を呼び出します。このレコードプ
ロセッサは initializeInput.shardId として渡されるシャード ID のみを処理し、通常、その逆も
真です(このシャードはこのレコードプロセッサによってのみ処理されます)。ただし、コンシュー
マーでは、データレコードが複数回処理される可能性に対応する必要があります。これは、Streams
では「少なくとも 1 回」のセマンティクスを使用しているためです。これは、シャードから取得され
たすべてのデータレコードが、コンシューマーのワーカーによって少なくとも 1 回処理されることを
意味します。特定のシャードが複数のワーカーによって処理される可能性がある場合の詳細について
は、「リシャーディング、拡張、並列処理 (p. 91)」を参照してください。
processRecords
processRecords : function (processRecordsInput, completeCallback)
KCL は、initialize 関数に指定したシャードからのデータレコードのリストが含まれる入力を使用
して、この関数を呼び出します。実装するレコードプロセッサは、コンシューマーのセマンティクス
に従って、これらのレコードのデータを処理します。たとえば、ワーカーは、データ変換を実行した
後、 S3 バケットに結果を格納できます。
データ自体に加えて、レコードにもシーケンス番号とパーティションキーが含まれ、ワーカーはデー
タを処理するときに、これらを使用できます。たとえば、ワーカーは、パーティションのキーの値に
基づいて、データを格納する S3 バケットを選択できます。record ディクショナリは、レコードの
データ、シーケンス番号、およびパーティションキーにアクセスする次のキーと値のペアを公開しま
す。
record.data
record.sequenceNumber
record.partitionKey
データは Base64 でエンコードされていることに注意してください。
基本サンプルでは、関数 processRecords に、ワーカーでレコードのデータ、シーケンス番号、お
よびパーティションキーにアクセスする方法を示すコードが含まれています。
Streams では、シャードで既に処理されたレコードを追跡するためにレコードプロセッサが必要で
す。KCL は、processRecordsInput.checkpointer として渡した checkpointer オブジェクト
を使用して、この追跡を処理します。レコードプロセッサは、checkpointer.checkpoint 関数を
呼び出して、シャード内のレコードの処理の進行状況を KCL に通知します。ワーカーでエラーが発生
した場合、シャードの処理を再開するときに、処理されたことが分かっている最後のレコードから再
開するように、KCL はこの情報を使用します。
分割または結合オペレーションの場合、KCL は、元のシャードのプロセッサが checkpoint を呼び出
して元のシャードの処理がすべて完了したことを通知するまで、新しいシャードの処理を開始しませ
ん。
74
Amazon Kinesis Streams 開発者ガイド
KCL の使用
checkpoint 関数にシーケンス番号を渡さない場合、KCL は、checkpoint が呼び出されるときは、
レコードプロセッサに渡された最後のレコードまで、すべてのレコードが処理されたと見なします。
したがって、レコードプロセッサは、渡されたリストにあるすべてのレコードの処理が完了した場合
にのみ、checkpoint を呼び出す必要があります。レコードプロセッサは、processRecords の各
呼び出しで checkpoint を呼び出す必要はありません。たとえば、プロセッサは、3 回呼び出すた
びに、または、レコードプロセッサの外部イベント(実装したカスタムの認証または検証サービスな
ど)により、checkpoint を呼び出すことができます。
オプションでレコードの正確なシーケンス番号をパラメータとして checkpoint に指定できます。こ
の場合、KCL は、すべてのレコードがそのレコードまで処理されたと見なします。
基本サンプルアプリケーションでは、checkpointer.checkpoint 関数の最もシンプルな呼び出し
を示します。関数のこの時点でコンシューマーに必要な他のチェックポイントロジックを追加できま
す。
shutdown
shutdown: function(shutdownInput, completeCallback)
KCL は、処理が終了した場合(shutdownInput.reason は TERMINATE)またはワーカーが応答し
ていない場合(shutdownInput.reason は ZOMBIE)、shutdown 関数を呼び出します。
シャードが分割または結合されたか、ストリームが削除されたため、レコードプロセッサがシャード
からこれ以上レコードを受信しない場合は、処理が終了します。
また、KCL は、shutdownInput.checkpointer オブジェクトを shutdown に渡します。シャット
ダウンの理由が TERMINATE である場合、レコードプロセッサがすべてのデータレコードの処理を終
了したことを確認し、このインターフェイスの checkpoint 関数を呼び出します。
設定プロパティを変更する
このサンプルでは、設定プロパティのデフォルト値を提供します。これらのプロパティを独自の値に
オーバーライドできます(基本サンプルの sample.properties を参照してください)。
アプリケーション名
KCL には、ユーザーのアプリケーション間、および同じリージョン内の DynamoDB テーブル間で一
意のアプリケーションが必要です。次のようにアプリケーション名の設定値を使用します。
• このアプリケーション名と関連付けられたすべてのワーカーは、連係して同じストリームを処理し
ていると見なされます。これらのワーカーは複数のインスタンスに分散している場合もあります。
同じアプリケーションコードの追加のインスタンスを実行するときに、アプリケーション名が異な
る場合、KCL は 2 番目のインスタンスを、同じストリームで動作するまったく別のアプリケーショ
ンと見なします。
• KCL はアプリケーション名を使用して DynamoDB テーブルを作成し、このテーブルを使用してア
プリケーションの状態情報(チェックポイントやワーカーとシャードのマッピングなど)を保存
します。各アプリケーションには、それぞれ DynamoDB テーブルがあります。詳細については、
「Amazon Kinesis Streams Applicationの状態の追跡 (p. 89)」を参照してください。
認証情報の設定
デフォルトの認証情報プロバイダチェーンのいずれかの認証情報プロバイダで AWS の認証情報を使
用できるようにする必要があります。AWSCredentialsProvider プロパティを使用して認証情報
プロバイダを設定できます。sample.properties ファイルで、デフォルトの認証情報プロバイダ
チェーンのいずれかの認証情報プロバイダでユーザーの認証情報を使用できるようにする必要があり
ます。EC2 インスタンスでコンシューマーを実行している場合は、IAM ロールでインスタンスを設定
することをお勧めします。この IAM ロールに関連付けられたアクセス許可を反映する AWS の認証情
75
Amazon Kinesis Streams 開発者ガイド
KCL の使用
報は、インスタンスメタデータを通じて、インスタンス上のアプリケーションで使用できるようにな
ります。これは、EC2 インスタンスで実行されるコンシューマーアプリケーションの認証情報を管理
するための最も安全な方法です。
次の例では、KCL を設定し、sample_kcl_app.js で指定されているレコードプロセッサを使用して
「kclnodejssample」という Amazon Kinesis stream を処理します。
# The Node.js executable
script
executableName = node sample_kcl_app.js
# The name of an Amazon Kinesis stream to process
streamName = kclnodejssample
# Unique KCL application name
applicationName = kclnodejssample
# Use default AWS credentials provider chain
AWSCredentialsProvider = DefaultAWSCredentialsProviderChain
# Read from the beginning of the stream
initialPositionInStream = TRIM_HORIZON
.NET での Amazon Kinesis Client Library コンシューマーの開
発
Amazon Kinesis Client Library(KCL)を使用して Amazon Kinesis stream からデータを処理するアプ
リケーションを構築できます。Amazon Kinesis Client Library は、複数の言語で使用できます。このト
ピックでは、.NET について説明します。
KCL は Java ライブラリです。Java 以外の言語のサポートは、MultiLangDaemon という多言語イ
ンターフェイスを使用して提供されます。このデーモンは Java ベースで、Java 以外の KCL 言語
を使用するときに実行されます。 そのため、KCL for .NET をインストールして、コンシューマーア
プリケーションをすべて .NET で書く場合でも、MultiLangDaemon を使用するために、Java をシ
ステムにインストールする必要があります。さらに、MultiLangDaemon には、接続先の AWS リー
ジョンなどの、ユースケースに合わせてカスタマイズする必要のあるデフォルト設定例がありま
す。MultiLangDaemon の詳細については、GitHub で「KCL MultiLangDaemon project」のページにア
クセスしてください。
GitHub から .NET KCL をダウンロードするには、「Amazon Kinesis Client Library (.NET)」にアクセ
スしてください。 .NET KCL コンシューマーアプリケーションのサンプルコードをダウンロードする
には、GitHub で「GitHub の KCL for .NET sample consumer project」のページにアクセスしてくださ
い。
.NET で KCLコンシューマーアプリケーションを実装する場合は、次のタスクを完了する必要があり
ます。
タスク
• IRecordProcessor クラスのメソッドを実装する (p. 76)
• 設定プロパティを変更する (p. 78)
IRecordProcessor クラスのメソッドを実装する
コンシューマーでは、IRecordProcessor の次のメソッドを実装する必要があります。出発
点として使用できる実装がサンプルコンシューマーに提供されています(SampleConsumer/
AmazonKinesisSampleConsumer.cs の SampleRecordProcessor クラスを参照してくださ
い)。
public void Initialize(InitializationInput input)
76
Amazon Kinesis Streams 開発者ガイド
KCL の使用
public void ProcessRecords(ProcessRecordsInput input)
public void Shutdown(ShutdownInput input)
Initialize
public void Initialize(InitializationInput input)
KCL は、レコードプロセッサがインスタンス化されたときに、input パラメータの特定のシャード
ID(input.ShardId)を渡して、このメソッドを呼び出します。このレコードプロセッサはこの
シャードのみを処理し、通常、その逆も真です(このシャードはこのレコード プロセッサによっての
み処理されます)。ただし、コンシューマーでは、データレコードが複数回処理される可能性に対応
する必要があります。これは、Streams では「少なくとも 1 回」のセマンティクスを使用しているた
めです。これは、シャードから取得されたすべてのデータレコードが、コンシューマーのワーカーに
よって少なくとも 1 回処理されることを意味します。特定のシャードが複数のワーカーによって処理
される可能性がある場合の詳細については、「リシャーディング、拡張、並列処理 (p. 91)」を参照
してください。
ProcessRecords
public void ProcessRecords(ProcessRecordsInput input)
KCL は、Initialize メソッドで指定されたシャードの input パラメータにあるデータレコードの
リスト(input.Records)を渡して、このメソッドを呼び出します。実装するレコードプロセッサ
は、コンシューマーのセマンティクスに従って、これらのレコードのデータを処理します。たとえ
ば、ワーカーは、データ変換を実行した後、 S3 バケットに結果を格納できます。
データ自体に加えて、レコードにもシーケンス番号とパーティションキーが含まれます。ワーカーは
データを処理するときに、これらの値を使用できます。たとえば、ワーカーは、パーティションの
キーの値に基づいて、データを格納する S3 バケットを選択できます。Record クラスは以下を公開
し、レコードのデータ、シーケンス番号、およびパーティションキーのアクセスを可能にします。
byte[] Record.Data
string Record.SequenceNumber
string Record.PartitionKey
サンプルでは、メソッド ProcessRecordsWithRetries に、ワーカーでレコードのデータ、シーケ
ンス番号、およびパーティションキーにアクセスする方法を示すコードが含まれています。
Streams では、シャードで既に処理されたレコードを追跡するためにレコードプロ
セッサが必要です。KCL は、Checkpointer オブジェクトを ProcessRecords に渡
すこと(input.Checkpointer)で、この追跡を処理します。レコードプロセッサ
は、Checkpointer.Checkpoint メソッドを呼び出して、シャード内のレコード処理の進行状況を
KCL に通知します。ワーカーでエラーが発生した場合、KCL はこの情報を使用して、処理されたこと
が分かっている最後のレコードからシャードの処理を再開します。
分割または結合オペレーションの場合、KCL は、元のシャードのプロセッサが
Checkpointer.Checkpoint を呼び出して元のシャードの処理がすべて完了したことを通知するま
で、新しいシャードの処理を開始しません。
パラメータを渡さない場合、KCL は、Checkpointer.Checkpoint が呼び出されるときは、レ
コードプロセッサに渡された最後のレコードまで、すべてのレコードが処理されたと見なしま
す。したがって、レコードプロセッサは、渡されたリストにあるすべてのレコードの処理が完了
した場合にのみ、Checkpointer.Checkpoint を呼び出す必要があります。レコードプロセッ
サは、ProcessRecords の各呼び出しで Checkpointer.Checkpoint を呼び出す必要はありま
せん。たとえば、プロセッサは、3 回または 4 回呼び出すたびに、Checkpointer.Checkpoint
77
Amazon Kinesis Streams 開発者ガイド
KCL の使用
を呼び出すことができます。オプションでレコードの正確なシーケンス番号をパラメータとして
Checkpointer.Checkpoint に指定できます。この場合、KCL は、レコード処理がそのレコードま
で完了したと見なします。
サンプルでは、プライベートメソッド Checkpoint(Checkpointer checkpointer) で、適切な例
外処理と再試行のロジックを使用する Checkpointer.Checkpoint メソッドを呼び出す方法を示し
ています。
KCL for .NET では、例外を処理する方法が他の KCL 言語ライブラリとは異なり、データレコードの
処理から発生した例外を扱いません。ユーザーコードからの例外がキャッチされないと、プログラム
がクラッシュします。
シャットダウン
public void Shutdown(ShutdownInput input)
KCL は、処理が終了した場合(シャットダウンの理由は TERMINATE)またはワーカーが応答してい
ない場合(シャットダウンの input.Reason の値は ZOMBIE)、Shutdown メソッドを呼び出しま
す。
シャードが分割または結合されたか、ストリームが削除されたため、レコードプロセッサがシャード
からこれ以上レコードを受信しない場合は、処理が終了します。
また、KCL は、Checkpointer オブジェクトを shutdown に渡します。シャットダウンの理由が
TERMINATE である場合、レコードプロセッサはすべてのデータレコードの処理を終了し、このイン
ターフェイスの checkpoint メソッドを呼び出します。
設定プロパティを変更する
このサンプルコンシューマーでは、設定プロパティのデフォルト値を提供します。これらのプロパ
ティを独自の値にオーバーライドできます(SampleConsumer/kcl.properties を参照してくださ
い)。
アプリケーション名
KCL には、ユーザーのアプリケーション間、および同じリージョン内の DynamoDB テーブル間で一
意のアプリケーションが必要です。次のようにアプリケーション名の設定値を使用します。
• このアプリケーション名と関連付けられたすべてのワーカーは、連係して同じストリームを処理し
ていると見なされます。これらのワーカーは複数のインスタンスに分散している場合もあります。
同じアプリケーションコードの追加のインスタンスを実行するときに、アプリケーション名が異な
る場合、KCL は 2 番目のインスタンスを、同じストリームで動作するまったく別のアプリケーショ
ンと見なします。
• KCL はアプリケーション名を使用して DynamoDB テーブルを作成し、このテーブルを使用してア
プリケーションの状態情報(チェックポイントやワーカーとシャードのマッピングなど)を保存
します。各アプリケーションには、それぞれ DynamoDB テーブルがあります。詳細については、
「Amazon Kinesis Streams Applicationの状態の追跡 (p. 89)」を参照してください。
認証情報の設定
デフォルトの認証情報プロバイダチェーンのいずれかの認証情報プロバイダで AWS の認証情報を使
用できるようにする必要があります。AWSCredentialsProvider プロパティを使用して認証情報プ
ロバイダを設定できます。sample.properties で、デフォルトの認証情報プロバイダチェーンのいずれ
かの認証情報プロバイダでユーザーの認証情報を使用できるようにする必要があります。EC2 インス
タンスでコンシューマーアプリケーションを実行している場合は、IAM ロールでインスタンスを設定
することをお勧めします。この IAM ロールに関連付けられたアクセス許可を反映する AWS の認証情
78
Amazon Kinesis Streams 開発者ガイド
KCL の使用
報は、インスタンスメタデータを通じて、インスタンス上のアプリケーションで使用できるようにな
ります。これは、EC2 インスタンスで実行されるコンシューマーの認証情報を管理するための最も安
全な方法です。
サンプルのプロパティファイルでは、KCL を設定し、AmazonKinesisSampleConsumer.cs で指定
されているレコードプロセッサを使用して「words」という Amazon Kinesis stream を処理します。
Python での Amazon Kinesis Client Library コンシューマーの
開発
Amazon Kinesis Client Library(KCL)を使用して Amazon Kinesis stream からデータを処理するアプ
リケーションを構築できます。Amazon Kinesis Client Library は、複数の言語で使用できます。このト
ピックでは、Python について説明します。
KCL は Java ライブラリです。Java 以外の言語のサポートは、MultiLangDaemon という多言語イ
ンターフェイスを使用して提供されます。このデーモンは Java ベースで、Java 以外の KCL 言語
を使用するときに実行されます。 そのため、KCL for Python をインストールして、コンシューマー
アプリケーションをすべて Python で書く場合でも、MultiLangDaemon を使用するために、Java
をシステムにインストールする必要があります。さらに、MultiLangDaemon には、接続先の AWS
リージョンなどの、ユースケースに合わせてカスタマイズする必要のあるデフォルト設定例があり
ます。MultiLangDaemon の詳細については https://github.com/awslabs/amazon-kinesis-client/tree/
master/src/main/java/com/amazonaws/services/kinesis/multilangGitHub の KCL MultiLangDaemon プ
ロジェクトのページを参照してください。
GitHub から Python KCL をダウンロードするには、「Amazon Kinesis Client Library (Python)」にア
クセスしてください。 Python KCL コンシューマーアプリケーションのサンプルコードをダウンロー
ドするには、GitHub で「KCL for Python sample project」にアクセスしてください。
Python で KCLコンシューマーアプリケーションを実装する場合は、次のタスクを完了する必要があり
ます。
タスク
• RecordProcessor クラスのメソッドを実装する (p. 79)
• 設定プロパティを変更する (p. 81)
RecordProcessor クラスのメソッドを実装する
RecordProcess クラスでは、RecordProcessorBase を拡張して次のメソッドを実装
する必要があります。このサンプルでは、開始点として使用できる実装を提供しています
(sample_kclpy_app.py を参照してください。)
def initialize(self, shard_id)
def process_records(self, records, checkpointer)
def shutdown(self, checkpointer, reason)
initialize
def initialize(self, shard_id)
KCL は、レコードプロセッサがインスタンス化されたときに、パラメータとして特定のシャード ID
を渡して、initialize メソッドを呼び出します。このレコードプロセッサはこのシャードのみを
処理し、通常、その逆も真です(このシャードはこのレコード プロセッサによってのみ処理されま
す)。ただし、コンシューマーでは、データレコードが複数回処理される可能性に対応する必要があ
ります。これは、Streams では「少なくとも 1 回」のセマンティクスを使用しているためです。これ
79
Amazon Kinesis Streams 開発者ガイド
KCL の使用
は、シャードから取得されたすべてのデータレコードが、コンシューマーのワーカーによって少なく
とも 1 回処理されることを意味します。特定のシャードが複数のワーカーによって処理される可能性
がある場合の詳細については、「リシャーディング、拡張、並列処理 (p. 91)」を参照してくださ
い。
process_records
def process_records(self, records, checkpointer)
KCL は、initialize メソッドで指定されたシャードからのデータレコードのリストを渡して、この
メソッドを呼び出します。実装するレコードプロセッサは、コンシューマーのセマンティクスに従っ
て、これらのレコードのデータを処理します。たとえば、ワーカーは、データ変換を実行した後、 S3
バケットに結果を格納できます。
データ自体に加えて、レコードにもシーケンス番号とパーティションキーが含まれます。ワーカー
はデータを処理するときに、これらの値を使用できます。たとえば、ワーカーは、パーティションの
キーの値に基づいて、データを格納する S3 バケットを選択できます。record ディクショナリは、レ
コードのデータ、シーケンス番号、およびパーティションキーにアクセスする次のキーと値のペアを
公開します。
record.get('data')
record.get('sequenceNumber')
record.get('partitionKey')
データは Base64 でエンコードされていることに注意してください。
サンプルでは、メソッド process_records に、ワーカーでレコードのデータ、シーケンス番号、お
よびパーティションキーにアクセスする方法を示すコードが含まれています。
Streams では、シャードで既に処理されたレコードを追跡するためにレコードプロセッサが必要で
す。KCL は、Checkpointer オブジェクトを process_records に渡すことで、この追跡を処理し
ます。レコードプロセッサは、このオブジェクトの checkpoint メソッドを呼び出して、シャード内
のレコードの処理の進行状況を KCL に通知します。ワーカーでエラーが発生した場合、KCL はこの
情報を使用して、処理されたことが分かっている最後のレコードからシャードの処理を再開します。
分割または結合オペレーションの場合、KCL は、元のシャードのプロセッサが checkpoint を呼び出
して元のシャードの処理がすべて完了したことを通知するまで、新しいシャードの処理を開始しませ
ん。
パラメータを渡さない場合、KCL は、checkpoint が呼び出されるときは、レコードプロセッサに渡
された最後のレコードまで、すべてのレコードが処理されたと見なします。したがって、レコードプ
ロセッサは、渡されたリストにあるすべてのレコードの処理が完了した場合にのみ、checkpoint を
呼び出す必要があります。レコードプロセッサは、process_records の各呼び出しで checkpoint
を呼び出す必要はありません。たとえば、プロセッサは、3 回呼び出すたびに、checkpoint を
呼び出すことができます。オプションでレコードの正確なシーケンス番号をパラメータとして
checkpoint に指定できます。この場合、KCL は、すべてのレコードがそのレコードまで処理された
と見なします。
サンプルでは、プライベートメソッド checkpoint で、適切な例外処理と再試行のロジックを使用す
る Checkpointer.checkpoint メソッドを呼び出す方法を示しています。
KCL は、process_records を使用して、データレコードの処理から発生するすべての例外を
処理します。例外が process_records からスローされた場合、KCLは例外発生よりも前に
process_records に渡されたデータレコードをスキップします。つまり、これらのレコードは、例
外をスローしたレコードプロセッサや、コンシューマー内の他のレコードプロセッサには再送信され
ません。
80
Amazon Kinesis Streams 開発者ガイド
KCL の使用
shutdown
def shutdown(self, checkpointer, reason)
KCL は、処理が終了した場合(シャットダウンの理由は TERMINATE)またはワーカーが応答してい
ない場合(シャットダウンの reason は ZOMBIE)、shutdown メソッドを呼び出します。
シャードが分割または結合されたか、ストリームが削除されたため、レコードプロセッサがシャード
からこれ以上レコードを受信しない場合は、処理が終了します。
また、KCL は、Checkpointer オブジェクトを shutdown に渡します。シャットダウンの reason
が TERMINATE である場合、レコードプロセッサはすべてのデータレコードの処理を終了し、このイ
ンターフェイスの checkpoint メソッドを呼び出します。
設定プロパティを変更する
このサンプルでは、設定プロパティのデフォルト値を提供します。これらのプロパティを独自の値に
オーバーライドできます(sample.properties を参照してください)。
アプリケーション名
KCL には、ユーザーのアプリケーション間、および同じリージョン内の DynamoDB テーブル間で一
意のアプリケーションが必要です。次のようにアプリケーション名の設定値を使用します。
• このアプリケーション名と関連付けられたすべてのワーカーは、連係して同じストリームを処理し
ていると見なされます。これらのワーカーは複数のインスタンスに分散している場合もあります。
同じアプリケーションコードの追加のインスタンスを実行するときに、アプリケーション名が異な
る場合、KCL は 2 番目のインスタンスを、同じストリームで動作するまったく別のアプリケーショ
ンと見なします。
• KCL はアプリケーション名を使用して DynamoDB テーブルを作成し、このテーブルを使用してア
プリケーションの状態情報(チェックポイントやワーカーとシャードのマッピングなど)を保存
します。各アプリケーションには、それぞれ DynamoDB テーブルがあります。詳細については、
「Amazon Kinesis Streams Applicationの状態の追跡 (p. 89)」を参照してください。
認証情報の設定
デフォルトの認証情報プロバイダチェーンのいずれかの認証情報プロバイダで AWS の認証情報を使
用できるようにする必要があります。AWSCredentialsProvider プロパティを使用して認証情報プ
ロバイダを設定できます。sample.properties で、デフォルトの認証情報プロバイダチェーンのいずれ
かの認証情報プロバイダでユーザーの認証情報を使用できるようにする必要があります。EC2 インス
タンスでコンシューマーアプリケーションを実行している場合は、IAM ロールでインスタンスを設定
することをお勧めします。この IAM ロールに関連付けられたアクセス許可を反映する AWS の認証情
報は、インスタンスメタデータを通じて、インスタンス上のアプリケーションで使用できるようにな
ります。これは、EC2 インスタンスで実行されるコンシューマーアプリケーションの認証情報を管理
するための最も安全な方法です。
サンプルのプロパティファイルでは、KCL を設定し、sample_kclpy_app.py で指定されているレ
コードプロセッサを使用して「words」という Amazon Kinesis stream を処理します。
Ruby での Amazon Kinesis Client Library コンシューマーの開
発
Amazon Kinesis Client Library(KCL)を使用して Amazon Kinesis stream からデータを処理するアプ
リケーションを構築できます。Amazon Kinesis Client Library は、複数の言語で使用できます。このト
ピックでは、Ruby について説明します。
81
Amazon Kinesis Streams 開発者ガイド
API の使用
KCL は Java ライブラリです。Java 以外の言語のサポートは、MultiLangDaemon という多言語イ
ンターフェイスを使用して提供されます。このデーモンは Java ベースで、Java 以外の KCL 言語
を使用するときに実行されます。 そのため、KCL for .Ruby をインストールして、コンシューマー
アプリケーションをすべて Ruby で書く場合でも、MultiLangDaemon を使用するために、Java を
システムにインストールする必要があります。 さらに、MultiLangDaemon には、接続先の AWS
リージョンなどの、ユースケースに合わせてカスタマイズする必要のあるデフォルト設定例がありま
す。MultiLangDaemon の詳細については、GitHub で「KCL MultiLangDaemon project」のページにア
クセスしてください。
GitHub から Ruby KCL をダウンロードするには、「Amazon Kinesis Client Library (Ruby)」にアクセ
スしてください。 Ruby KCL コンシューマーアプリケーションのサンプルコードをダウンロードする
には、GitHub で「KCLfor Ruby sample project」にアクセスしてください。
KCL の Ruby サポートライブラリの詳細については、「KCL Ruby Gems Documentation」を参照して
ください。
Amazon Kinesis Streams API および AWS SDK
for Java を使用した Amazon Kinesis Streams コン
シューマーの開発
Amazon Kinesis Streams API と AWS SDK for Java を使用してコンシューマーを開発できま
す。Streams を初めて利用する場合は、Amazon Kinesis Streams とは? (p. 1) と Amazon Kinesis
Streams の使用開始 (p. 9) に説明されている概念と用語について理解することから始めてください。
以下の例では、Streams API について説明し、AWS SDK for Java を使用してストリームからデータを
取得します。ただし、ほとんどのユースケースでは、Streams KCL ライブラリを使用します。詳細に
ついては、「Amazon Kinesis Client Library を使用した Amazon Kinesis Streams コンシューマーの開
発 (p. 66)」を参照してください。
この章で紹介する Java サンプルコードは、基本的な Streams API オペレーションを実行する方法を
示しており、オペレーションタイプ別に論理的に分割されています。これらのサンプルは、すべての
例外を確認しているわけではなく、すべてのセキュリティやパフォーマンスの側面を考慮しているわ
けでもない点で、本稼働環境に使用できるコードを表すものではありません。また、他のプログラミ
ング言語を使用して Streams API を呼び出すこともできます。利用可能なすべての AWS SDK の詳細
については、「アマゾン ウェブ サービスを使用した開発の開始」を参照してください。
各タスクには前提条件があります。たとえば、ストリームを作成するまではストリームにデータを
追加できず、ストリームを作成するにはクライアントを作成する必要があります。詳細については、
「Amazon Kinesis Stream の管理 (p. 96)」を参照してください。
ストリームからのデータの取得
Streams API には、ストリームからデータを取得する getShardIterator メソッドと getRecords
メソッドが用意されています。これはプルモデルで、コードはストリームのシャードからデータを直
接取得します。
Amazon Kinesis Client Library(KCL)で提供されているレコードプロセッサのサポートを使用して、
コンシューマーアプリケーションのストリームデータを取得することをお勧めします。これは、デー
タを処理するコードを組み込むプッシュ モデルです。KCL は、ストリームからデータレコードを取
り出し、アプリケーションコードに配信します。さらに、KCL には、フェイルオーバー、リカバリ、
負荷分散の機能が用意されています。詳細については、「Amazon Kinesis Client Library を使用した
Amazon Kinesis Streams コンシューマーの開発 (p. 66)」を参照してください。
ただし、状況によっては AWS SDK for Java とともに Streams API を使用した方がよい場合がありま
す。たとえば、ストリームのモニタリングやデバッグのためのカスタムツールを実装する場合です。
82
Amazon Kinesis Streams 開発者ガイド
API の使用
Important
データレコードはストリームに追加されてからデフォルトでは 24 時間アクセス可能です。こ
の期間は、保持期間と呼ばれ、24 時間から 168 時間 (1~7 日) まで 1 時間単位で設定できま
す。ストリームの保持期間の詳細については、「データ保持期間の変更 (p. 105)」を参照し
てください。
シャードイテレーターを使用する
ストリームからシャード単位でレコードを取得します。シャードごとに、そのシャードから取得する
レコードのバッチごとに、シャードイテレーターを取得する必要があります。シャードイテレーター
を getRecordsRequest オブジェクトで使用して、レコードの取得元になるシャードを指定します。
シャードイテレーターに関連付ける型により、シャード内でレコードの取得元になる位置が決まりま
す(詳細については以下を参照)。シャードイテレーターを使用する前に、「ストリームからシャー
ドを取得する (p. 99)」で説明したように、シャードを取得する必要が あります。
最初のシャードイテレーターは、getShardIterator メソッドを使用して取得します。レ
コードのその他のバッチのシャードイテレーターは、getRecords メソッドによって返された
getRecordsResult オブジェクトの getNextShardIterator メソッドを使用して取得します。
シャードイテレーターは 5 分間有効です。有効な間、シャードイテレーターを使用すると、新しいも
のを取得します。使用された後でも、各シャードイテレーターは 5 分間有効であることに注目してく
ださい。
最初のシャードイテレーターを取得するには、GetShardIteratorRequest をインスタンス化
し、getShardIterator メソッドに渡します。リクエストを設定するには、ストリームとシャード
ID を指定する必要があります。AWS アカウントのストリームを取得する方法については、「スト
リームのリスト (p. 98)」を参照してください。ストリーム内のシャードを取得する方法について
は、「ストリームからシャードを取得する (p. 99)」を参照してください。
String shardIterator;
GetShardIteratorRequest getShardIteratorRequest = new
GetShardIteratorRequest();
getShardIteratorRequest.setStreamName(myStreamName);
getShardIteratorRequest.setShardId(shard.getShardId());
getShardIteratorRequest.setShardIteratorType("TRIM_HORIZON");
GetShardIteratorResult getShardIteratorResult =
client.getShardIterator(getShardIteratorRequest);
shardIterator = getShardIteratorResult.getShardIterator();
このサンプルコードでは、最初のシャードイテレーターを取得するときにイテレーター型として
TRIM_HORIZON を指定しています。このイテレーター型を指定することで、レコードはまず、シャー
ドに直近に追加されたレコード(tip)からではなく、シャードに最初に追加されたレコードから返さ
れます。可能なイテレーターの種類は次になります。
• AT_SEQUENCE_NUMBER
• AFTER_SEQUENCE_NUMBER
• AT_TIMESTAMP
• TRIM_HORIZON
• LATEST
詳細については、「ShardIteratorType」を参照してください。
イテレーター型によっては、型に加えてシーケンス番号を指定する必要があります。以下に例を示し
ます。
83
Amazon Kinesis Streams 開発者ガイド
API の使用
getShardIteratorRequest.setShardIteratorType("AT_SEQUENCE_NUMBER");
getShardIteratorRequest.setStartingSequenceNumber(specialSequenceNumber);
getRecords を使用してレコードを取得した後、レコードの getSequenceNumber メソッドを呼び
出すことで、レコードのシーケンス番号を取得できます。
record.getSequenceNumber()
さらに、データストリームにレコードを追加するコードでは、putRecord の結果に対して
getSequenceNumber を呼び出すことで、追加したレコードのシーケンス番号を取得できます。
lastSequenceNumber = putRecordResult.getSequenceNumber();
シーケンス番号を使用すると、レコードの順番が厳密に増えるようにできます。詳細については、
「PutRecord の例 (p. 54)」のサンプルコードを参照してください。
GetRecords を使用する
シャードイテレーターを取得した後、GetRecordsRequest オブジェクトをインスタンス化しま
す。setShardIterator メソッドを使用してリクエストのイテレーターを指定します。
必要に応じて、setLimit メソッドを使用して、取得するレコードの数を設定することもできま
す。getRecords によって返されるレコードの数は常にこの制限以下になります。この制限を指定し
ない場合、getRecords は取得したレコードの 10 MB を返します。次のサンプルコードでは、この制
限を 25 個のレコードに設定しています。
レコードが返されない場合、シャードイテレーターによって参照されたシーケンス番号では、この
シャードからどのデータレコードも現在使用できないことになります。この状況になった場合、ス
トリームのデータソースに対して、アプリケーションを適切な時間(少なくとも 1 秒間)待機状態
にする必要があります。次に、getRecords の前の呼び出しで返されたシャードイテレーターを
使用して、シャードからのデータの取得を再試行します。レコードがストリームに追加されてから
getRecords で使用できるまでに約 3 秒の遅延があることに注意してください。
getRecords メソッドに getRecordsRequest を渡し、 getRecordsResult オブジェクトとして返
された値をキャプチャします。データレコードを取得するには、getRecordsResult オブジェクト
の getRecords メソッドを呼び出します。
GetRecordsRequest getRecordsRequest = new GetRecordsRequest();
getRecordsRequest.setShardIterator(shardIterator);
getRecordsRequest.setLimit(25);
GetRecordsResult getRecordsResult = client.getRecords(getRecordsRequest);
List<Record> records = getRecordsResult.getRecords();
getRecords の別の呼び出しに備えて、getRecordsResult から次のシャードイテレーターを取得
します。
shardIterator = getRecordsResult.getNextShardIterator();
最良の結果を得るには、getRecords の呼び出し間の 1 秒(1,000 ミリ秒)以上はスリープ状態にし
て、getRecords の頻度制限を超えないようにしてください。
try {
84
Amazon Kinesis Streams 開発者ガイド
API の使用
Thread.sleep(1000);
}
catch (InterruptedException e) {}
一般的に、テストシナリオで 1 つのレコードを取得するときでも、getRecords はループ内で呼び
出す必要があります。getRecords の 1 回の呼び出しでは、後続のシーケンス番号でシャード内に
レコードがある場合でも、空のレコードのリストが返されることがあります。この状況になった場合
は、空のレコードのリストと共に返された NextShardIterator によってシャード内の後続のシーケ
ンス番号が参照されて、続く getRecords の呼び出しによって最終的にレコードが返されます。次の
サンプルでは、ループの使用を示しています。
例: getRecords
以下のコード例には、このセクションで示した getRecords のヒント(ループ内での呼び出しなど)
を反映しています。
// Continuously read data records from a shard
List<Record> records;
while (true) {
// Create a new getRecordsRequest with an existing shardIterator
// Set the maximum records to return to 25
GetRecordsRequest getRecordsRequest = new GetRecordsRequest();
getRecordsRequest.setShardIterator(shardIterator);
getRecordsRequest.setLimit(25);
GetRecordsResult result = client.getRecords(getRecordsRequest);
// Put the result into record list. The result can be empty.
records = result.getRecords();
try {
Thread.sleep(1000);
}
catch (InterruptedException exception) {
throw new RuntimeException(exception);
}
shardIterator = result.getNextShardIterator();
}
Amazon Kinesis Client Libraryを使用している場合は、データが返されるまで KCL によって複数回呼
び出しが行われることに注意してください。この動作は仕様であり、KCL やデータの問題を示すもの
ではありません。
リシャーディングに適応する
getRecordsResult.getNextShardIterator によって が返された場合、このシャードは分割また
は結合されて、現在 状態であり、使用可能なすべてのデータレコードはこのシャードから読み取り済
みということです。nullCLOSED
このシナリオでは、ストリーム内のシャードを再び列挙して、分割または結合によって作成された新
しいシャードを取得する必要があります。
分割の場合、2 つの新しいシャードの parentShardId はいずれも、前に処理されたシャードの ID に
一致します。これらのシャードの adjacentParentShardId の値はいずれも null です。
85
Amazon Kinesis Streams 開発者ガイド
トラブルシューティング
結合の場合、結合によって作成された 1 つの新しいシャードの parentShardId は、親のシャード
のいずれかの ID に一致し、adjacentParentShardId は、その他の親シャードの ID に一致しま
す。アプリケーションはこれらのいずれかのシャードからすべてのデータを読み取り済みです。これ
は、getRecordsResult.getNextShardIterator が null を返したシャードです。データの順序
がアプリケーションにとって重要である場合、結合によって作成された子シャードから新しいデータ
を読み取る前に、その他の親シャードからもすべてのデータを読み取るようにする必要があります。
複数のプロセッサを使用してストリームからデータを取得する場合、シャードごとに 1 つのプロセッ
サがあり、シャードの分割または結合を行うとすると、プロセッサの数を増やしたり減らしたりし
て、シャードの数の変化に適応する必要があります。
シャードの状態(CLOSED など)の説明を含むリシャーディングの詳細については、「ストリームを
リシャーディングする (p. 100)」を参照してください。
Amazon Kinesis Streams コンシューマーのトラブ
ルシューティング
以下のセクションでは、Amazon Kinesis Streams コンシューマーの操作中に発生する可能性がある一
般的な問題に対する解決策を示します。
• Kinesis クライアントライブラリの使用時に一部の Streams レコードがスキップされる (p. 86)
• 同じシャードに属するレコードが、異なるレコードプロセッサによって同時に処理され
る (p. 86)
• コンシューマーアプリケーションの読み取りの速度が予想よりも遅い (p. 87)
• ストリームにデータがある場合でも、GetRecords が空の Records 配列を返す (p. 87)
• シャードイテレータが予期せずに終了する (p. 88)
• コンシューマーレコードの処理が遅れる (p. 88)
Kinesis クライアントライブラリの使用時に一部の Streams レ
コードがスキップされる
レコードがスキップされる最も一般的な原因は、processRecords からスローされる処理されない
例外です。Amazon Kinesis Client Library (KCL) は、processRecords コードを使用して、データレ
コードの処理から発生するすべての例外を処理します。processRecords からスローされるすべて
の例外は、KCL によって吸収されます。反復的なエラーに対する無限再試行を回避するために、KCL
では例外の発生時に処理中であったレコードのバッチを再送信しません。KCL は、レコードプロセッ
サを再開することなく、データレコードの次のバッチについて processRecords を呼び出します。
これにより、事実上、コンシューマーアプリケーションではレコードがスキップされたことになりま
す。レコードのスキップを防止するには、processRecords 内ですべての例外を適切に処理します。
同じシャードに属するレコードが、異なるレコードプロセッサ
によって同時に処理される
実行されている Amazon Kinesis Client Library (KCL) アプリケーションでは、シャードの所有者はひ
とりだけです。ただし、複数のレコードプロセッサが一時的に同じシャードを処理する場合がありま
す。ネットワーク接続を紛失したワーカーインスタンスの場合、KCL はフェイルオーバー時間の期限
が切れた後に、到達できないワーカーはレコードを処理していないと仮定し、他のワーカーインスタ
ンスが引き継ぐように指示します。このとき短時間ですが、新しいレコードプロセッサと到達不可能
なワーカーのレコードプロセッサが同じシャードのデータを処理する場合があります。
アプリケーションに適したフェイルオーバー時間を設定する必要があります。低レイテンシーアプリ
ケーションの場合、10秒のデフォルトは、待機する最大時間を表している場合があります。ただし、
より頻繁に接続が失われる地域で通話を行うなどの接続問題が予想される場合、この数値は低すぎる
場合があります。
86
Amazon Kinesis Streams 開発者ガイド
トラブルシューティング
ネットワーク接続は通常、以前の到達不可能なワーカーに復元されるため、アプリケーションではこ
のシナリオを予期して処理する必要があります。レコードプロセッサのシャードが別のレコードプロ
セッサに引き継がれた場合、レコードプロセッサは正常なシャットダウンを実行するために次の 2 つ
のケースを処理する必要があります。
1. processRecords の現在の呼び出しが完了した後、KCL はシャットダウンの理由「ZOMBIE」を
使用してレコードプロセッサでシャットダウンメソッドを呼び出します。レコードプロセッサは、
すべてのリソースを必要に応じて適切にクリーンアップした後、終了する必要があります。
2. 「ゾンビ」ワーカーからチェックポイントを作成しようとすると、KCL は ShutdownException
をスローします。この例外を受け取った後、コードは現在のメソッドを正常に終了する必要があり
ます。
詳細については、「重複レコードの処理 (p. 92)」を参照してください。
コンシューマーアプリケーションの読み取りの速度が予想より
も遅い
読み取りのスループットが予想よりも遅くなる最も一般的な理由は次のとおりです。
1. 複数おコンシューマーアプリケーションの読み取りの合計が、シャードごとの制限を超えていま
す。詳細については、「Amazon Kinesis Streams の制限 (p. 7)」を参照してください。この場
合、Amazon Kinesis stream のシャードの数を増やします。
2. 呼び出しあたりの GetRecords の最大数を指定する リミットに低い値が設定されています。KCL を
使用している場合は、ワーカーに設定した maxRecords プロパティの値が低い可能性があります。
一般的に、このプロパティにはシステムのデフォルトを使用することをお勧めします。
3. processRecords 呼び出し内のロジックに予想よりも時間がかかる場合があります。これには、
ロジックが CPU を大量に消費する、I/O をブロックする、同期のボトルネックになっているなど、
多くの理由が考えられます。これに該当するかどうかをテストするには、空のレコードプロセッサ
をテスト実行し、読み取りスループットを比較します。受信データに遅れずに対応する方法につい
ては、「リシャーディング、拡張、並列処理 (p. 91)」を参照してください。
コンシューマーアプリケーションが 1 つのみである場合、通常、PUT レートの少なくとも 2 倍
高速に読み取りを実行できます。これは、書き込みについては最大 1 秒あたり 1,000 レコード、
データの最大書き込み合計レートは 1 秒あたり 1 MB (パーティションキーを含む) まで書き込む
ことができるためです。開いている各シャードは 読み取りは最大 1 秒あたり 5 件のトランザク
ション、データ読み取りの最大合計レートは 1 秒あたり 2 MB をサポートできます。各読み取り
(GetRecords) は、レコードのバッチを取得します。GetRecords によって返されるデータのサイズ
は、シャードの使用状況によって異なります。GetRecords が返すことができるデータの最大サイズ
は、10 MB です。呼び出しがその制限を返す場合、次の 5 秒以内に行われるそれ以降の呼び出しは
ProvisionedThroughputExceededException をスローします。
ストリームにデータがある場合でも、GetRecords が空の
Records 配列を返す
レコードの消費、つまり取得は、プルモデルです。開発者は、バックオフがない連続ループで
GetRecords を呼び出す必要があります。GetRecords のすべての呼び出しは、ShardIterator 値も
返します。この値は、ループの次のイテレーションで使用する必要があります。
GetRecords オペレーションはブロックしません。その代わりに、関連データレコードまたは空の
Records 要素とともに、直ちに制御を戻します。空の Records 要素は、2 つの条件の下で返されま
す。
1. 現在シャードにはそれ以上のデータがない。
2. シャードの ShardIterator で指定されたパートの近くにデータがない。
87
Amazon Kinesis Streams 開発者ガイド
トラブルシューティング
後者の条件は微妙ですが、レコードを取得するときに無限のシーク時間 (レイテンシー) を回避するた
めに必要な設計上のトレードオフです。そのため、ストリームを使用するアプリケーションはループ
し、GetRecords を呼び出して、当然のこととして空のレコードを処理します。
本稼働シナリオで、連続ループが終了するのは、NextShardIterator の値が NULL である場
合のみにする必要があります。NextShardIterator が NULL である場合、現在のシャードが閉
じられ、ShardIterator 値は最後のレコードを過ぎたことを示します。コンシューマーアプリ
ケーションが SplitShard または MergeShards を呼び出さない場合、シャードは開いたままにな
り、GetRecords の呼び出しは NextShardIterator である NULL 値を返しません。
Amazon Kinesis Client Library (KCL) を使用する場合、お客様に対しては前述の消費パターンは抽象化
されます。これには、動的に変更する一連のシャードの自動処理が含まれます。KCL により、開発者
は入力レコードを処理するロジックのみを提供します。ライブラリが自動的に GetRecords の継続的
な呼び出しを行うため、これが可能になります。
シャードイテレータが予期せずに終了する
新しいシャードのイテレーターは、GetRecords リクエスト (NextShardIterator として) によっ
て返されます。これは次の GetRecords リクエスト (ShardIterator として) で使用します。通常の
場合、このシャードイテレーターは使用する前に有効期限が切れることはありません。ただし、5 分
以上 を呼び出さなかったため、またはコンシューマーアプリケーションの再起動を実行したため、
シャードイテレーターの有効期限が切れる場合があります。
シャードイテレーターの有効期限がすぐに切れた場合、それを使用するには、これは Amazon Kinesis
によって使用されている DynamoDB テーブルに リースデータを格納するのに十分な容量がないこと
を示している可能性あります。この状況は、多数のシャードがある場合により発生する可能性が高
くなります。この問題を解決するには、シャードテーブルに割り当てられた書き込み容量を増やしま
す。詳細については、「Amazon Kinesis Streams Applicationの状態の追跡 (p. 89)」を参照してく
ださい。
コンシューマーレコードの処理が遅れる
ほとんどのユースケースで、コンシューマーアプリケーションはストリームから最新のデータの読み
取ります。特定の状況下では、コンシューマーの読み取りが遅れるという好ましくない事態が発生し
ます。コンシューマーの読み取りの遅れ具合を確認したら、遅れの最も一般的な理由を参照してくだ
さい。
GetRecords.IteratorAgeMilliseconds メトリックスを起動して、ストリーム内のすべての
シャードとコンシューマーの読み取り位置を追跡します。イテレータの経過日数が保持期間(デ
フォルトで 24 時間、最大で 7 日まで設定可能)の 50% を経過すると失効する場合、レコード
の有効期限切れによるデータ損失のリスクがあります。とりあえずの解決策は、保持期間を長
くすることです。これにより、問題のトラブルシューティングを行う間に重要なデータが失わ
れるのを防ぎます。詳細については、「Amazon CloudWatch による Amazon Kinesis Streams
サービスのモニタリング (p. 106)」を参照してください。次に、Amazon Kinesis Client Library
(KCL)、MillisBehindLatest が出力するカスタム CloudWatch メトリックスを使用して、コン
シューマーアプリケーションの読み取りが各シャードからどのくらい遅れているかを確認します。詳
細については、「Amazon CloudWatch による Amazon Kinesis クライアントライブラリのモニタリン
グ (p. 118)」を参照してください。
コンシューマーが遅れる最も一般的な理由:
• GetRecords.IteratorAgeMilliseconds の突然の上昇または MillisBehindLatest は、通常
ダウンストリームアプリケーションに対する API オペレーションの障害などの一時的な問題を示し
ます。どちらかのメトリックスが恒常的にこのような動きを示す場合、この急激な上昇を調査する
必要があります。
• これらのメトリックスが徐々に上昇する場合は、レコードの処理速度が不十分なためストリー
ムにコンシューマーが追いついていないことを示します。この状況に共通の原因は、物理リ
ソースの不足またはストリームスループットの上昇にレコード処理ロジックが追随できない
88
Amazon Kinesis Streams 開発者ガイド
高度なトピック
ことです。processTask、RecordProcessor.processRecords.Time、Success など
の、RecordsProcessed オペレーションに関連する KCL が出力する他のカスタム CloudWatch メ
トリックスを確認することで、この状況を調査できます。
• スループットの増加に伴う processRecords.Time メトリックスの上昇が確認された場合、レ
コード処理ロジックを分析して、スループットの増加に対応したスケーリングができない理由を
調べる必要があります。
• スループットの上昇とは関連性がない processRecords.Time 値の上昇が認められた場合は、
重要なパスでブロック呼び出しを行っていないか確認します。これは、レコード処理の低下を
招きます。代替策として、シャードの数を増やして並列処理を増やす方法があります。最後に、
ピーク需要時の基礎処理ノードで物理的リソース(メモリ、CPU 使用率など)の量が十分である
ことを確認します。
Amazon Kinesis Streams コンシューマーについて
の高度なトピック
このセクションでは、Amazon Kinesis Streams コンシューマーを最適化する方法について説明しま
す。
目次
• Amazon Kinesis Streams Applicationの状態の追跡 (p. 89)
• 低レイテンシー処理 (p. 90)
• Amazon Kinesis プロデューサライブラリ での AWS Lambda の使用 (p. 91)
• リシャーディング、拡張、並列処理 (p. 91)
• 重複レコードの処理 (p. 92)
• Amazon Kinesis Streams の障害からの復旧 (p. 94)
• 起動、シャットダウン、スロットリングの処理 (p. 95)
Amazon Kinesis Streams Applicationの状態の追跡
KCL は、各 Amazon Kinesis Streams applicationに対して、一意の Amazon DynamoDB テーブルを使
用してアプリケーションの状態を追跡します。KCL では、Amazon Kinesis Streams application名を使
用してテーブルの名前を作成するため、各アプリケーション名は一意である必要があります。
アプリケーションの実行中に、Amazon DynamoDB コンソールを使用してテーブルを表示できます。
アプリケーションの起動時に Amazon Kinesis Streams applicationの Amazon DynamoDB テーブルが
存在しない場合は、ワーカーの 1 つがテーブルを作成し、describeStream メソッドを呼び出して
テーブルの値を設定します。詳細については、「アプリケーション状態データ (p. 90)」を参照して
ください。
Important
アカウントには、Streams 自体に関連付けられているコストに加えて、DynamoDB テーブル
に関連付けられているコストが課金されます。
スループット
Amazon Kinesis Streams applicationでプロビジョニングされたスループットの例外が発生した場合
は、DynamoDB テーブルにプロビジョニングされたスループットを増やす必要があります。KCL が
テーブルを作成するときにプロビジョニングされるスループットは、1 秒あたりの読み込み 10 回、1
秒あたりの書き込み 10 回ですが、これがユーザーのアプリケーションで十分でない場合がありま
す。たとえば、Amazon Kinesis Streams applicationが頻繁にチェックポイントを作成する場合や、多
89
Amazon Kinesis Streams 開発者ガイド
高度なトピック
くのシャードで構成されるストリームを処理する場合は、より多くのスループットが必要になる可能
性があります。
DynamoDB でプロビジョニングされたスループットの詳細については、『Amazon DynamoDB 開発
者ガイド』の「Amazon DynamoDB でプロビジョニングされたスループット」と「テーブルの操作」
を参照してください。
アプリケーション状態データ
DynamoDB テーブルの各行は、アプリケーションによって処理中のシャードを表します。テーブルの
ハッシュキーはシャード ID です。
シャード ID に加えて、各行には次のデータが含まれます。
• チェックポイント: シャードの最新チェックポイントのシーケンス番号。この値はストリームのすべ
てのシャードで一意です。
• checkpointSubSequenceNumber: Kinesis プロデューサーライブラリの集約機能を使用するとき、
これは Amazon Kinesis レコード内の個別のユーザーレコードを追跡するチェックポイントに対す
る拡張となります。
• leaseCounter: ワーカーが他のワーカーの撮影を受けたことを検出できるように、リースのバージョ
ニングに使用されます。
• leaseKey: リースの固有識別子。各リースはストリームのシャードに固有のもので、一度に 1 つの
ワーカーで保持されます。
• leaseOwner: このリースを保持しているワーカー。
• ownerSwitchesSinceCheckpoint: 最後にチェックポイントが書き込まれてから、このリースワー
カーが何回変更されたかを示します。
• parentShardId: 子シャードの処理を開始する前に、親シャードが完全に処理されるようにするため
に使用します。これにより、レコードがストリームに入力されたのと同じ順序で処理されるように
なります。
低レイテンシー処理
伝達遅延は、レコードがストリームに書き込まれた瞬間からコンシューマーアプリケーションによっ
て読み取られるまでの、エンドツーエンドのレイテンシーとして定義されます。この遅延はいくつか
の要因によって異なりますが、最も大きく影響するのはコンシューマーアプリケーションのポーリン
グ間隔です。
ほとんどのアプリケーションについては、アプリケーションごとに各シャードを 1 秒に 1 回ポーリ
ングすることをお勧めします。この設定では、Amazon Kinesis Streams の制限(1 秒あたり 5 回の
GetRecords 呼び出し)を超えることなく、複数のコンシューマーアプリケーションで同時に 1 つの
ストリームを処理することができます。さらに、処理するデータバッチが大きくなると、アプリケー
ション内でネットワークおよび他の下流レイテンシーを効率的に短縮できる可能性が高くなります。
KCL のデフォルト値は、毎秒のポーリングのベストプラクティスに従うよう設定されています。この
デフォルト設定により、平均的な伝達遅延は通常、1 秒未満になります。
Streams レコードは、書き込まれた後、すぐに読み取り可能になります。このことを利用し、スト
リームが使用可能になったらすぐにストリームのデータ利用が必要になるユースケースもあります。
次の例に示されているように、KCL のデフォルト設定を上書きしてポーリングの頻度を高くすると、
伝達遅延を大幅に短縮できます。
Java KCL の設定コードを次に示します。
kinesisClientLibConfiguration = new
KinesisClientLibConfiguration(applicationName,
90
Amazon Kinesis Streams 開発者ガイド
高度なトピック
streamName,
credentialsProvider,
workerId).withInitialPositionInStream(initialPositionInStream).withIdleTimeBetweenReadsInMi
Python および Ruby KCL のプロパティファイル設定を次に示します。
idleTimeBetweenReadsInMillis = 250
Note
Streams には、シャードごとに GetRecords を呼び出す回数として 1 秒あたり 5 回という
上限があるため、idleTimeBetweenReadsInMillis プロパティを 200 ms 未満に設定する
と、アプリケーションで ProvisionedThroughputExceededException 例外が発生する可
能性があります。この例外の発生回数が多くなりすぎると、エクスポネンシャルバックオフ
につながり、予期しない大幅なレイテンシーが処理中に生じることが考えられます。このプ
ロパティを 200 ms または少し上に設定した場合も、複数の処理アプリケーションが実行され
ていれば、同様の調整が発生します。
Amazon Kinesis プロデューサライブラリ での AWS Lambda
の使用
Amazon Kinesis プロデューサライブラリ (KPL) は、ユーザーがフォーマットした小さなレコード
を最大 1 MB のレコードに集約して、Amazon Kinesis Streams スループットの使用を容易にしま
す。Java 用の KCL はこれらのレコードの集約解除をサポートしますが、ストリームのコンシュー
マーとして AWS Lambda を使用する場合は、特別なモジュールを使用してレコードを集約解除する
必要があります。「Amazon Kinesis プロデューサライブラリAWS Lambda の集約解除モジュール」
の GitHub から、必要なプロジェクトコードと指示を取得できます。このプロジェクトのコンポーネ
ントでは、Java、Node.js、および Python で、KPL のシリアル化されたデータを AWS Lambda 内で
処理することもできます。これらのコンポーネントは、複数言語 KCL アプリケーションの一部として
使用することもできます。
リシャーディング、拡張、並列処理
リシャーディングによって、ストリームのデータフロー率の変化に合わせて、ストリーム内のシャー
ドの数を増減することができます。リシャーディングは、通常、シャードのデータ処理メトリックス
を監視する管理アプリケーションによって実行されます。KCL 自体はリシャーディングオペレーショ
ンを開始しませんが、リシャーディングに起因するシャードの数の変化に適応するように設計されて
います。
「Amazon Kinesis Streams Applicationの状態の追跡 (p. 89)」に示されているように、KCL は
Amazon DynamoDB テーブルを使用してストリーム内のシャードを追跡します。リシャーディングの
結果として新しいシャードが作成されるときに、KCL は新しいシャードを検出し、テーブル内の新し
い行に値を入力します。ワーカーは、自動的に新しいシャードを検出し、シャードからのデータを処
理するためにプロセッサを作成します。また、KCL は、ストリーム内のシャードを、利用可能なすべ
てのワーカーとレコードプロセッサに分散させます。
KCL は、リシャーディング前にシャードに存在していたすべてのデータが最初に処理されるようにし
ます。このデータが処理された後、新しいシャードからのデータがレコードプロセッサに送信されま
す。このようにして、KCL は、データレコードが特定のパーティションキーのストリームに追加され
た順序を保持します。
例: リシャーディング、拡張、並列処理
次の例は、KCL を使用してスケーリングとリシャーディングを処理する方法を示しています。
91
Amazon Kinesis Streams 開発者ガイド
高度なトピック
• アプリケーションが 1 つの EC2 インスタンスで実行中であり、4 つのシャードを含む 1 つの
Amazon Kinesis stream を処理しているとします。この 1 つのインスタンスに 1 つの KCL ワーカー
と、4 つのレコードプロセッサ(各シャードに 1 つのレコードプロセッサ)があります。この 4 つ
のレコードプロセッサは、同一プロセス内で並列実行されます。
• 次に、別のインスタンスを使用するようにアプリケーションを拡張し、2 つのインスタンスで、4
つのシャードを含む 1 つのストリームを処理するとします。KCL ワーカーが 2 番目のインスタンス
で起動すると、最初のインスタンスとの間で負荷分散が行われ、各インスタンスで 2 つのシャード
が処理されるようになります。
• 次に、4 つのシャードを 5 つのシャードに分割するとします。KCL は再度インスタンスでの処理を
調整します。一方のインスタンスが 3 つのシャードを処理し、もう一方のインスタンスが 2 つの
シャードを処理するように調整されます。シャードをマージしたときにも、同様の調整が行われま
す。
通常、KCL を使用する場合、インスタンスの数がシャードの数を超過しないように注意します(障害
に対するスタンバイを目的とする場合を除く)。各シャードは厳密に 1 つの KCL ワーカーによって処
理され、対応するレコードプロセッサが厳密に 1 つ存在するため、1 つのシャードを処理するために
複数のインスタンスが必要になることはありません。ただし、1 つのワーカーで任意の数のシャード
を処理できるため、シャードの数がインスタンスの数を超過していても問題はありません。
アプリケーションでの処理を拡張するには、次のようなアプローチの組み合わせをテストする必要が
あります。
• インスタンスのサイズを拡張する(すべてのレコードプロセッサがプロセス内で並列実行されるた
め)
• 開くことができるシャードの最大数までインスタンスの数を増やす(シャードを個別に処理できる
ため)
• シャードの数を増やす(並列処理のレベルが向上する)
Auto Scaling を使用すると、適切なメトリックスに基づいて自動的にインスタンスを拡張できます。
詳細については、「Auto Scaling ユーザーガイド」を参照してください。
リシャーディングによってストリーム内のシャードの数が増加すると、対応するレコードプロセッ
サの数も増加し、これらをホストする EC2 インスタンスの負荷が増大します。このインスタンス
が Auto Scaling グループの一部であり、負荷の増加が十分である場合、増加した負荷を処理するた
めに Auto Scaling グループにインスタンスが追加されます。新しいインスタンスで追加のワーカー
やレコードプロセッサがすぐにアクティブになるように、インスタンスの起動時に Amazon Kinesis
Streams applicationを起動するように設定してください。
リシャーディングの詳細については、「ストリームをリシャーディングする (p. 100)」を参照してく
ださい。
重複レコードの処理
レコードが複数回 Amazon Kinesis Streams applicationに配信される理由は、主にプロデューサーの再
試行とコンシューマーの再試行の 2 つになります。アプリケーションは、各レコードの複数回処理を
予測して適切に処理する必要があります。
プロデューサーの再試行
PutRecord を呼び出した後で Amazon Kinesis Streams から受信確認を受け取る前までに、ネット
ワーク関連のタイムアウトを発生させるプロデューサーを検討してください。プロデューサーは、
レコードが Streams に配信されたかどうかを確認することができません。各レコードがアプリケー
ションにとって重要である場合、同じデータを使用して呼び出しを再試行するようにプロデューサー
を記述します。同じデータでの PutRecord の呼び出しが両方とも Streams に正常にコミットされ
ると、Streams レコードは 2 つになります。2 つのレコードには同一データが存在しますが、これら
92
Amazon Kinesis Streams 開発者ガイド
高度なトピック
には一意のシーケンス番号が付けられています。厳密な保証を必要とするアプリケーションは、後で
処理するときに重複を削除するようにレコード内にプライマリキーを埋め込む必要があります。プロ
デューサーの再試行に起因する重複の数が、コンシューマーの再試行に起因する重複の数より通常は
少ないことに注意してください。
Note
AWS SDK の PutRecord を使用すると、デフォルトの設定により、失敗した PutRecord の
呼び出しを 3 回まで再試行します。
コンシューマーの再試行
コンシューマー(データ処理アプリケーション)の再試行は、レコードプロセッサが再開するときに
発生します。同じシャードのレコードプロセッサは次の場合に再開します。
1. ワーカーが予期せず終了する
2. ワーカーのインスタンスが追加または削除される
3. シャードが結合または分割される
4. アプリケーションがデプロイされる
これらのすべての場合において、負荷分散処理に対するシャードとワーカーとレコードプロセッサの
マッピングは継続的に更新されます。他のインスタンスに移行されたシャードプロセッサは、最後の
チェックポイントからレコードの処理を再開します。これにより、次の例に示すように、重複レコー
ド処理が発生します。負荷分散の詳細については、「リシャーディング、拡張、並列処理 (p. 91)」
を参照してください。
例: コンシューマーの再試行によるレコードの再配信
この例では、ストリームから継続的にレコードを読み取り、ローカルファイルにレコードを集約し、
このファイルを Amazon S3 にアップロードするアプリケーションがあるとします。分かりやすいよ
うに、1 つのシャードとこのシャードを処理する 1 つのワーカーがあるとします。最後のチェックポ
イントがレコード番号 10000 であると仮定して、次の例の一連のイベントを考えてみます。
1. ワーカーで、シャードから次のレコードのバッチを読み込みます(10001 から 20000)。
2. 次にワーカーで、そのレコードのバッチを関連付けられたレコードプロセッサに渡します。
3. レコードプロセッサはデータを集約し、Amazon S3 ファイルを作成してこのファイルを Amazon
S3 に正常にアップロードします。
4. 新しいチェックポイントが発生する前にワーカーが予期せず終了します。
5. アプリケーション、ワーカー、およびレコードプロセッサが再開します。
6. ワーカーは、正常な最後のチェックポイント(この場合は 10001)から読み込みを開始しました。
したがって、10001 から 20000 のレコードは複数回使用されます。
コンシューマーの再試行に対する弾力性
レコードが複数回処理される可能性がある場合でも、アプリケーションは、レコードが 1 回だけ処理
されたかのように副作用を示すことがあります(べき等処理)。この問題に対するソリューションは
複雑さと正確性によって異なります。最終データの送信先が重複を適切に処理できる場合は、べき等
処理の実行に最終送信先を使用することをお勧めします。たとえば、Elasticsearch で、バージョニン
グと一意の ID の組み合わせを使用して重複処理を回避することができます。
前のセクションのサンプルアプリケーションでは、ストリームから継続的にレコードを読み取り、
ローカルファイルにレコードを集約し、このファイルを Amazon S3 にアップロードします。図に示
すように、10001 から 20000 のレコードが複数回使用されることにより、複数の Amazon S3 ファイ
93
Amazon Kinesis Streams 開発者ガイド
高度なトピック
ルのデータは同じになります。この例の重複を減らす方法の 1 つは、ステップ 3 で次のスキーマを使
用することです。
1. レコードプロセッサは、各 Amazon S3 ファイルに固定のレコード番号(5000 など)を使用しま
す。
2. ファイル名には、このスキーマ(Amazon S3、プレフィックス、シャード ID、および FirstSequence-Num)を使用します。この場合、sample-shard000001-10001 のようになります。
3. Amazon S3 ファイルをアップロードした後で、Last-Sequence-Num を指定してチェックポイン
トを作成します。この場合、レコード番号 15000 にチェックポイントが作成されます。
このスキーマを使用すると、レコードが複数回処理されても、Amazon S3 ファイルには同じ名前と
同じデータが保持されます。再試行によってのみ、同じファイルに同じデータが複数回書き込まれま
す。
リシャーディングオペレーションの場合、シャードに残っているレコードの数は必要な一定数より少
ないことがあります。この場合、shutdown() メソッドは Amazon S3 にファイルをフラッシュし、
最後のシーケンス番号でチェックポイントを作成する必要があります。前述のスキーマも、リシャー
ディングオペレーションと互換性があります。
Amazon Kinesis Streams の障害からの復旧
Amazon Kinesis Streams applicationを使用してストリームからのデータを処理するときに、次のレベ
ルで障害が発生する可能性があります。
• レコードプロセッサで障害が発生する
• ワーカーで障害が発生するか、そのワーカーをインスタンス化したこのアプリケーションのインス
タンスで障害が発生する
• アプリケーションの 1 つ以上のインスタンスをホストしている EC2 インスタンスで障害が発生する
レコードプロセッサの障害
ワーカーは、Java の ExecutorService タスクを使用してレコードプロセッサメソッドを呼び出しま
す。タスクが失敗した場合でも、ワーカーはレコードプロセッサが処理中であったシャードの制御を
保持しています。ワーカーは、このシャードを処理するために新しいレコードプロセッサタスクを開
始します。詳細については、「読み込みのスロットリング (p. 96)」を参照してください。
ワーカーまたはアプリケーションの障害
ワーカー、または Amazon Kinesis Streams applicationインスタンスに障害が発生した場合、状況を検
出して処理する必要があります。たとえば、Worker.run メソッドが例外をスローする場合、この例
外をキャッチして処理する必要があります。
アプリケーション自体に障害が発生した場合は、これを検出し、再起動する必要があります。アプリ
ケーションは、起動するときに新しいワーカーをインスタンス化します。このワーカーが新しいレ
コードプロセッサをインスタンス化すると、処理するシャードが自動的に割り当てられます。これら
は、障害が発生する前に、これらのレコード プロセッサが処理していたものと同じシャードにするこ
とも、これらのプロセッサで新しいシャードにすることもできます。
ワーカーやアプリケーションで障害が発生したが、この障害を検出しない場合、このアプリケーショ
ンの他のインスタンスが他の EC2 インスタンスで実行されているときには、これらのインスタンス上
のワーカーが障害を処理します。これらのインスタンスは、障害が発生したワーカーで処理されなく
なったシャードを処理するために、追加のレコードプロセッサを作成します。これにより、他の EC2
インスタンスの負荷は増加します。
ここで説明するシナリオでは、ワーカーやアプリケーションに障害が発生した場合でも、ホストして
いる EC2 インスタンスは実行されているため、Auto Scaling グループによって再起動されないことを
前提としています。
94
Amazon Kinesis Streams 開発者ガイド
高度なトピック
Amazon EC2 インスタンスの障害
アプリケーションの EC2 インスタンスを Auto Scaling グループで実行することをお勧めします。こ
のようにすることで、いずれかの EC2 インスタンスに障害が発生した場合でも、Auto Scaling グルー
プによって、自動的にそのインスタンスを置き換える新しいインスタンスが起動されます。起動時に
Amazon Kinesis Streams applicationを起動するようにこのインスタンスを設定する必要があります。
起動、シャットダウン、スロットリングの処理
ここでは、Amazon Kinesis Streams applicationの設計に取り入れる必要がある、追加の考慮事項を示
します。
目次
• データプロデューサとデータコンシューマーの起動 (p. 95)
• Amazon Kinesis Streams Applicationのシャットダウン (p. 95)
• 読み込みのスロットリング (p. 96)
データプロデューサとデータコンシューマーの起動
デフォルトでは、KCL はストリームの末尾(最後に追加されたレコード)からレコードの読み込みを
開始します。この設定では、受信側のレコードプロセッサが実行される前に、データプロデューサー
アプリケーションがストリームにレコードを追加した場合、レコードプロセッサが起動した後、これ
らのレコードはレコードプロセッサによって読み込まれません。
レコードプロセッサの動作を変更して、常にストリームの先頭からデータを読み込むには、Amazon
Kinesis Streams applicationの properties ファイルで次の値を設定します。
initialPositionInStream = TRIM_HORIZON
Amazon Kinesis Streams は、レコードを 24 ~ 168 時間保持します。この期間は保持期間と呼ば
れます。TRIM_HORIZON に起動ポジションを設定すると、保持期間で定義されているとおりに、ス
トリームの古いデータを使用してレコードプロセッサが起動します。TRIM_HORIZON 設定でも、レ
コードプロセッサが保持期間経過後に起動した場合は、ストリームのデータの一部が使用できなく
なります。そのため、ストリームから読み込むコンシューマーアプリケーションが常に存在してお
り、CloudWatch メトリックス GetRecords.IteratorAgeMilliseconds を使用して、アプリケー
ションが受信データに追随していることをモニタリングする必要があります。
シナリオによっては、レコードプロセッサでストリームの最初の数レコードが不足していても問題は
ない場合があります。たとえば、ストリームがエンドツーエンドで正常に機能していることをテスト
するために、ストリームに最初の数レコードを送信できます。この初期確認を行った後、ワーカーを
起動し、ストリームへの本稼働データの送信を開始します。
TRIM_HORIZON の設定の詳細については、「シャードイテレーターを使用する (p. 83)」を参照し
てください。
Amazon Kinesis Streams Applicationのシャットダウン
Amazon Kinesis Streams applicationが目的のタスクを完了したら、アプリケーションが実行されてい
る EC2 インスタンスを終了することによって、アプリケーションをシャットダウンする必要がありま
す。インスタンスを終了するには、AWS マネジメントコンソールまたは AWS CLI を使用します。
Amazon Kinesis Streams applicationをシャットダウンした後、KCL でアプリケーションの状態を追跡
するために使用した Amazon DynamoDB テーブルを削除する必要があります。
95
Amazon Kinesis Streams 開発者ガイド
ストリームの管理
読み込みのスロットリング
ストリームのスループットは、シャードレベルでプロビジョニングされます。各シャードの読み込み
スループットは 読み取りは最大 1 秒あたり 5 件のトランザクション、データ読み取りの最大合計レー
トは 1 秒あたり 2 MB です。アプリケーション(または同じストリームで動作するアプリケーション
のグループ)がシャードからデータをより高速に取得しようとすると、Streams は対応する GET オペ
レーションを調整します。
Amazon Kinesis Streams applicationでは、レコードプロセッサが制限よりも高速にデータを処理す
る場合(フェイルオーバーの場合など)に、スロットリングが発生します。Amazon Kinesis Client
Library (p. 66)によってアプリケーションと Streams との対話が管理されるため、スロットリング
例外は、アプリケーションコードではなく KCL コードで発生します。ただし、KCL によってこれら
の例外がログに記録されるため、ログで例外を確認できます。
アプリケーションのスロットリングが一貫して行われる場合は、ストリームのシャードの数を増やす
ことを検討してください。
Amazon Kinesis Stream の管理
次の例では、Amazon Kinesis Streams API について説明し、AWS SDK for Java を使用して Amazon
Kinesis stream を作成、削除、および操作する方法を示します。
この章で紹介する Java サンプルコードは、基本的な Streams API オペレーションを実行する方法を
示しており、オペレーションタイプ別に論理的に分割されています。これらのサンプルは、すべての
例外を確認しているわけではなく、すべてのセキュリティやパフォーマンスの側面を考慮しているわ
けでもない点で、本稼働環境に使用できるコードを表すものではありません。また、他のプログラミ
ング言語を使用して Streams API を呼び出すこともできます。利用可能なすべての AWS SDK の詳細
については、「アマゾン ウェブ サービスを使用した開発の開始」を参照してください。
トピック
• ストリームの作成 (p. 96)
• ストリームのリスト (p. 98)
• ストリームからシャードを取得する (p. 99)
• ストリームを削除する (p. 99)
• ストリームをリシャーディングする (p. 100)
• データ保持期間の変更 (p. 105)
ストリームの作成
次の手順に従って Amazon Kinesis stream を作成します 。
Streams クライアントを作成する
Amazon Kinesis stream を使用する前に、クライアントオブジェクトをインスタンス化する必要があ
ります。次の Java コードでは、Streams クライアントを作成し、クライアントのエンドポイント情
報を設定します。setEndpoint のこのオーバーロードには、サービス名とリージョンも含まれてい
ます。serviceName を kinesis に設定します。
client = new AmazonKinesisClient();
client.setEndpoint(endpoint, serviceName, regionId);
96
Amazon Kinesis Streams 開発者ガイド
ストリームの作成
詳細については、『AWS General Reference』の「Streams のリージョンとエンドポイント」を参照
してください。
ストリームを作成する
Streams クライアントを作成したら、使用するストリームを作成できます。この作業は、Streams コ
ンソールを使用して行うか、プログラムによって実行することができます。プログラムでストリーム
を作成するには、CreateStreamRequest オブジェクトをインスタンス化し、ストリームの名前とス
トリームが使用するシャードの数を指定します。
CreateStreamRequest createStreamRequest = new CreateStreamRequest();
createStreamRequest.setStreamName( myStreamName );
createStreamRequest.setShardCount( myStreamSize );
ストリーム名はストリームを識別するために使用されます。この名前のスコープは、アプリケーショ
ンが使用する AWS アカウントに限定されます。また、リージョンにも限定されます。つまり、2 つ
の異なる AWS アカウント内の 2 つのストリームを同じ名前にすることができ、同じ AWS アカウン
トで 2 つの異なるリージョン内の 2 つのストリームを同じ名前にすることができますが、同じアカウ
ントで、同じリージョン内の 2 つのストリームを同じ名前にすることはできません。
ストリームのスループットはシャードの数によって決まります。プロビジョンドスループットを高く
するほど、必要になるシャードの数は増えます。シャードが増えると、ストリームに対して請求さ
れる AWS のコストも増えます。アプリケーションに適切なシャードの数の計算の詳細については、
「Amazon Kinesis Stream の初期サイズを決定する (p. 5)」を参照してください。
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 );
97
Amazon Kinesis Streams 開発者ガイド
ストリームのリスト
}
catch ( Exception e ) {}
}
catch ( ResourceNotFoundException e ) {}
}
if ( System.currentTimeMillis() >= endTime ) {
throw new RuntimeException( "Stream " + myStreamName + " never went
active" );
}
ストリームのリスト
前のセクションで説明したように、ストリームのスコープは、Streams クライアントのインスタンス
化に使用される AWS の認証情報に関連付けられた AWS アカウントに限定されます。また、このク
ライアントに指定されたリージョンにも限定されます。AWS アカウントを使用して多数のストリー
ムを 1 度にアクティブにできます。ストリームは、Streams コンソールでリストするか、プログラム
によってリストすることができます。このセクションのコードでは、AWS アカウントのすべてのスト
リームをリスト表示する方法を示します。
ListStreamsRequest listStreamsRequest = new ListStreamsRequest();
listStreamsRequest.setLimit(20);
ListStreamsResult listStreamsResult = client.listStreams(listStreamsRequest);
List<String> streamNames = listStreamsResult.getStreamNames();
このコード例では、最初に ListStreamsRequest の新しいインスタンスを作成し、その setLimit
メソッドを呼び出して、最大 20 個のストリームが listStreams の呼び出しごとに返される
ように指定しています。setLimit の値を指定しない場合は、アカウントにあるストリームの
数と同じかそれよりも少ないストリームの数が Streams によって返されます。次に、コードは
クライアントの listStreams メソッドに listStreamsRequest を渡します。listStreams
の戻り値は ListStreamsResult オブジェクトに格納されます。コードはこのオブジェクトの
getStreamNames メソッドを呼び出して、返されたストリームの名前を streamNames リストに
格納します。アカウントとリージョンにこの制限で指定したよりも多くのストリームがある場合で
も、Streams によって返されるストリームの数が指定した制限に満たないことがあります。確実にす
べてのストリームを取得するには、次のコード例で説明している getHasMoreStreams メソッドを使
用します。
while (listStreamsResult.getHasMoreStreams())
{
if (streamNames.size() > 0) {
listStreamsRequest.setExclusiveStartStreamName(streamNames.get(streamNames.size()
- 1));
}
listStreamsResult = client.listStreams(listStreamsRequest);
streamNames.addAll(listStreamsResult.getStreamNames());
}
このコードは、listStreamsRequest の getHasMoreStreams メソッドを呼び出し
て、listStreams の最初の呼び出しで返されたストリームの数よりも多いストリームがあ
るかどうかを確認します。ある場合、コードは setExclusiveStartStreamName メソッド
を呼び出して、listStreams の前の呼び出しで返された最後のストリームの名前を指定しま
す。setExclusiveStartStreamName メソッドは listStreams の次の呼び出しをそのストリーム
の後から開始します。その呼び出しによって返されたストリーム名のグループが streamNames リス
トに追加されます。すべてのストリームの名前がリストに収集されるまで、この処理を続行します。
listStreams で返されるストリームは以下のいずれかの状態になります。
98
Amazon Kinesis Streams 開発者ガイド
ストリームからシャードを取得する
• CREATING
• ACTIVE
• UPDATING
• DELETING
前の「ストリームの作成 (p. 96)」で示した describeStream メソッドを使用して、ストリームの
状態を確認できます。
ストリームからシャードを取得する
describeStream メソッドによって返された応答オブジェクトを使用すると、ストリームを構成する
シャードについて情報を取得できます。シャードを取得するには、このオブジェクトの getShards
メソッドを呼び出します。このメソッドは、1 回の呼び出しでストリームからすべてのシャードを返
すとは限りません。以下のコードでは、getStreamDescription の getHasMoreShards メソッド
を使用して、返されなかったシャードがあるかどうかを確認しています。ある場合、つまり、このメ
ソッドが true を返した場合は、ループ内で getShards の呼び出しを繰り返して、返されたシャー
ドの新しいバッチをシャードのリストに追加していきます。getHasMoreShards が false を返した
場合は、ループが終了します。つまり、すべてのシャードが返されたことになります。getShards は
状態のシャードを返さないことに注意してください。EXPIREDシャードの状態(EXPIRED 状態など)
の詳細については、「リシャーディング後のデータのルーティング、データの永続化、シャードの状
態 (p. 104)」を参照してください。
DescribeStreamRequest describeStreamRequest = new DescribeStreamRequest();
describeStreamRequest.setStreamName( myStreamName );
List<Shard> shards = new ArrayList<>();
String exclusiveStartShardId = null;
do {
describeStreamRequest.setExclusiveStartShardId( exclusiveStartShardId );
DescribeStreamResult describeStreamResult =
client.describeStream( describeStreamRequest );
shards.addAll( describeStreamResult.getStreamDescription().getShards() );
if (describeStreamResult.getStreamDescription().getHasMoreShards() &&
shards.size() > 0) {
exclusiveStartShardId = shards.get(shards.size() - 1).getShardId();
} else {
exclusiveStartShardId = null;
}
} while ( exclusiveStartShardId != null );
ストリームを削除する
ストリームは、Streams コンソールで削除するか、プログラムによって削除することができます。ス
トリームをプログラムで削除するには、次のコードに示されているように DeleteStreamRequest
を使用します。
DeleteStreamRequest deleteStreamRequest = new DeleteStreamRequest();
deleteStreamRequest.setStreamName(myStreamName);
client.deleteStream(deleteStreamRequest);
ストリームを削除する前に、そのストリームとやり取りしているアプリケーションをすべてシャッ
トダウンする必要があります。削除したストリームとアプリケーションがやり取りしようとする
と、ResourceNotFound 例外を受け取ります。また、削除した前のストリームと同じ名前の新しい
ストリームを作成した場合、前のストリームとやり取りしていたアプリケーションがまだ実行されて
99
Amazon Kinesis Streams 開発者ガイド
ストリームをリシャーディングする
いると、それらのアプリケーションが前のストリームであるかのように新しいストリームとやり取り
しようとして、予期しない動作につながることがあります。
ストリームをリシャーディングする
Streams ではリシャーディングがサポートされています。リシャーディングにより、ストリーム内の
シャードの数を調整して、ストリームのデータフロー率の変化に適応できます。リシャーディングは
高度なオペレーションと見なされます。Streams を初めて使用する場合は、Streams の他のあらゆる
機能を使い慣れてから、このトピックをお読みください。
リシャーディングには、シャードの分割と結合という 2 種類のオペレーションがあります。シャー
ドの分割では、1 つのシャードを 2 つシャードに分けます。シャードの結合では、2 つシャードを 1
つのシャードに組み合わせます。リシャーディングは、1 回のオペレーションで複数のシャードに
分割できなければ、1 回のオペレーションで複数のシャードを結合できないという意味で、常に「ペ
アワイズ」です。リシャーディングオペレーションの実行対象となるシャードまたはシャードペア
は、親シャードと呼ばれます。リシャーディングオペレーションの実行結果となるシャードまたは
シャードペアは、子シャードと呼ばれます。
分割によりストリーム内のシャードの数が増え、したがってストリームのデータ容量は増えます。
シャード単位で請求されるため、分割によりストリームのコストが増えます。同様に、統合によりス
トリーム内のシャードの数は減り、したがってストリームのデータ容量(コスト)は減ります。
リシャーディングは、通常、プロデューサー(入力)アプリケーションやコンシューマー(取得)
アプリケーションとは別の管理アプリケーションによって実行されます。管理アプリケーション
は、CloudWatch が提供するメトリックに基づいて、またはプロデューサーとコンシューマーから収
集されたメトリックに基づいて、ストリームの全体的なパフォーマンスを監視します。管理アプリ
ケーションには、コンシューマーまたはプロデューサーよりも広範な IAM アクセス権限も必要にな
ります。コンシューマーとプロデューサーは通常、リシャーディングに使用される API にアクセス
する必要がないためです。Streams の IAM アクセス許可の詳細については、「IAM により Amazon
Kinesis Streams リソースへのアクセスを制御する (p. 133)」を参照してください。
トピック
• リシャーディングのための戦略 (p. 100)
• シャードの分割 (p. 101)
• 2 つのシャードを結合する (p. 102)
• リシャーディング後 (p. 103)
リシャーディングのための戦略
リシャーディングの目的は、ストリームをデータの流量の変化に適応させることです。シャードを分
割すると、ストリームの容量(およびコスト)が増えます。シャードを結合すると、ストリームのコ
スト(および容量)が減ります。
リシャーディングへの 1 つのアプローチとして考えられるのは、単にストリーム内のすべてのシャー
ドを分割することです。これにより、ストリームの容量は倍増します。ただし、実際に必要になるよ
りも多くの容量が追加されるため、不要なコストが生じる可能性があります。
メトリックを使用して、シャードが「ホット」であるか「コールド」であるか、つまり、想定より過
多なデータを受け取っているか、過少なデータを受け取っているかを判断できます。ホットシャー
ドは分割して、それらのハッシュキーに対応した容量を増やすことができます。同様に、コールド
シャードは結合して、未使用の容量をより有効に活用できます。
Streams が発行する CloudWatch メトリックスから、ストリームについてパフォーマンスデータを取
得できます。ただし、ストリームについて独自のメトリックを収集することもできます。1 つのアプ
ローチとして考えられるのは、データレコードのパーティションキーによって生成されたハッシュ
100
Amazon Kinesis Streams 開発者ガイド
ストリームをリシャーディングする
キー値をログに記録することです。ストリームにレコードを追加するときにパーティションキーを指
定していることを思い出してください。
putRecordRequest.setPartitionKey( String.format( "myPartitionKey" ) );
Streams では、MD5 を使用してパーティションキーからハッシュキーを計算します。レコードのパー
ティションキーを指定しているため、MD5 を使用してそのレコードのハッシュキー値を計算し、ログ
に記録できます。
また、データレコードが割り当てられているシャードの ID をログに記録することもできます。
シャード ID は、putRecords メソッドによって返される putRecordResults オブジェクトおよび
putRecord メソッドによって返される putRecordResult オブジェクトの getShardId メソッドを
使用することによって利用できます。
String shardId = putRecordResult.getShardId();
シャード ID とハッシュキー値を使用すると、最も多いまたは少ないトラフィックを受け取っている
シャードとハッシュキーを特定できます。その後、リシャーディングによりこれらのハッシュキーに
対応した容量を増やすか減らすことができます。
シャードの分割
シャードを分割するには、親シャードのハッシュキー値を子シャードに再配分する方法を指定する
必要があります。データレコードをストリームに追加すると、レコードはハッシュキー値に基づい
てシャードに割り当てられます。ハッシュキー値は、ストリームにデータレコードを追加するとき
にデータレコードに指定するパーティションキーの MD5 ハッシュです。パーティションキーが同じ
データレコードはハッシュキー値も同じです。
指定したシャードに使用可能なハッシュキー値は、順序付けられた連続する正の整数で構成されま
す。ハッシュキーの一連の値は以下の式により得られます。
shard.getHashKeyRange().getStartingHashKey();
shard.getHashKeyRange().getEndingHashKey();
シャードを分割するときは、この一連の値を指定します。そのハッシュキー値とそれより上位のす
べてのハッシュキー値は、いずれかの子シャードの配分されます。それより下位のすべてのハッシュ
キー値は、その他の子のシャードに配分されます。
以下のコードでは、子シャード間でハッシュキーを均等に再配分し、親シャードを半分に分割する基
本的なシャード分割オペレーションを示します。これは、親シャードを分割する方法の 1 つに過ぎま
せん。たとえば、親シャードの下位 1/3 のキーを 1 つの子シャードに配分し、上位 2/3 のキーをその
他の子シャードに配分して、シャードを分割することもできます。ただし、多くアプリケーションに
効果的なのは、シャードを半分に分割することです。
以下のコードでは、myStreamName にストリームの名前が格納され、オブジェクト変数 shard に分
割するシャードが格納されるとします。新しい splitShardRequest オブジェクトをインスタンス化
し、ストリーム名とシャード ID を設定することから始めます。
SplitShardRequest splitShardRequest = new SplitShardRequest();
splitShardRequest.setStreamName(myStreamName);
splitShardRequest.setShardToSplit(shard.getShardId());
シャード内の最小値と最大値の中間にあるハッシュキー値を決定します。これは、子シャード
の開始ハッシュキー値になり、親シャードのハッシュキーの上位半分が含まれます。この値を
101
Amazon Kinesis Streams 開発者ガイド
ストリームをリシャーディングする
setNewStartingHashKey メソッドで指定します。指定する必要があるのはこの値のみです。この値
より下位のハッシュキーは、分割によって作成されたその他の子シャードに、Streams によって自動
的に配分されます。最後に、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);
この方法の後の最初の手順は、「ストリームが再度アクティブになるまで待機する (p. 103)」に示さ
れています。
2 つのシャードを結合する
シャードの結合オペレーションは、指定した 2 つのシャードを取得し、1 つシャードに組み合わせま
す。結合後、1 つの子シャードは 2 つの親シャードのすべてのハッシュキー値のデータを受け取りま
す。
シャードの隣接
2 つシャードを結合するには、シャードが隣接している必要があります。2 つシャードのハッシュ
キー範囲が途切れておらず連続している場合、2 つのシャードは隣接していると考えられます。たと
えば 2 つシャードがあり、一方のハッシュキー範囲が 276 ~ 381、もう一方のハッシュキー範囲が
382 ~ 454 である場合、これら 2 つシャードを、ハッシュキー範囲が 276 ~ 454 の 1 つのシャード
に結合できます。
別の例を考えてみます。2 つシャードがあり、一方のハッシュキー範囲が 276 ~ 381、もう一方の
ハッシュキー範囲が 455 ~ 560 である場合、これらの 2 つのシャードは結合できません。2 つのハッ
シュキー範囲の間 382 ~ 454 に 1 つ以上のシャードがあるためです。
ストリーム内で OPEN 状態にある一連のシャードはすべて、グループとして、常に MD5 ハッシュキー
値の全範囲にまたがります。シャードの状態(CLOSED など)の詳細については、「リシャーディン
グ後のデータのルーティング、データの永続化、シャードの状態 (p. 104)」を参照してください。
結合候補になるシャードを特定するには、CLOSED 状態にあるすべてのシャードを除外する必要があ
ります。OPEN 状態のシャード(CLOSED 状態でないシャード)の終了シーケンス番号は null です。
以下のコードを使用してシャードの終了シーケンス番号をテストできます。
if( null == shard.getSequenceNumberRange().getEndingSequenceNumber() )
{
// Shard is OPEN, so it is a possible candidate to be merged.
}
CLOSED 状態のシャードを除外した後、各シャードでサポートされている最大ハッシュキー値で、残
りのシャードを並べ替えます。以下のコード使用してこの値を取得できます。
shard.getHashKeyRange().getEndingHashKey();
このフィルタリングして並び替えたリストで 2 つシャードが隣接している場合、それらのシャードは
結合できます。
102
Amazon Kinesis Streams 開発者ガイド
ストリームをリシャーディングする
結合オペレーションのコード
以下のコードでは、2 つシャードを結合しています。myStreamName には、ストリームの名前が格納
され、オブジェクト変数 shard1 と shard2 には、結合する 2 つの隣接するシャードが格納されると
します。
結合オペレーションの場合、新しい mergeShardsRequest オブジェクトをインスタンス化すること
から始めます。setStreamName メソッドでストリーム名を指定します。次に、setShardToMerge
と setAdjacentShardToMerge のメソッドを使用して、結合する 2 つのシャードを指定します。最
後に、Streams クライアントの mergeShards メソッドを呼び出して、このオペレーションを実行し
ます。
MergeShardsRequest mergeShardsRequest = new MergeShardsRequest();
mergeShardsRequest.setStreamName(myStreamName);
mergeShardsRequest.setShardToMerge(shard1.getShardId());
mergeShardsRequest.setAdjacentShardToMerge(shard2.getShardId());
client.mergeShards(mergeShardsRequest);
この方法の後の最初の手順は、「ストリームが再度アクティブになるまで待機する (p. 103)」に示さ
れています。
リシャーディング後
リシャーディングの手順が終了した後、通常のレコード処理を再開する前に、その他の手順および考
慮が必要になります。以下のセクションでは、これらについて説明します。
トピック
• ストリームが再度アクティブになるまで待機する (p. 103)
• リシャーディング後のデータのルーティング、データの永続化、シャードの状態 (p. 104)
ストリームが再度アクティブになるまで待機する
リシャーディングオペレーションとして splitShard または mergeShards のいずれかを呼び出した
後、ストリームが再びアクティブになるまで待機する必要があります。使用するコードは、ストリー
ムの作成 (p. 96)後にストリームがアクティブになるまで待機する場合のものと同じです。以下にそ
のコードを再び示します。
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;
103
Amazon Kinesis Streams 開発者ガイド
ストリームをリシャーディングする
}
//
// 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" );
}
リシャーディング後のデータのルーティング、データの永続化、シャードの状
態
Streams はリアルタイムのデータストリーミングサービスです。つまりアプリケーションでは、デー
タがストリーム内のシャードに連続的に流れていることが前提になります。リシャーディングする
と、親シャードに流れていたデータレコードは、データレコードのパーティションキーがマッピン
グされるハッシュキー値に基づいて、子シャードに流れるように再ルーティングされます。ただし、
リシャーディング前に親シャードにあったデータレコードはすべて、それらのシャードに残ります。
すなわち、リシャーディング後に親シャードが失われることはありません。それらのシャードはリ
シャーディング前に格納されていたデータと共に保持されます。親シャード内のデータレコードに
は、Streams API の getShardIterator と getRecords (p. 82) のオペレーションを使用する
か、Amazon Kinesis Client Libraryを使用してアクセスできます。
Note
データレコードは、現在の保持期間にストリームを追加した時間からアクセスできます。こ
れは、その期間内のストリームのシャードの変更に関係なく当てはまります。ストリームの
保持期間の詳細については、「データ保持期間の変更 (p. 105)」を参照してください。
リシャーディングの過程で、親シャードは OPEN 状態から CLOSED 状態に、さらに EXPIRED 状態へと
移行します。
• OPEN: リシャーディングオペレーションの前、親シャードは OPEN 状態にあります。つまり、デー
タレコードはシャードへの追加とシャードからの取得のいずれも可能です。
• CLOSED: リシャーディングオペレーションの後、親シャードは CLOSED 状態に移行します。つま
り、データレコードはシャードに追加されなくなります。このシャードに追加されることになって
いたデータレコードは、子シャードに追加されるようになります。ただし、データレコードは引き
続き、制限された時間内にシャードから取得できます。
• 期限切れ: ストリーム保持期間の有効期限が切れたら、親シャードのすべてのデータレコードの期
限も切れてアクセスできなくなります。この時点で、シャード自体は EXPIRED 状態に移行しま
す。getStreamDescription().getShards を呼び出してストリーム内のシャードを列挙して
も、返されるシャードのリストには 状態のシャードは含まれません。EXPIREDストリームの保持期
間の詳細については、「データ保持期間の変更 (p. 105)」を参照してください。
リシャーディング後、ストリームが再び ACTIVE 状態になるとすぐに、子シャードからのデー
タの読み取りを開始できます。ただし、リシャーディング後に残った親シャードには依然とし
て、リシャーディング前にストリームに追加されてまだ読み取られていないデータが格納されて
いる可能性があります。親シャードからすべてのデータを読み取る前に、子シャードからデータ
を読み取った場合は、特定のハッシュキーが原因で、読み取ったデータがデータレコードのシー
104
Amazon Kinesis Streams 開発者ガイド
データ保持期間の変更
ケンス番号に基づいた順序に並ばない可能性があります。したがって、データの順序が重要な場
合は、リシャーディング後に親シャードからのデータを読み取りを、そのデータを使い切るまで
続行する必要があります。その後でのみ、子シャードからのデータの読み取りを開始してくださ
い。getRecordsResult.getNextShardIterator が を返した場合は、親シャード内のすべての
データを読み取ったということです。nullAmazon Kinesis Client Libraryを使用してデータを読み取
る場合は、リシャーディング後でも正しい順序でデータを受け取ることができます。
データ保持期間の変更
Streams は、ストリームのデータレコードの保持期間の変更をサポートしています。Amazon Kinesis
stream はデータレコードの順序付けられたシーケンスで、リアルタイムで書き込みと読み取りができ
ることが前提となっています。したがって、データレコードはシャードに一時的に保存されます。レ
コードが追加されてからアクセスできなくなるまでの期間は、保持期間と呼ばれます。デフォルトで
Amazon Kinesis stream は 24 時間レコードを保持し、最大値は 168 時間です。
IncreaseStreamRetentionPeriod オペレーションを使用して保持期間を最大 168 時間まで増やした
り、DecreaseStreamRetentionPeriod オペレーションを使用して最短の 24 時間に短縮したりできま
す。両方のオペレーションに対するリクエスト構文には、時間にストリーム名と保存期間が含まれま
す。最後に、DescribeStream オペレーションを呼び出すことで、ストリームの現在の保持期間を確認
できます。
オペレーションはどちらも操作が簡単です。保持期間を変更する例を、以下の AWS CLI (リンク)
に示します。
aws kinesis increase-stream-retention-period --stream-name
retentionPeriodDemo --retention-period-hours 72
Streams は、数分間延長した保持期間内で古い保持期間のアクセス停止を解除することができます。
たとえば、保持期間を 24 時間から 48 時間に変更すると、23 時間 55 分前にストリームに追加された
レコードは、さらに 24 時間が経過するまで使用可能になります。
Streams は、保持期間が短縮されると、新しい保持期間よりも古いレコードをほぼ即座にアクセス不
能にします。したがって、DecreaseStreamRetentionPeriod オペレーションを呼び出すときは、細心
の注意が必要です。
問題が発生した場合は、期限が切れる前にデータを読めるように、保持期間を設定しておく必要があ
ります。レコード処理ロジックの問題または長期間にわたるダウンストリームの依存関係など、あら
ゆる可能性を慎重に検討してください。保持期間は、安全策としてデータ回復のための余裕期間を見
込んでください。保持期間 API オペレーションでは、この期間を事前に設定したり、オペレーション
イベントにリアクティブに対応したりできます。
追加料金は 24 時間を超えて保持されたストリームに適用されます。詳細については、「Amazon
Kinesis Streams 料金表」を参照してください。
Amazon Kinesis Streams のモニタリング
次の機能を使用して Amazon Kinesis Streams をモニタリングできます。
• CloudWatch メトリックス (p. 106) – Streams は、Amazon CloudWatch に各ストリームの詳細モ
ニタリングのカスタムメトリックスを送信します。
• Amazon Kinesis エージェント (p. 114) ‐ Amazon Kinesis エージェントは、エージェントが期待ど
おりに動作している場合に、カスタム CloudWatch メトリックスを発行します。
• API ログ作成 (p. 114) – Streams は AWS CloudTrail を使用して API 呼び出しをログに記録し、そ
のデータを Amazon S3 バケットに保存します。
105
Amazon Kinesis Streams 開発者ガイド
CloudWatch によるサービスのモニタリング
• Amazon Kinesis クライアントライブラリ (p. 118) — Streams クライアントライブラリ (KCL)
は、シャード、ワーカー、および KCL アプリケーションあたりのメトリックスを提供します。
• Amazon Kinesis プロデューサーライブラリ (p. 126) — Streams プロデューサーライブラリ (KPL)
は、シャード、ワーカー、および KPL アプリケーションあたりのメトリックスを提供します。
Amazon CloudWatch による Amazon Kinesis
Streams サービスのモニタリング
Amazon Kinesis Streams と Amazon CloudWatch は統合されているため、Amazon Kinesis stream
の CloudWatch メトリックスを収集、表示、分析できます。たとえば、シャードの使用状況の追跡
に、PutRecords.Bytes メトリックスと GetRecords.Bytes メトリックスをモニタリングし、スト
リーム内のシャードの数と比較できます。
ストリーム用に設定するメトリックスは、自動的に収集され、1 分おきに CloudWatch にプッシュさ
れます。2 週間分のメトリックスがアーカイブされ、その期間が経過したデータは破棄されます。
次の表は、Amazon Kinesis の基本的なストリームレベルと拡張シャードレベルのモニタリングについ
て説明しています。
型
説明
基本 (ストリームレベル)
ストリームレベルデータは自動的に 1 分間無料
で取得できます。
拡張 (シャードレベル)
1分間のシャードレベルデータを取得できます。
追加料金がかかります。このレベルのデータを
取得するには、EnableEnhancedMonitoring 操作
を使用してストリームを明示的に有効にする必
要があります。
料金表の詳細については、Amazon CloudWatch
product page を参照してください。
トピック
• Amazon Kinesis Streams のディメンションおよびメトリックス (p. 106)
• Streams の Amazon CloudWatch メトリックスへのアクセス (p. 113)
Amazon Kinesis Streams のディメンションおよびメトリック
ス
Streams は、ストリームレベルとオプションのシャードレベルの 2 つのレベルでメトリックスを
CloudWatch に送信します。ストリームレベルのメトリックスは、通常の条件での最も一般的なモニ
タリングのユースケース用です。シャードレベルのメトリックスは、通常トラブルシューティングに
関連する特定のモニタリングタスクで、EnableEnhancedMonitoring 操作を使用して有効になります。
CloudWatch メトリックスから収集された統計の説明については、『Amazon CloudWatch 開発者ガイ
ド』の「CloudWatch の統計」を参照してください。
トピック
• Basic Stream-level Metrics (p. 107)
• Enhanced Shard-level Metrics (p. 110)
• Amazon Kinesis Streams メトリックスのディメンション (p. 112)
106
Amazon Kinesis Streams 開発者ガイド
CloudWatch によるサービスのモニタリング
• 推奨 Amazon Kinesis Streams メトリックス (p. 112)
Basic Stream-level Metrics
The AWS/Kinesis namespace includes the following stream-level metrics.
Streams sends these stream-level metrics to CloudWatch every minute. These metrics are always
available.
Metric
Description
GetRecords.Bytes
The number of bytes retrieved from the Amazon Kinesis stream, measured
over the specified time period. Minimum, Maximum, and Average statistics
represent the bytes in a single GetRecords operation for the stream in the
specified time period.
Shard-level metric name: OutgoingBytes
Dimensions: StreamName
Statistics: Minimum, Maximum, Average, Sum, Samples
Units: Bytes
GetRecords.IteratorAge
This metric is deprecated. Use
GetRecords.IteratorAgeMilliseconds.
GetRecords.IteratorAgeMilliseconds
The age of the last record in all GetRecords calls made against an
Amazon Kinesis stream, measured over the specified time period. Age is
the difference between the current time and when the last record of the
GetRecords call was written to the stream. The Minimum and Maximum
statistics can be used to track the progress of Amazon Kinesis consumer
applications. A value of zero indicates that the records being read are
completely caught up with the stream.
Shard-level metric name: IteratorAgeMilliseconds
Dimensions: StreamName
Statistics: Minimum, Maximum, Average, Samples
Units: Milliseconds
GetRecords.Latency The time taken per GetRecords operation, measured over the specified
time period.
Dimensions: StreamName
Statistics: Minimum, Maximum, Average
Units: Milliseconds
GetRecords.Records The number of records retrieved from the shard, measured over the
specified time period. Minimum, Maximum, and Average statistics
represent the records in a single GetRecords operation for the stream in
the specified time period.
Shard-level metric name: OutgoingRecords
Dimensions: StreamName
107
Amazon Kinesis Streams 開発者ガイド
CloudWatch によるサービスのモニタリング
Metric
Description
Statistics: Minimum, Maximum, Average, Sum, Samples
Units: Count
GetRecords.Success The number of successful GetRecords operations per stream, measured
over the specified time period.
Dimensions: StreamName
Statistics: Average, Sum, Samples
Units: Count
IncomingBytes
The number of bytes successfully put to the Amazon Kinesis stream over
the specified time period. This metric includes bytes from PutRecord
and PutRecords operations. Minimum, Maximum, and Average statistics
represent the bytes in a single put operation for the stream in the specified
time period.
Shard-level metric name: IncomingBytes
Dimensions: StreamName
Statistics: Minimum, Maximum, Average, Sum, Samples
Units: Bytes
IncomingRecords
The number of records successfully put to the Amazon Kinesis stream
over the specified time period. This metric includes record counts from
PutRecord and PutRecords operations. Minimum, Maximum, and
Average statistics represent the records in a single put operation for the
stream in the specified time period.
Shard-level metric name: IncomingRecords
Dimensions: StreamName
Statistics: Minimum, Maximum, Average, Sum, Samples
Units: Count
PutRecord.Bytes
The number of bytes put to the Amazon Kinesis stream using the
PutRecord operation over the specified time period.
Dimensions: StreamName
Statistics: Minimum, Maximum, Average, Sum, Samples
Units: Bytes
PutRecord.Latency
The time taken per PutRecord operation, measured over the specified
time period.
Dimensions: StreamName
Statistics: Minimum, Maximum, Average
Units: Milliseconds
108
Amazon Kinesis Streams 開発者ガイド
CloudWatch によるサービスのモニタリング
Metric
Description
PutRecord.Success
The number of successful PutRecord operations per Amazon Kinesis
stream, measured over the specified time period. Average reflects the
percentage of successful writes to a stream.
Dimensions: StreamName
Statistics: Average, Sum, Samples
Units: Count
PutRecords.Bytes
The number of bytes put to the Amazon Kinesis stream using the
PutRecords operation over the specified time period.
Dimensions: StreamName
Statistics: Minimum, Maximum, Average, Sum, Samples
Units: Bytes
PutRecords.Latency The time taken per PutRecords operation, measured over the specified
time period.
Dimensions: StreamName
Statistics: Minimum, Maximum, Average
Units: Milliseconds
PutRecords.Records The number of successful records in a PutRecords operation per Amazon
Kinesis stream, measured over the specified time period.
Dimensions: StreamName
Statistics: Minimum, Maximum, Average, Sum, Samples
Units: Count
PutRecords.Success The number of PutRecords operations where at least one record
succeeded, per Amazon Kinesis stream, measured over the specified time
period.
Dimensions: StreamName
Statistics: Average, Sum, Samples
Units: Count
109
Amazon Kinesis Streams 開発者ガイド
CloudWatch によるサービスのモニタリング
Metric
Description
ReadProvisionedThroughputExceeded
The number of GetRecords calls throttled for the stream over the
specified time period. The most commonly used statistic for this metric is
Average.
When the Minimum statistic has a value of 1, all records were throttled for
the stream during the specified time period.
When the Maximum statistic has a value of 0 (zero), no records were
throttled for the stream during the specified time period.
Shard-level metric name: ReadProvisionedThroughputExceeded
Dimensions: StreamName
Statistics: Minimum, Maximum, Average, Sum, Samples
Units: Count
WriteProvisionedThroughputExceeded
The number of records rejected due to throttling for the stream over the
specified time period. This metric includes throttling from PutRecord and
PutRecords operations. The most commonly used statistic for this metric
is Average.
When the Minimum statistic has a non-zero value, records were being
throttled for the stream during the specified time period.
When the Maximum statistic has a value of 0 (zero), no records were being
throttled for the stream during the specified time period.
Shard-level metric name: WriteProvisionedThroughputExceeded
Dimensions: StreamName
Statistics: Minimum, Maximum, Average, Sum, Samples
Units: Count
Enhanced Shard-level Metrics
The AWS/Kinesis namespace includes the following shard-level metrics.
Amazon Kinesis sends the following shard-level metrics to CloudWatch every minute. These metrics
are not enabled by default. There is a nominal charge for enhanced metrics emitted from Amazon
Kinesis. For more information, see Amazon CloudWatch Pricing.
Metric
Description
IncomingBytes
The number of bytes successfully put to the shard over the specified time
period. This metric includes bytes from PutRecord and PutRecords
operations. Minimum, Maximum, and Average statistics represent the
bytes in a single put operation for the shard in the specified time period.
Stream-level metric name: IncomingBytes
Dimensions: StreamName, ShardId
Statistics: Minimum, Maximum, Average, Sum, Samples
110
Amazon Kinesis Streams 開発者ガイド
CloudWatch によるサービスのモニタリング
Metric
Description
Units: Bytes
IncomingRecords
The number of records successfully put to the shard over the specified
time period. This metric includes record counts from PutRecord and
PutRecords operations. Minimum, Maximum, and Average statistics
represent the records in a single put operation for the shard in the specified
time period.
Stream-level metric name: IncomingRecords
Dimensions: StreamName, ShardId
Statistics: Minimum, Maximum, Average, Sum, Samples
Units: Count
IteratorAgeMilliseconds
The age of the last record in all GetRecords calls made against a shard,
measured over the specified time period. Age is the difference between the
current time and when the last record of the GetRecords call was written
to the stream. The Minimum and Maximum statistics can be used to track
the progress of Amazon Kinesis consumer applications. A value of 0 (zero)
indicates that the records being read are completely caught up with the
stream.
Stream-level metric name: GetRecords.IteratorAgeMilliseconds
Dimensions: StreamName, ShardId
Statistics: Minimum, Maximum, Average, Samples
Units: Milliseconds
OutgoingBytes
The number of bytes retrieved from the shard, measured over the specified
time period. Minimum, Maximum, and Average statistics represent the
bytes in a single GetRecords operation for the shard in the specified time
period.
Stream-level metric name: GetRecords.Bytes
Dimensions: StreamName, ShardId
Statistics: Minimum, Maximum, Average, Sum, Samples
Units: Bytes
OutgoingRecords
The number of records retrieved from the shard, measured over the
specified time period. Minimum, Maximum, and Average statistics
represent the records in a single GetRecords operation for the shard in
the specified time period.
Stream-level metric name: GetRecords.Records
Dimensions: StreamName, ShardId
Statistics: Minimum, Maximum, Average, Sum, Samples
Units: Count
111
Amazon Kinesis Streams 開発者ガイド
CloudWatch によるサービスのモニタリング
Metric
Description
ReadProvisionedThroughputExceeded
The number of GetRecords calls throttled for the shard over the specified
time period. This exception count covers all dimensions of the following
limits: 5 reads per shard per second or 2 MB per second per shard. The
most commonly used statistic for this metric is Average.
When the Minimum statistic has a value of 1, all records were throttled for
the shard during the specified time period.
When the Maximum statistic has a value of 0 (zero), no records were
throttled for the shard during the specified time period.
Stream-level metric name: ReadProvisionedThroughputExceeded
Dimensions: StreamName, ShardId
Statistics: Minimum, Maximum, Average, Sum, Samples
Units: Count
WriteProvisionedThroughputExceeded
The number of records rejected due to throttling for the shard over the
specified time period. This metric includes throttling from PutRecord and
PutRecords operations and covers all dimensions of the following limits:
1,000 records per second per shard or 1 MB per second per shard. The
most commonly used statistic for this metric is Average.
When the Minimum statistic has a non-zero value, records were being
throttled for the shard during the specified time period.
When the Maximum statistic has a value of 0 (zero), no records were being
throttled for the shard during the specified time period.
Stream-level metric name: WriteProvisionedThroughputExceeded
Dimensions: StreamName, ShardId
Statistics: Minimum, Maximum, Average, Sum, Samples
Units: Count
Amazon Kinesis Streams メトリックスのディメンション
You can use the following dimensions to filter the metrics for Amazon Kinesis Streams.
Dimension
Description
StreamName
The name of the Amazon Kinesis stream.
ShardId
The shard ID within the Amazon Kinesis stream.
推奨 Amazon Kinesis Streams メトリックス
Amazon Kinesis Streams のお客様の多くにとって有益なメトリックスがいくつか存在します。次のリ
ストは推奨メトリックスとご利用方法を提供しています。
112
Amazon Kinesis Streams 開発者ガイド
CloudWatch によるサービスのモニタリング
メトリックス
使用に関する注意事項
GetRecords.IteratorAgeMilliseconds
ストリームのすべてのシャードとコンシューマーの読み込み場所を追跡し
ます。イテレータの経過日数が保持期間(デフォルトで 24 時間、最大で
7 日まで設定可能)の 50% を経過すると失効する場合、レコードの有効
期限切れによるデータ損失のリスクがあります。この損失がリスクになる
前に警告するように、最大統計の CloudWatch アラームを使用することを
お勧めします。このメトリックスを使用するシナリオ例は、「コンシュー
マーレコードの処理が遅れる (p. 88)」を参照してください。
ReadProvisionedThroughputExceeded
コンシューマー側のレコード処理に後れが生じているときに、ボトルネッ
クがどこにあるかを確認するのは難しい場合があります。このメトリック
スを使用して、読み取りスループット制限を超えたために、読み取りが調
整されているかを判断してください。このメトリックスで最も一般的に使
用される統計は Average です。
WriteProvisionedThroughputExceeded
これは、ReadProvisionedThroughputExceeded メトリックスと同じ
目的ですが、ストリームのプロデューサ (PUT) 側用です。このメトリック
スで最も一般的に使用される統計は Average です。
PutRecord.Success、PutRecords.Success
レコードがストリームの役に立っていないことを示す平均統計の
CloudWatch アラームを使用することをお勧めします。プロデューサー
が使用しているものに応じて、一つまたは両方の種類の PUT 種類を選
択します。Kinesis プロデューサーライブラリ (KPL) を使用している場
合、PutRecords.Success を使用します。
GetRecords.Success レコードがストリームから失敗していることを示す、平均統計の
CloudWatch アラームを使用することをお勧めします。
Streams の Amazon CloudWatch メトリックスへのアクセス
CloudWatch コンソール、コマンドライン、または CloudWatch API を使用して、Streams のメトリッ
クスをモニタリングできます。次の手順は、これらのさまざまなメソッドを使用してメトリックスに
アクセスする方法を示しています。
CloudWatch コンソールを使用してメトリックスにアクセスするには
1.
2.
https://console.aws.amazon.com/cloudwatch/にある CloudWatch コンソールを開きます。
ナビゲーションバーから、リージョンを選択します。
3.
4.
ナビゲーションペインで メトリックスを選択します。
[CloudWatch Metrics by Category] ペインで [Kinesis Metrics] を選択します。
5.
該当する行をクリックし、指定した [MetricName] と [StreamName] の統計を表示します。
6.
注: ほとんどのコンソール統計の名前は、[Read Throughput] と [Write Throughput] を除いて、
上記の対応する CloudWatch メトリックス名に一致します。次の統計は 5 分間隔で計算されま
す。[Write Throughput] は IncomingBytes CloudWatch メトリックスをモニタリングし、[Read
Throughput] は GetRecords.Bytes をモニタリングします。
(オプション)グラフペインで、統計と期間を選択し、これらの設定を使用して CloudWatch ア
ラームを作成します。
AWS CLI を使用してメトリックスにアクセスするには
list-metrics コマンドと get-metric-statistics コマンドを使用します。
CloudWatch CLI を使用してメトリックスにアクセスするには
mon-list-metrics コマンドと mon-get-stats コマンドを使用します。
113
Amazon Kinesis Streams 開発者ガイド
CloudWatch によるエージェントのモニタリング
CloudWatch API を使用してメトリックスにアクセスするには
ListMetrics と GetMetricStatistics 操作を使用してください。
Amazon CloudWatch で Streams エージェントの状
態をモニタリングする
エージェントは、[AWSKinesisAgent] の名前空間でカスタム CloudWatch メトリックスを発行して、
エージェントがデータを指定されたとおりに Streams にデータを送信しており、状態が正常でデータ
プロデューサーで適切な量の CPU リソースとメモリリソースを消費している場合の評価を容易にし
ます。送信されたレコード数やバイト数などのメトリックスは、エージェントがストリームにデータ
を送信する速度を知るのに便利です。これらのメトリックスが、ある程度の割合低下するかゼロにな
ることで期待されるしきい値を下回っている場合は、設定の問題、ネットワークエラー、エージェン
トの状態の問題を示している場合があります。オンホスト CPU やメモリなどの消費量とエージェン
トエラーカウンターなどのメトリックスは、プロデューサーのリソース使用率を示し、潜在的な構成
またはホストのエラーに対する洞察を提供します。最後に、エージェントの問題を調査するのに役立
つサービス例外を記録します。これらのメトリックスは、エージェント設定 cloudwatch.endpoint
で指定されたリージョンで報告されます。エージェント設定の詳細については、「エージェントの設
定 (p. 57)」を参照してください。
CloudWatch によるモニタリング
Streams エージェントは以下のメトリックスを CloudWatch に送信します。
メトリックス
説明
BytesSent
指定された期間に Streams に送信されたバイト数。
単位: バイト
RecordSendAttempts 指定した期間内の PutRecords 呼び出しのレコード数(初回または再試
行の)。
単位: Count
RecordSendErrors
指定した期間内の、PutRecords への呼び出しの失敗ステータス(再試行
など)のレコード数。
単位: Count
ServiceErrors
指定した期間内の、サービスエラー(スロットリングエラーを除く)と
なった PutRecords への呼び出し数。
単位: Count
AWS CloudTrail を使用した Amazon Kinesis
Streams API 呼び出しのログ記録
Amazon Kinesis Streams は AWS CloudTrail と統合されます。CloudTrail は Streams による直接的
または間接的な API 呼び出しをキャプチャし、指定した Amazon S3 バケットにログファイルを渡し
ます。API 呼び出しは、Streams コンソールを使用して間接的に行うか、Streams API を使用して直
接的に行うことができます。CloudTrail によって収集された情報を使用して、Streams に対してどの
ようなリクエストが行われたか(リクエストの実行元 IP アドレス、実行者、実行日時など)を判断
できます。CloudTrail の詳細(設定して有効にする方法など)については、『AWS CloudTrail User
Guide』を参照してください。
114
Amazon Kinesis Streams 開発者ガイド
CloudTrail を使用した API 呼び出しのログ記録
Streams および CloudTrail
CloudTrail のログ記録を有効にすると、Streams のアクションに対する呼び出しがログファイルに記
録されます。Streams のレコードは、CloudTrail のログ記録で有効な他の AWS サービスのレコード
とともにログファイルに書き込まれます。CloudTrail は、指定された期間とファイルサイズに基づい
て、新しいファイルをいつ作成して書き込むかを決定します。
以下のアクションがサポートされています。
• CreateStream
• DeleteStream
• DescribeStream
• ListStreams
• MergeShards
• SplitShard
各ログエントリには、リクエストの生成元に関する情報が含まれます。たとえば、ストリームを作成
するリクエスト(CreateStream)が行われた場合は、そのリクエストを行ったユーザーのユーザー ID
またはサービスがログに記録されます。ユーザー ID 情報は、リクエストが、ルートまたは IAM ユー
ザーの認証情報を使用して送信されたか、ロールまたはフェデレーションユーザーの一時的なセキュ
リティ認証情報を使用して送信されたか、あるいは別の AWS サービスによって送信されたかを確認
するのに役立ちます。詳細については、『AWS CloudTrail User Guide』の「userIdentity 要素」を参
照してください。
必要な場合はログファイルを自身のバケットに保存できますが、ログファイルを自動的にアーカイブ
または削除するように Amazon S3 ライフサイクルルールを定義することもできます。デフォルトで
は Amazon S3 のサーバー側の暗号化(SSE)を使用して、ログファイルが暗号化されます。
また、複数の AWS リージョンと複数の AWS アカウントからの Streams ログファイルを 1 つの
Amazon S3 バケットに集約することもできます。詳細については、『AWS CloudTrail User Guide』
の「CloudTrail ログファイルの単一の Amazon S3 バケットへの集約」を参照してください。
ログファイルの配信時にすぐにアクションを実行する必要がある場合、新しいログファイルの配信
時に CloudTrail により SNS 通知が発行されるようにできます。詳細については、『AWS CloudTrail
User Guide』の「Amazon SNS 通知の設定」を参照してください。
Streams ログファイルエントリ
CloudTrail ログファイルには、複数の JSON 形式イベントで構成される 1 つ以上のログエントリが
記録されます。ログエントリは任意の送信元からの単一のリクエストを表し、リクエストされたアク
ション、パラメーター、アクションの日時などに関する情報を含みます。ログエントリは、特定の順
序になるように生成されるわけではありません。つまり、API 呼び出しの順序付けられたスタックト
レースではありません。
次の例は、CloudTrail のログエントリを示しています。
{
"Records": [
{
"eventVersion": "1.01",
"userIdentity": {
"type": "IAMUser",
"principalId": "EX_PRINCIPAL_ID",
"arn": "arn:aws:iam::012345678910:user/Alice",
"accountId": "012345678910",
"accessKeyId": "EXAMPLE_KEY_ID",
"userName": "Alice"
115
Amazon Kinesis Streams 開発者ガイド
CloudTrail を使用した API 呼び出しのログ記録
},
"eventTime": "2014-04-19T00:16:31Z",
"eventSource": "kinesis.amazonaws.com",
"eventName": "CreateStream",
"awsRegion": "us-east-1",
"sourceIPAddress": "127.0.0.1",
"userAgent": "aws-sdk-java/unknown-version Linux/x.xx",
"requestParameters": {
"shardCount": 1,
"streamName": "GoodStream"
},
"responseElements": null,
"requestID": "db6c59f8-c757-11e3-bc3b-57923b443c1c",
"eventID": "b7acfcd0-6ca9-4ee1-a3d7-c4e8d420d99b"
},
{
"eventVersion": "1.01",
"userIdentity": {
"type": "IAMUser",
"principalId": "EX_PRINCIPAL_ID",
"arn": "arn:aws:iam::012345678910:user/Alice",
"accountId": "012345678910",
"accessKeyId": "EXAMPLE_KEY_ID",
"userName": "Alice"
},
"eventTime": "2014-04-19T00:17:06Z",
"eventSource": "kinesis.amazonaws.com",
"eventName": "DescribeStream",
"awsRegion": "us-east-1",
"sourceIPAddress": "127.0.0.1",
"userAgent": "aws-sdk-java/unknown-version Linux/x.xx",
"requestParameters": {
"streamName": "GoodStream"
},
"responseElements": null,
"requestID": "f0944d86-c757-11e3-b4ae-25654b1d3136",
"eventID": "0b2f1396-88af-4561-b16f-398f8eaea596"
},
{
"eventVersion": "1.01",
"userIdentity": {
"type": "IAMUser",
"principalId": "EX_PRINCIPAL_ID",
"arn": "arn:aws:iam::012345678910:user/Alice",
"accountId": "012345678910",
"accessKeyId": "EXAMPLE_KEY_ID",
"userName": "Alice"
},
"eventTime": "2014-04-19T00:15:02Z",
"eventSource": "kinesis.amazonaws.com",
"eventName": "ListStreams",
"awsRegion": "us-east-1",
"sourceIPAddress": "127.0.0.1",
"userAgent": "aws-sdk-java/unknown-version Linux/x.xx",
"requestParameters": {
"limit": 10
},
"responseElements": null,
"requestID": "a68541ca-c757-11e3-901b-cbcfe5b3677a",
116
Amazon Kinesis Streams 開発者ガイド
CloudTrail を使用した API 呼び出しのログ記録
"eventID": "22a5fb8f-4e61-4bee-a8ad-3b72046b4c4d"
},
{
"eventVersion": "1.01",
"userIdentity": {
"type": "IAMUser",
"principalId": "EX_PRINCIPAL_ID",
"arn": "arn:aws:iam::012345678910:user/Alice",
"accountId": "012345678910",
"accessKeyId": "EXAMPLE_KEY_ID",
"userName": "Alice"
},
"eventTime": "2014-04-19T00:17:07Z",
"eventSource": "kinesis.amazonaws.com",
"eventName": "DeleteStream",
"awsRegion": "us-east-1",
"sourceIPAddress": "127.0.0.1",
"userAgent": "aws-sdk-java/unknown-version Linux/x.xx",
"requestParameters": {
"streamName": "GoodStream"
},
"responseElements": null,
"requestID": "f10cd97c-c757-11e3-901b-cbcfe5b3677a",
"eventID": "607e7217-311a-4a08-a904-ec02944596dd"
},
{
"eventVersion": "1.01",
"userIdentity": {
"type": "IAMUser",
"principalId": "EX_PRINCIPAL_ID",
"arn": "arn:aws:iam::012345678910:user/Alice",
"accountId": "012345678910",
"accessKeyId": "EXAMPLE_KEY_ID",
"userName": "Alice"
},
"eventTime": "2014-04-19T00:15:03Z",
"eventSource": "kinesis.amazonaws.com",
"eventName": "SplitShard",
"awsRegion": "us-east-1",
"sourceIPAddress": "127.0.0.1",
"userAgent": "aws-sdk-java/unknown-version Linux/x.xx",
"requestParameters": {
"shardToSplit": "shardId-000000000000",
"streamName": "GoodStream",
"newStartingHashKey": "11111111"
},
"responseElements": null,
"requestID": "a6e6e9cd-c757-11e3-901b-cbcfe5b3677a",
"eventID": "dcd2126f-c8d2-4186-b32a-192dd48d7e33"
},
{
"eventVersion": "1.01",
"userIdentity": {
"type": "IAMUser",
"principalId": "EX_PRINCIPAL_ID",
"arn": "arn:aws:iam::012345678910:user/Alice",
"accountId": "012345678910",
"accessKeyId": "EXAMPLE_KEY_ID",
"userName": "Alice"
117
Amazon Kinesis Streams 開発者ガイド
CloudWatch による KCL のモニタリング
},
"eventTime": "2014-04-19T00:16:56Z",
"eventSource": "kinesis.amazonaws.com",
"eventName": "MergeShards",
"awsRegion": "us-east-1",
"sourceIPAddress": "127.0.0.1",
"userAgent": "aws-sdk-java/unknown-version Linux/x.xx",
"requestParameters": {
"streamName": "GoodStream",
"adjacentShardToMerge": "shardId-000000000002",
"shardToMerge": "shardId-000000000001"
},
"responseElements": null,
"requestID": "e9f9c8eb-c757-11e3-bf1d-6948db3cd570",
"eventID": "77cf0d06-ce90-42da-9576-71986fec411f"
}
]
}
Amazon CloudWatch による Amazon Kinesis クラ
イアントライブラリのモニタリング
Amazon Kinesis Client Library (KCL) for Amazon Kinesis Streams は、ユーザーに代わって、名前空間
として KCL アプリケーションの名前を使用して、カスタム Amazon CloudWatch メトリックスを発
行します。CloudWatch コンソール に移動し、[Custom Metrics] を選択すると、これらのメトリック
スを表示できます。カスタムメトリックスの詳細については、『Amazon CloudWatch ユーザーガイ
ド』の「カスタムメトリックスをパブリッシュする」を参照してください。
KCL によって CloudWatch にアップロードされたメトリックスには、小額の課金が発生します。具体
的には、Amazon CloudWatch カスタムメトリックスと Amazon CloudWatch API リクエストの料金が
適用されます。詳細については、「Amazon CloudWatch 料金表」を参照してください。
トピック
• メトリックスと名前空間 (p. 118)
• メトリックスレベルとディメンション (p. 118)
• メトリックスの設定 (p. 119)
• メトリックスの一覧 (p. 119)
メトリックスと名前空間
メトリックスのアップロードに使用される名前空間は、KCL の起動時に指定されたアプリケーション
名になります。
メトリックスレベルとディメンション
CloudWatch にアップロードされるメトリックスを制御する 2 つのオプションがあります。
メトリックスレベル
すべてのメトリックスに、個別のレベルが割り当てられます。メトリックスのレポートレベルを
設定すると、レポートレベル以下の個別のレベルのメトリックスは CloudWatch に送信されませ
ん。このレベルとして、NONE、SUMMARY、DETAILED があります。デフォルト設定は DETAILED
であり、すべてのメトリックスが CloudWatch に送信されます。レポートレベル NONE は、メト
リックスがまったく送信されないことを意味します。各メトリックスに割り当てられるメトリッ
クスの詳細については、「メトリックスの一覧 (p. 119)」を参照してください。
118
Amazon Kinesis Streams 開発者ガイド
CloudWatch による KCL のモニタリング
有効なディメンション
各 KCL メトリックスには、CloudWatch にも送信される関連ディメンションがありま
す。Operation ディメンションは常にアップロードされ、無効にすることはできません。デフォ
ルトでは、WorkerIdentifier ディメンションは無効となり、Operation および ShardID
ディメンションのみがアップロードされます。
CloudWatch メトリックスディメンションの詳細については、『Amazon CloudWatch ユーザー
ガイド』の「CloudWatch の概念」トピックの「ディメンション」セクションを参照してくださ
い。
WorkerIdentifier ディメンションが有効で、特定の KCL ワーカーが再起動するたびに、ワー
カー ID プロパティに異なる値が使用される場合、新しい WorkerIdentifier ディメンション値
を持つ新しいメトリックスのセットが CloudWatch に送信されます。特定の KCL ワーカーの再起
動で、WorkerIdentifier ディメンションの値が同じである必要がある場合、各ワーカーに初期
化中に、明示的に同じワーカー ID 値を指定する必要があります。アクティブな各 KCL ワーカー
のワーカー ID 値は、すべての KCL ワーカー間で一意である必要があります。
メトリックスの設定
メトリックスレベルと有効なディメンションは、KinesisClientLibConfiguration インスタンスを使用
して設定でき、このインスタンスは KCL アプリケーションを起動するときにワーカーに渡されま
す。MultiLangDaemon の場合、metricsLevel および metricsEnabledDimensions プロパティ
は、MultiLangDaemon KCL アプリケーションを起動するために使用される .properties ファイルで指
定できます。
メトリックスレベルには、NONE、SUMMARY、または DETAILED の 3 つの値のうち 1 つを割り当
てることができます。有効なディメンションの値は、CloudWatch メトリックスで許可されている
ディメンションのリストを含むカンマ区切りの文字列である必要があります。KCL アプリケーション
によって使用されるディメンションは、Operation、ShardID、および WorkerIdentifier です。
メトリックスの一覧
次の表には、範囲および操作によってグループ分けされた KCL メトリックスが表示されています。
トピック
• KCL アプリケーションあたりのメトリックス (p. 119)
• ワーカーあたりのメトリックス (p. 122)
• シャードあたりのメトリックス (p. 124)
KCL アプリケーションあたりのメトリックス
これらのメトリックスは、Amazon CloudWatch 名前空間で定義されているように、アプリケーショ
ンの範囲内にあるすべての KCL ワーカーで集約されます。
トピック
•
•
•
•
InitializeTask (p. 119)
ShutdownTask (p. 120)
ShardSyncTask (p. 121)
BlockOnParentTask (p. 122)
InitializeTask
InitializeTask オペレーションは、KCL アプリケーションのレコードプロセッサを初期化しま
す。このオペレーションのロジックには、Streams からのシャードイテレーターの取得とレコードプ
ロセッサの初期化が含まれています。
119
Amazon Kinesis Streams 開発者ガイド
CloudWatch による KCL のモニタリング
メトリックス:
メトリックス名
説明
KinesisDataFetcher.getIterator.Success
KCL アプリケーションあたりの GetShardIterator オペレーションの成
功回数。
メトリックスレベル: Detailed
単位: Count
KinesisDataFetcher.getIterator.Time
指定された KCL アプリケーションの GetShardIterator オペレーショ
ンにかかった時間。
メトリックスレベル: Detailed
単位: ミリ秒
RecordProcessor.initialize.Time
レコードプロセッサの初期化メソッドにかかった時間。
メトリックスレベル: Summary
単位: ミリ秒
成功
レコードプロセッサの初期化の成功回数。
メトリックスレベル: Summary
単位: Count
時間
KCL ワーカーでレコードプロセッサの初期化にかかった時間。
メトリックスレベル: Summary
単位: ミリ秒
ShutdownTask
ShutdownTask オペレーションは、シャード処理のシャットダウンシーケンスを開始します。これ
は、シャードが分割または結合された場合やシャードリースがワーカーから失われた場合に発生する
場合があります。どちらの場合も、レコードプロセッサ shutdown() 関数が呼び出されます。また、
シャードが分割または結合された場合、新しいシャードが 1 つまたは 2 つ作成されるため、新しい
シャードが検出されます。
メトリックス:
メトリックス名
説明
CreateLease.Success
親シャードのシャットダウンの後に、新しい子シャードが KCL アプリ
ケーションの DynamoDB テーブルに正常に追加された回数。
メトリックスレベル: Detailed
単位: Count
CreateLease.Time
KCL アプリケーションの DynamoDB テーブルに新しい子シャード情報を
追加するのにかかった時間。
メトリックスレベル: Detailed
単位: ミリ秒
120
Amazon Kinesis Streams 開発者ガイド
CloudWatch による KCL のモニタリング
UpdateLease.Success
レコードプロセッサのシャットダウン中に成功した最終チェックポイント
の数。
メトリックスレベル: Detailed
単位: Count
UpdateLease.Time
レコードプロセッサのシャットダウン中にチェックポイントオペレーショ
ンにかかった時間。
メトリックスレベル: Detailed
単位: ミリ秒
RecordProcessor.shutdown.Time
レコードプロセッサのシャットダウンメソッドにかかった時間。
メトリックスレベル: Summary
単位: ミリ秒
成功
シャットダウンタスクの成功回数。
メトリックスレベル: Summary
単位: Count
時間
KCL ワーカーでシャットダウンタスクにかかった時間。
メトリックスレベル: Summary
単位: ミリ秒
ShardSyncTask
ShardSyncTask オペレーションは、Amazon Kinesis stream のシャード情報に対する変更を検出す
るため、新しいシャードは KCL アプリケーションで処理することができます。
メトリックス:
メトリックス名
説明
CreateLease.Success
KCL アプリケーションの DynamoDB テーブルへの新しいシャード情報の
追加が成功した回数。
メトリックスレベル: Detailed
単位: Count
CreateLease.Time
KCL アプリケーションの DynamoDB テーブルに新しいシャード情報を追
加するのにかかった時間。
メトリックスレベル: Detailed
単位: ミリ秒
成功
シャード同期オペレーションの成功回数。
メトリックスレベル: Summary
単位: Count
121
Amazon Kinesis Streams 開発者ガイド
CloudWatch による KCL のモニタリング
時間
シャード同期オペレーションにかかった時間。
メトリックスレベル: Summary
単位: ミリ秒
BlockOnParentTask
シャードが分割または他のシャードと結合された場合、新しい子シャードが作成されま
す。BlockOnParentTask オペレーションは、KCL による親シャードの処理が完了するまで、新しい
シャードのレコード処理を開始しないことを保証します。
メトリックス:
メトリックス名
説明
成功
親シャードの完了チェックの成功回数。
メトリックスレベル: Summary
単位: Count
時間
親シャードが完了するまでにかかった時間。
メトリックスレベル: Summary
単位: ミリ秒
ワーカーあたりのメトリックス
これらのメトリックスは、Amazon EC2 インスタンスのように Amazon Kinesis stream のデータを消
費するすべてのレコードプロセッサについて集約されます。
トピック
• RenewAllLeases (p. 122)
• TakeLeases (p. 123)
RenewAllLeases
RenewAllLeases オペレーションは、特定のワーカーインスタンスによって所有されるシャードリー
スを定期的に更新します。
メトリックス:
メトリックス名
説明
RenewLease.Success
ワーカーによるリース更新の成功回数。
メトリックスレベル: Detailed
単位: Count
RenewLease.Time
リース更新オペレーションにかかった時間。
メトリックスレベル: Detailed
単位: ミリ秒
122
Amazon Kinesis Streams 開発者ガイド
CloudWatch による KCL のモニタリング
CurrentLeases
すべてのリースの更新後にワーカーによって所有されているシャードリー
スの数。
メトリックスレベル: Summary
単位: Count
LostLeases
ワーカーによって所有されているすべてのリースの更新を試みたときに失
われたシャードリースの数。
メトリックスレベル: Summary
単位: Count
成功
ワーカーのリース更新オペレーションが成功した回数。
メトリックスレベル: Summary
単位: Count
時間
ワーカーのすべてのリースを更新するのにかかった時間。
メトリックスレベル: Summary
単位: ミリ秒
TakeLeases
TakeLeases オペレーションは、すべての KCL ワーカー間でレコード処理の負荷を分散させます。現
在の KCL ワーカーのシャードリースが、必要数を下回る場合、過負荷になっている他のワーカーから
シャードリースを取得します。
メトリックス:
メトリックス名
説明
ListLeases.Success
すべてのシャードリースが KCL アプリケーションの DynamoDB テーブル
から正常に取得された回数。
メトリックスレベル: Detailed
単位: Count
ListLeases.Time
KCL アプリケーションの DynamoDB テーブルからすべてのシャードリー
スを取得するのにかかった時間。
メトリックスレベル: Detailed
単位: ミリ秒
TakeLease.Success
ワーカーが他の KCL ワーカーからシャードリースを正常に取得した回
数。
メトリックスレベル: Detailed
単位: Count
TakeLease.Time
ワーカーが取得したリースを使用してリーステーブルを更新するのにか
かった時間。
メトリックスレベル: Detailed
123
Amazon Kinesis Streams 開発者ガイド
CloudWatch による KCL のモニタリング
単位: ミリ秒
NumWorkers
特定のワーカーにより識別されるワーカーの総数。
メトリックスレベル: Summary
単位: Count
NeededLeases
現在のワーカーがシャード処理の負荷を分散するのに必要なシャードリー
スの数。
メトリックスレベル: Detailed
単位: Count
LeasesToTake
ワーカーが取得を試みるリースの数。
メトリックスレベル: Detailed
単位: Count
TakenLeases
ワーカーが取得に成功したリースの数。
メトリックスレベル: Summary
単位: Count
TotalLeases
KCL アプリケーションが処理しているシャードの総数。
メトリックスレベル: Detailed
単位: Count
ExpiredLeases
特定のワーカーによって識別されるどのワーカーでも処理されていない
シャードの総数。
メトリックスレベル: Summary
単位: Count
成功
TakeLeases オペレーションが正常に完了した回数。
メトリックスレベル: Summary
単位: Count
時間
ワーカーの TakeLeases オペレーションにかかった時間。
メトリックスレベル: Summary
単位: ミリ秒
シャードあたりのメトリックス
これらのメトリックスは、単一のレコードプロセッサについて集約されます。
ProcessTask
ProcessTask オペレーションは、現在のイテレーター位置を使用して GetRecords を呼び出すこと
によりストリームからレコードを取得し、レコードプロセッサの processRecords 関数を起動しま
す。
124
Amazon Kinesis Streams 開発者ガイド
CloudWatch による KCL のモニタリング
メトリックス:
メトリックス名
説明
KinesisDataFetcher.getRecords.Success
Amazon Kinesis stream シャードあたりの GetRecords オペレーションの
成功回数。
メトリックスレベル: Detailed
単位: Count
KinesisDataFetcher.getRecords.Time
Amazon Kinesis stream シャードの GetRecords オペレーションにかかっ
た時間。
メトリックスレベル: Detailed
単位: ミリ秒
UpdateLease.Success
指定されたシャードのレコードプロセッサによってチェックポイントが正
常に作成された回数。
メトリックスレベル: Detailed
単位: Count
UpdateLease.Time
指定されたシャードの各チェックポイントオペレーションにかかった時
間。
メトリックスレベル: Detailed
単位: ミリ秒
DataBytesProcessed
ProcessTask の各呼び出しで処理されたレコードのバイト単位の合計サ
イズ。
メトリックスレベル: Summary
単位: バイト
RecordsProcessed
ProcessTask の各呼び出しで処理されたレコード数。
メトリックスレベル: Summary
単位: Count
ExpiredIterator
GetRecords を呼び出したときに受信した ExpiredIteratorException の
数。
メトリックスレベル: Summary
単位: Count
MillisBehindLatest
現在のイテレーターがシャード内の最新のレコード (先端) から遅れてい
る時間。この値は、応答の最新レコードと現在時間における時間差と同じ
かそれ以下です。これは、最新の応答レコードのタイムスタンプを比較す
るよりも、シャードが先端からどれくらい離れているかを示すより正確な
反映です。この値は、各レコードの全タイムスタンプの平均ではなく、レ
コードの最新バッチに適用されることに留意してください。
メトリックスレベル: Summary
単位: ミリ秒
125
Amazon Kinesis Streams 開発者ガイド
CloudWatch による KPL のモニタリング
RecordProcessor.processRecords.Time
レコードプロセッサの processRecords メソッドにかかった時間。
メトリックスレベル: Summary
単位: ミリ秒
成功
プロセスタスクオペレーションの成功回数。
メトリックスレベル: Summary
単位: Count
時間
プロセスタスクオペレーションにかかった時間。
メトリックスレベル: Summary
単位: ミリ秒
Amazon CloudWatch による Amazon Kinesis プロ
デューサーライブラリのモニタリング
Amazon Kinesis プロデューサライブラリ (KPL) for Amazon Kinesis Streams は、ユーザーに代わっ
てカスタム Amazon CloudWatch メトリックスを発行します。CloudWatch コンソール に移動し、
[Custom Metrics] を選択すると、これらのメトリックスを表示できます。カスタムメトリックスの詳
細については、『Amazon CloudWatch ユーザーガイド』の「カスタムメトリックスをパブリッシュ
する」を参照してください。
KPL によって CloudWatch にアップロードされたメトリックスには、小額の課金が発生します。具体
的には、Amazon CloudWatch カスタムメトリックスと Amazon CloudWatch API リクエストの料金が
適用されます。詳細については、「Amazon CloudWatch 料金表」を参照してください。ローカルメ
トリックスの収集では、CloudWatch の課金が発生しません。
トピック
• メトリックス、ディメンション、および名前空間 (p. 126)
• メトリックスレベルと詳細度 (p. 126)
• ローカルアクセスと Amazon CloudWatch へのアップロード (p. 127)
• メトリックスの一覧 (p. 128)
メトリックス、ディメンション、および名前空間
KPL の起動時にアプリケーション名を指定できます。これは、メトリックスをアップロードする際、
名前空間の一部として使用されます。これはオプションであり、アプリケーション名を設定しない場
合は、KPL によりデフォルト値が設定されます。
また、メトリックスに任意の追加ディメンションを追加するように KPL を設定できます。これは、よ
り詳細なデータが CloudWatch メトリックスに必要な場合に便利です。たとえば、ディメンションと
してホスト名を追加でき、これによりフリート全体の均一でない負荷分散を特定できます。すべての
KPL 設定は変更不可能なため、KPL インスタンスを初期化した後、これらの追加ディメンションは変
更できません。
メトリックスレベルと詳細度
CloudWatch にアップロードされるメトリックスの数を制御する 2 つのオプションがあります。
126
Amazon Kinesis Streams 開発者ガイド
CloudWatch による KPL のモニタリング
メトリックスレベル
これは、メトリックスの重要性を示すおおよその目安です。すべてのメトリックスにレベルが割
り当てられます。レベルを設定すると、それより下のレベルのメトリックスは、CloudWatch に
送信されません。このレベルとして、NONE、SUMMARY、DETAILED があります。デフォルト設定
は DETAILED であり、すべてのメトリックスが対象です。NONE はメトリックスが一切ないこと
を意味し、実際にはどのメトリックスもそのレベルに割り当てられません。
詳細度
これは、追加の詳細度レベルで同じメトリックスが出力されるかどうかを制御します。このレベ
ルとして、GLOBAL、STREAM、SHARD があります。デフォルト設定は SHARD で、最も詳細なメ
トリックスが含まれます。
SHARD が選択されると、ストリーム名とシャード ID をディメンションとしてメトリックスが出
力されます。また、同じメトリックスは、ストリーム名のディメンションのみを使用して出力さ
れるため、そのメトリックスにはストリーム名がありません。つまり、ある特定のメトリックス
について、それぞれに 2 つのシャードがある 2 つのストリームから、7 つの CloudWatch メト
リックスが生成されます。各シャードに 1 つ、各ストリームに 1 つ、全体に 1 つのメトリックス
が生成され、これらはどれも同じ統計情報を記述していますが、詳細度のレベルは異なります。
次の図は、これを説明するものです。
異なる詳細度から階層が形成され、システム内のすべてのメトリックスから、メトリックス名を
ルートとするツリーが構成されます。
MetricName (GLOBAL):
Metric X
Metric Y
|
|
---------------------------|
|
|
|
StreamName (STREAM):
Stream A
Stream B
Stream A
Stream B
|
|
---------------|
|
|
|
ShardID (SHARD):
Shard 0 Shard 1 Shard 0 Shard 1
すべてのメトリックスをシャードレベルで使用できるわけではありません。一部のメトリックス
はストリームレベルまたは本質的にグローバルです。これらは、シャードレベルのメトリックス
を有効にしても、シャードレベルで生成されません(上の図の Metric Y)。
追加のディメンションを指定すると、tuple:<DimensionName, DimensionValue,
Granularity> に値を指定する必要があります。詳細度は、カスタムディメンションが階層のど
こに挿入されたかを判断するのに使用されます。GLOBAL は、追加のディメンションがメトリッ
クス名の後に挿入されたことを意味し、STREAM はストリーム名の後に、SHARD は ID シャードの
後に挿入されたことをそれぞれ意味します。複数の追加ディメンションが詳細度レベルごとに指
定された場合、それらは指定された順序で挿入されます。
ローカルアクセスと Amazon CloudWatch へのアップロード
現在の KPL インスタンスのメトリックスはローカルでリアルタイムに使用できるため、いつでも KPL
でクエリを実行してそれらを取得できます。KPL では、CloudWatch の場合と同様に、すべてのメト
リックスの合計、平均、最小値、最大値、および個数をローカルで計算します。
プログラムの開始から現在の時点までの累積として、または過去 N 秒間(N は 1 から 60 までの整
数)のローリングウィンドウを使用して統計情報を取得できます。
すべてのメトリックスは、CloudWatch へのアップロードに使用することができます。これは、複数
のホスト、モニタリング、およびアラームの間でデータを集約するのに特に役立ちます。この機能
は、ローカルでは使用できません。
127
Amazon Kinesis Streams 開発者ガイド
CloudWatch による KPL のモニタリング
前に説明したように、メトリックスレベルと詳細度の設定を使用してどのメトリックスをアップロー
ドするかを選択できます。ローカルでメトリックスをアップロードしたり使用したりすることはでき
ません。
データポイントを個別にアップロードするのは、高トラフィックの場合、毎秒数百万のアップロード
が発生するためお勧めしません。そのため、KPL は、メトリックスをローカルで 1 分間のバケットに
集約し、有効なメトリックスごとに 1 分あたり 1 回ずつ統計情報オブジェクトを CloudWatch にアッ
プロードします。
メトリックスの一覧
メトリックス
説明
User Records
Received
入力オペレーションで KPL コアにより受信された論理ユーザーレコード
の数。シャードレベルでは使用できません。
メトリックスレベル: Detailed
単位: 個
User Records
Pending
現在保留状態にあるユーザーレコード数の定期的なサンプリング。レコー
ドが現在バッファ処理されていて送信待ちの場合、または、送信済みで
バックエンドサービスで処理中の場合、そのレコードは保留状態です。
シャードレベルでは使用できません。
KPL が提供する専用のメソッドを使用して、グローバルレベルでこのメト
リックスを取得することで、お客様は PUT レートを管理できます。
メトリックスレベル: Detailed
単位: 個
User Records Put
入力に成功した論理ユーザーレコードの数。
このメトリックスの場合、KPL では、失敗したレコードがカウントされま
せん。このため、平均が成功率に、個数が総試行回数に、個数と合計の差
が失敗件数にそれぞれ対応します。
メトリックスレベル: Summary
単位: 個
User Records Data
Put
入力に成功した論理ユーザーレコードのバイト数。
メトリックスレベル: Detailed
単位: バイト
Kinesis Records
Put
入力に成功した Streams レコードの数(各 Streams レコードは、複数の
ユーザーレコードを含むことができます)。
KPL は、失敗したレコードに対してゼロを出力します。このため、平均が
成功率に、個数が総試行回数に、個数と合計の差が失敗件数にそれぞれ対
応します。
メトリックスレベル: Summary
単位: 個
Kinesis Records
Data Put
Streams レコードのバイト数。
128
Amazon Kinesis Streams 開発者ガイド
CloudWatch による KPL のモニタリング
メトリックスレベル: Detailed
単位: バイト
Errors by Code
各種類のエラーコードの数。これにより、StreamName や ShardID など
の通常のディメンションに加え、ディメンション ErrorCode が追加され
ます。シャードに対して、すべてのエラーを追跡することはできません。
追跡できないエラーは、ストリームレベルまたはグローバルレベルでのみ
出力されます。このメトリックスは、スロットリング、シャードマッピン
グの変更、内部エラー、サービス使用不可、タイムアウトなどに関する情
報をとらえます。
Streams API のエラーは、Streams レコードごとに 1 回カウントされま
す。Streams レコード内の複数のユーザーレコードで複数回のカウントが
生じることはありません。
メトリックスレベル: Summary
単位: 個
All Errors
これは、同じエラーによって Errors by Code としてトリガーされますが、
エラーの種類は区別されません。異なる種類のすべてのエラーから件数の
合計を手計算する必要がなくなるため、これはエラー率の総合的なモニタ
リングに役立ちます。
メトリックスレベル: Summary
単位: 個
Retries per
Record
ユーザーレコードあたりの再試行の実行回数。1 回の試行でレコードが成
功した場合は、ゼロが出力されます。
ユーザーレコードが終了すると(成功した場合またはそれ以上再試行され
ない場合)、直ちにデータが出力されます。レコードの有効期限値が大き
いと、このメトリックスの出力が大幅に遅延する場合があります。
メトリックスレベル: Detailed
単位: 個
Buffering Time
ユーザーレコードが KPL に到着してからバックエンドに送信されるまで
の時間。この情報は、レコード単位でユーザーに返されますが、集約され
た統計情報としても使用できます。
メトリックスレベル: Summary
単位: ミリ秒
Request Time
PutRecordsRequests の実行にかかる時間。
メトリックスレベル: Detailed
単位: ミリ秒
User Records per
Kinesis Record
単一の Streams レコードに集約された論理ユーザーレコードの数。
メトリックスレベル: Detailed
単位: 個
129
Amazon Kinesis Streams 開発者ガイド
ストリームのタグ付け
Amazon Kinesis
Records per
PutRecordsRequest
単一の PutRecordsRequest に集約された Streams レコードの数。
シャードレベルでは使用できません。
メトリックスレベル: Detailed
単位: 個
User Records per
PutRecordsRequest
PutRecordsRequest に含まれているユーザーレコードの総数。これは、
前の 2 つのメトリックスの積にほぼ一致します。シャードレベルでは使用
できません。
メトリックスレベル: Detailed
単位: 個
Amazon Kinesis Streams でのストリームのタグ
付け
Amazon Kinesis Streams で作成したストリームに、独自のメタデータをタグ形式で割り当てることが
できます。タグは、ストリームに対して定義するキーと値のペアです。タグの使用は、AWS リソース
の管理やデータ(請求データなど)の整理を行うシンプルかつ強力な方法です。
目次
• タグの基本 (p. 130)
• タグ付けを使用したコストの追跡 (p. 131)
• タグの制限 (p. 131)
• Streams コンソールを使用したストリームのタグ付け (p. 131)
• AWS CLI を使用したストリームのタグ付け (p. 132)
• Streams API を使用したストリームのタグ付け (p. 132)
タグの基本
Streams コンソール、AWS CLI、または Streams API を使用して、次のタスクを実行します。
• ストリームにタグを追加する
• ストリームのタグを一覧表示する
• ストリームからタグを削除する
タグを使用すると、ストリームを分類できます。たとえば、目的、所有者、環境などに基づいてスト
リームを分類できます。タグごとにキーと値を定義するため、特定のニーズを満たすためのカテゴリ
のカスタムセットを作成できます。たとえば、所有者と、関連するアプリケーションに基づいてスト
リームを追跡するのに役立つタグのセットを定義できます。次にいくつかのタグの例を示します。
• プロジェクト: プロジェクト名
• 所有者: 名前
• 目的: 負荷テスト
• アプリケーション: アプリケーション名
• 環境: 本稼働
130
Amazon Kinesis Streams 開発者ガイド
タグ付けを使用したコストの追跡
タグ付けを使用したコストの追跡
タグを使用して、AWS コストを分類して追跡できます。AWS リソース(ストリームなど)にタグを
適用すると、AWS のコスト配分レポートに、タグ別に集計された使用状況とコストが表示されます。
自社のカテゴリ(例えばコストセンター、アプリケーション名、所有者)を表すタグを適用すると、
複数のサービスにわたってコストを分類することができます。詳細については、『AWS Billing and
Cost Management ユーザーガイド』の「コスト配分タグを使用したカスタム請求レポート」を参照し
てください。
タグの制限
タグには次の制限があります。
基本制限
• リソース(ストリーム)あたりのタグの最大数は 10 です。
• タグのキーと値は大文字と小文字が区別されます。
• 削除されたストリームのタグを変更または編集することはできません。
タグキーの制限
• 各タグキーは一意である必要があります。既に使用されているキーを含むタグを追加すると、新し
いタグで、既存のキーと値のペアが上書きされます。
• aws: は AWS が使用するように予約されているため、このプレフィックスを含むタグキーで開始す
ることはできません。AWS ではユーザーの代わりにこのプレフィックスで始まるタグを作成します
が、ユーザーはこれらのタグを編集または削除することはできません。
• タグキーの長さは 1~128 文字(Unicode)にする必要があります。
• タグキーは、次の文字で構成する必要があります。Unicode 文字、数字、空白、特殊文字(_ . /
= + - @)。
タグ値の制限
• タグ値の長さは 0~255 文字(Unicode)にする必要があります。
• タグ値は空白にすることができます。空白にしない場合は、次の文字で構成する必要がありま
す。Unicode 文字、数字、空白、特殊文字(_ . / = + - @)。
Streams コンソールを使用したストリームのタグ付
け
Streams コンソールを使用してタグの追加、一覧表示、および削除を行うことができます。
ストリームのタグを表示するには
1.
Streams コンソールを開きます。ナビゲーションバーで、リージョンセレクターを展開し、リー
ジョンを選択します。
2.
[Stream List] ページで、ストリームを選択します。
3.
[Stream Details] ページで、[Tags] タブをクリックします。
131
Amazon Kinesis Streams 開発者ガイド
AWS CLI を使用したストリームのタグ付け
ストリームにタグを追加するには
1.
Streams コンソールを開きます。ナビゲーションバーで、リージョンセレクターを展開し、リー
ジョンを選択します。
2.
[Stream List] ページで、ストリームを選択します。
3.
[Stream Details] ページで、[Tags] タブをクリックします。
4.
[Key] フィールドにタグキーを指定し、オプションとして [Value] フィールドにタグ値を指定した
後で、[Add Tag] をクリックします。
[Add Tag] ボタンが有効でない場合は、指定したタグキーまたはタグ値のいずれかがタグの制限を
満たしていません。詳細については、「タグの制限 (p. 131)」を参照してください。
5.
[Tags] タブのリストに新しいタグを表示するには、更新アイコンをクリックします。
ストリームからタグを削除するには
1.
Streams コンソールを開きます。ナビゲーションバーで、リージョンセレクターを展開し、リー
ジョンを選択します。
2.
[Stream List] ページで、ストリームを選択します。
3.
[Stream Details] ページで、[Tags] タブをクリックし、タグの [Remove] アイコンをクリックしま
す。
4.
[Delete Tag] ダイアログボックスで、[Yes, Delete] をクリックします。
AWS CLI を使用したストリームのタグ付け
AWS CLI を使用してタグの追加、一覧表示、および削除を行うことができます。例については、次の
ドキュメントを参照してください。
add-tags-to-stream
指定したストリームのタグを追加または更新します。
list-tags-for-stream
指定したストリームのタグを一覧表示します。
remove-tags-from-stream
指定したストリームからタグを削除します。
Streams API を使用したストリームのタグ付け
Streams API を使用してタグの追加、一覧表示、および削除を行うことができます。例については、
次のドキュメントを参照してください。
AddTagsToStream
指定したストリームのタグを追加または更新します。
ListTagsForStream
指定したストリームのタグを一覧表示します。
RemoveTagsFromStream
指定したストリームからタグを削除します。
132
Amazon Kinesis Streams 開発者ガイド
アクセスの制御
IAM により Amazon Kinesis Streams リソースへ
のアクセスを制御する
AWS Identity and Access Management (IAM)を使って以下を行えます。
• お客様の AWS アカウントでユーザーとグループを作成する
• お客様の AWS アカウントでユーザーごとに固有のセキュリティ認証情報を割り当てる
• AWS のリソースを使用してタスクを実行するために各ユーザーのアクセス許可を制御する
• 別の AWS アカウントのユーザーがお客様の AWS のリソースを共有できるようにする
• AWS アカウントにロールを作成し、それを行えるユーザーまたはサービスを定義する
• お客様の企業用の既存のアイデンティティを使用し、AWS のリソースを使用してタスクを実行する
ようにアクセス許可を与える
Streams と組み合わせて IAM を使用することにより、組織のユーザーが特定の Streams API アクショ
ンを使用してタスクを実行できるかどうか、また、特定の AWS リソースを使用できるかどうかを制
御できます。
Amazon Kinesis Client Library(KCL)ライブラリを使用してアプリケーションを開発する場合、ポリ
シーに Amazon DynamoDB と Amazon CloudWatch へのアクセス許可を含める必要があります。これ
は、KCL がアプリケーションの状態情報を追跡するために DynamoDB を使用し、ユーザーに代わっ
て KCL メトリックスを CloudWatch に送信するために CloudWatch を使用するからです。KCL の詳
細については、「Amazon Kinesis Client Library を使用した Amazon Kinesis Streams コンシューマー
の開発 (p. 66)」を参照してください。
IAM の詳細については、以下を参照してください。
• Identity and Access Management (IAM)
• はじめに
• IAM ユーザーガイド
IAM および Amazon DynamoDB の詳細については、『Amazon DynamoDB 開発者ガイド』の「Using
IAM to Control Access to Amazon DynamoDB Resources」を参照してください。
IAM と Amazon CloudWatch の詳細については、『Amazon CloudWatch ユーザーガイド』の「AWS
アカウントへのユーザーアクセスのコントロール」を参照してください。
目次
• ポリシー構文 (p. 133)
• Streams のアクション (p. 134)
• Streams 用の Amazon リソースネーム(ARN) (p. 134)
• Streams のポリシー例 (p. 135)
ポリシー構文
IAM ポリシーは 1 つ以上のステートメントで構成される JSON ドキュメントです。各ステートメント
は次のように構成されます。
{
133
Amazon Kinesis Streams 開発者ガイド
Streams のアクション
"Statement":[{
"Effect":"effect",
"Action":"action",
"Resource":"arn",
"Condition":{
"condition":{
"key":"value"
}
}
}
]
}
ステートメントはさまざまなエレメントで構成されます。
• [Effect]: effect は、Allow または Deny にすることができます。デフォルトでは、IAM ユーザーはリ
ソースおよび API アクションを使用するアクセス許可がないため、リクエストはすべて拒否されま
す。明示的な許可はデフォルトに優先します。明示的な拒否はすべての許可に優先します。
• [Action]: action は、アクセス許可を付与または拒否する対象とする、特定の API アクションです。
• [Resource]: アクションによって影響を及ぼされるリソースです。ステートメント内でリソースを指
定するには、Amazon リソースネーム(ARN)を使用する必要があります。
• [Condition]: condition はオプションです。ポリシーの発効条件を指定するために使用します。
IAM のポリシーを作成および管理するときは、AWS Policy Generator と IAM Policy Simulator を使用
することもできます。
Streams のアクション
IAM ポリシーステートメントで、IAM をサポートするすべてのサービスから任意の API アクションを
指定できます。Streams の場合、API アクション kinesis: の名前に次のプレフィックスを使用しま
す。例: kinesis:CreateStream、kinesis:ListStreams、および kinesis:DescribeStream。
単一のステートメントに複数のアクションを指定するには、次のようにコンマで区切ります。
"Action": ["kinesis:action1", "kinesis:action2"]
ワイルドカードを使用して複数のアクションを指定することもできます。たとえば、「Get」という単
語で始まる名前のすべてのアクションは、以下のように指定できます。
"Action": "kinesis:Get*"
すべての Streams オペレーションを指定するには、次のように * ワイルドカードを使用します。
"Action": "kinesis:*"
Streams API アクションの完全なリストについては、『Amazon Kinesis API Reference』を参照して
ください。
Streams 用の Amazon リソースネーム(ARN)
各 IAM ポリシーステートメントは、ARN を使用して指定したリソースに適用されます。
134
Amazon Kinesis Streams 開発者ガイド
Streams のポリシー例
Amazon Kinesis stream には、次の ARN リソースフォーマットを使用します。
"Resource": arn:aws:kinesis:region:account-id:stream/stream-name
以下に例を示します。
"Resource": arn:aws:kinesis:*:111122223333:stream/my-stream
Streams のポリシー例
次のポリシーの例は、Amazon Kinesis stream へのユーザーアクセスの制御方法について説明してい
ます。
Example 1: ユーザーがストリームからデータを取得できるようにする
このポリシーでは、ユーザーまたはグループが、指定したストリームに対して
GetShardIterator、GetRecords、DescribeStream、ListStreams のオペレーションを実行で
きます。このポリシーは、特定のストリームからデータを取得できる必要があるユーザーに適用でき
ます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"kinesis: Get*"
],
"Resource": [
"arn:aws:kinesis:us-east-1:111122223333:stream/stream1"
]
},
{
"Effect": "Allow",
"Action": [
"kinesis:DescribeStream"
],
"Resource": [
"arn:aws:kinesis:us-east-1:111122223333:stream/stream1"
]
},
{
"Effect": "Allow",
"Action": [
"kinesis:ListStreams"
],
"Resource": [
"*"
]
}
]
}
135
Amazon Kinesis Streams 開発者ガイド
Streams のポリシー例
Example 2: ユーザーがアカウントの任意のストリームにデータを追加できるようにする
このポリシーでは、ユーザーまたはグループが、アカウントのストリームに対して PutRecord オペ
レーションを使用できます。このポリシーは、アカウントのすべてのストリームにデータレコードを
追加できる必要のあるユーザーに適用できます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"kinesis:PutRecord"
],
"Resource": [
"arn:aws:kinesis:us-east-1:111122223333:stream/*"
]
}
]
}
Example 3: 特定のストリームに対して任意の Streams アクションを実行できるようにする
このポリシーでは、ユーザーまたはグループが、指定したストリームに対して任意の Streams オペ
レーションを実行できます。このポリシーは、特定のストリームに対して管理上の制御が必要なユー
ザーに適用できます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "kinesis:*",
"Resource": [
"arn:aws:kinesis:us-east-1:111122223333:stream/stream1"
]
}
]
}
136
Amazon Kinesis Streams 開発者ガイド
Streams のポリシー例
Example 4: 任意のストリームに対して任意の Streams アクションを実行できるようにする
このポリシーでは、ユーザーまたはグループが、アカウントの任意のストリームに対して任意の
Streams オペレーションを実行できます。このポリシーは、すべてのストリームへのフルアクセスを
許可するため、管理者にのみ適用する必要があります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "kinesis:*",
"Resource": [
"arn:aws:kinesis:*:111122223333:stream/*"
]
}
]
}
137
Amazon Kinesis Streams 開発者ガイド
ドキュメント履歴
以下の表は Amazon Kinesis Streams のドキュメントの重要な変更点をまとめたものです。
変更
説明
変更日
拡張 CloudWatch メ
トリックスの新しい
コンテンツ。
更新済み Amazon Kinesis Streams のモニタリン
グ (p. 105).
2016 年 4 月 19 日
拡張 Amazon
Kinesis エージェン
トの新しいコンテン
ツ。
更新済み Amazon Kinesis エージェントを使用して
Amazon Kinesis Streams への書き込み (p. 54).
2016 年 4 月 11 日
Amazon Kinesis
エージェントを使用
するための新しいコ
ンテンツ。
「Amazon Kinesis エージェントを使用して Amazon
Kinesis Streams への書き込み (p. 54)」が追加されま
した。
2015 年 10 月 2 日
リリース 0.10.0 へ
の KPL コンテンツ
の更新
「Amazon Kinesis プロデューサライブラリ を使用
した Amazon Kinesis Streams プロデューサーの開
発 (p. 39)」が追加されました。
2015 年 7 月 15 日
設定可能なメトリッ
クスの KCL メト
リックスのトピック
の更新。
「Amazon CloudWatch による Amazon Kinesis クライ
アントライブラリのモニタリング (p. 118)」が追加さ
れました。
2015 年 7 月 9 日
コンテンツの再編
成。
コンテンツトピックを大幅に再編成し、より簡潔なツ
リー表示とより論理的なグループ化を行いました。
2015 年 7 月 01 日
新しい KPL 開発者
ガイドのトピック。
「Amazon Kinesis プロデューサライブラリ を使用
した Amazon Kinesis Streams プロデューサーの開
発 (p. 39)」が追加されました。
2015 年 6 月 02 日
新しい KCL メト
リックスのトピッ
ク。
「Amazon CloudWatch による Amazon Kinesis クライ
アントライブラリのモニタリング (p. 118)」が追加さ
れました。
2015 年 5 月 19 日
KCL .NET のサポー
ト
「.NET での Amazon Kinesis Client Library コンシュー
マーの開発 (p. 76)」が追加されました。
2015 年 5 月 1 日
138
Amazon Kinesis Streams 開発者ガイド
変更
説明
変更日
KCL Node.js のサ
ポート
「Node.js での Amazon Kinesis Client Library コン
シューマーの開発 (p. 73)」が追加されました。
2015 年 3 月 26 日
KCL Ruby のサポー
ト
KCL Ruby ライブラリへのリンクを追加しました。
2015 年 1 月 12 日
新しい API
PutRecords
「the section called “PutRecords を使用した複数のレ
コードの追加” (p. 50)」に、新しい PutRecords API に
関する情報を追加しました。
2014 年 12 月 15 日
タグ指定のサポート
「Amazon Kinesis Streams でのストリームのタグ付
け (p. 130)」が追加されました。
2014年9月11日
CloudWatch メト
リックスの新規追加
GetRecords.IteratorAgeMilliseconds メトリッ
クを Amazon Kinesis Streams のディメンションおよ
びメトリックス (p. 106) に追加しました。
2014年9月3日
モニタリングに関す
る章の新規追加
Amazon Kinesis Streams のモニタリング (p. 105) と
Amazon CloudWatch による Amazon Kinesis Streams
サービスのモニタリング (p. 106) が追加されました。
2014 年 7 月 30 日
サンプルアプリケー
ションの新規追加
「チュートリアル: Amazon Kinesis Streams を使用し
たウェブトラフィックの可視化 (p. 10)」が追加されま
した。
2014 年 6 月 27 日
デフォルトのシャー
ド制限
Amazon Kinesis Streams の制限 (p. 7) の更新点: デ
フォルトのシャード制限が 5 から 10 に増えました。
2014 年 2 月 25 日
デフォルトのシャー
ド制限
Amazon Kinesis Streams の制限 (p. 7) の更新点: デ
フォルトのシャード制限が 2 から 5 に増えました。
2014 年 1 月 28 日
2014 年 1 月 3 日
API バージョンに合
わせた更新
Streams API の 2013-12-02 バージョンに合わせた更
新。
2013年12月12日
初回リリース
Amazon Kinesis Developer Guide の初回リリース。
2013 年 11 月 14 日
139
Amazon Kinesis Streams 開発者ガイド
AWS の用語集
最新の AWS の用語については、『AWS General Reference』の「AWS の用語集」を参照してくださ
い。
140