初めに
こんにちは、株式会社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のプログラムを変更してください。
それでは。