こんにちは、ロジカル・アーツの福島です。先日APIを作成する機会があり、API Gateway + Lambdaという構成で構築しました。その際はPythonを使用し、SAM + Swaggerを利用して開発を行いました。AWS上でPythonを使用してAPIを作成する場合にはAWS Chaliceというサービスがあり、今後の選択肢を増やすため入門してみたいと思います。今回はAWS Chaliceのインストール・デプロイ・削除までの流れを最小の構成で行なっていこうと思います。
AWS Chaliceとは
AWS上でPythonを使用してサーバレスアプリケーションを開発するときに使用できるフレームワークです。実際に触ってみたところかなり操作が分かりやすく、またデプロイもSAMと比較してかなり高速になっている印象です。 公式ブログによると『AWS Chalice は Python 製のフレームワークで、Python で AWS 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をブラウザで開き下記が表示されていることを確認しました。
リソースの削除
下記コマンドで全てのリソースが削除されます。
$ chalice delete
終わりに
実際にAPIを作成する際には、Lambda LayerやLambdaのネットワークの設定など、より多くの部分の設定が必要になると思います。AWS Chaliceで更に細かい部分の設定方法などを学んでいこうと思います。