AWS Lambda でS3にファイルがアップロードされたら、加工して別フォルダにファイルを作成する(Python)

AWS Lambda でS3にファイルがアップロードされたら、加工して別フォルダにファイルを作成する(Python)

さて、前回に続き AWS Lambda での少し複雑になった設定を今回は Python で。

【関連記事】
AWS LambdaでS3にファイルがアップロードされたのを検知する
外部のライブラリを利用してのAWS Lambdaの設定
AWS Lambdaをpython-lambda-localとlambda-uploaderを使ってローカル開発してみる

 

AWS Lambda で実行する環境について

今回はS3の特定バケットのフォルダ上にinputファイルが置かれた時に、そのS3イベントを検知してCSVファイルをJSONに加工して別フォルダに置くという動作をやってみます。

バケット s3://sample-app01.developer-collaboration.com
inputのフォルダ(CSVを置く) sample-app01.developer-collaboration.com/input
outputのフォルダ(JSONを置く) sample-app01.developer-collaboration.com/output

inputのフォルダにファイルがアップされるイメージです。

inputのファイルは以下のようなファイルです。

 

 

関数名は「csvExtractor」とします。

 

トリガーについて

トリガーは前回と同じですが以下のような形で設定となります。
バケットのプレフィックスに「input/」がついています。

AWS Lambda トリガー

 

関数について

さて、次に関数コードについて。

AWS Lambda 関数

ランタイムとして「Python 3.6」を使用しています。

「lambda_function.py」というファイルを起動するので、ハンドラは「lambda_function.lambda_handler」となります。

今回、S3へのファイルの読み書きをするので実行ロールにS3への読み書きをつける必要があります。

AWS Lambda 実行ロール

 

さて、「lambda_function.py」の中身です。

 

幾つかimportはしていますが、外部モジュールは使用していないので「lambda_function.py」の、1ファイルで実行しています。

 

関数の確認

まず、基本的なところで「def lambda_handler(event, context)」について。

こちらのコードでは「lambda_handler」という関数を定義しています。
ハンドラが「lambda_function.lambda_handler」なので、「lambda_function.py」の「lambda_handler」が実行されます。

最初の引数の「event」ではこの関数の実行時に呼び出されるイベントの情報がディクショナリ型で提供されます。

次に「context」の引数でランタイム情報(関数のタイムアウトまでの残り時間や実行中の関数のバージョン、設定されたメモリサイズなど)が提供されます。

また、この関数では戻り値として以下の値を返します。

同期型(RequestResponse)

関数の戻り値をLambda関数の呼び出し元へと返します。

 

非同期(Event)

関数の戻り値はかえりません。値がセットされていたとしても破棄されます。
何も返されない場合、nullという文字列が返されます。

今回のS3イベントでは非同期なので戻り値はありません。

 

CloudWatchでの確認

最終的な状況をCloudWatchで確認すると以下のようになります。

Cloud Watch 確認

実行中のログなどは出していないのでエラーが出なければスッキリのログになります。

 

最終的なアウトプット

また、最終的なアウトプットのファイルは以下のようになりました。

 

実際の運用ではエラー処理でコードは大きくなりそうですが、基本的には色々な処理の前段ではありかなというベースができました。

【関連記事】
AWS LambdaでS3にファイルがアップロードされたのを検知する
外部のライブラリを利用してのAWS Lambdaの設定
AWS Lambdaをpython-lambda-localとlambda-uploaderを使ってローカル開発してみる