「Chalice」を使ってサーバーレスなWeb APIを簡単につくる

Pythonのサーバーレスアプリケーション用のフレームワーク「Chalice」を使ってAPI Gatewayにデプロイしてみます。
2021.09.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Chaliceとは

公式によればChaliceとは以下のようなものらしいです。

A framework for writing serverless applications

つまりはサーバーレスなアプリケーションのためのフレームワークということです。

フレームワークの設計が秀逸でAPI Gatewayなどのインフラのことをあまり意識せず、Flaskでサーバーを書いているかのように開発が可能です。

具体的にはAWS Lambdaを中心としたアプリケーションの開発を支援するようなフレームワークで、Pythonで書かれた関数をデコレータでラップすると、それをLambda関数としてとしてデプロイしてくれます。

さらに便利なのが、API Gatewayとの連携やS3やSQSなどのイベントからのトリガーなど、AWS Lambdaを使用するいくつかのユースケースでの設定を自動でやってくれます。

デコレータでこれらの設定をかけるので、まるでFlaskでエンドポイントを書くかのようにAPI Gatewayなどの設定が可能です。

CloudformationやCDKとの連携が考慮されており、様々なリソースの管理が一元化できることが期待できます。

使ってみる

今回は公式のQuickstartに沿って進めていきます。

インストール

インストールはpipで可能です

install chalice

pip3 install chalice

AWSのクレデンシャルを設定

~/.aws/credentials~/.aws/configに適切な認証情報を設定します。もし、すでにプロファイルを設定しているなら、この作業は不要です。 ここでは詳細は省きますが、基本的にはIAMユーザーのアクセスキーを利用して、特定のプロファイルで実行することを想定しています。 なんの権限も持たないIAMユーザをデプロイ用の権限を持ったロールにスイッチ ロールすることで、作業を行います。 設定の仕方は以下の記事が参考になると思います。

今回は以下のような感じです。

~/.aws/credentials

[chalice]
aws_access_key_id = XXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXX

~/.aws/credentials

[profile chalice]
role_arn = arn:aws:iam::XXXXXXXXXXX:role/XXXXXXXXXXX
region=ap-northeast-1
output=json
source_profile = chalice

プロジェクトを作成する

プロジェクトの作成

$ chalice new-project helloworld
Your project has been generated in ./helloworld

これを実行すると、現在のディレクトリにhelloworldというディレクトリが作成されます。

ディレクトリの中身

$ cd helloworld/
$ ls
app.py			requirements.txt

このapp.pyがアプリケーションの本体になります。 プロジェクトの作成時点でサンプルのアプリケーションが作成されています。 Flaskのようにapp.routeというデコレータでラップするとAPIが作成されます。

app.py

from chalice import Chalice

app = Chalice(app_name='helloworld')


@app.route('/')
def index():
    return {'hello': 'world'}

デプロイする

以下のようにコマンドを実行するとデプロイできます。 --profileでどのプロファイルで実行できるのかを指定できます。

デプロイ

$ chalice deploy --profile chalice
Creating deployment package.
Creating IAM role: helloworld-dev
Creating lambda function: helloworld-dev
Creating Rest API
Resources deployed:
  - Lambda ARN: arn:aws:lambda:ap-northeast-1:XXXXXXXXXXX:function:helloworld-dev
  - Rest API URL: https://XXXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/api/

HTTP APIにアクセスする

デプロイされたAPIにアクセスしてみます。 chalice urlを実行するとデプロイされたAPI Gatewayのエンドポイントが返されます。

APIにアクセス

$ chalice url
https://XXXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/api/
$ curl $(chalice url)
{"hello":"world"}

無事にアクセスできました。

WebブラウザでマネージドコンソールからAPI Gatewayを見てみます。

無事にデプロイされているようです。

リソースを削除する

削除

chalice delete --profile chalice

付録

--profileを省略する

環境変数AWS_PROFILEを設定すると、オプションを省略できます。

環境変数を設定

export AWS_PROFILE=chalice