Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8837

Kinesisストリームを作ってレコードを投げる【Node.js/TypeScript】

$
0
0
はじめに aws-sdk/client-kinesisを使えば、async/awaitで簡単にKinesisにデータを投げることができます。 試しに使うにあたり、ストリーム作成からやってみたので、それらの手順をまとめました。 未来の自分やどなたかのお役にたてれば嬉しいです。 環境 OS: MacOS Catalina(10.15.7) Node: v14.16.1 注意 Kinesisに無料枠はないので実行する度にお金がかかるらしい AWSでKinesisストリームを作成 AWSにログインしKinesisサービスを検索 「データストリームを作成」をクリック 情報を入力 データストリーム名: test 開いているシャードの数: 1 「データストリームの作成」ボタンをクリック 参考: AWS デベロッパーガイド IAMの設定 ポリシーの作成 IAMサービスを検索しユーザ設定ページへ遷移 ポリシー設定画面でポリシーの作成をクリック 対象サービスをKinesisに設定 アクションを以下に設定 DescribeStream GetShardIterator GetRecords PutRecord リソースを先ほど作成したKinesisに設定(「このアカウント内のいずれか」にチェックを入れるとARNを選択できる) リクエスト条件を設定する IPアドレスの場合は確認くんにアクセスし、「あなたのIPアドレス(IPv4)」に書いてあるIPアドレスをコピー ビジュアルエディタとJSONが以下のようになっていることを確認 「次のステップ: タグ」をクリックする 何も入力せずに「次のステップ: 確認」をクリックする 内容を確認し「ポリシーの作成」をクリックする IAMにアタッチ ユーザ設定画面から「アクセス権限の追加」をクリック 先ほど作成したポリシーを検索して選択 参考: Kinesis ポリシーの作成 Cledentialsの設定 右上の自分のアカウントメーをクリックし、「マイセキュリティ資格情報」を選択 ~/.aws/credentialsにアクセスキーとクレデンシャルを記入 [default] aws_access_key_id = AXXXXXXXXXXXXXXXX aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXX [sample1] aws_access_key_id = AXXXXXXXXXXXXXXXX aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXX プロジェクトのセットアップ mkdir kinesis cd kinesis npm init -y npm i @aws-sdk/client-kinesis コードの記述 app.jsを作成し以下を記載 // セットアップ const { KinesisClient, PutRecordCommand } = require('@aws-sdk/client-kinesis'); const REGION = 'ap-northeast-1'; const client = new KinesisClient({ region: REGION }); // 引数の定義 const params = { Data: Buffer.from(JSON.stringify({ id: 1, name: 'test' })), PartitionKey: 'partitionKey', StreamName: 'test', }; // PutRecordコマンドの実行 const command = new PutRecordCommand(params); const send = async () => { try { const data = await client.send(command); console.log(data); } catch (error) { console.log(error); } finally { console.log('done'); } }; send(); 実行 ルートディレクトリで以下を実行 node app.js 実行結果 { '$metadata': { httpStatusCode: 200, requestId: 'XXXXX-XXXXX-XXXXX-XXXXXX-XXXXXXXXXXXX', extendedRequestId: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxx/xxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxx', cfId: undefined, attempts: 1, totalRetryDelay: 0 }, EncryptionType: undefined, SequenceNumber: '0000000000000000000000000000000000000000000000000000000000001', ShardId: 'shardId-000000000000' } httpStatusCodeが200なので成功している模様。 解説 requireについて const { KinesisClient, PutRecordCommand } = require('@aws-sdk/client-kinesis'); KinesisClientはKinesisClassをnewするために必要なのでrequireしている。 PutRecordCommandはKinesisにレコードを1件追加する関数。 ちなみに他にもたくさんの関数があり、npm installしたソースコードの中身を覗いてみるとだいたいわかる。 よく使う&わかりやすいものだけピックアップすると以下のような感じ。 場所:/node_modules/@aws-sdk/client-kinesis/dist/types/index.d.ts export * from "./KinesisClient"; export * from "./Kinesis"; export * from "./commands/CreateStreamCommand"; export * from "./commands/DecreaseStreamRetentionPeriodCommand"; export * from "./commands/DeleteStreamCommand"; export * from "./commands/DescribeStreamCommand"; export * from "./commands/GetRecordsCommand"; export * from "./commands/ListShardsCommand"; export * from "./commands/ListStreamConsumersCommand"; export * from "./commands/PutRecordCommand"; export * from "./commands/PutRecordsCommand"; // ..略。他にもたくさん書いてある 使う分だけrequireしておけばOK。 params定義について const params = { Data: Buffer.from(JSON.stringify({ id: 1, name: 'test' })), PartitionKey: 'partitionKey', StreamName: 'test', }; AWS JavaScript SDK のドキュメントを参考に、引数を設定。今回は設定必須の値のみ渡している。このドキュメントによると、以下の値が設定できる。 var params = { Data: Buffer.from('...') || 'STRING_VALUE' /* Strings will be Base-64 encoded on your behalf */, /* required */ PartitionKey: 'STRING_VALUE', /* required */ StreamName: 'STRING_VALUE', /* required */ ExplicitHashKey: 'STRING_VALUE', SequenceNumberForOrdering: 'STRING_VALUE' }; Data: kinesisに投げるデータをBase64にエンコードして設定する。 PartitionKey: 複数のシャードに振り分ける際に振り分けルール。 の元になる値(?)。今回はシャード数が1なのでなんでもOKだと思う。公式には以下のように書かれている。 パーティションキーは、ストリーム内のデータをシャード単位でグループ化するために使用されます。Kinesis Data Streams は、ストリームに属するデータレコードを複数のシャードに配分します。この際、各データレコードに関連付けられたパーティションキーを使用して、配分先のシャードを決定します。パーティションキーは Unicode 文字列で、各キーの最大長は 256 文字に制限されています。MD5 ハッシュ関数を使用して、パーティションキーを 128 ビットの整数値にマッピングし、関連付けられたデータレコードをシャードにマッピングします。後者のマッピングにはシャードのハッシュキー範囲を使用します。アプリケーションは、ストリームにデータを配置するときに、パーティションキーを指定する必要があります。 参考: -Kinesis デベロッパーガイド- StreamName: ストリームの名前。 補足1 credentialsについて 認証情報の設定を忘れていた。 共有認証情報ファイルを~/.aws/credentialsに置いているので勝手に動いたが、本来は明示的に設定したほうがよさそう。 以下のようにKinesisClientをnewする時にcredentialsを渡せばOK。 const aws = require('aws-sdk') const credential = new aws.SharedIniFileCredentials() new KinesisClient({ region: 'ap-northeast-1', credentials: credential }) 補足2 TypeScript 最終的にTypeScriptを使った。 npm i typescript npm i --save-dev @types/node package.jsonに以下が追加される。 - "typescript": "^4.3.5" - "@types/node": "^16.0.0" コードはだいたい以下のように書いている。 app.ts import { KinesisClient, PutRecordCommand, PutRecordCommandOutput, PutRecordInput } from '@aws-sdk/client-kinesis' const client = new KinesisClient({ region: 'ap-northeast-1'}) const params: PutRecordInput = { Data: Buffer.from(JSON.stringify({ id: 1, name: 'test' })), PartitionKey: 'partitionKey', StreamName: 'test', } const command = new PutRecordCommand(params); const send = async () => { try { const data:PutRecordCommandOutput = await client.send(command); console.log(data); } catch (error) { console.log(error); } finally { console.log('done'); } }; send(); 使用する(使用しそうな)値と型はこんなかんじ。 REGION: string STREAM_NAME: string credential: aws.SharedIniFileCredentials client: KinesisClient params: PutRecordInput data: PutRecordCommandOutput まとめ 公式のドキュメントはシンプルで非常にわかりやすいのですが、 paramsがわからない 使える関数がわからない TypeScriptの型がわからない などのちょっとしたつまずきがありました。 次にKinesisを操作するときは、この記事を読み返せばスムーズに書けるんじゃないかな、と思います。 以上

Viewing all articles
Browse latest Browse all 8837

Trending Articles