Edited at

AWS Lambda for Ruby を使って Lambda から Thinreports ライブラリで生成したPDFをS3に保存してみるメモ

AWS Lambda の Ruby サポート を受けてRubyのインストールからデプロイまでやってみたメモの続きです。

前回は、 AWS Lambda のRubyサポートを受けて、LambdaにアップロードしたRubyスクリプトを API Gateway のエンドポイントを叩いて表示されるテストまでやって見ました。

今回は、LambdaのRubyスクリプトでPDFを生成し、それをS3に保存して見ます。

PDF生成のライブラリにはThinreportsを利用します。


Rubyコード

まず初めにRubyのコードを載せておきます。

# coding: utf-8

require 'thinreports' #Thinreportsのライブラリを読み込み
require 'aws-sdk-s3' #AWS Ruby SDK を読み込み

def lambda_handler(event:, context:)
# TODO implement
region = 'region' #S3バケットのリージョンを設定。アジアパシフィック (東京)の場合は 'ap-northeast-1'
bucket_name = 'bucket_name' #S3バケット名を設定
key = 'put-hello-world.pdf' #生成するファイル名を設定
s3 = Aws::S3::Resource.new(region: region)
obj = s3.bucket(bucket_name).object(key)

#Thinreportsを利用してPDFファイルを生成
report = Thinreports::Report.new layout: 'hello_world'
# 1st page
report.start_new_page
report.page.item(:world).value('Thinreports')
report.page.item(:thinreports).value('Thinreports')

#S3に書き込み
obj.put(body: report.generate)
end


今後

後ほど下記を追加していきます。


  • S3バケットの設定

  • Ruby SDK の設定

  • Thinreportsの設定


    • ThinreportsからPDFを生成して表示させるテスト

    • kintoneからkintone.poxy経由でLambdaにレコードを渡すテスト




S3バケットの設定

S3バケットを作成します。

その際に下記のようにアクセス権を設定することで外部からのアクセスを禁止しています。


  • バケットのデータへのパブリックアクセスを許可しない(標準の設定のままとします)

  • バケットポリシーにて作成したLambdaからS3にオブジェクトの読み込みと書き込みを許可します

{

"Version": "2012-10-17",
"Id": "Policy9999999999999",
"Statement": [
{
"Sid": "9999999999999",
"Effect": "Allow",
"Principal": {
"AWS": "Lambdaを実行するIAMユーザーのARN"
},
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "作成したバケットのARN/*"
}
]
}

バケットポリシーはポリシーエディタにて生成した物を貼り付けます。

他にも良いやり方があるかもしれませんので、上記は参考程度にしてください。

ひとまず上記の設定で、作成したS3バケットに作成したLambdaから読み込みと書き込みが出来るようになるかと思います。


IAMユーザーの設定

上記で設定したバケットポリシーに指定したIAMユーザーの設定です。


  • ポリシーに「AWSLambdaBasicExecutionRole」を設定
    上記の設定でLambdaにアクセスする最低限の権限を持つIAMユーザーが作成出来ます。


Lambdaの設定

Lambdaに実行ロールを設定します。ロールはあらかじめIAMにて作成しておきます。

今回は下記のようにロールを作成しました。


  • 「AmazonAPIGatewayPushToCloudWatchLogs」
    後々必要なAPI GatewayのログをCloudWatchに書き込むようにしています。

S3バケットへの権限は前段のようにバケット側で許可することも出来ますが、Labmda側に設定するロールに付与することも出来ます。

その場合は、Lambda実行ロールにインラインポリシーを追加することで可能となります。


参考リンク