LoginSignup
14
9

More than 5 years have passed since last update.

Chalice入門(APIgateway+Lambda)

Posted at

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のインストール

さくっと以下のコマンドでインストールしましょう。

shell
$ sudo pip install chalice

chaliceプロジェクトの作成

適当なディレクトリに移動して、「new-project」します。
そうすると、サンプルアプリのapp.pyとrequirementsが生成されます。

shell
$ cd ~/Project 
$ chalice new-project qiita-advent
$ cd qiita-advent
$ tree -a
.
├── .chalice
│   └── config.json
├── .gitignore
├── app.py
└── requirements.txt
app.py
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へ格納するのがいいみたいです。

shell
$ tree -a
.
├── .chalice
│   └── config.json
├── .gitignore
├── app.py
├── chalicelib
│   ├── __init__.py
│   └── utils.py
└── requirements.txt

pipで取得可能なライブラリを使用する場合

一方、pipで取得するようなライブラリは以下のようにvendorディレクトリに突っ込みます。

shell
$ tree -a
.
├── .chalice
│   └── config.json
├── .gitignore
├── app.py
├── chalicelib
│   ├── __init__.py
│   └── utils.py
├── requirements.txt
└── vendor

ここで、例えばrequestsを使う場合は、以下のようにします。

shell
$ 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なんかは

shell
$ 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形式への変換が必要です。

shell
$ 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に付与される権限です。

shell
$ 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でローカル環境を構築すれば、ローカルでも色々テストができそうです。

shell
$ chalice local
Serving on localhost:8000
shell
$ curl http://localhost:8000/
{"hello": "world"}

deployする

以下のコマンドで、AWS環境にデプロイでいます。
そしてそのままAPIが払い出される!素敵すぎです。

shell
$ 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でサーバーレスなアプリを作ってみてください!

14
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
9