9
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AWS Lambda から S3 に保存したPDFファイルをダウンロードするメモ

Last updated at Posted at 2019-01-15

AWS Lambda からS3に保存したPDFファイルをダウンロードする際の覚書きです。

続きの記事を書きました。
Amazon CloudFront経由で、S3からLambda for Ruby2.5を使ってPDFファイルをダウンロードする

流れ

  1. S3バケットを作成
  2. IAMロールの作成
  3. Lambdaファンクションの作成
  4. API Gatewayの設定
  5. S3にPDFファイルを保存
  6. ファイルダウンロードのコードを作成
  7. API Gateway のAPI エンドポイントにアクセス
  8. ファイルがダウンロードされることを確認

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

メソッドリクエストの設定画面

スクリーンショット 2019-01-15 6.24.43.png

メソッドリクエストの設定画面

スクリーンショット 2019-01-15 6.25.20.png

バイナリメディアタイプの設定画面

スクリーンショット 2019-01-15 6.25.48.png

設定が終わったらステージを選んで保存します。
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ファイルをダウンロードする

参考リンク

9
11
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
9
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?