はじめに
Pythonを使ってAmazon S3にファイルをアップロードするでは、Python 用 AWS SDK である Boto3 を用いて Amazon S3 へのファイルアップロードを行った。この際、保存されているファイルのパスを指定していたが、ローカルにファイルを残したくない場合や準リアルタイムに結果を送りたい場合、ファイルを一度保存してそのパスを指定するのは望ましくない。本記事では、Python でよく用いられる DataFrame 形式のデータを CSV ファイルとして保存することなく一時ファイルのままで Amazon S3 へアップロードすることを試みた。S3.Client.upload_fileobj を参考にした。
S3 へファイルオブジェクトをアップロード
以下コードでファイルオブジェクトを Amazon S3 へアップロードできる。Boto3 のインストールや AWS API キーの準備、Amazon S3 へのアクセスは Pythonを使ってAmazon S3にファイルをアップロードするを参照。
import boto3
import tempfile
def upload_to_s3(fileobj, Bucket, Key):
client = boto3.client('s3')
with tempfile.NamedTemporaryFile() as tf:
with open(tf.name, 'w+') as f:
f.write(fileobj)
client.upload_fileobj(tf, Bucket, Key)
df = pd.DataFrame({'name': ['Raphael', 'Donatello'],
'mask': ['red', 'purple'],
'weapon': ['sai', 'bo staff']})
fileobj = df.to_csv()
Bucket = 'my-bucket'
Key = 'result/result.csv'
upload_to_s3(file_obj, Bucket, Key)
おわりに
DataFrame をファイルとして保存することなく Amazon S3 に送ることができた。以前書いたFastAPI で作成した Web API にて、リクエストボディのデータを DataFrame に直接入れるや機械学習モデルの推論結果を返す Web API を FastAPI で作成と合わせることで、POST リクエストで受け取ったデータをそのまま DataFrame として読み込み、学習済みモデルで予測を行い、その予測結果である DataFrame を Amazon S3 へ送るといった一連の流れが構成できる。