Help us understand the problem. What is going on with this article?

Chalice入門(APIgateway+Lambda)

More than 1 year has passed since last update.

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away