TL;DR
- AWS Lambdaのマネージメントツールlammaを作っているhttps://github.com/ayemos/lamma
- 使ってみて欲しい/issue上げて欲しい
AWS Lambda
Amazon S3上にcsvファイルがアップロードされたら、その集計データをS3上の別のcsvファイルに保存したい
毎週金曜日の21:00に特定のタグがついたEc2インスタンスの過去数時間のCPUUtilization値をチェックして、アイドル状態にあるものは自動的にシャットダウンしたい
などなど、AWS上に構築されたインフラシステムにおいて、あるトリガーが発生したときに、ちょっとしたロジックと実装でもって処理を継続したい、というシチュエーションに最適なサービスがAWS Lambdaです。
AWS Lambdaで予め用意された計算環境(python, Node.jsなどの言語環境と、 AWS SDKの各言語実装などが含まれる)を利用することで、EC2上に計算環境をプロビジョンする手間が省けたり、実行回数とその長さに基づいた課金システムで、非常に安価に利用できるなどの利点があります。
しかし、計算機環境の構築と付き合わなくなった一方で、実装された関数のLambda上でのバージョンコントロールやデプロイ/ロールバックが面倒であるという現状があり、実際apexやlamveryなど、Lambdaのマネジメントツールが開発されています。
lamma
https://github.co/ayemos/lamma
ruby製のAWS Lambdaのマネジメントツール。
すでにあるツールとの差別化という意味で「IoT、ChatBotなどの目的でAWS Lambdaをなるべく手軽に今すぐ使いたい」という人をターゲットに作っているつもりです。
$ gem install lamma
$ lamma init my_function --runtime=python2.7
Looks like you didn't specified role arn for the function.
Do you want me to create default IAM role and configure it (my_function-lamma-role)? (y/n) y
I, [2017-04-06T22:28:53.952278 #5027] INFO -- : Creating role my_function-lamma-role
I, [2017-04-06T22:28:54.863304 #5027] INFO -- : Checking attached role policies for my_function-lamma-role
I, [2017-04-06T22:28:55.243400 #5027] INFO -- : Could not find AWSLambdaBasicExecutionRole policy. Attatching.
I, [2017-04-06T22:28:55.243449 #5027] INFO -- : Attaching minimal policy (AWSLambdaBasicExecutionRole) to my_function-lamma-role
I, [2017-04-06T22:28:55.466092 #5027] INFO -- : Done
create /workspace/my_function/lambda_function.py
create /workspace/my_function/lamma.yml
I, [2017-04-06T22:28:55.468021 #5027] INFO -- : Initializing git repo in /workspace/my_function
$ ls
total 16
drwxr-xr-x 5 yuichiro-someya staff 170 4 6 22:28 ./
drwxr-xr-x 3 yuichiro-someya staff 102 4 6 22:28 ../
drwxr-xr-x 10 yuichiro-someya staff 340 4 6 22:28 .git/
-rw-r--r-- 1 yuichiro-someya staff 357 4 6 22:28 lambda_function.py
-rw-r--r-- 1 yuichiro-someya staff 207 4 6 22:28 lamma.yml
$ lamma deploy -a production
Function my_function doesn't seem to be exist on remote.
Do you want me to create it? (y/n) y
I, [2017-04-06T22:29:14.113561 #9209] INFO -- : Creating new function my_function...
I, [2017-04-06T22:29:14.123244 #9209] INFO -- : Saved the build: /var/folders/kd/_chs6sw13jvg01hlq6nd50k00000gp/T/lamma/05f92074cf833092343cd5414754efef
I, [2017-04-06T22:29:14.448724 #9209] INFO -- : Created new function arn:aws:lambda:ap-northeast-1::function:my_function
I, [2017-04-06T22:29:14.448780 #9209] INFO -- : Publishing...
I, [2017-04-06T22:29:14.605540 #9209] INFO -- : Published $LATEST version as version 1 of funtion: arn:aws:lambda:ap-northeast-1::function:my_function:1
Function alias PRODUCTION doesn't seem to be exist on remote.
Do you want me to create it? (y/n) y
とまあこんな感じに、
gem install lamma
して、
lamma init my_function --runtime=python2.7
して、 lambda_function.py 編集して
lamma deploy -a production
とすると、my_functionとPRODUCTIONエイリアスがクラウド上に生成されます。便利。
一方で、init時に生成されたlamma.ymlは次のように設定値がまるっとはいってます。
$ cat lamma.yml
function:
name: my_function
role_arn: arn:aws:iam:::role/my_function-lamma-role
description: Hello, world.
timeout: 3
memory_size: 128
runtime: python2.7
region: ap-northeast-1
また、複数回デプロイした後は、
lamma rollback -a production
でエイリアスを指定して(デプロイごとに1回のみ)ロールバックすることが出来ます。
(deploy時にエイリアス毎に古いバージョンに向けたエイリアス(LAST)を用意することで実現している。)
lammaの紹介は以上。issueを上げてもらえると開発頑張れます。