こんにちは!新入社員の柴垣です!
突然ですが、Lambdaって機能が多くてどれだけのことができるのかよくわからないですよね💦
・イベント駆動実行
・自動スケーリング
・関数としてのコード実行
・タイムアウト設定
・IAMロールでのアクセス制御
・従量課金
・バージョン管理
等々
色々出来すぎてどう使えばいいかわからないと思うので、今回はこの中の「イベント駆動実行」と「関数としてのコード実行」を使って、「S3に画像がアップロードされると自動でLambdaが処理してログをCloudWatchに記録するソリューション」を作っていきたいと思います!
S3:ファイル(画像など)を保存するAWSのオンラインオブジェクトストレージサービス
Lambda:コードをサーバーなしで自動実行できるサービス(イベント駆動型)
CloudWatch:AWSの動作ログやエラーを記録・監視するサービス
今回メインではない機能紹介
| 機能 | 説明 | 
| 🚀 自動スケーリング | リクエストの数に応じて自動的に関数が並列実行される。大量アクセスにも対応。 | 
| ⏱ タイムアウト設定 | 最大実行時間を設定でき、処理が長引く場合は自動で終了して無駄な実行を防げる。 | 
| 🔐 IAMロールでのアクセス制御 | S3やDynamoDBなど、他のAWSサービスへのアクセスを明示的に許可できる。 | 
| 💰 従量課金 | 実行時間とリソース使用量に応じてミリ秒単位で料金が発生。使った分だけ課金される。 | 
| 📌 バージョン管理 | 関数のバージョンを記録しておける。別名(エイリアス)で環境を使い分けることも可能。 | 
「S3に画像を入れたという、ログが見れるようにしていきます」
Step1:S3バケットを作成
Step2:Lambda関数を作成
Step3:トリガー(S3イベント)を設定
Step4:CloudWatchでログ確認
早速やっていきましょう!
①AWSマネジメントコンソールに移動 → S3に移動 →「バケットを作成」
②任意のバケット名
(※バケット名はAWS全体で一意である必要があります。私は今回は例のバケット名で作ります。)
(例:myimage-upload-bucket) 
③パブリックアクセスはすべてブロックでOK(他もデフォルト設定でOK)
④作成完了(例:バケット「myimage-upload-bucket2」が正常に作成されました)
画像を入れるバケットができました!
①Lambda→「関数の作成」
②名前:S3ImageLogger
③ランタイム:Python3.13 (今回はPython3.13を選びました)
④デフォルトの実行ロールの変更:実行ロール→「基本的なLambdaアクセス権限で新しいロールを作成」
(Lambda関数を作成する際に「基本的なLambdaアクセス権限で新しいロールを作成」とすると、 CloudWatch Logsにログを出すための最低限の権限だけが付与されます。関数の実行内容にかかわらず、他のAWSサービスへのアクセスは明示的に追加しないと使えません。)
⑤作成(例:関数 S3ImageLogger を正常に作成しました。)
⑥コードタグでコードを書く→Deployする
(このコードはS3にファイルがアップロードされたときに自動で実行され、CloudWatch Logsにログを出力するシンプルな処理です)
※コード内容
| 処理内容 | 目的 | 
| event を受け取る | S3からのイベント内容(バケット名・ファイル名)を取得する | 
| bucket と key を抽出 | アップロードされたファイルの保存先と名前を取得する | 
| print() でログ出力 | CloudWatch Logs に内容を記録し、動作確認・デバッグ用に活用する | 
| return でレスポンスを返す | 処理が正常に完了したことを AWS 側に通知する | 
⑦作成完了(例:関数 S3ImageLogger2 が正常に更新されました。)
S3に画像がアップロードされたときに自動で実行され、そのファイル名とバケット名をCloudWatchに記録する処理を作りました!
①Lambda関数画面→「トリガーを追加」
②「S3」を選択
③作成したバケットを指定
④イベントタイプ:「オブジェクトを作成(すべて)」
⑤プレフィックスやサフィックス(例:.jpg)で絞ってもOK
再帰呼び出し✔ → 追加
(実際には今回の関数はS3に書き込みを行わないため、再帰は発生しません。 
それでもAWSが「再帰呼び出しの可能性があります」と警告するのは、トリガーの範囲を限定しない場合、将来的にS3への書き込み処理を追加したときにループが起きるリスクがあるからです。そのため、トリガーを追加するには「了承」にチェックする必要があります。) 
S3に画像をアップロードすると自動でLambda関数を呼び出す処理が作れました!
①画像をS3バケットにアップロード
②CloudWatch→「ロググループ」→Lambda関数名のグループを選択
③ログストリーム内に出力あり
※ログ説明
| タイム スタンプ | ログ種別 | 内容 | 
| 2025-05-19T04:43:19.360Z | INIT_START | Lambda関数の初期化が開始された。Python 3.13 ランタイムが使われ、コールドスタートであることを示す。 | 
| 2025-05-19T04:43:19.444Z | START | Lambda関数の実行が開始された。RequestId によりこの実行が識別される。 | 
| 2025-05-19T04:43:19.445Z | ログ出力 | 「S3イベント発生」:Lambda関数内の処理でS3からのトリガーイベントを検出した旨が出力されている。 | 
| 2025-05-19T04:43:19.445Z | ログ出力 | 「アップロードされたファイル: HappyFace.jpg(バケット: myimage-upload-bucket2)」:アップロードされた画像ファイルとS3バケット名が出力された。 | 
| 2025-05-19T04:43:19.446Z | END | Lambda関数の実行が完了した。RequestId によりこの実行を追跡できる。 | 
| 2025-05-19T04:43:19.447Z | REPORT | 関数の実行に要した時間は 1.95ms、請求対象時間は 2ms。 メモリ使用量などの実行リソース情報が含まれる。 | 
| 上下部のメッセージ(日本語) | システム通知 | CloudWatchのUI上で「現時点ではイベントはありません」と表示され、自動再試行が停止していることが示されている。 | 
設定したログが出てきましたね!これで完了です!簡単でしたよね!
AWSを使うことで私たちの管理が楽になる、そんな機能をLambdaは特に感じさせてくれます!
この機能を応用することで
Lambdaが画像ファイルを受け取ったとき、そのファイルの拡張子やMIMEタイプを確認して、 
「許可された画像形式かどうか」を自動でチェックできます。 
たとえば、JPEGとPNGだけを受け入れて、その他(GIFやHEICなど)は弾くような処理ができます。 
セキュリティ対策や、フォーマット統一に役立ちます。
アップロードされた画像のサイズ、解像度、カメラ情報(Exif)などのメタデータを取得し、 
その情報をDynamoDBに記録したり、画像ファイルのS3オブジェクトにタグとして追加することが可能です。 
画像管理がしやすくなり、検索や分類にも活用できます。
画像がS3にアップされたら、Lambdaでリサイズ処理を行い、縮小版(サムネイル)画像を生成して、 
別のS3バケットや特定のプレフィックスに保存する仕組みが作れます。 
Webサイトやギャラリーの高速表示に使える「自動画像最適化」が実現できます。
画像がアップされたら、LambdaがAmazon SNS(Simple Notification Service)と連携して、 
メールやSMS、Slackなどに通知を送ることができます。 
通知内容にはファイル名やアップロード者の情報などを含められます。 
不審なアップロードや、即時の確認が必要な場合にとても便利です。
S3に保存された画像に対して、「アップロードから30日経過したら自動で削除する」ような処理をLambdaとEventBridge(スケジュール実行)で実装できます。 
または、S3のライフサイクルルールと連携する方法もあります。 
ただの自動削除ならS3のライフサイクルルールだけで十分ですが、LambdaとEventBridgeを使うと「JPEGだけを30日後に削除」などファイル形式による条件指定が可能です。削除前に通知を送ることもできます。
ストレージ容量の節約や、古いデータの自動整理に役立ちます。
等々、色々なことができてしまいます!
今回のブログ内容をきっかけにLambdaをもっと理解すれば、AWSをもっと効率よくもっと楽に扱うことができる、つまり簡単に情報を扱える!
これからのIT社会で生きやすくなりますね!
ブログを最後まで読んでいただきありがとうございました! それでは良いAWS生活を!(^^)!