AWS Lambda からS3に保存したPDFファイルをダウンロードする際の覚書きです。
続きの記事を書きました。
Amazon CloudFront経由で、S3からLambda for Ruby2.5を使ってPDFファイルをダウンロードする
流れ
- S3バケットを作成
- IAMロールの作成
- Lambdaファンクションの作成
- API Gatewayの設定
- S3にPDFファイルを保存
- ファイルダウンロードのコードを作成
- API Gateway のAPI エンドポイントにアクセス
- ファイルがダウンロードされることを確認
S3バケットを作成
東京リージョンにS3バケットを作成します。
- バケット名:バケット名(ex. kazu-lambda-test001)
IAMロールの作成
S3にアクセスできる権限を持つユーザーロールを作成します。
ポリシーの作成
- サービス:S3
- アクション:GetObject, PutObject
- リソース:S3バケットARN/*
- ポリシー名:luck-s3-get-put-policy
ロールの作成
- ロール名:lambda-s3-read-write-role
- 利用サービス:Lambda
- ポリシー:AWSLambdaBasicExecutionRole, luck-s3-get-put-policy, AmazonAPIGatewayPushToCloudWatchLogs
Lambdaファンクションの作成
AWSのLambdaコンソールからLambdaファンクションを作成します。
- ファンクション名:s3PdfDownload
- ランタイム:Ruby2.5
- ロール:lambda-s3-read-write-role
API Gatewayの設定
テストの為、セキュリティはオープンに設定します。
- API:新規APIの作成
- セキュリティ:オープン
- 設定:バイナリタイプメディア:application/pdf
メソッドリクエストの設定画面
メソッドリクエストの設定画面
バイナリメディアタイプの設定画面
設定が終わったらステージを選んで保存します。
API Gatewayの設定を変更した場合は、デプロイするステージを選択して保存(デプロイ)します。
S3にPDFファイルを保存
S3にPDFファイルをアップロードします。
今回は事前にThinreportsで作成したPDFファイルをアップロードしました。
ファイルダウンロードのコードを作成
Lambdaコンソールでコードを記述します。
require 'json'
require 'base64'
require 'aws-sdk-s3'
def lambda_handler(event:, context:)
region = 'リージョン'
bucket_name = 'バケット名'
key = 'hello_world.pdf'
s3 = Aws::S3::Resource.new(region: region)
obj = s3.bucket(bucket_name).object(key)
puts "pp object => "
pp obj
resp = obj.get()
puts "pp resp"
pp resp
puts "pp resp.body"
pp resp.body
pp resp.content_type
{ statusCode: 200, headers: { 'Content-Type': 'application/pdf' }, body: Base64.encode64(resp.body.read()), isBase64Encoded: true }
end
テスト
Lambdaにてテストを実行します。
レスポンスにPDFが出力されていることを確認します。
APIエンドポイントにアクセス
APIエンドポイントにアクセスします。
LambdaのコンソールからAPI Gatewayを選択し、APIエンドポイントのURLリンクをクリックします。
ブラウザでアクセスして、エラーで表示されないことを確認します。
cURLで実行
cURLを使って実行してPDFファイルがダウンロードされることを確認します。
$ curl -H "Accept: application/pdf" "APIエンドポイントURL" > test.pdf
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 45348 100 45348 0 0 84780 0 --:--:-- --:--:-- --:--:-- 88397
$ ls
test.pdf
ダウンロードされたファイルを開いて確認します。
続きの記事を書きました。続きでは、ブラウザからアクセスしてPDFを表示させます。
Amazon CloudFront経由で、S3からLambda for Ruby2.5を使ってPDFファイルをダウンロードする