AWSの知識を血肉にするための「AWS 100日チャレンジ」の63日目です。
・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 Images3_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






















