Chaliceを使ってみた

まだまだサーバレスアーキテクチャを支える技術を使ってみたシリーズは終わらない。今回はChaliceを使ってみました。「Python Serverless Microframework for AWS」と謳っている通り、Python特化型のServerless Frameworkになります。

以前試したものは以下になります。
[SERVERLESS FRAMEWORKを使ってみた](http://qiita.com/kojiisd/items/0b778f381b51951cee65)
[Apexを使ってみた](http://qiita.com/kojiisd/items/930716b25015278a0f05)

今回のフレームワークの説明はこちら。

https://github.com/awslabs/chalice

# インストール
他のフレームワークに負けず、こちらもシンプルです。

```
$ pip install chalice
Collecting chalice
  Downloading chalice-0.1.0.tar.gz (52kB)
    100% |████████████████████████████████| 53kB 2.4MB/s 
Collecting click==6.2 (from chalice)
  Downloading click-6.2-py2.py3-none-any.whl (70kB)
    100% |████████████████████████████████| 73kB 55kB/s 
Collecting botocore<2.0.0,>=1.4.8 (from chalice)
  Downloading botocore-1.4.46-py2.py3-none-any.whl (2.5MB)
    100% |████████████████████████████████| 2.5MB 194kB/s 
Collecting virtualenv<16.0.0,>=15.0.0 (from chalice)
  Downloading virtualenv-15.0.3-py2.py3-none-any.whl (3.5MB)
    100% |████████████████████████████████| 3.5MB 140kB/s 
Collecting typing==3.5.1.0 (from chalice)
  Downloading typing-3.5.1.0.tar.gz (45kB)
    100% |████████████████████████████████| 49kB 1.9MB/s 
Requirement already satisfied (use --upgrade to upgrade): jmespath<1.0.0,>=0.7.1 in /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages (from botocore<2.0.0,>=1.4.8->chalice)
Requirement already satisfied (use --upgrade to upgrade): python-dateutil<3.0.0,>=2.1 in /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages (from botocore<2.0.0,>=1.4.8->chalice)
Requirement already satisfied (use --upgrade to upgrade): docutils>=0.10 in /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages (from botocore<2.0.0,>=1.4.8->chalice)
Requirement already satisfied (use --upgrade to upgrade): six>=1.5 in /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages (from python-dateutil<3.0.0,>=2.1->botocore<2.0.0,>=1.4.8->chalice)
Installing collected packages: click, botocore, virtualenv, typing, chalice
  Found existing installation: botocore 1.4.0
    Uninstalling botocore-1.4.0:
      Successfully uninstalled botocore-1.4.0
  Running setup.py install for typing ... done
  Running setup.py install for chalice ... done
Successfully installed botocore-1.4.46 chalice-0.1.0 click-6.2 typing-3.5.1.0 virtualenv-15.0.3
```
それではプロジェクトを作ってみます。今回もaws configureの設定は省きます。

# プロジェクトを作成する

```
$ chalice new-project hello
```
作成されたプロジェクトにはrequirements.txtとapp.pyファイルが存在します。requirements.txtはからのファイル。app.pyは以下のような内容が記されていました。

```app.py
from chalice import Chalice

app = Chalice(app_name='hello')


@app.route('/')
def index():
    return {'hello': 'world'}
```
とてもシンプルですね。デプロイもシンプルです。

```
$ chalice deploy
Initial creation of lambda function.
Creating role
Creating deployment package.
Lambda deploy done.
Initiating first time deployment...
Deploying to: dev
https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/dev/
```
さっそくデプロイしたプロジェクトにアクセスしてみます。

```
$ curl https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/dev/
{"hello": "world"}
```
バッチリですね。

ちなみにhttpieを使うことでヘッダの中身も確認することができます。

```
$ http https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/dev/
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 18
Content-Type: application/json
Date: Sun, 14 Aug 2016 15:30:13 GMT
Via: 1.1 2fe788985cac89c0ef661ff7cd8edf63.cloudfront.net (CloudFront)
X-Amz-Cf-Id: LqBl20KXNqVHqpmIQDmYeGnDzVdTjA71MrmVuoZQxDFe1qouqicQuQ==
X-Cache: Miss from cloudfront
x-amzn-RequestId: fd5885be-6233-11e6-aad4-3ba79e12d2f0

{
    "hello": "world"
}
```

# 他のコマンドは？
chaliceはとてもシンプルなコマンドのみを実装しているようです。

```
$ chalice
Usage: chalice [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  deploy
  gen-policy
  local
  logs
```

# 他のフレームワークと比べての利点
ここまで見てくると、他の言語にも対応していてさらにコマンドの多いフレームワークの方が優秀に見えてしまうのですが、何が利点なのかを調べようとしたところ、公式サイトにバッチリFAQがありましたね。先読みされているようだ。

Q: How does the Python Serverless Microframework for AWS compare to other similar frameworks?

とりあえず色々と回答が書かれていますが、要約するとこんなところでしょうか。

- Pythonで簡単に開発できることを目的としている。FlaskやBottleと同じようなもの。
- すべてのAPIを網羅しているわけではない。（簡単に開発できるようにするため）
- S3やDynamoDBへのアクセスもさせていない

割り切って簡単にPythonでアプリケーションをデプロイできるようにする、というのが大目的なようです。

# まとめ
思い切って割り切って簡単なPython開発を目的としているため、確かに開発などは簡単でしたし、コマンド実行後に出来上がるファイルなどもとてもシンプルでした。シンプルにLambdaでさっと開発したい時には向いているかもしれません。