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

Chalice入門(APIgateway+Lambda)

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

yutako0217
4年間ホスト基盤エンジニアで金融機関系プロジェクトに従事。 その後、AWS資格の取得をきっかけに、AWS移行の提案〜保守までの小さい案件を複数担当する。 現在はAWS上でのサーバーサイドJava開発を経て、 大小新旧問わずにAWS案件のアーキテクトや構築やサービス提供しています。 2016年11月 AWS ASA更新 2017年3月 AWS PSA取得
Why not register and get more from Qiita?
  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