新ネットワークスペシャリスト道

ネットワーク、セキュリティ、何の話?

【AWS 100日チャレンジ - 63日目】Lambda による S3 アップロード時の自動画像変換(またはログ記録)

AWSの知識を血肉にするための「AWS 100日チャレンジ」の63日目です。

 

AWS 100日チャレンジの記事を書く上でのルール

・100日連続アウトプット!

・継続が第一、クオリティは第二

・「社会人のリアル」を忘れない(持続可能な完走を目指す)

・コアな学習に全集中!
 テーマとするサービス以外は、CloudFormationや構築済みの資産をフル活用。効率よく「核心」を突き詰めます。

課題

Lambda による S3 アップロード時の自動画像変換(またはログ記録)

実施 

1.S3バケット作成

変換元と変換先のバケット作成

変換元:xxx-source-image-backet

変換先:xxx-after-image-bakchet

バケット名だけ入力しあとはデフォルト設定で作成。

 

2.IAM ロールの作成

IAMロール名:xxx-imagechange-role

許可ポリシー:

 AmazonS3FullAccess

 AWSLambdaBasicExecutionRole

 

3.Lambda 関数の作成

lambda名:xxx-imagechange-function

関数を作成 :一から作成

そのほかはデフォルト。

 

ソースコードは以下。

import boto3
import os
import sys
import uuid
from PIL import Image

s3_client = boto3.client('s3')

def lambda_handler(event, context):
    # イベントからバケット名とファイル名を取得
    source_bucket = event['Records'][0]['s3']['bucket']['name']
    key = event['Records'][0]['s3']['object']['key']
    
    # ログ記録
    print(f"File uploaded: {key} in bucket {source_bucket}")

    # 出力先バケットの設定
    dest_bucket = "xxx-after-image-bakchet"
    download_path = f"/tmp/{uuid.uuid4()}{key}"
    upload_path = f"/tmp/resized-{key}"

    # S3から画像をダウンロード
    s3_client.download_file(source_bucket, key, download_path)

    # 画像リサイズ処理
    with Image.open(download_path) as image:
        image.thumbnail*1 # 例:最大128pxにリサイズ
        image.save(upload_path)

    # S3にアップロード
    s3_client.upload_file(upload_path, dest_bucket, f"resized-{key}")
    
    print(f"Successfully resized and uploaded to {dest_bucket}")

 

手順2で作成したロールをlambdaに設定

 

 

トリガーを追加。

 

 

一般設定タブをクリック。

 

メモリを512MBにして、タイムアウトを1分に設定。

 

 

Lambda の標準環境には画像処理ライブラリ Pillow が入っていないため、外部から持ち込む必要がある。

そのためにレイヤーが必要。

 

レイヤーを事前に登録

 

レイヤーの追加をクリック。

 

今日はここまで、明日に続けます。

 

*1:128, 128