Amazon S3に画像をアップロードしたらAWS LambdaでPythonを実行させてグレースケール画像に変換してAmazon S3に保存する方法

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ディレクトリが作成されその中にグレースケールに変換された画像が保存されます。

お気軽にコメントをどうぞ

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください