九 月
17
日曜日

打刻情報をKinesis FirehoseでS3へ保存

『打刻システムの構築(前編)』 『打刻システムの構築(後編)』 『ClojureScriptでLambd@Edge』からの続き。

当初、打刻情報は出退勤イベントのみであったためGoogle Spreadsheetへデータを記録していた。
Google Spreadsheetはブラウザから気軽に閲覧、編集できるため便利ではあるのだが、他の打刻イベントを含め長期間にわたり蓄積していくのには向いていない。
そこで基本的に全ての打刻情報はS3上に蓄積し、任意の打刻イベントのみGoole Spreadsheetへ併記する形にする。


Kinesis Firehose

Amazon Kinesis FirehoseはS3にデータを書き込むためのデリバリーストリームを提供し逐次発生するデータを簡単にS3に保存することができる。今回は打刻情報をS3に保存するために利用する。

S3バケットの作成

Firehose経由で打刻情報をS3に保存するためのS3バケットを作成する。

AWSマネージメントコンソールから S3 を開き バケットを作成する

バケット名
dakoku-data.nijohando.jp
リージョン
アジアパシフィック(東京)

デリバリーストリームの作成

AWSマネージメントコンソールから Amazon Kinesis を開き Firehoseコンソール へ移動。

Create デリバリーストリーム で新規デリバリーストリームを作成。

Delivery stream name
dakoku
Source
Direct PUT or other sources
Record transformation
Disabled
Destination
Amazon S3
S3 bucket
dakoku-data.nijohando.jp
Prefix
なし
Buffer size
5 MB
Buffer interval
300 Seconds
S3 compression
GZIP
S3 encryption
Disabled
Error logging
Enabled
IAM role
dakoku-firehose-delivery
( Create new, or Choose から新規に作成 )

Next Create delivery stream で作成。

Firehose -> S3の疎通確認

AWSマネージメントコンソールから Amazon Kinesis Firehoseコンソール にて先ほど作成したS3 デリバリーストリーム dakoku を選択。
Test with demo data からStart sending demo data を押下。

送信したデモデータが指定したBuffer sizeを超えるか、Buffer Intervalが経過することでS3にファイルが作成されることを確認する。

Lambdaの作成

dakoku-aws-kinesis-firehose-adapter を作成。
打刻トピックのリスナーとして受信した打刻イベントをFirehose経由でS3に蓄積する。
ClojureScriptベースのLambdaであり基本的なプロジェクト構成は『ClojureScriptでLambd@Edge』とほぼ同じ。

npmモジュールの利用

ClojureScript v1.9.518以降ではコンパイラオプション:npm-depsを利用することができる。

今回はFirehoseへアクセスするためnpmモジュール aws-sdk を利用する必要があり、 src/dev/clj/tools.clj 中にて以下のように定義している。

(def cljs-npm-deps {:npm-deps {:aws-sdk "2.94.0"}
                    :install-deps true})

ここに定義したnpmモジュールはClojureScript内からモジュール名でrequireできるようになる。

Lambdaデプロイパッケージの配備

Lambda関数のデプロイパッケージをAWS上へ配備する。

zipパッケージの作成

lein package

S3に配置

aws s3 cp target/dakoku-aws-kinesis-firehose-adapter.zip s3://dakoku.nijohando.jp

ちなみにnpmモジュールを利用している場合、デプロイパッケージにnode_modules配下をまるっと含めてやる必要がある。
ただ今回依存しているnpmモジュールはaws-sdkのみであり、これについてはパッケージに含めずともLambdaのランタイム環境では利用可能であるため node_modulesをパッケージに含める処理をコメントアウトしている。

Lambda実行用ロールの作成

ポリシーの作成

Kinesis FirehoseのDelivery stream dakoku へのレコード作成を許可するためのポリシーを作成する。

AWSマネージメントコンソールから IAM を開き ポリシー から ポリシーの作成 Policy Generator を選択。

効果
許可
AWSサービス
Amazon Kinesis Firehose
アクション
putRecord
putRecordBatch
Amazon リソースネーム
arn:aws:firehose:ap-northeast-1:<AWSアカウントID>:deliverystream/dakoku

ステートメントの追加 次のステップ で次画面へ。

ポリシー名
DakokuKinessFirehoseWriteOnlyAccess

ポリシーの作成 で作成。

ロールの作成

AWSマネージメントコンソールから IAM を開き ロール から 新しいロールの作成

AWSサービスロール AWS Lambda を選択。

以下のポリシーをアタッチする。

  • AWSLambdaBasicExecutionRole
  • DakokuKinessFirehoseWriteOnlyAccess

次のステップ

ロール名
dakoku-aws-kinesis-firehose-adapter

ロールの作成 で作成。

Lambdaの登録

AWS マネージメントコンソールから Lambda を開き 関数の作成

設計図の選択 から 一から作成 を選択。

トリガの設定 画面から SNS を選択。

SNSトピック
dakoku
トリガの有効化

次へ で次画面へ。

名前
dakoku-aws-kinesis-firehose-adapter
ランタイム
Node.js 6.10
コードエントリタイプ
Amazon S3からファイルアップロード
S3リンクのURL
https://s3-ap-northeast-1.amazonaws.com/dakoku.nijohando.jp/dakoku-aws-kinesis-firehose-adapter.zip
ハンドラ
index.handler
暗号化ヘルパーを有効にする
しない
ロール
既存のロールを選択
既存のロール
dakoku-aws-kinesis-firehose-adapter
メモリ(MB)
128
タイムアウト
3秒
KMS キー
(デフォルト)aws/lambda

次へ 関数の作成 で関数を作成。

S3上の打刻情報を確認

以上で打刻トピックのリスナーとしてLambda dakoku-aws-kinesis-firehose-adapter が有効になり、 S3上のYYYY/MM/DD/hh形式のディレクトリ配下に打刻情報を表すJSONファイルがgz形式で圧縮され作成されるようになる。