- AWS Lambda【ビール片手に】体験するもくもく会
- http://d-cube.connpass.com/event/36632/
- こちらの勉強会に参加しました。
- 聞き間違いや勘違いがあったらごめんなさい。
- 勧められなかった部分については補足してあります。
タイムライン
- 環境準備
- chalice を使う
- APIGateway + Lambda で Hello,world on ブラウザ
- 事例紹介など
- 雑談
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 で入れなおす
$ 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.route('/{name}/hello')
def hello(name):
return {'hello': name}
再度デプロイしてアクセスする
$ chalice deploy
$ curl <URL>
ログを出力する
次コードに変更する
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は全てのサービスのベースとなっている初期から存在するサービス. ここを上手に使うことでサービスをキレイにまとめあげることができる
- アラームは一度届くと2回目はないので、心配ならアラームを複数個設定したほうがいい