サーバーレスアプリケーション開発入門 – AWS Cloud Formation(SAM)、Lambda、S3, を使った画像リサイズサービスの構築

AWS

はじめに

今回は、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にはまだ私の知らない優れたサービスがいっぱいあるので、今後も学習していきます。

タイトルとURLをコピーしました