/ #cdk #Lambda Powertools 

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-powertoolsrequirements.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を実装してみました!さらにテストもやってみました。

さらに詳細を知りたい方は公式サイトをご覧ください!

今回のリポジトリはこちら

https://github.com/sisi100/cdk_lambda_powertools_restapi

Author

Sisii

インフラが好きなエンジニアぶってるなにか