LoginSignup
2
2

More than 5 years have passed since last update.

【AWS】Python Lambdaのdeploy - Chalice

Last updated at Posted at 2018-12-22

【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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2