今回は外部のライブラリを使用しての AWS Lambda の設定を行います。
【関連記事】
・AWS LambdaでS3にファイルがアップロードされたのを検知する
・AWS LambdaでS3にファイルがアップロードされたら、加工して別フォルダにファイルを作成する(Python)
・AWS Lambdaをpython-lambda-localとlambda-uploaderを使ってローカル開発してみる
今回実施する内容として、zipファイルをAWSマネージメントコンソールからアップしての方法となります。
前提として前回の「AmazonLinuxでpyenvを利用してPython3.6の仮想環境の構築(Vagrant)」で仮想環境の構築を行っておきます。
Lambda関数の作成
さて、前回の項目の最後の部分ですが、AmazonLinux に python3.6 の仮想環境を作り、pandas をインストールしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$ mkdir sampleFunction $ cd sampleFunction $ pyenv local python3.6 (python3.6)$ pip install pandas -t . (python3.6)$ tree -L 1 . ├── __pycache__ ├── bin ├── dateutil ├── numpy ├── numpy-1.15.1.dist-info ├── pandas ├── pandas-0.23.4.dist-info ├── python_dateutil-2.7.3.dist-info ├── pytz ├── pytz-2018.5.dist-info ├── six-1.11.0.dist-info └── six.py 11 directories, 1 file |
次に同じフォルダで Lambda の実行ファイルとなる「lambda_function.py」を作成します。
1 2 3 |
(python3.6)$ vi lambda_function.py |
以下を作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# -*- coding: utf-8 -*- import urllib.parse import boto3 import io import numpy as np import pandas as pd print('Loading function') s3 = boto3.client('s3') def lambda_handler(event, context): # Get the object from the event and show its content type input_bucket = event['Records'][0]['s3']['bucket']['name'] input_key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8') try: response = s3.get_object(Bucket=input_bucket, Key=input_key) data = pd.read_csv(io.BytesIO(response['Body'].read()), index_col=0) for i, v in data.iteritems(): print(i) print(v) except Exception as e: print(e) print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket)) raise e |
pandas を使っていますがこちらでは表示だけで。
外部ライブラリを使えているかの確認になります。
さて、続けて同一フォルダでzip圧縮ファイルを作成します。
1 2 3 |
$ zip -rq lambda.zip . |
こちらのファイルでアップするファイルの準備はできました。
Lambdaの関数をAWSマネージメントコンソールで作成
Lambdaの管理画面から「一から作成」を選択し、ランタイムは「python3.6」で新しい関数を作成します。
次に「コードエントリタイプ」で「.zipファイルをアップロード」を選択し、作成した「lambda.zip」をアップロードします。
次にトリガーの設定をします。
以前に実施したようにS3にファイルが上がったものをトリガーにします。
トリガーは以下のように設定しました。
今回はロールは特に意識せず以前のものを利用しています。
また、アップしたファイルが大きいので、インラインコードでの編集は実施できません。
Lambda 関数の圧縮したデプロイパッケージのサイズが 3MB を超える場合は、Lambda コンソールでインラインコードを編集する機能を使用することはできません。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/limits.html
ファイル変更の際はzipファイルを都度アップロードする必要があります。
さて、上記で実行環境は整いましたのでS3にファイルをアップロードします。
今回、アップロードしたファイルは以下でした。
1 2 3 4 5 6 |
id,name,age 1,Taro,32 2,Miku,23 3,Yuuichirou,44 |
結果は CloudWatch でログストリームとして出力されます。
無事、結果が出力されています。
外部モジュールを読み込んだことで、メモリーの利用も大きくなっているようです。
外部モジュールを使えることでかなりのシステムが Lambda を利用して作れることがわかりました。
今回はこれまでで。
【関連記事】
・AWS LambdaでS3にファイルがアップロードされたのを検知する
・AWS LambdaでS3にファイルがアップロードされたら、加工して別フォルダにファイルを作成する(Python)
・AWS Lambdaをpython-lambda-localとlambda-uploaderを使ってローカル開発してみる
このブログは株式会社CoLabMixによる技術ブログです。
GCP、AWSなどでのインフラ構築・運用や、クローリング・分析・検索などを主体とした開発を行なっています。
Ruby on RailsやDjango、Pythonなどの開発依頼などお気軽にお声がけください。
開発パートナーを増やしたいという企業と積極的に繋がっていきたいです。