はじめに
S3 Object Lambdaについて、資格試験等で存在は知っていたものの実際に使ったことがなかったので、ハンズオン形式で学んでみました。
本記事では、S3 Object Lambdaを使って画像をモノクロに変換する処理を実装する流れを紹介します。
S3 Object Lambdaとは
S3 Object Lambdaとは、Amazon S3の機能の一つで、S3に保存しているオブジェクトを取得するときに、取得リクエストの途中でカスタム処理(変換やフィルタリングなど)を挟むことができます。
保存された元データを変更せずに、用途に応じてリアルタイムで変換・加工して配信できるため、画像変換やデータマスキングなどの用途に便利です。
具体的には、以下の流れで動作します。
- ユーザーやアプリケーションがObject Lambda Access Pointに対してAPIリクエスト(
GetObjectなど)を送信 - S3 Object Lambda Access Pointがリクエストを受け取り、リクエストに応じてLambda関数を呼び出す
- Lambda関数がS3バケットからオブジェクトを取得し、処理を行う
- 処理結果をS3 Object Lambda Access Pointに返し、最終的にユーザーやアプリケーションにオブジェクトを返す
ハンズオン
S3バケットの作成
まずは画像を保存するためのS3バケットを作成します。
バケット名を入力し、残りの設定はデフォルトのままで「バケットを作成」をクリックします。
作成したバケットを選択し、「アップロード」から画像ファイルをアップロードします。
今回は先日沖縄に行った時の写真をアップロードしました。(とてもきれい)
Lambda関数を作成
S3 Object Lambdaでオブジェクトを取得する際に実行されるLambda関数を作成します。
下の画像のような設定で作成しました。ランタイムはPython3.12です。

- Lambda関数のコード
Lambda関数のコードは以下の通りです。
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)}
- ライブラリのインストール
ローカル環境で以下のコマンドを実行して、必要なライブラリをインストールします。
mkdir -p pillow-layer/python
cd pillow-layer
pip install Pillow -t ./python
zip -r ../pillow-layer.zip python
- レイヤーの作成
コンソール画面に戻り、左側のサイドバーから「レイヤー」を選択し、「レイヤーの追加」をクリックします。
pillow-layer.zipをアップロードし、レイヤー名を入力します。また、先ほど作成したLambda関数と同じアーキテクチャ、ランタイムを選択して「作成」をクリックします。
- レイヤーの追加
作成したレイヤーをLambda関数に追加します。
Lambda関数のコンソール画面の下の方にある「レイヤー」セクションで「レイヤーの追加」をクリックし、先ほど作成したレイヤーを選択します。(画像ではランタイムがPython3.13になっていますが、正しくは3.12です。)
-
Lambda関数のアクセス権限の設定
Lambda関数がS3バケットにアクセスできるように、IAMロールに以下のポリシーを追加します。AmazonS3FullAccessAmazonS3ObjectLambdaExecutionRolePolicy
S3 Access Pointの作成
サイドバーから「汎用バケットのAccess Points」を選択し、「アクセスポイントの作成」をクリックします。
アクセスポイント名を入力し、先ほど作成したS3バケットを選択します。
ネットワークオリジンは「インターネット」を選択して「アクセスポイントの作成」をクリックします。
S3 Object Lambda Access Pointの作成
サイドバーから「Object Lambdaアクセスポイント」を選択し、「Object Lambdaアクセスポイントの作成」をクリックします。
Object Lambdaアクセスポイント名を入力し、作成したS3 Access Pointを選択します。
S3 APIはGetObjectを選択し、作成したLambda関数を選択します。
動作確認
最後に、S3 Object Lambdaアクセスポイントから画像を取得してみます。
作成したS3 Object Lambdaアクセスポイントを選択し、画像にチェックを入れて「開く」または「ダウンロード」をクリックします。

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









