はじめに
今回は、AWSのサーバーレスアーキテクチャを利用して、画像がS3にアップロードされると自動でリサイズ(サムネイル生成)されるサービスを構築しました。開発には、AWS Lambda、Amazon S3、CloudFormation(SAM テンプレート)、そしてSAM CLIを活用し、インフラをコード化するメリットと自動化の手法を学びました。
S3の画像をリサイズ化するだけのサービスなので、特にリリースなどはしていませんが
コードは公開しているので気になった方はどうぞ↓
GitHub - Saburi314/lambda_resize_image
Contribute to Saburi314/lambda_resize_image development by creating an account on GitHub.
プロジェクトの概要
サービスの目的
- 画像リサイズ自動化:
ユーザーがS3バケットに画像をアップロードすると、Lambda関数がトリガーされ、画像をリサイズしてサムネイルを生成。生成されたサムネイルは同じバケット内のthumbnails/
フォルダに同様の名前で保存されます。

使用したAWSサービス
- AWS Lambda:
画像のリサイズ処理を実行するサーバーレスコンピューティングサービス。Pillowライブラリを使い、画像の加工を実施。 - Amazon S3:
画像のアップロード先として利用。さらに、S3イベント通知により、画像のアップロード時にLambda関数が自動的に起動します。 - AWS CloudFormation (SAM テンプレート):
インフラをコードとして管理。SAMテンプレートにより、Lambda関数、S3バケット、IAMロールなどのリソースを一括で作成・更新。 - IAM:
Lambda関数がS3から画像を読み取り、アップロードできるように必要な権限(s3:GetObject、s3:PutObjectなど)を実行ロールに付与しました。 - SAM CLI:
ローカルでのビルド、パッケージング、デプロイ作業を自動化し、CloudFormationスタックとしてリソースを展開するために使用しました。
作業の流れ
1. 開発環境の構築とソースコードの作成
- ローカル環境セットアップ:
Pythonの仮想環境(venv)を作成し、依存パッケージ(Pillowなど)をインストール。 - Lambda 関数の実装 (lambda_function.py):
S3イベントを受け取った際に、対象画像を取得し、Pillowでリサイズ処理を行い、thumbnails/
フォルダへアップロードするコードを実装しました。 - SAM テンプレートの作成 (template.yaml):
CloudFormation(SAM)テンプレートで、以下のリソースを定義しました。- S3バケット(MyImageUploadBucket)
- Lambda関数(ImageResizerFunction)
- Lambda関数のトリガーとして、S3イベント通知(拡張子が
.jpg
の場合に発火)
- 依存関係の管理 (requirements.txt):
Pillowなど必要なPythonパッケージを記載し、SAM Buildで自動的に取り込む設定にしました。
2. ビルド、パッケージング、デプロイ
- ビルド:
sam build --use-container
コマンドで、Linux環境に合わせたビルドを実行。これにより、依存関係が正しくインストールされ、ビルド成果物が.aws-sam/build/
に生成されました。 - パッケージング:
ビルド済み成果物を指定のデプロイ用S3バケット(例: my-image-upload-bucket-20250316)にアップロードするため、以下のコマンドを使用しました。 bashコピーするsam package --template-file .aws-sam/build/template.yaml --output-template-file packaged.yaml --s3-bucket my-image-upload-bucket-20250316
- デプロイ:
パッケージ済みテンプレートを使用してCloudFormationスタックを作成し、全リソース(Lambda、S3、IAMロール等)を一括でデプロイしました。 bashコピーするsam deploy --template-file packaged.yaml --stack-name my-image-resizer-stack --capabilities CAPABILITY_IAM --region ap-northeast-1

3. 動作確認と学習の成果
- S3バケットへの画像アップロード:
定義したS3バケットに画像をアップロードすると、設定したS3イベント通知によりLambda関数が起動。 - リサイズ処理の検証:
Lambda関数は画像を取得し、サムネイルとしてリサイズして、thumbnails/
フォルダにアップロードされることを確認しました。 - CloudWatch Logsでの検証:
Lambdaの実行ログをCloudWatchで確認し、エラーがなく正常に動作していることを確認しました。
まとめ
今回のプロジェクトでは、AWSのサーバーレス技術を活用し、CloudFormation(SAMテンプレート)でリソースをコードとして管理する手法を学びました。以下の点が特に重要でした。
- インフラのコード化:
SAMテンプレートでLambda、S3、IAMなどのリソースを一元管理することで、再現性と管理の容易さが向上。 - 自動化:
定期実行やイベント駆動により、手動作業を大幅に削減し、効率的な運用が可能になる。 - セキュリティとアクセス管理:
IAMロールに適切な権限を付与し、LambdaがS3上の画像を安全に操作できるように設定。
学習を通して、SAM CLIを使ったローカルテスト、パッケージング、デプロイの一連のプロセスを体験しました。
サーバーレスの考え方は少し前から流行っていましたが、触れずじまいだったので良い勉強になりました。Cloud Formationも初めて触りましたが、インフラをコード化して扱えるのはかなり良いですね。
サーバー関連の設定関連はどうしてもAIに聞きにくい部分があったりしますが、コード化しているおかげでAIに質問しやすいという恩恵も受けられていると感じました。
AWSにはまだ私の知らない優れたサービスがいっぱいあるので、今後も学習していきます。