2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

画像加工がリアルタイムでできる!?S3 Object Lambdaでモノクロ変換してみた

Last updated at Posted at 2025-07-21

はじめに

S3 Object Lambdaについて、資格試験等で存在は知っていたものの実際に使ったことがなかったので、ハンズオン形式で学んでみました。
本記事では、S3 Object Lambdaを使って画像をモノクロに変換する処理を実装する流れを紹介します。

S3 Object Lambdaとは

S3 Object Lambdaとは、Amazon S3の機能の一つで、S3に保存しているオブジェクトを取得するときに、取得リクエストの途中でカスタム処理(変換やフィルタリングなど)を挟むことができます。
保存された元データを変更せずに、用途に応じてリアルタイムで変換・加工して配信できるため、画像変換やデータマスキングなどの用途に便利です。

具体的には、以下の流れで動作します。

  1. ユーザーやアプリケーションがObject Lambda Access Pointに対してAPIリクエスト(GetObjectなど)を送信
  2. S3 Object Lambda Access Pointがリクエストを受け取り、リクエストに応じてLambda関数を呼び出す
  3. Lambda関数がS3バケットからオブジェクトを取得し、処理を行う
  4. 処理結果をS3 Object Lambda Access Pointに返し、最終的にユーザーやアプリケーションにオブジェクトを返す

S3ObjectLambda.png

ハンズオン

S3バケットの作成

まずは画像を保存するためのS3バケットを作成します。
バケット名を入力し、残りの設定はデフォルトのままで「バケットを作成」をクリックします。

image.png

作成したバケットを選択し、「アップロード」から画像ファイルをアップロードします。
今回は先日沖縄に行った時の写真をアップロードしました。(とてもきれい)

okinawa.jpg

Lambda関数を作成

S3 Object Lambdaでオブジェクトを取得する際に実行されるLambda関数を作成します。
下の画像のような設定で作成しました。ランタイムはPython3.12です。
image.png

  • Lambda関数のコード

Lambda関数のコードは以下の通りです。

lambda_function.py
import boto3
from PIL import Image
import io
import urllib.request

def lambda_handler(event, context):
    s3 = boto3.client('s3')
    
    try:
        context_info = event['getObjectContext']
        request_route = context_info['outputRoute']
        request_token = context_info['outputToken']
        s3_url = context_info['inputS3Url']

        # 画像データ取得
        with urllib.request.urlopen(s3_url) as response:
            original = response.read()

        # モノクロ変換
        image = Image.open(io.BytesIO(original))
        grayscale = image.convert("L")

        buffer = io.BytesIO()
        grayscale.save(buffer, format="PNG")
        buffer.seek(0)

        # LambdaからObject Lambdaへ応答を返す
        s3.write_get_object_response(
            Body=buffer.read(),
            RequestRoute=request_route,
            RequestToken=request_token,
            ContentType='image/png'
        )

        return {'status_code': 200}
    
    except Exception as e:
        print("Error:", str(e))
        return {'status_code': 500, 'error': str(e)}
  • ライブラリのインストール
    ローカル環境で以下のコマンドを実行して、必要なライブラリをインストールします。
bash
mkdir -p pillow-layer/python
cd pillow-layer
pip install Pillow -t ./python
zip -r ../pillow-layer.zip python
  • レイヤーの作成
    コンソール画面に戻り、左側のサイドバーから「レイヤー」を選択し、「レイヤーの追加」をクリックします。
    pillow-layer.zipをアップロードし、レイヤー名を入力します。また、先ほど作成したLambda関数と同じアーキテクチャ、ランタイムを選択して「作成」をクリックします。

image.png

  • レイヤーの追加
    作成したレイヤーをLambda関数に追加します。
    Lambda関数のコンソール画面の下の方にある「レイヤー」セクションで「レイヤーの追加」をクリックし、先ほど作成したレイヤーを選択します。(画像ではランタイムがPython3.13になっていますが、正しくは3.12です。)

image.png

  • Lambda関数のアクセス権限の設定
    Lambda関数がS3バケットにアクセスできるように、IAMロールに以下のポリシーを追加します。

    • AmazonS3FullAccess
    • AmazonS3ObjectLambdaExecutionRolePolicy
  • タイムアウト時間の設定
    Lambda関数のタイムアウト時間を1分に設定します。
    image.png

S3 Access Pointの作成

サイドバーから「汎用バケットのAccess Points」を選択し、「アクセスポイントの作成」をクリックします。

S3ap.png

アクセスポイント名を入力し、先ほど作成したS3バケットを選択します。
ネットワークオリジンは「インターネット」を選択して「アクセスポイントの作成」をクリックします。

image.png

S3 Object Lambda Access Pointの作成

サイドバーから「Object Lambdaアクセスポイント」を選択し、「Object Lambdaアクセスポイントの作成」をクリックします。

Object Lambdaアクセスポイント名を入力し、作成したS3 Access Pointを選択します。
S3 APIはGetObjectを選択し、作成したLambda関数を選択します。

image.png

動作確認

最後に、S3 Object Lambdaアクセスポイントから画像を取得してみます。
作成したS3 Object Lambdaアクセスポイントを選択し、画像にチェックを入れて「開く」または「ダウンロード」をクリックします。
s3objectlambda結果.png

無事、モノクロに変換された画像が表示されました。
okinawa2.png

おわりに

知ってるけど使ったことがないサービスはまだまだあるので、今後もたくさん試していきたいと思います。
最後まで読んでいただきありがとうございました!

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?