この記事は、ハンズラボ Advent Calendar 2018 12日目の記事です。
先日のAWS:reInventで発表されたLambdaLayersでpandas
のlayerを作成して、lambda
から使用していきたいと思います。
概要
今までではlambda関数ごとにパッケージし、デプロイしなければいけません。
共通で使用したい関数やライブラリはその都度パッケージの際にpip
などで入れる必要がありました。
numpy
やpandas
といったPure PythonでないライブラリはAmazonLinux環境でインストールしたファイルを使用してパッケージする必要があります。
実際、Lambdaを1つ作成する作業としては手間がかかります。
LambdaLayersにより共通で使用したい関数やライブラリをLayerに設定しておくことで、複数のLambda関数から呼び出すことができます。
すでにnumpy
とscipy
を使用できるLayerをAWSが公開しています。
なんかひとつ足りなくね
numpy
, scipy
と来たらやっぱりpandas
でしょ。(個人の意見)
とりあえずpandas
の依存関係を確認します。
- pandas [required: >=0.15.2, installed: 0.23.4]
- numpy [required: >=1.9.0, installed: 1.15.4]
- python-dateutil [required: >=2.5.0, installed: 2.7.5]
- six [required: >=1.5, installed: 1.11.0]
- pytz [required: >=2011k, installed: 2018.7]
こいつらをzipで固めてLambdaLayer
にアップロードすればいいわけです。
ちなみに依存関係はpipdeptree
確認しました。
zipファイルの作成
最初はdocker
環境でインストールしてzipで固めようと思いましたが、結局EC2インスタンスを作成して行いました。Pythonのバージョンは3.6.5(pyenvでインストール)
- EC2インスタンスを作成(AmazonLinux)してsshで入る
- pyenvを入れる(参考)
- 以下のコマンドを実行
$ mkdir python
$ pip install -t ./python pandas
$ zip -r pandas.zip python
注意点:AmazonLinux2はなくAmazonLinuxで!(どうやらLambdaはAmazonLinuxで動いてるそうです)
最後に、EC2インスタンスから出て、ローカルから作成したpandas.zip
をscp
でローカルにダウンロードすればOK。
また作る機会があると面倒なのでgithubにあげときました。(これをcloneしてきてもいいです。)
Layerの作成
AWSのコンソール画面→Lambda→Layersから作成をします。
名前と説明を書いてzipファイルをアップロードします。
10 MB より大きいファイルの場合は、Amazon S3 を使用したアップロードを検討してください。
とありますが、10MBを超えていてもアップロードできました。(できない場合はS3にアップロードしてURLを入力してください)
ランタイムはPython3.6で。
関数を作成

Lambda

とりあえずpandas
でDataFrame
を作成して出力してみます。
import json
import pandas as pd
def lambda_handler(event, context):
data = {"year": [2010, 2011, 2012, 2013],
"pref":["千葉", "山口", "岐阜", "東京"]}
df = pd.DataFrame(data)
print(df)
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
Layerを追加する



いざテスト

いろんなことができそう
S3に入ってきたcsvファイルを処理して、S3に置き直したり、MySQLにいれたりといろんなことができそうです。
ServerlessFlameworkではすでにLayerのサポートがされているので今回作成した手順より楽かつ早く作成ができるかもしれません。
参考ページ:https://serverless.com/framework/docs/providers/aws/guide/layers/
ハンズラボ Advent Calendar 2018 明日13日目は@sr-mtmtです!