艦これメモ+開発メモ+その他若干

ゲーム「艦隊これくしょん」の自分用メモとそれに基づいた簡単な記事、開発関連の自分用メモ、旅行時のメモなど

AWS lambdaの学習メモ01

AWS lambda で python3.6を使う必要が出たので、AWSの公式チュートリアル(nodejsを使うもの)を参考に、ちょっとチュートリアルこなしてみました。そのさいの環境構築や、コマンドラインで指定すべき値をどこから取得するか、などのメモです。
この文書は チュートリアル: Amazon S3 で AWS Lambda を使用する - AWS Lambda を補足するメモなので、単体で読んでもあまり意味がないと思います。

やりたいこと

AWS lambda を python3.6で使ってみる。
そのさい、ローカルで仮想環境を用意し、仮想環境上で試験した上で zip に固めて lambda 関数にアップするところまでの手順をまとめる。

仮想環境を用意するメモ

手元の環境は MacOS X Sierra
/usr/bin/python に python2.7、/usr/local/bin/python3 に python3.6 が導入済みです。

今回はpython3の機能で仮想環境を作ります。

AWSチュートリアル: Amazon S3 で AWS Lambda を使用する - AWS Lambdapython でこなす場合、サンプル Amazon Simple Storage Service 関数コード - AWS Lambda を参考にすることになります。
チュートリアルを行うために、python3.6の仮想環境を用意しました。
AWS公式ドキュメントでは virtualenv を使うよう求めていますけど、今回はお手軽な違う手法をとりました。
(pythonの仮装環境、pyenvとかvirtualenvとか複数ある上にバージョンによってはpython3そのものに組み込まれてたり別途 pip install しないといけなかったり、異なるpython実装系 - 例えば PyPy とか)を使うためには手順の制約があったり、面倒臭いですね)

$ python3 -m venv lambda_training_1
$ cd venv_lambda_traing_1
$ source bin/activate

次に、公式チュートリアルで求められているライブラリを仮装環境に導入します。

$ pip install Pillow
$ pip install boto3

いちおうこれで必要な仮装環境(と公式チュートリアルを行うにあたって求められるライブラリの導入)は済みました。

lambdaにアップするパッケージの生成とアップのメモ

こんなかんじでライブラリこみのzipをまず生成。

$ cd $VIRTUAL_ENV/lib/python3.6/site-packages
$ zip -r9 . /path/of/zipfile.zip

lambda用のpythonのコードが書かれたファイルを足す。

$ zip -g /path/of/sourcefile.py /path/of/zipfile.zip

zipファイルをアップロード。

$ aws lambda  create-function --function-name CreateThumbnail --zip-file fileb://zipfile.zip --handler handler --runtime python3.6 --role arn:aws:iam::9999999999:role/lambda-s3-role --timeout 10 --memory-size 1024 --profile huge

ここで runtime の選択肢はGUIからlambda関数を作ろうとした時の選択肢を参照。
role指定ですが、AMIの画面に移動して「ロール」から使いたいロールの詳細画面に移動すると、「ロールAPN」という項目が見つかると思います。大抵は arn:aws:iam::xxxxxxxxxxx:yyyyyy みたいな形の文字列です。これを指定します。GUIからlambda関数を作る際に指定するロールはエイリアスで、実態はこのarn:ナントカの方です。
timeoutとmemory-sizeは、まぁ、見てわかると思うので割愛。

もし、構成済みのlambdaの設定を変えたい場合は、こんなかんじ。

$ aws lambda update-function-configuration --function-name name_of_lambda_function --timeout 30

もし zip を上書きしたい場合は、こんなかんじ。

$ aws lambda  update-function-code --function-name CreateThumbnail --zip-file fileb://CreateThumbnail.zip 

トラブルシュート

profile指定時にリージョン設定しろとか言われた場合

aws configure または aws configure --profile hoge で上書きする。
これを実行しても ~/.aws/credential は特に変わってないように見えて、こっそりリージョンとかmodeとかそのへんが更新されてたりするよ。

macで環境構築時に pip install 中に six がどうこう言われて失敗する

virtualenvとか使う場合、たまに発生します。--ignore-installed six で無理やり無視します。

$ sudo pip install virtualenvwrapper --ignore-installed six

すげーどうでもいいけど、はてなのエディタ、aws って入れたら誤字判定されて was に書き換えられたりするので、すげー使いにくい。
自分責任の誤字は許容するから勝手に内容変えないでほしい。