「Chalice」を使ってサーバーレスなWeb APIを簡単につくる
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
で可能です
pip3 install chalice
AWSのクレデンシャルを設定
~/.aws/credentials
と~/.aws/config
に適切な認証情報を設定します。もし、すでにプロファイルを設定しているなら、この作業は不要です。
ここでは詳細は省きますが、基本的にはIAMユーザーのアクセスキーを利用して、特定のプロファイルで実行することを想定しています。
なんの権限も持たないIAMユーザをデプロイ用の権限を持ったロールにスイッチ
ロールすることで、作業を行います。
設定の仕方は以下の記事が参考になると思います。
今回は以下のような感じです。
[chalice] aws_access_key_id = XXXXXXXXXXX aws_secret_access_key = XXXXXXXXXXX
[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が作成されます。
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のエンドポイントが返されます。
$ 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