2プロジェクト連続でのリリースがあり、15日に記事が書けませんでした。すみません。。。
qiita advent-calendar 2017 aws-lambda
の12/15の記事となります。
最近は私の会社もアドベントカレンダーを始めていて、
そこでもChaliceを書いたのですが、Chaliceとは、サーバーレスのフレームワークです。
github
docs
Pythonで、簡単にAPIが作成できます。
今回の記事は、初めてLambdaでAPI書いてみる、人向けの記事になります。
環境と前提条件
環境
PC:Macbook Pro
OS:macOS High Sierra
Python:3.6.3
前提条件
・AWSCLIがセットアップされていること
・Python3がインストールされていること
・pipがインストールされていること
chaliceのインストール
さくっと以下のコマンドでインストールしましょう。
$ sudo pip install chalice
chaliceプロジェクトの作成
適当なディレクトリに移動して、「new-project」します。
そうすると、サンプルアプリのapp.pyとrequirementsが生成されます。
$ cd ~/Project
$ chalice new-project qiita-advent
$ cd qiita-advent
$ tree -a
.
├── .chalice
│ └── config.json
├── .gitignore
├── app.py
└── requirements.txt
from chalice import Chalice
app = Chalice(app_name='qiita-advent')
@app.route('/')
def index():
return {'hello': 'world'}
# The view function above will return {"hello": "world"}
# whenever you make an HTTP GET request to '/'.
#
# Here are a few more examples:
#
# @app.route('/hello/{name}')
# def hello_name(name):
# # '/hello/james' -> {"hello": "james"}
# return {'hello': name}
#
# @app.route('/users', methods=['POST'])
# def create_user():
# # This is the JSON body the user sent in their POST request.
# user_as_json = app.current_request.json_body
# # We'll echo the json body back to the user in a 'user' key.
# return {'user': user_as_json}
#
# See the README documentation for more examples.
#
自作ライブラリを追加する場合
docsにも記載があるのですが、
以下のようにchalicelibへ格納するのがいいみたいです。
$ tree -a
.
├── .chalice
│ └── config.json
├── .gitignore
├── app.py
├── chalicelib
│ ├── __init__.py
│ └── utils.py
└── requirements.txt
pipで取得可能なライブラリを使用する場合
一方、pipで取得するようなライブラリは以下のようにvendorディレクトリに突っ込みます。
$ tree -a
.
├── .chalice
│ └── config.json
├── .gitignore
├── app.py
├── chalicelib
│ ├── __init__.py
│ └── utils.py
├── requirements.txt
└── vendor
ここで、例えばrequestsを使う場合は、以下のようにします。
$ cd vendor
$ pip download requests
$ cd ..
$ tree -a
.
├── .chalice
│ └── config.json
├── .gitignore
├── app.py
├── chalicelib
│ ├── __init__.py
│ └── utils.py
├── requirements.txt
└── vendor
├── certifi-2017.11.5-py2.py3-none-any.whl
├── chardet-3.0.4-py2.py3-none-any.whl
├── idna-2.6-py2.py3-none-any.whl
├── requests-2.18.4-py2.py3-none-any.whl
└── urllib3-1.22-py2.py3-none-any.whl
このようにwhlで落ちてくれば、そのまま利用できますが、
tar.gzでDLされてくるものもあると思います。
たとえばslackwebなんかは
$ pip download slackweb
$ cd ..
$ tree -a
.
├── .chalice
│ └── config.json
├── .gitignore
├── app.py
├── chalicelib
│ ├── __init__.py
│ └── utils.py
├── requirements.txt
└── vendor
└── slackweb-1.0.5.tar.gz
こんな感じでDLされます。
ここでも書いていますが
このままデプロイしてもエラーになってしまうため、whl形式への変換が必要です。
$ pip wheel slackweb-1.0.5.tar.gz
$ rm slackweb-1.0.5.tar.gz && cd ..
$ tree -a
.
├── .chalice
│ └── config.json
├── .gitignore
├── app.py
├── chalicelib
│ ├── __init__.py
│ ├── backlog.py
│ ├── backlog_api.py
│ └── utils.py
├── requirements.txt
└── vendor
└── slackweb-1.0.5-py3-none-any.whl
LambdaのIAM権限
Dynamoやら、他のリソースにアクセスするためには
Lambdaに付与するIAM ROLE権限を修正する必要があります。
.chalice
配下に、policy-dev.jsonがありますが、これがLambdaに付与される権限です。
$ tree -a
.
├── .chalice
│ ├── config.json
│ ├── deployed.json
│ ├── deployments
│ │ └── 30371575b45c60a8b9201f9999e41202-python3.6.zip
│ └── policy-dev.json
├── .gitignore
├── __pycache__
│ └── app.cpython-36.pyc
├── app.py
├── chalicelib
│ ├── __init__.py
│ ├── backlog.py
│ ├── backlog_api.py
│ └── utils.py
├── requirements.txt
└── vendor
├── slackweb-1.0.5-py3-none-any.whl
└── slackweb-1.0.5.tar.gz
debugする
ローカルで動かすこともできます。
以下のコマンドで、ポート8000で待ち受けてくれます。
Dynamo localや、SAM Localでローカル環境を構築すれば、ローカルでも色々テストができそうです。
$ chalice local
Serving on localhost:8000
$ curl http://localhost:8000/
{"hello": "world"}
deployする
以下のコマンドで、AWS環境にデプロイでいます。
そしてそのままAPIが払い出される!素敵すぎです。
$ chalice deploy
Creating role: qiita-advent-dev
Creating deployment package.
Creating lambda function: qiita-advent-dev
Initiating first time deployment.
Deploying to API Gateway stage: api
https://xxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/api/
以上となります!
ぜひ、LambdaとAPI gatewayでサーバーレスなアプリを作ってみてください!