😊

Powertools for AWS (Python) を用いた S3 Trigger のカスタマイズ方法

2024/02/26に公開

こんにちは。hayata-yamamoto です。

今回は、Powertools for AWS (Python) を用いて、S3 のイベントトリガーで動く Lambda 関数の提供方法を紹介します。私が思うに、Lambda と S3 はファイルアップロード時に何か処理を非同期で動かしたい時にとても便利で、多くの利用事例があるイメージです。これから、何か実装しようと思ってる方の参考になれば嬉しいです

https://zenn.dev/todoker_blog/articles/217da602e2cff3
https://zenn.dev/todoker_blog/articles/91ac3ebcb1fe0d
https://zenn.dev/todoker_blog/articles/1ac4d61f4e42fd
https://zenn.dev/todoker_blog/articles/c616fe424fb671

S3 と Lambda の統合はどのようなもの?

公式によりますと、

Amazon Simple Storage Service からのイベント通知は、Lambda を使用して処理することができます。Amazon S3 は、オブジェクトを作成または削除するときに、イベントを Lambda 関数に送信できます。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-s3.html

具体的な利用シーンは、S3に何かオブジェクトがアップロードされたら処理の処理をかけておく、と言ったシーンでしょうか。クライアントから直接S3にファイルをアップロードするシーンがある場合は、こちらのトリガーがとても便利に使えます。

使い方

さて、このS3トリガーですが、以下のようなシーケンスを想定して動かします。

どのようなシーンで Lambda に変更が通知されるかは以下も合わせて確認するのがお勧めです。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/EventNotifications.html

実装例は以下のような感じになります。実際の処理の内容はケースバイケースですが、アップロードされた画像を事前に何か加工したり、外部のAPIを呼び出したりするのが便利そうですね

import re
from urllib.parse import unquote_plus

from aws_lambda_powertools.utilities.data_classes import S3Event, event_source


@event_source(data_class=S3Event)
def handler(event: S3Event, context: dict) -> None:
    print(f"{event.raw_event=}")
    for message in event.records:
        try:
            key = unquote_plus(message.s3.get_object.key)
	    do_something(key)
        except Exception as e:
	   print(e)

おわりに

もしご興味お持ちいただけた方は、ぜひカジュアル面談にお越しくださいませ!

トドケールテックブログ

Discussion