lammaで始める等身大のAWS Lambda

(https://medium.com/@ayemos/lamma%E3%81%A7%E5%A7%8B%E3%82%81%E3%82%8B%E7%AD%89%E8%BA%AB%E5%A4%A7%E3%81%AEaws-lambda-d032addc5f4d より転載)

# 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をなるべく手軽に今すぐ使いたい」という人をターゲットに作っているつもりです。

```shell-session
$ 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
```

とまあこんな感じに、
```shell-session
gem install lamma
```

して、

```shell-session
lamma init my_function --runtime=python2.7
```

して、 lambda_function.py 編集して

```shell-session
lamma deploy -a production
```

とすると、my_functionとPRODUCTIONエイリアスがクラウド上に生成されます。便利。

一方で、init時に生成されたlamma.ymlは次のように設定値がまるっとはいってます。

```shell-session
$ 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
```

また、複数回デプロイした後は、

```shell-session
lamma rollback -a production
```

でエイリアスを指定して(デプロイごとに1回のみ)ロールバックすることが出来ます。
(deploy時にエイリアス毎に古いバージョンに向けたエイリアス(LAST)を用意することで実現している。)

lammaの紹介は以上。issueを上げてもらえると開発頑張れます。