Edited at

【AWS】Python Lambdaのdeploy - Chalice

【AWS】Python Lambdaのdeploy - CloudFormation - Qiita

【AWS】Python Lambdaのdeploy - Chalice - Qiita

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


  • アプリの作成、デプロイ、管理するためのコマンドツール

  • Pythonプログラマに馴染みのあるmicroframework

  • 自動的にIAM policyを生成

ドキュメントは「AWS Chalice」「aws/chalice - github」 になります。ちょっと少ないかな。

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


1.環境設定

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

$ 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


2.Lambda関数

Lambda関数は「AWS Chalice」 のサンプルを少し変更して使います。


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)



3.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を使ってみる - アマゾン売れ筋ランキング

【AWS】Pythonの開発環境Chaliceを使ってみる - CloudWatch Events

【AWS】Pythonの開発環境Chaliceを使ってみる - API Key

【AWS】Python Lambdaのdeploy - Chalice

【AWS】Python Lambdaのdeploy - CloudFormation