Amazon S3に画像をアップロードしたらAWS LambdaでPythonを実行させてグレー画像にしてAmazon S3に保存する仕組みを作ったのでその備忘録です。
実行ロール等のAWS Lambdaの設定は以下をご確認下さい。
Amazon S3に動画をアップロードしたらAWS Lambdaでサムネイルを作成してAmazon S3に保存する方法
S3トリガーの設定について
S3トリガーは以下のように設定して下さい。
- [イベントタイプ] – [ObjectCreatedByPut]
- [サフィックス] – [.jpg]
- [プレフィックス] – [uploads/]
関数コード作成
Pythonの画像処理ライブラリPillow(PIL)を使ってS3にアップロードされた画像(jpg)をグレー画像に変換します。
from PIL import Image import json import boto3 import os import re def lambda_handler(event, context): bucket = event['Records'][0]['s3']['bucket']['name'] key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8') try: s3 = boto3.client("s3") imagePath = "/tmp/" + os.path.basename(key) # S3のバケットからファイルをダウンロード s3.download_file(Bucket=bucket, Key=key, Filename=imagePath) img = Image.open(imagePath) # グレー画像に変換 grayImg = img.convert("L") grayImg.save(imagePath) key = re.sub(r'^uploads/', '', key) # S3のバケットのgrayディレクトリにファイルを保存 s3.upload_file( Bucket=bucket, Key="gray/"+key, Filename=imagePath, ExtraArgs={'ContentType': 'image/jpeg'}) except Exception as e: print(e)
AWS Cloud9でPillow(PIL)をインストール
AWS LambdaはAmazon Linux上で動作していているので、ローカルなどAmazon Linux以外の環境にインストールしたPillowをAWS Lambdaにアップロードすると正しく動作しません。
なので、AWS Cloud9でAWS Lambda環境の上記で作成した関数コードがある場所へアクセスして、以下のコマンドを実行してPillow(PIL)をインストールして下さい。
python3 -m pip install Pillow -t .
S3に画像をアップロード
uploadsディレクトリを作成してその中にjpg画像をアップロードすると、grayディレクトリが作成されその中にグレースケールに変換された画像が保存されます。