LoginSignup
5
4

More than 5 years have passed since last update.

AWS Lambda にPOSTしたkintoneのレコードからThinreportsを利用してPDFファイルを生成する

Last updated at Posted at 2019-01-13

これまでの記事でRubyのインストールからLambda・API Gatewayの利用、ThinreportsによるPDF生成までテストしてきましたが、最後にこれまでのまとめとして、LambdaにPOSTしたkintoneレコードを利用してPDFを生成してみたいと思います。
kintonePostAwsLambda.png

今回のゴール

Thinreportsで生成したPDFファイルです。
スクリーンショット 2019-01-13 13.24.25.png

処理の流れ

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

アプリを作成したらレコードを登録しておきます。
スクリーンショット 2019-01-13 9.16.27.png

kintoneカスタマイズJavaScriptファイル作成

kintone.proxyを利用して、レコードをAWSへPOSTします。

customer.js
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/を参照してください。

スクリーンショット 2019-01-13 13.09.45.png

今回はクイックスタートガイドのレイアウトファイルをそのまま利用します。
尚、サンプルコードとレイアウトファイルはリンク先の下の方からダウンロード出来ます。

Lambdaファンクションの作成

LambdaにはRubyとRubyのgemライブラリを利用しています。

手順は次の通りです。詳細はこれまでの記事を参考にしてください。

  1. thinreportsインストール
  2. Rubyスクリプト作成
  3. zip圧縮
  4. S3アップロード
  5. Lambdaにアップロード
hello_world.rb
# 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ファイルが生成されていることを確認します。
スクリーンショット 2019-01-13 13.38.14.png

ファイルをダウンロードしてPDFファイルを確認します。

まとめ

kintoneで帳票出力が必要なものに関しては、外部のレポートサービスを利用することが多いと聞きますが、今回AWS Lambda、Thinreports を利用して、kintoneの帳票出力をある程度自前でサポートできる可能性があると感じました。

生成したPDFファイルをセキュリティを保った上で、ユーザーにどのようにダウンロードさせるか?やLambdaのデバッグやテスト、デプロイ等は今後試していきたいと思います。

これまでの記事

  1. AWS Lambda の Ruby サポート を受けてRubyのインストールからデプロイまでやってみたメモ
  2. AWS Lambda for Ruby を使って Lambda から Thinreports ライブラリで生成したPDFをS3に保存してみるメモ
  3. kintone から AWS API Gateway 経由で Lambda for Ruby ファンクションにリクエストを投げてみるテスト
  4. kintone のレコードを kintone.proxyでAWS LambdaへPOSTリクエストしてログに吐き出してみるテスト

参考リンク

参考にさせて頂きました。この場をお借りして感謝致します。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4