👾

AWS Transfer Family をつかって S3 にファイルがアップされた場合に Lambda を実行してみる:後編

2024/05/07に公開

はじめに

前回の続きからやっていきます。
https://zenn.dev/rescuenow/articles/4d6d9aa1da1450

後編でやる内容は以下になります。

ファイルが置かれたことを検知してログに書き出すまで:後編

  • SQS の設定
  • Lambda の設定
  • EventBridge の設定

SQS の設定

SQS の設定を行います。
SQS は EventBridge のターゲットとして設定されますし、
Lambda のトリガーにもなるので先に作成します。

今回は S3 にファイルが置かれた順番で処理を行いたいので SQS のタイプを FIFO で作成したいと思います。

SQS が作成されました。

次は Lambda を作成します。

Lambda の設定

今回は python で作成してみようと思います。
SQS からメッセージを取得して 情報をログに書き込むだけの Lambda になります。

Lambda が作成されました。

コードの部分に以下のコードを貼り付けて Deploy します。
※ 今回のコードでは SQS から1つずつメッセージを取得して処理を行うことを想定しているので添え字0だけを扱っています。

import json

def lambda_handler(event, context):
    print("Lambda 実行!")

    # eventオブジェクトからメッセージとキュー名称を取得
    msg = event['Records'][0]['body']
    queue = event['Records'][0]['eventSourceARN']
    print(msg)
    print(queue)

    print("Lambda 完了!")
    
    # メッセージとキューを返す
    return {
        'statusCode': 200,
        'body': {'Message':msg, 'Queue':queue}
    }

動作確認のために Test を実行します。

以下のような SQS のテストイベントを作成して実行します。

成功すると以下のように表示されます。

次に トリガーとして SQS を選択するのですが、その前に Lambda にアタッチされたロールにポリシーを追加します。

ポリシーを追加できたのでトリガーを設定していきます。

追加していきます。

SQS のトリガーが追加されました。

それではここで一旦 SQS からテストでメッセージを送ってみましょう。

メッセージを送信すると Lambda が実行されるはずなので CloudWatch を確認してみます。

実行されていることが確認できました!

これで Transfer Family -> S3 と SQS -> Lambda ができたのでその間を EventBridge でくっつけたいと思います。

EventBridge の設定

今回は default のイベントバスでルールを作成していきます。

イベントのパターンとしては前編で作成した S3 バケットでオブジェクトが作成された場合を設定します。

ルールが作成されました。

これで全てが組み上がったので実際に SFTP サーバにファイルをアップして動作を確認してみます。

先ほどバケットにあげたファイルを削除してもう一度ファイルをアップロードしてみます。

無事にファイルを CyberDuck からアップロードしたら それを検知して Lambda が動いてくれました。

次は複数ファイルをアップロードしたその順番通りにアップロードされるか試してみます。

少し見ずらいですが A.txt, B.txt, C.txt とアップロードした順番に処理されていることがわかります。

これで構築は完了です。

さいごに

いかがだったでしょうか。コンソールで設定する内容が多く前編、後編に分かれてしまいました。
設定している内容自体はそれほど難しくないので一度手を動かして構築してしまえばイメージが掴めると思います。ただし本格運用するにはデッドレターキューなどまだまだ調整が必要になると思います。
とはいえ、SQS -> Lambda など部分的に抜き出しても使える設定だと思うのでぜひお試しください。
注意点! SFTP サーバは作成されているだけで以下の料金がかかってしまうので気をつけてください。

https://aws.amazon.com/jp/aws-transfer-family/pricing/

https://zenn.dev/rescuenow/articles/4d6d9aa1da1450

レスキューナウテックブログ

Discussion