これまでの記事でRubyのインストールからLambda・API Gatewayの利用、ThinreportsによるPDF生成までテストしてきましたが、最後にこれまでのまとめとして、LambdaにPOSTしたkintoneレコードを利用してPDFを生成してみたいと思います。
今回のゴール
処理の流れ
kintoneアプリの詳細画面に設置したボタンを押下して、AWSのAPI Gateway経由でLambdaを実行し、PDFファイルをAWS S3に出力します。
- kintoneアプリ作成
- kintoneカスタマイズJavaScriptファイル作成
- Thinreportsレイアウトファイルを作成
- Lambdaファンクションの作成
- S3,API Gatewayの設定
- kintoneアプリから実行
- S3にPDFファイルが生成されていることを確認
kintoneアプリ作成
kintoneアプリを新規に作成します。
文字列1行フィールドを追加して次のように設定します。
フィールド名 | フィールドタイプ | フィールドコード |
---|---|---|
text | 文字列1行 | text |
kintoneカスタマイズJavaScriptファイル作成
kintone.proxyを利用して、レコードをAWSへPOSTします。
const url = kintoneEnv.props.url;
console.log(url);
const method = 'POST';
const headers = {'Content-Type' : 'application/json'};
kintone.events.on('app.record.detail.show', event => {
let myButton = document.createElement('button');
myButton.id = 'myButton';
myButton.innerHTML = 'Hello Ruby!!';
myButton.onclick = () => {
console.log(event);
let data = event;
kintone.proxy(url, method, headers, data, (body, status, headers) => {
console.log(status, body);
if(status >= 200 && status < 300) {
console.log("Success");
}else{
console.log("Error");
}
});
return event;
};
kintone.app.record.getHeaderMenuSpaceElement().appendChild(myButton);
})
kintoneアプリ開発ベース〜ビルド、デプロイ、環境切り替え〜の記事を参考にして、ビルド・デプロイをしました。
API GatewayのURLは設定ファイルから読み込みます。
Thinreportsレイアウトファイルを作成
ThinreportsはRubyでPDFファイルを生成するソフトウェアです。rubyのライブラリとデザイナが提供されています。詳しくはhttp://www.thinreports.org/を参照してください。
今回はクイックスタートガイドのレイアウトファイルをそのまま利用します。
尚、サンプルコードとレイアウトファイルはリンク先の下の方からダウンロード出来ます。
Lambdaファンクションの作成
LambdaにはRubyとRubyのgemライブラリを利用しています。
手順は次の通りです。詳細はこれまでの記事を参考にしてください。
- thinreportsインストール
- Rubyスクリプト作成
- zip圧縮
- S3アップロード
- Lambdaにアップロード
# coding: utf-8
require 'thinreports'
require 'json'
require 'base64'
require 'aws-sdk-s3'
def lambda_handler(event:, context:)
begin
print 'JSON.parse event.body => '
pp JSON.parse(event["body"])
event_body = JSON.parse(event["body"])
record = event_body["record"]
print 'record => '
pp record
puts '$id => ', record["$id"]["value"]
puts 'text => ', record["text"]["value"]
rescue => e
puts "#{e.class}: #{e.message}"
puts e.backtrace
end
begin
region = 'S3バケットのリージョン'
bucket_name = 'バケット名'
key = 'put-hello-ruby.pdf'
# S3 Backet Object init
s3 = Aws::S3::Resource.new(region: region)
obj = s3.bucket(bucket_name).object(key)
# Thinreports Object init
report = Thinreports::Report.new layout: 'hello_world'
# 1st page
report.start_new_page
report.page.item(:world).value(record["$id"]["value"])
report.page.item(:thinreports).value(record["text"]["value"])
obj.put(body: report.generate)
rescue => e
puts "#{e.class}: #{e.message}"
puts e.backtrace
end
{ statusCode: 200, body: JSON.generate('Hello Lambda! Thinreports for Ruby') }
end
補足説明
kintoneからPOSTしたデータは、event["body"]にセットされているので、それをJSON.parseしてRubyオブジェクトに変換します。さらに、kintoneのレコードのみを取り出してrecord変数にセットしています。
event_body = JSON.parse(event["body"])
record = event_body["record"]
":world"と":thinreports"がThinreportsのレイアウトファイルに設定したブロックツールのIDと対応しています。ここでセットした値がレイアウトファイルに差し込まれます。
最後にreport.generateでPDFを出力します。
report.page.item(:world).value(record["$id"]["value"])
report.page.item(:thinreports).value(record["text"]["value"])
obj.put(body: report.generate)
S3,API Gatewayの設定
S3に書き込み権限を付与します。API GatewayはLambdaファンクションの作成時にLambdaのコンソール画面から設定します。詳細はこれまでの記事を参考にしてください。
kintoneアプリから実行
kintoneアプリの詳細画面のボタンを押下します。
実行後にログを確認します。
S3にPDFファイルが生成されていることを確認
S3のコンソールからバケットを選択してPDFファイルが生成されていることを確認します。
ファイルをダウンロードしてPDFファイルを確認します。
まとめ
kintoneで帳票出力が必要なものに関しては、外部のレポートサービスを利用することが多いと聞きますが、今回AWS Lambda、Thinreports を利用して、kintoneの帳票出力をある程度自前でサポートできる可能性があると感じました。
生成したPDFファイルをセキュリティを保った上で、ユーザーにどのようにダウンロードさせるか?やLambdaのデバッグやテスト、デプロイ等は今後試していきたいと思います。
これまでの記事
- AWS Lambda の Ruby サポート を受けてRubyのインストールからデプロイまでやってみたメモ
- AWS Lambda for Ruby を使って Lambda から Thinreports ライブラリで生成したPDFをS3に保存してみるメモ
- kintone から AWS API Gateway 経由で Lambda for Ruby ファンクションにリクエストを投げてみるテスト
- kintone のレコードを kintone.proxyでAWS LambdaへPOSTリクエストしてログに吐き出してみるテスト
参考リンク
参考にさせて頂きました。この場をお借りして感謝致します。