Parser (Zod)
This utility provides data validation and parsing using Zod, a TypeScript-first schema declaration and validation library.
Key features¶
- Define data schema as Zod schema, then parse, validate and extract only what you want
- Built-in envelopes to unwrap and validate popular AWS event sources payloads
- Extend and customize envelopes to fit your needs
- Safe parsing option to avoid throwing errors and custom error handling
- Available for Middy.js middleware and TypeScript method decorators
Getting started¶
1 |
|
This utility supports Zod v3.x and above.
Define schema¶
You can define your schema using Zod:
schema.ts | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
This is a schema for Order
object using Zod.
You can create complex schemas by using nested objects, arrays, unions, and other types, see Zod documentation for more details.
Parse events¶
You can parse inbound events using parser
decorator, Middy.js middleware, or manually using built-in envelopes and schemas.
Both are also able to parse either an object or JSON string as an input.
Warning
The decorator and middleware will replace the event object with the parsed schema if successful. Be cautious when using multiple decorators that expect event to have a specific structure, the order of evaluation for decorators is from bottom to top.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
Built-in schemas¶
Parser comes with the following built-in schemas:
Model name | Description |
---|---|
AlbSchema | Lambda Event Source payload for Amazon Application Load Balancer |
APIGatewayProxyEventSchema | Lambda Event Source payload for Amazon API Gateway |
APIGatewayRequestAuthorizerEventSchema | Lambda Event Source payload for Amazon API Gateway Request Authorizer |
APIGatewayTokenAuthorizerEventSchema | Lambda Event Source payload for Amazon API Gateway Token Authorizer |
APIGatewayProxyEventV2Schema | Lambda Event Source payload for Amazon API Gateway v2 payload |
APIGatewayProxyWebsocketEventSchema | Lambda Event Source payload for Amazon API Gateway WebSocket events |
APIGatewayRequestAuthorizerEventV2Schema | Lambda Event Source payload for Amazon API Gateway v2 Authorizer |
CloudFormationCustomResourceCreateSchema | Lambda Event Source payload for AWS CloudFormation CREATE operation |
CloudFormationCustomResourceUpdateSchema | Lambda Event Source payload for AWS CloudFormation UPDATE operation |
CloudFormationCustomResourceDeleteSchema | Lambda Event Source payload for AWS CloudFormation DELETE operation |
CloudwatchLogsSchema | Lambda Event Source payload for Amazon CloudWatch Logs |
PreSignupTriggerSchema | Lambda Event Source payload for Amazon Cognito Pre Sign-up trigger |
PostConfirmationTriggerSchema | Lambda Event Source payload for Amazon Cognito Post Confirmation trigger |
PreTokenGenerationTriggerSchema | Lambda Event Source payload for Amazon Cognito Pre Token Generation trigger |
CustomMessageTriggerSchema | Lambda Event Source payload for Amazon Cognito Custom Message trigger |
MigrateUserTriggerSchema | Lambda Event Source payload for Amazon Cognito User Migration trigger |
CustomSMSTriggerSchema | Lambda Event Source payload for Amazon Cognito Custom SMS trigger |
CustomEmailTriggerSchema | Lambda Event Source payload for Amazon Cognito Custom Email trigger |
DefineAuthChallengeTriggerSchema | Lambda Event Source payload for Amazon Cognito Define Auth Challenge trigger |
CreateAuthChallengeTriggerSchema | Lambda Event Source payload for Amazon Cognito Create Auth Challenge trigger |
VerifyAuthChallengeResponseTriggerSchema | Lambda Event Source payload for Amazon Cognito Verify Auth Challenge Response trigger |
PreTokenGenerationTriggerSchemaV1 | Lambda Event Source payload for Amazon Cognito Pre Token Generation trigger v1 |
PreTokenGenerationTriggerSchemaV2AndV3 | Lambda Event Source payload for Amazon Cognito Pre Token Generation trigger v2 and v3 |
DynamoDBStreamSchema | Lambda Event Source payload for Amazon DynamoDB Streams |
EventBridgeSchema | Lambda Event Source payload for Amazon EventBridge |
KafkaMskEventSchema | Lambda Event Source payload for AWS MSK payload |
KafkaSelfManagedEventSchema | Lambda Event Source payload for self managed Kafka payload |
KinesisDataStreamSchema | Lambda Event Source payload for Amazon Kinesis Data Streams |
KinesisFirehoseSchema | Lambda Event Source payload for Amazon Kinesis Firehose |
KinesisDynamoDBStreamSchema | Lambda Event Source payload for DynamodbStream record wrapped in Kinesis Data stream |
KinesisFirehoseSqsSchema | Lambda Event Source payload for SQS messages wrapped in Kinesis Firehose records |
LambdaFunctionUrlSchema | Lambda Event Source payload for Lambda Function URL payload |
S3EventNotificationEventBridgeSchema | Lambda Event Source payload for Amazon S3 Event Notification to EventBridge. |
S3Schema | Lambda Event Source payload for Amazon S3 |
S3ObjectLambdaEvent | Lambda Event Source payload for Amazon S3 Object Lambda |
S3SqsEventNotificationSchema | Lambda Event Source payload for S3 event notifications wrapped in SQS event (S3->SQS) |
SesSchema | Lambda Event Source payload for Amazon Simple Email Service |
SnsSchema | Lambda Event Source payload for Amazon Simple Notification Service |
SqsSchema | Lambda Event Source payload for Amazon SQS |
TransferFamilySchema | Lambda Event Source payload for AWS Transfer Family events |
VpcLatticeSchema | Lambda Event Source payload for Amazon VPC Lattice |
VpcLatticeV2Schema | Lambda Event Source payload for Amazon VPC Lattice v2 payload |
Extend built-in schemas¶
You can extend every built-in schema to include your own schema, and yet have all other known fields parsed along the way.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
JSON stringified payloads¶
If you want to extend a schema and transform a JSON stringified payload to an object, you can use helper function JSONStringified
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
- Extend built-in
AlbSchema
using JSONStringified function to transform your payload
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
|
DynamoDB Stream event parsing¶
If you want to parse a DynamoDB stream event with unmarshalling, you can use the helper function DynamoDBMarshalled
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
|
Envelopes¶
When trying to parse your payload you might encounter the following situations:
- Your actual payload is wrapped around a known structure, for example Lambda Event Sources like EventBridge
- You're only interested in a portion of the payload, for example parsing the detail of custom events in EventBridge, or body of SQS records
- You can either solve these situations by creating a schema of these known structures, parsing them, then extracting and parsing a key where your payload is.
This can become difficult quite quickly. Parser simplifies the development through a feature named Envelope. Envelopes can be used via envelope parameter available in middy and decorator. Here's an example of parsing a custom schema in an event coming from EventBridge, where all you want is what's inside the detail key.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
The envelopes are functions that take an event and the schema to parse, and return the result of the inner schema. Depending on the envelope it can be something simple like extracting a key. We have also complex envelopes that parse the payload from a string, decode base64, uncompress gzip, etc.
Envelopes vs schema extension
Use envelopes if you want to extract only the inner part of an event payload and don't use the information from the Lambda event. Otherwise, extend built-in schema to parse the whole payload and use the metadata from the Lambda event.
Built-in envelopes¶
Parser comes with the following built-in envelopes:
Envelope name | Behaviour |
---|---|
apiGatewayEnvelope | 1. Parses data using APIGatewayProxyEventSchema . 2. Parses body key using your schema and returns it. |
apiGatewayV2Envelope | 1. Parses data using APIGatewayProxyEventV2Schema . 2. Parses body key using your schema and returns it. |
cloudWatchEnvelope | 1. Parses data using CloudwatchLogsSchema which will base64 decode and decompress it. 2. Parses records in message key using your schema and return them in a list. |
dynamoDBStreamEnvelope | 1. Parses data using DynamoDBStreamSchema . 2. Parses records in NewImage and OldImage keys using your schema. 3. Returns a list with a dictionary containing NewImage and OldImage keys |
eventBridgeEnvelope | 1. Parses data using EventBridgeSchema . 2. Parses detail key using your schema and returns it. |
kafkaEnvelope | 1. Parses data using KafkaRecordSchema . 2. Parses value key using your schema and returns it. |
kinesisEnvelope | 1. Parses data using KinesisDataStreamSchema which will base64 decode it. 2. Parses records in Records key using your schema and returns them in a list. |
kinesisFirehoseEnvelope | 1. Parses data using KinesisFirehoseSchema which will base64 decode it. 2. Parses records in Records key using your schema and returns them in a list. |
lambdaFunctionUrlEnvelope | 1. Parses data using LambdaFunctionUrlSchema . 2. Parses body key using your schema and returns it. |
snsEnvelope | 1. Parses data using SnsSchema . 2. Parses records in body key using your schema and return them in a list. |
snsSqsEnvelope | 1. Parses data using SqsSchema . 2. Parses SNS records in body key using SnsNotificationSchema . 3. Parses data in Message key using your schema and return them in a list. |
sqsEnvelope | 1. Parses data using SqsSchema . 2. Parses records in body key using your schema and return them in a list. |
vpcLatticeEnvelope | 1. Parses data using VpcLatticeSchema . 2. Parses value key using your schema and returns it. |
vpcLatticeV2Envelope | 1. Parses data using VpcLatticeSchema . 2. Parses value key using your schema and returns it. |
Safe parsing¶
If you want to parse the event without throwing an error, use the safeParse
option.
The handler event
object will be replaced with ParsedResult<Input?, Oputput?>
, for example ParsedResult<SqsEvent, Order>
, where SqsEvent
is the original event and Order
is the parsed schema.
The ParsedResult
object will have success
, data
, or error
and originalEvent
fields, depending on the outcome.
If the parsing is successful, the data
field will contain the parsed event, otherwise you can access the error
field and the originalEvent
to handle the error and recover the original event.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
|
Manual parsing¶
You can use built-in envelopes and schemas to parse the incoming events manually, without using middy or decorator.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
Custom validation¶
Because Parser uses Zod, you can use all the features of Zod to validate your data.
For example, you can use refine
to validate a field or a combination of fields:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
Zod provides a lot of other features and customization, see Zod documentation for more details.
Types¶
Schema and Type inference¶
Use z.infer
to extract the type of the schema, so you can use types during development and avoid type errors.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
Compatibility with @types/aws-lambda
¶
The package @types/aws-lambda
is a popular project that contains type definitions for many AWS service event invocations.
Powertools parser utility also bring AWS Lambda event types based on the built-in schema definitions.
We recommend to use the types provided by the parser utility. If you encounter any issues or have any feedback, please submit an issue.
Testing your code¶
When testing your handler with parser decorator you need to use double assertion to bypass TypeScript type checking in your tests. This is useful when you want to test the handler for invalid payloads or when you want to test the error handling. If you are you use middy middleware, you don't need to do this.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
This also works when using safeParse
option.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|