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

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

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


流れ

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

今回はクイックスタートガイドのレイアウトファイルをそのまま利用します。

尚、サンプルコードとレイアウトファイルはリンク先の下の方からダウンロード出来ます。


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 = 'ap-northeast-1' 
        bucket_name = 'luck-lambda-ruby-upload-backet' 
        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 


これまでの記事

  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リクエストしてログに吐き出してみるテスト


参考リンク

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

コメント

このブログの人気の投稿

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2020-12-01 09:41:49 RSSフィード2020-12-01 09:00 分まとめ(69件)