Lambda PowertoolsでRERST APIを実装する。ついでにテストもする
もくじ
何がしたいの?
Lambda Powertools Python
を使うとREST API
が簡単にできるらしいので、実際に作ってみます!
では 作っていきましょう👻
デモ用のプロジェクトの用意
下記な感じで新規のプロジェクトを用意します!
$ mkdir cdk_lambda_powertools_restapi
$ cd cdk_lambda_powertools_restapi
$ cdk init --language python
$ rm setup.py source.bat
インフラの実装
使うリソースのパッケージをrequirements.txt
に追加します!
aws-cdk.core==1.91.0
aws-cdk.aws-lambda==1.91.0
aws_cdk.aws_lambda_python==1.91.0
aws-cdk.aws_apigateway==1.91.0
からのインストール
$ pip install -r requirements.txt
次にStackを実装
from aws_cdk import core
from aws_cdk.aws_apigateway import LambdaRestApi
from aws_cdk.aws_lambda import Runtime
from aws_cdk.aws_lambda_python import PythonFunction
APP_NAME = "CdkLambdaPowertoolsRestapi"
class CdkLambdaPowertoolsRestapiStack(core.Stack):
def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
lambda_ = PythonFunction(self, f"{APP_NAME}Lambda", entry="lambda_app", runtime=Runtime.PYTHON_3_8,)
# RestApiでAPI Gatewayを作成する
LambdaRestApi(self, f"{APP_NAME}Gateway", handler=lambda_)
)
この辺はCDKめっちゃお手軽ですね〜!
まだlambda_app
ディレクトリの中を実装してないですが、そこを実装してデプロイすれば完成です!
アプリケーションの実装
aws-lambda-powertools
をrequirements.txt
へ追加する
aws-lambda-powertools
次にアプリケーションのエントリーポイントを実装しますがー、、、lambda-powertools
を使うとこんな簡単に実装できます!
Flaskのような手軽さですね!
from aws_lambda_powertools.event_handler.api_gateway import ApiGatewayResolver, ProxyEventType
from aws_lambda_powertools.utilities.data_classes import APIGatewayProxyEvent
from aws_lambda_powertools.utilities.typing import LambdaContext
app = ApiGatewayResolver(proxy_type=ProxyEventType.APIGatewayProxyEvent)
@app.get("/hello")
def get_hello_world():
return {"message": "hello world"}
def handler(event: APIGatewayProxyEvent, context: LambdaContext):
return app.resolve(event, context)
テストも作ってみる
テストも書いてみます!
まずテストディレクトリを作成します
$ mkdir tests
次にtests
直下に__init__.py
という名前の空ファイルを置いておきます。
次にhello
のテストを書きます。
import json
import lambda_app.index as app
def test_get_hello():
minimal_event = {
"path": "/hello",
"httpMethod": "GET",
"requestContext": {"requestId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"},
}
response = app.handler(minimal_event, {})
assert response["statusCode"] == 200
assert json.loads(response["body"]) == {"message": "hello world"}
そしてテスト実行!
$ pytest
下記な感じのログがTerminalに出力されればOK!
collected 1 item
tests/test_hello.py . [100%]
動作確認
$ cdk deploy
デプロイが完了するとターミナルにエンドポイントが表示されるので、そのエンドポイントの末尾に/hello
をつけてブラウザで叩きます!
動作確認完了しました!
削除
$ cdk destroy
まとめ
今回はLambda Powertools Python
を使ってREST API
を実装してみました!さらにテストもやってみました。
さらに詳細を知りたい方は公式サイトをご覧ください!