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

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/」がついています。

 

関数について

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

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

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

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

 

さて、「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で確認すると以下のようになります。

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

 

最終的なアウトプット

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

 

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

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

 

このブログは株式会社CoLabMixによる技術ブログです。

GCP、AWSなどでのインフラ構築・運用や、クローリング・分析・検索などを主体とした開発を行なっています。

Ruby on RailsやDjango、Pythonなどの開発依頼などお気軽にお声がけください。

開発パートナーを増やしたいという企業と積極的に繋がっていきたいです。

お問い合わせやご依頼・ご相談など

    関連記事

    1. React(JavaScript)でサーバー時刻を表示

    2. Scrapyでデータ取得でクローリングで取得したURLから検索する(S…

    3. AmazonLinuxでpyenvを利用してPython3.6の仮想環…

    4. Rails5.2.0(Beta)のインストール

    5. autditbeatをcentos7にインストールして監査ログをとって…

    6. Pythonでのgoogle-cloud-bigqueryライブラリを…