(著者:クローバ株式会社 門屋 亮)
はじめに
こんにちは。クローバの門屋です。
AWS Lambdaの Scheduled Functions がリリースされました。Scheduled Functions とは、AWS のサーバー側でプログラムを定期実行する仕組みのことです。この仕組みをkintone と組み合わせれば、kintone 単体ではできなかった、サーバー側の機能拡張を行うことができます。
今回は AWS Lambdaを用いて、kintoneにアップロードされた複数枚の画像を一つのPDFに変換するツールを作ってみます。
kintone x AWS Lambda連携
kintoneアプリの作成
次のようなアプリを作成します
フィールドタイプ | 標題 | フィールドコード | 追加設定 |
文字列一行 | タイトル | title | - |
添付ファイル | 画像 | images | - |
添付ファイル | - | ||
チェックボックス | チェックボックス | processed | 項目:processed |
AWS アカウントのセットアップ
こちらのページを参考にして、AWSアカウントのセットアップと管理者ユーザーの作成を行ってください。利用を開始してから1年間は、無料利用枠の範囲で利用することができます。
http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/setting-up.html
Lambdaの利用を開始する
サービスメニューからLambdaを開きます。何も設定していない場合は以下のような画面が表示されます。「Get Started Now」と書かれたボタンをクリックしてください。
あらかじめ用意されたテンプレートを利用することができます。ランタイムのドロップダウンからNode.js 6.10を選択して、hello-world というタイトルのテンプレートをクリックします。
ファンクションの設定
以下のように設定します。
Name: pdfConverterForKintone
Description: A starter AWS Lambda function
Runtime: Node.js 6.10
Handler: index.handler
Role: Basic execution role(新しくロールを作成します)
Advanced settings: Timeoutを30 secにする
「Create function」をクリックするとファンクションが作成されます。
この状態で左上の「Test」をクリックすると、ファンクションが実行され、動作を確認することができます。
では、早速kintoneと連携するプログラムを作っていきましょう。
kintoneからレコードを取得する
コードエディタを編集して、以下のコードを入力します。
こちらのページを参考に、TLS v1.2 以降の値を指定してください。
kintoneHost, appId, apiTokenは適宜ご利用の環境に合わせて差し替えてください。編集が終わったら、左上の「Save and test」をクリックします。処理が正常に実行されると、緑色のチェックマークとともに、「Execution result: succeeded」のメッセージが表示されます。
このプログラムでは、処理済みのフラグが立っていないレコードの件数を戻り値として返しています。プログラムで出力されたログを見れば、きちんとkintoneからデータが返ってきていることがわかります。
kintoneからファイルをダウンロードする
次に、kintoneからファイルをダウンロードする処理を書いてみます。
Lambdaでは、/tmpディレクトリ以下に500MBまで、一時的なファイルを置くことができます。この関数ではファイルキーと拡張子をファイル名として、/tmpディレクトリに一時ファイルを生成しています。添付ファイルのサイズが大きい場合、一度のdataイベントで全てのデータが返らないことがあるため、fs.appendFileSyncでデータをファイルに追加していくようにしています。全てのデータがダウンロードし終わったら、callbackを呼び出してファイル名を呼び出し元に渡します。
画像ファイルをPDFに変換する
LambdaのNode.jsでは、ImageMagickを利用することができます。ImageMagickはパワフルな画像処理ライブラリで、Webサービスによく用いられます。ImageMagickを使えば、複数の画像ファイルから簡単にPDFファイルを生成することができます。
kintoneにファイルをアップロードする
Lambdaからkintoneにファイルをアップロードするには、multipart/form-data形式でファイルをアップロードする必要があります。この形式のデータ生成を行ってくれるライブラリもあるようなのですが、今回は自力でやってみました。boundaryは適当な長さの文字列であればなんでも構いません。
kintoneのレコードを更新する
最後に、アップロードしたファイルキーでkintoneのレコードを更新します。さらに処理済みのフラグをオンにします。
非同期処理を行う
JavaScriptではうまく非同期処理を扱わないと非常にコードが汚くなってしまいます。最近のNode.jsではPromiseがサポートされているのですが、Lambdaで利用されているバージョンではサポートされていないようなので、今回はasyncライブラリを使用することにしました。ライブラリを使う場合、以下のようにライブラリごとzipに固めて Lambdaにアップロードする必要があります。
ここまでのプログラムをまとめたものをこちらで公開しています。
https://gist.github.com/ryokdy/cad4af0bb8cbc80c9661
実行してみよう
プログラムを実行すると、kintone に登録した画像ファイルがPDFに変換され、アップロードされていますね!
注意)
PDFの変換には一時的に多くのメモリを消費するため、画像のサイズなどによっては変換が失敗することがあります。必要に応じてメモリの設定を行ってください(メモリ量によって無料利用枠で実行できる時間が異なりますので注意してください)。
定期実行を行う
さて、プログラムができたところで、いよいよ定期実行の設定を行います。 「Triggers」タブを表示させたのち、「Add trigger」をクリックします。 「trigger type」に「CloudWatch Events - Schedule」を選択します。
Schedule expressionでファンクションを実行する周期を設定できます。cronのように実行時刻を細かく設定することもできます。 この設定を行うことで、5分ごとにkintoneに新しいレコードがないかを確認し、あればPDFに変換するという処理を行えるようになります。
終わりに
いかがでしたか? 今回はLambda内で完結する処理を行いましたが、AWSの他のサービスを組み合わせることでさらに可能性が広がります。 例えば、こんなこともできそうです。
- kintoneにアップロードした画像の文字認識や顔認識を行う
- アップロードした動画をElastic transcoderエンコードしてストリーミング配信する
- 定期的にデータをS3にバックアップする
Lambdaが定期実行をサポートしたことで、kintoneに対して定期的に処理を行うことが容易になりました。kintone側に手を入れなくて良いというメリットもあります(欲を言えばkintone側にもWebフックの機能を期待します)。
ぜひおためしください!
https://www.joyzo.co.jp/blog/6277
について書いておいてほしかったです!
chikayam 様
お世話になっております。cybozu developer network 事務局です。
記事に対するフィードバックをくださりありがとうございます。
いただいたフィードバックを元に記事の修正を検討いたします。
今後ともよろしくお願いいたします。