【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」 のサンプルを少し変更して使います。
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