【AWS】Python Lambdaのdeploy - Chalice

[【AWS】Python Lambdaのdeploy - CloudFormation - Qiita](https://qiita.com/sand/items/2b918a29bf08bfb86d32)
[【AWS】Python Lambdaのdeploy - Chalice - Qiita](https://qiita.com/sand/items/4642f417bf0d2b49c7e2)




**Chalice**は、LambdaとAPI GatewayをdeployするためのPythonライブラリです。deployという意味ではCloudFormationと被りますが、コンセプトは違っていて、以下のような機能を提供してくれます。つまりLambdaとAPI Gatewayを利用したアプリ作成が簡単に行えるためのものです。


* アプリの作成、デプロイ、管理するためのコマンドツール
* Pythonプログラマに馴染みのあるmicroframework
* 自動的にIAM policyを生成


ドキュメントは[「AWS Chalice」](https://chalice.readthedocs.io/en/latest/) と [「aws/chalice - github」](https://github.com/aws/chalice) になります。ちょっと少ないかな。


以下、PythonのLambda関数をChaliceを使ってdeployすことを目標とします。CloudFormationとの大きな違いは面倒なSAMファイル(yaml)を描く必要がないことです。

#１．環境設定

以下のコマンドで環境設定を行います。

```
$ python -m venv chalice-workspace          # venvを設定
$ source ./chalice-workspace/bin/activate   # venvをアクティベイト
$ pip freeze                  # まだ何もインストるされていないことを確認
$ pip install httpie          # curlの代わりにhttpを使う
$ pip install boto3           # AWS SDK の Boto3をインストール
$ pip install chalice　　　　　# chaliceをインストール
$ chalice --version           # chaliceのバージョンを確認
$ cd chalice-workspace
$ chalice new-project helloworld  # アプリのプロジェクトを作成
$ cd helloworld
```



#２．Lambda関数


Lambda関数は[「AWS Chalice」](https://chalice.readthedocs.io/en/latest/) のサンプルを少し変更して使います。

```python:helloworld/app.js
import json
import boto3
from botocore.exceptions import ClientError

from chalice import Chalice
from chalice import NotFoundError

app = Chalice(app_name='Policy Generation')

S3 = boto3.client('s3', region_name='ap-northeast-1')
BUCKET = 'chalice-s3-test'


@app.route('/objects/{key}', methods=['GET', 'PUT'])
def s3objects(key):
    request = app.current_request
    if request.method == 'PUT':
        S3.put_object(Bucket=BUCKET, Key=key,
                      Body=json.dumps(request.json_body))
    elif request.method == 'GET':
        try:
            response = S3.get_object(Bucket=BUCKET, Key=key)
            return json.loads(response['Body'].read())
        except ClientError as e:
            raise NotFoundError(key)
```


#３．deployと実行


```
$ chalice deploy
Creating deployment package.
Updating policy for IAM role: helloworld-dev  # Policyが自動生成される
Updating lambda function: helloworld-dev
Updating rest API
Resources deployed:
  - Lambda ARN: arn:aws:lambda:ap-northeast-1:xxxxx:function:helloworld-env-dev
  - Rest API URL: https://yyyyy.execute-api.ap-northeast-1.amazonaws.com/api/
```

さてそれでは動作を確認してみましょう。

以下のコマンドでS3にオブジェクト{"foo": "bar"}をputします。

```
echo '{"foo": "bar"}' | http PUT https://yyyyy.execute-api.ap-northeast-1.amazonaws.com/api/objects/mykey
```

次に以下のコマンドでS3からオブジェクトを取得します。

```
$ http GET https://yyyyy.execute-api.ap-northeast-1.amazonaws.com/api/objects/mykey
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 14
Content-Type: application/json
Date: Sat, 22 Dec 2018 04:37:15 GMT
Via: 1.1 a4668e9d7fa998f233f6d639127ba57c.cloudfront.net (CloudFront)
X-Amz-Cf-Id: KzwcGWt-sxbwPXWJWkXJvFbNT8apB0h6DzfLcUVn1nrAsd3Ob9Zrog==
X-Amzn-Trace-Id: Root=1-5c1dbf7b-de6ad5d054bf787402bdabd0;Sampled=0
X-Cache: Miss from cloudfront
x-amz-apigw-id: SSrbPH_aNjMFZYg=
x-amzn-RequestId: 41af5b77-05a3-11e9-9ec8-1f0e977b0961

{
    "foo": "bar"
}
```


無事成功しました。

APIのURLを忘れたら、

```
$ chalice url
$ curl `chalice url`
```



以下のコマンドで、deployしたリソースをすべて削除することができます。

```
$ chalice delete
```

Chaliceでは必要なPolicyが自動生成される点が特に素晴らしいと感じました。

今回は以上です。



#★最近の投稿
[【AWS】Pythonの開発環境Chaliceを使ってみる - アマゾン売れ筋ランキング](https://qiita.com/sand/items/cfdc9957caa0aee63c0f)
[【AWS】Pythonの開発環境Chaliceを使ってみる - CloudWatch Events](https://qiita.com/sand/items/4a4c273872b266af6680)
[【AWS】Pythonの開発環境Chaliceを使ってみる - API Key](https://qiita.com/sand/items/2f8615b03c6f24c85b49)
[【AWS】Python Lambdaのdeploy - Chalice](https://qiita.com/sand/items/4642f417bf0d2b49c7e2)
[【AWS】Python Lambdaのdeploy - CloudFormation](https://qiita.com/sand/items/2b918a29bf08bfb86d32)