初めに
こんにちは、株式会社BFT新人エンジニアのないとうです。
今回はAWS LambdaとAmazon API Gatewayを用いて、S3に保存された画像を表示する方法について紹介したいと思います。
概要としては、LambdaでS3の画像を呼び出しbase64形式に変換してから、API Gatewayに送信します。
その後送信されたAPI GatewayのURLにアクセスすることで、画像が表示できるシステムになっています。
前提条件
・画像を保存してあるS3のバケットが存在する
Lambdaに設定するロールの作成
以下の内容のポリシーを持つロールを作成する
また作成時信頼関係にLambdaを設定する
{ "Version": "2012-10-17", "Statement": [ { "Sid": "image", "Action": [ "s3:*Object*" ], "Effect": "Allow", "Resource": [ "【バケットのarn】/*" ] }, { "Sid": "ListObjectsInBucket", "Effect": "Allow", "Action": "s3:ListBucket", "Resource": [ "【バケットのarn】" ] } ] }
Lambdaの作成と設定
Lambdaの作成
1.Lambdaのコンソールから【関数の作成】をクリック
2.【1から関数を作成する】を選択し【関数名】を入力、【ランタイム】を「python3.9」を選択する
3.【実行ロール】に「既存のロールを使用する」を選択し作成したロールをアタッチする
4.【関数の作成】をクリックする
Lambdaのプログラム作成
下記内容を記載する
import json import boto3 import base64 def get_img_from_s3(FILE_PATH): s3 = boto3.client('s3') bucket_name = '【バケット名】' file_path = FILE_PATH responce = s3.get_object(Bucket=bucket_name, Key=file_path) body = responce['Body'].read() body = base64.b64encode(body) return body def lambda_handler(event, context): name = event['queryStringParameters']['name'] img = get_img_from_s3(name) return { 'headers': { "Content-Type": "image/jpeg" }, 'statusCode': 200, 'body': img.decode('utf8'), 'isBase64Encoded': True }
API Gatewayの作成と設定
API Gatewayの作成
1.API Gatewayのコンソールから【APIの作成】をクリック
2.【REST API】の【構築】をクリック
3.【API名】を入力し【APIの作成】をクリック
API Gatewayの設定
1.【アクション】から【メソッドの作成】を選択しgetメソッドを追加する
2.以下の設定値を設定し【保存】をクリック
【統合タイプ】:「Lambda関数」
【Lambdaプロシキ統合を使用】:チェック
【Lambdaリージョン】:「ap-northeast-1」
【Lambda関数名】:「先ほど作成したLambda関数名」
【デフォルトタイムアウトを使用】:チェック
3.【メソッドレスポンス】の【200のレスポンス本文】に「application/json」を追加する
4.左のサイドバーから【設定】を選択し【バイナリメディアタイプ】に「*/*」を入力し【変更の保存】をクリック
5.APIをデプロイする
6.【APIのURL】?name=【ファイル名】にアクセスしてS3の画像が表示されれば完了
終わりに
今回はS3の画像を表示する方法を紹介しました。
作成したLambdaはバケット直下に画像を保存する場合を想定していますが、画像をフォルダ内に保存している場合は、それに応じてLambdaのプログラムを変更してください。
それでは。