BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【AWS】【API Gateway】【Lambda】API GatewayとLambdaでS3の画像を表示する

初めに

こんにちは、株式会社BFT新人エンジニアのないとうです。
今回はAWS LambdaとAmazon API Gatewayを用いて、S3に保存された画像を表示する方法について紹介したいと思います。
概要としては、LambdaでS3の画像を呼び出しbase64形式に変換してから、API Gatewayに送信します。
その後送信されたAPI GatewayのURLにアクセスすることで、画像が表示できるシステムになっています。
f:id:bftnagoya:20211020095542p:plain

前提条件

・画像を保存してある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のコンソールから【関数の作成】をクリック
f:id:bftnagoya:20211020095605p:plain 2.【1から関数を作成する】を選択し【関数名】を入力、【ランタイム】を「python3.9」を選択する
f:id:bftnagoya:20211020095636p:plain 3.【実行ロール】に「既存のロールを使用する」を選択し作成したロールをアタッチする
f:id:bftnagoya:20211020095659p:plain 4.【関数の作成】をクリックする
f:id:bftnagoya:20211020095725p:plain

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の作成】をクリック
f:id:bftnagoya:20211020095758p:plain 2.【REST API】の【構築】をクリック
f:id:bftnagoya:20211020095828p:plain 3.【API名】を入力し【APIの作成】をクリック
f:id:bftnagoya:20211020095848p:plain

API Gatewayの設定

1.【アクション】から【メソッドの作成】を選択しgetメソッドを追加する
f:id:bftnagoya:20211020095920p:plain 2.以下の設定値を設定し【保存】をクリック
【統合タイプ】:「Lambda関数」
【Lambdaプロシキ統合を使用】:チェック
【Lambdaリージョン】:「ap-northeast-1」
【Lambda関数名】:「先ほど作成したLambda関数名」
【デフォルトタイムアウトを使用】:チェック
f:id:bftnagoya:20211020095957p:plain 3.【メソッドレスポンス】の【200のレスポンス本文】に「application/json」を追加する
f:id:bftnagoya:20211020100022p:plain 4.左のサイドバーから【設定】を選択し【バイナリメディアタイプ】に「*/*」を入力し【変更の保存】をクリック
f:id:bftnagoya:20211020101146p:plainf:id:bftnagoya:20211020101158p:plain 5.APIをデプロイする 6.【APIのURL】?name=【ファイル名】にアクセスしてS3の画像が表示されれば完了

終わりに

今回はS3の画像を表示する方法を紹介しました。
作成したLambdaはバケット直下に画像を保存する場合を想定していますが、画像をフォルダ内に保存している場合は、それに応じてLambdaのプログラムを変更してください。
それでは。


参照

qiita.com