『打刻システムの構築(前編)』 『打刻システムの構築(後編)』 『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形式で圧縮され作成されるようになる。