Yuta NakataのBlog

Python / AWS / ITについて役立つ情報を発信します

【入門】awswrangler(aws-sdk-pandas)の使い方|Lambdaでboto3/pandasを置き換える方法

awswrangler(aws-sdk-pandas)ってなに?

AWSの各種サービスとの統合を簡単に行ってくれるパッケージです。

Athena, Glue, Redshift, Timestream, OpenSearch, Neptune, QuickSight, Chime, CloudWatchLogs, DynamoDB, EMR, SecretManager, PostgreSQL, MySQL, SQLServer and S3 (Parquet, CSV, JSON and EXCEL)

等、各種AWSサービスに対応しています。

Githubのリンクはコチラ

github.com

個人的にいい体験だなと感じるユースケースとしては

Lambda Layerが提供されているため、ARNを指定するだけで使えることが魅力的だと感じています

どれぐらい簡単になるか、実際に見てましょう。

よくあるサンプルコード

最も一般的なユースケースとして、

S3からデータを読み、Lambdaで計算処理をして書き出すプログラム

を書いてみましょう。

その1 : boto3/pandasを使う場合

import boto3
import pandas as pd

BUCKET_NAME = 'my-test-bucket'
OBJECT_NAME = 'hello.csv'
FILE_NAME = '/tmp/helllo.csv'
RESULT = '/tmp/result.csv'
Key = 'result.csv'

client = boto3.client('s3') # boto3.clientのインスタンスを立てる
s3.download_file('BUCKET_NAME', 'OBJECT_NAME', 'FILE_NAME') # S3からデータをダウンロード

df = pd.read_csv(FILE_NAME) # データの読み込み

df.to_csv(RESULT) # データの書き出し

client.upload_file(RESULT, BUCKET_NAME, Key) # S3へのアップロード

となります。

ポイントは、

  • boto3を使って、一度ダウンロードしなければいけない
  • ダウンロードしたデータを読み込み、一度書き出さなければいけない
  • 書き出したデータをアップロードしなければいけない

これをawsranglerで書くとどうなりますでしょうか?

また、この実装をLambdaで実現する場合、Lambdaのストレージ領域として/tmp/以下しか使えません。

lambdaに不慣れな場合、この操作でまずはつまずくことも予想されます。

ちなみに、Lambdaをローカルで実行する方法については、下記で解説しています。

www.yuta-nakata.net

その2:awswranglerを使うと読み書きが簡略化できる

import awswrangler as wr

BUCKET_NAME = 'my-test-bucket'
OBJECT_NAME = 'hello.csv'
Key = 'result.csv'

df = wr.s3.read_csv(f's3://{BUCKET_NAME}/{OBJECT_NAME}') # S3から直接データを読んでくれる

df.to_csv(f's3://{BUCKET_NAME}/{Key}') # S3に直接データを書き出せる

です。とても簡素にかけて素晴らしいです。

awswranglerが内部的にboto3/pandasをラップしてくれているので、上記のような処理が実現できます。

そもそも、LambdaやPandasのパフォーマンス性能を上げたい!って場合は下記の記事を参考にしてみてください。

www.yuta-nakata.net

www.yuta-nakata.net

www.yuta-nakata.net

www.yuta-nakata.net

その他、よく使いそうな関数

excelファイルの読み込み

import awswrangler as wr
df = wr.s3.read_excel('s3://bucket/key.xlsx')

jsonの読み込み

import awswrangler as wr
df = wr.s3.read_json(path='s3://bucket/prefix/')

ダウンロード

import awswrangler as wr
wr.s3.download(path='s3://bucket/key', local_file='./key')

書き出し

import awswrangler as wr
wr.s3.upload(local_file='./key', path='s3://bucket/key')

オブジェクトのlist表記

import awswrangler as wr
wr.s3.list_objects('s3://bucket/prefix')
['s3://bucket/prefix0', 's3://bucket/prefix1', 's3://bucket/prefix2']

awswranglerのメリットとしてARNが提供されている

上記のように、awswranglerを使うと簡単に書くことができ、また

AWS上でのインストールが簡単

だからです。

具体的には、

arn:aws:lambda::336392948345:layer:AWSSDKPandas-Python<python-version>:<layer-version>.

のような形でインストールを行います。

arnの一覧ページは下記を参照ください。

aws-sdk-pandas.readthedocs.io

通常、サードパーティ製のライブラリを使う場合は、

  • zipファイル化してLayerとして展開
  • lambda containerを用いて、コンテナ化

等、そもそもサードパーティ製のライブラリを使うための準備に一苦労します。

どうしても、サードパーティ製のライブラリを爆速で使いたい場合、下記を参照ください

www.yuta-nakata.net