Posted at

AWS lambdaを使ってS3にファイルを簡単にアップロード・ダウンロード


AWS LambdaとAWS S3について

簡単に、

AWS Lambdaは、AWSのイベント(トリガー)でコードを実行でき、

AWS S3は、ファイルを保存したりできます(ストレージ)


概要

S3にファイルが保存されると、Lambdaが起動して保存したファイルを加工したりしてS3に保存してみます。

トリガーとなるファイルはテキスト形式で、保存するファイルはjson形式を想定しています。

今回はpythonでの実装を紹介します。


sample.py

import json

import urllib.parse
import boto3

print('Loading function')

s3 = boto3.client('s3')

def lambda_handler(event, context):
#S3上に保存されたファイルのパスを取得
file_key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
#バケット名を指定(イベントでの取得も可)
bucket_name = "sample"
res = s3.get_object(Bucket=bucket_name, Key=file_key)
body = res['Body'].read()
body = body.decode()
# bodyを加工して辞書型に変換してjsonファイルにする
# testはファイルの内容が入る
test = json.dumps(data_list, indent=4)
s3_2 = boto3.resource('s3')
# 加工したファイルの保存先のパス
file_name = 'output/sample.json'
bucket = s3_2.Object(bucket_name, file_name)
bucket.put(Body=test)



説明

Boto3とはAWSの各種サービスを使用できるようにするためのライブラリです。

今回使用したClientsは低レベルなAPIを、Resourcesは高レベルなAPIの機能を提供します。


sample.py

s3 = boto3.client('s3')

s3_2 = boto3.resource('s3')

また、jsonファイルの変換にはjson.dumpではなくjson.dumpsを使用して文字列に変換してからputメソッドに渡しています。

putメソッドを使うことでS3にファイルを保存することができます。


最後に

AWS LambdaをS3にファイルが保存されたら実行という風にトリガーを設定し使うことはよくあるので自分なりの実装方法をまとめてみました。

記事が少なく詰まった所もあるので少しでも実装の参考になれば幸いです。

まあ、ドキュメントを読むことが一番なのかもしれませんが…

ミスなどあれば連絡お願いします。