カテゴリー内の他の記事

AWS Lambda 連携 -PDF変換ツールを作ってみた-

フォローする

(著者:クローバ株式会社 門屋 亮

はじめに

こんにちは。クローバの門屋です。

AWS Lambdaの Scheduled Functions がリリースされました。Scheduled Functions とは、AWS のサーバー側でプログラムを定期実行する仕組みのことです。この仕組みをkintone と組み合わせれば、kintone 単体ではできなかった、サーバー側の機能拡張を行うことができます。

今回は AWS Lambdaを用いて、kintoneにアップロードされた複数枚の画像を一つのPDFに変換するツールを作ってみます。

kintone x AWS Lambda連携

kintoneアプリの作成

次のようなアプリを作成します

フィールドタイプ 標題 フィールドコード 追加設定
文字列一行 タイトル title -
添付ファイル 画像 images -
添付ファイル PDF pdf -
チェックボックス チェックボックス 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」をクリックするとファンクションが作成されます。

US_4.PNG

この状態で左上の「Test」をクリックすると、ファンクションが実行され、動作を確認することができます。

では、早速kintoneと連携するプログラムを作っていきましょう。

kintoneからレコードを取得する

コードエディタを編集して、以下のコードを入力します。

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」を選択します。

US_8.PNG

Schedule expressionでファンクションを実行する周期を設定できます。cronのように実行時刻を細かく設定することもできます。 この設定を行うことで、5分ごとにkintoneに新しいレコードがないかを確認し、あればPDFに変換するという処理を行えるようになります。

終わりに

いかがでしたか? 今回はLambda内で完結する処理を行いましたが、AWSの他のサービスを組み合わせることでさらに可能性が広がります。 例えば、こんなこともできそうです。

  • kintoneにアップロードした画像の文字認識や顔認識を行う
  • アップロードした動画をElastic transcoderエンコードしてストリーミング配信する
  • 定期的にデータをS3にバックアップする

Lambdaが定期実行をサポートしたことで、kintoneに対して定期的に処理を行うことが容易になりました。kintone側に手を入れなくて良いというメリットもあります(欲を言えばkintone側にもWebフックの機能を期待します)。

ぜひおためしください!

記事に関するフィードバック

直接的に記事と関連がないご質問はcybozu developer コミュニティをご活用ください。

ログインしてコメントを残してください。
Powered by Zendesk