AWS Lambda (本当に)ビール片手にもくもく会


- AWS Lambda【ビール片手に】体験するもくもく会
- http://d-cube.connpass.com/event/36632/
- こちらの勉強会に参加しました。
- 聞き間違いや勘違いがあったらごめんなさい。
- 勧められなかった部分については補足してあります。

## タイムライン
1. 環境準備
1. chalice を使う
1. APIGateway + Lambda で Hello,world on ブラウザ
1. 事例紹介など
1. 雑談

# 1. 環境準備
### 前提
AWSアカウントがあること

- AWSCLI インストール
- chalice インストール
- IAM で User 作成
- User に権限アタッチ

### chaliceとは

- Python Serverless Microframework for AWS
- Web API のフレームワーク
- AWS純正品
- 現在 Preview 版
- Serverless Framework に似てる
- 発音は恐らくカリス(=杯)、だけど勉強会ではチャリス、Bizreachではチョリース
- https://github.com/awslabs/chalice

Lambda + API Gateway で簡単な RESTful API を作れるが、やっぱり細かいところで準備が必要。
これをサポートしてくれる。

## AWSCLI インストール

~~~
$ brew install awscli
$ aws
~~~
最後反応あればOK

### AWSCLI に Access Key/Secret Access Key の登録

~~~
$ aws configure
$ AWS Access Key ID [None]: <Access Key>
$ AWS Secret Access Key [None]: <Secret Access Key>
$ Default region name [None]: ap-northeast-1
$ Default output format [None]: <empty>
~~~
インタラクティブモードになるので、順に入れていく.

## chalice インストール

python のパッケージ管理ソフト pip を使ってインストールします。

### python インストール
#### Mac の場合

デフォルトで Python が入っているので、easy_install pip で pip だけをインストールでもいいが
管理しやすいように homebrew で入れなおす

~~~sh
$ which python
/usr/bin/python
$ brew install python
〜略〜
$ which python
/usr/local/bin/python
$ pip
〜略〜
$ pip install --upgrade setuptools
$ pip install --upgrade pip
~~~
- which の結果が変化しない場合は .bash_profile 等で PATH の優先順位をきちんと定義

### pip でインストール

~~~
$ sudo pip install chalice
~~~

# 2. chalice を使う

### コマンドは全部で5個
~~~
$ chalice --help
~~~
- deploy
- gen-policy
- local
- logs
- new-project

### chalice でプロジェクト作成
~~~
$ chalice new-project demo
$ tree -a
~~~

### すこし覗いてみる
#### app.py
~~~
$ less app.py
~~~
URLルーティングとアクションがここでまとめてプログラムする

#### requirements.txt
Flask で使うライブラリのバージョンを書き込むことで固定できる.

#### .chalice/config.json
~~~
$ less .chalice/config.json
~~~
>{
>  "app_name": "demo",
>  "stage": "dev"
>}


### まずはデフォルトでデプロイ
~~~
$ cd demo
$ chalice deploy
~~~
これだけで Lambda, API Gateway, IAM Policy までも自動で行ってくれる

デプロイされたものはオープンになっている注意



#### 下記エラーが出る場合
~~~
Initial creation of lambda function.
Updating IAM policy.
Creating deployment package.
Traceback (most recent call last):
〜略〜
OSError: [Errno 2] No such file or directory
~~~
原因は virtualenv が入っていないため.

~~~
$ pip install virtualenv
~~~


### パラメータ付きGET
次コードを追加する

~~~app.py
@app.route('/{name}/hello')
def hello(name):
  return {'hello': name}
~~~
再度デプロイしてアクセスする

~~~
$ chalice deploy
$ curl <URL>
~~~

### ログを出力する

次コードに変更する

~~~app.py
def hello(name):
  print('return hello to {}'.format(name))
  return {'hello': name}
~~~
再度デプロイしてアクセスする

~~~
$ chalice deploy
$ curl <URL>
~~~

ログを見る

~~~
$ chalice logs
~~~
出ているログは Lambda の CloudWatch になる.


# 3. API Gateway + Lambda で Hello,world on ブラウザ

## API Gateway

- HTTP の Endpoint(http://---) を提供する
- GET/POST/PUT といった HTTP メソッドに対応
- HTTP でリクエストを受け取り次へ渡す.ここでは次とは Lambda を指す.

## Lambda
イベントベース
命令を受けてから起動する
起動していた時間分を課金
タイムアウトになって課金対象
Java, Node.js, Python に対応

# 4. 事例紹介など

## 事例 1
- よくティザーサイトを作って欲しいと言われる.
- LP にメアドなどを登録できるフォームが必要なことがある.
 - フォームはGoogle Spretsheet に羅列する必要がある.
- そのためにサーバ用意するのも面倒なので以下のような構成で実現している.

Route 53 -> CloudFront -> S3 -> Api Gateway -> Lambda -> Google Apps Script

## 事例 2

サイトのログを Lambda で集計.

- ログにはアクセス頻度に幅がある
- アクセスがないときにログにお金を使いたくない
- アクセスがあるときに Lambda ならお金はかかるが、オートスケールしてくれる

### 構成
CloudTrail -> CloudWatch -> Lambda -> Elasticsearch Service -> Kibana or Elasticsearch

# 5. 雑談
- Lambda はイベントにもフック可能
 - S3 にファイルが配置/削除された
 - S3 に何かが入ったら呼ばれ、ファイル名がこれだったら Slack に通知など
 - S3 に CSV が入ったら Lambda で DB に入れている
- 高額請求が怖いなら, Lamdba で 対象 Lambda をコロスケ可能
 - During アラームを設定
 - そのアラームを受け取ったら
 - Lamdba で対象の Lamdba をコロスケ
- JAWS にはかなり厳しいイベントの日もある
 - JAWS のイベント資料は Qiita に上がっている
- 以前別のところでリクルートさんが登壇したときに、AWS Lambda 使った理由を聞いたら「インフラチームいなくてもできるから」
- API 管理は別ファイルで管理
- 開発者を監視
- Config に構成変更が記録される
- いじってほしくないファイルに変更があると、 Config から検知して Lambda で Slack に通知といったことができる
- 同様に作ってほしくない EC2 が作成されると Lambda が EC2 をコロスケすることもできる
 - EC2 は完全に作成が成功しないと課金は発生しない.
 - EC2 のステータスがペンディング中にコロスケ
- サービスの量が多く、全てを把握している人は恐らくいない
- API Gateway, EC2, RDS, Route 53, S3, IAM, Lambda がよく使う
- SNS, SQS は覚えたほうがいい, SQSは全てのサービスのベースとなっている初期から存在するサービス. ここを上手に使うことでサービスをキレイにまとめあげることができる
- アラームは一度届くと２回目はないので、心配ならアラームを複数個設定したほうがいい