Blogical

AWS/Salesforceを中心に様々な情報を配信していきます(/・ω・)/

AWS Chaliceに入門する

こんにちは、ロジカル・アーツの福島です。先日APIを作成する機会があり、API Gateway + Lambdaという構成で構築しました。その際はPythonを使用し、SAM + Swaggerを利用して開発を行いました。AWS上でPythonを使用してAPIを作成する場合にはAWS Chaliceというサービスがあり、今後の選択肢を増やすため入門してみたいと思います。今回はAWS Chaliceのインストール・デプロイ・削除までの流れを最小の構成で行なっていこうと思います。

AWS Chaliceとは

AWS上でPythonを使用してサーバレスアプリケーションを開発するときに使用できるフレームワークです。実際に触ってみたところかなり操作が分かりやすく、またデプロイもSAMと比較してかなり高速になっている印象です。 公式ブログによると『AWS ChalicePython 製のフレームワークで、PythonAWS Lambda を用いたサーバーレスアプリケーションを構築するにおいて、シンプルかつパワフルな機能を提供しています。』とのことです。

開発環境

AWS Cloud9を利用しました。 AWS Cloud9のデフォルトで使用されるAWS managed temporary credentialsは無効にしました。 aws configureコマンドで今回作業する範囲で十分な権限をもつIAMユーザの認証情報を設定済です。 デフォルトのリージョンにはap-northeast-1の東京リージョンを設定しました。

AWS managed temporary credentialsを使用する場合、aws-cliの実行に一部制限があり、今回のコマンドは許可されないため、代わりに十分な権限を持つIAMユーザーの認証情報を使用します。参考のドキュメントはこちらです。 デフォルトのままの設定の場合下記のエラーが発生します。

An error occurred (InvalidClientTokenId) when calling the CreateRolePolicy 
 operation: The security token included in the request is invalid

AWS Chaliceは、AWS LambdaでサポートされているすべてのバージョンのPythonをサポートしています。 参考のドキュメントはこちらです。 今回はpythonのVersionは3.7.10、pipのVersionは20.2.2を使用しました。

サンプルのAPIの作成

インストール

pipを利用してインストールを行いました。

$ pip install chalice

プロジェクトの作成

下記コマンドでプロジェクトを作成します。今回はプロジェクト名をsampleに設定しました。

$ chalice new-project sample

コマンド実行後にsampleというディレクトリが作成されます。 中にはapp.pyとrequirement.txtが入っています。 app.pyの中身は下記です。

app.py

from chalice import Chalice

app = Chalice(app_name='sample')


@app.route('/')
def index():
    return {'hello': 'world'}


# The view function above will return {"hello": "world"}
# whenever you make an HTTP GET request to '/'.
#
# Here are a few more examples:
#
# @app.route('/hello/{name}')
# def hello_name(name):
#    # '/hello/james' -> {"hello": "james"}
#    return {'hello': name}
#
# @app.route('/users', methods=['POST'])
# def create_user():
#     # This is the JSON body the user sent in their POST request.
#     user_as_json = app.current_request.json_body
#     # We'll echo the json body back to the user in a 'user' key.
#     return {'user': user_as_json}
#
# See the README documentation for more examples.
#

すでにサンプル用のAPIが実装されており、コメントアウトされた状態で別のAPIが実装されています。 こちらの例のようにAPIのPATHやメソッドなどを@app.route('{PATH}',methods=[{method}]のように簡潔に書くことができます。

またURLパラメータなどを記述する場合はこちらのようにPATHの中にURLパラメータを{}で設定し、関数に引数として渡すことが可能です。

デプロイ

下記コマンドでデプロイができます。

$ cd sample
$ chalice deploy

実行後に下記のようなメッセージが表示されます。 下のリソース名はセキュリティのため実際に表示されたものではなく、GitHubの例を使用しています。

Creating deployment package.
Creating IAM role: helloworld-dev
Creating lambda function: helloworld-dev
Creating Rest API
Resources deployed:
  - Lambda ARN: arn:aws:lambda:us-west-2:12345:function:helloworld-dev
  - Rest API URL: https://abcd.execute-api.us-west-2.amazonaws.com/api/

上記で記載のあるURLをブラウザで開き下記が表示されていることを確認しました。

f:id:logicalarts:20211004092900p:plain

リソースの削除

下記コマンドで全てのリソースが削除されます。

$ chalice delete

終わりに

実際にAPIを作成する際には、Lambda LayerやLambdaのネットワークの設定など、より多くの部分の設定が必要になると思います。AWS Chaliceで更に細かい部分の設定方法などを学んでいこうと思います。