【AWS】Python Lambdaのdeploy - Chalice

【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" 
} 
無事成功しました。

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

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

今回は以上です。

コメント

このブログの人気の投稿

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2020-12-01 09:41:49 RSSフィード2020-12-01 09:00 分まとめ(69件)