😸

AWSLambdaPowertoolsを使ってバリデーションしてみる

2023/06/30に公開

LambdaにAWSLambdaPowertoolsを追加する

Lambdaにレイヤーを追加する。

AWSレイヤーのAWSLambdaPowertoolsPythonV2を設定する。

バリデーションコードを書く

Powertoolsをimportする

from aws_lambda_powertools.utilities.validation import validate
from aws_lambda_powertools.utilities.validation.exceptions import SchemaValidationError

バリデーションをスキーマで定義する

BODY_SCHEMA = {
    "required": ["name", "id", "data"],
    "properties": {
        "name": {
            "type": "string",
            "minLength": 5,
            "maxLength": 10,
        },
        "id": {
            "type": "integer",
            "minLength": 1
        },
        "data": {
            "type": "array",
            "minItems": 1,
            "items": {
                "type": "object",
                "properties": {
                    "version": {"type": "integer"},
                    "model": {"type": "string"}
                }
            }
        }
    },
}

処理部分

def lambda_handler(event, context):
    try:
        validate(event=event, schema=BODY_SCHEMA)
        return "success"
    except SchemaValidationError as e:
        return str(e)

テストイベントからLambdaを実行する

・正常

パラメータ
{
    "name": "test01",
    "id": 1,
    "data": [{"version": 1, "model": "A001"}]
}

結果
success

・文字数エラー

パラメータ
{
    "name": "test",
    "id": 1,
    "data": [{"version": 1, "model": "A001"}]
}

結果
"Failed schema validation. Error: data.name must be longer than or equal to 5 characters, Path: ['data', 'name'], Data: test"

・型エラー

パラメータ
{
    "name": 123456,
    "id": 1,
    "data": [{"version": 1, "model": "A001"}]
}

結果
"Failed schema validation. Error: data.name must be string, Path: ['data', 'name'], Data: 123456"

・必須エラー

パラメータ
{
    "id": 1,
    "data": [{"version": 1, "model": "A001"}]
}

結果
"Failed schema validation. Error: data must contain ['name', 'id', 'data'] properties, Path: ['data'], Data: {'id': 1, 'data': [{'version': 1, 'model': 'A001'}]}"

・配列エラー

パラメータ
{
    "name": "test01",
    "id": 1,
    "data": []
}

結果
"Failed schema validation. Error: data.data must contain at least 1 items, Path: ['data', 'data'], Data: []"

感想

色々なライブラリをlayerに追加して使ってみるのも楽しそうだなと思った。
バリデーションツールもたくさんあるので、試していきたい。

Discussion