diff --git a/aws_lambda_powertools/utilities/jmespath_utils/envelopes.py b/aws_lambda_powertools/utilities/jmespath_utils/envelopes.py index df50e5f98d4..f4aecb24bae 100644 --- a/aws_lambda_powertools/utilities/jmespath_utils/envelopes.py +++ b/aws_lambda_powertools/utilities/jmespath_utils/envelopes.py @@ -6,3 +6,8 @@ CLOUDWATCH_EVENTS_SCHEDULED = EVENTBRIDGE KINESIS_DATA_STREAM = "Records[*].kinesis.powertools_json(powertools_base64(data))" CLOUDWATCH_LOGS = "awslogs.powertools_base64_gzip(data) | powertools_json(@).logEvents[*]" +S3_SNS_SQS = "Records[*].powertools_json(body).powertools_json(Message).Records[0]" +S3_SQS = "Records[*].powertools_json(body).Records[0]" +S3_SNS_KINESIS_FIREHOSE = "records[*].powertools_json(powertools_base64(data)).powertools_json(Message).Records[0]" +S3_KINESIS_FIREHOSE = "records[*].powertools_json(powertools_base64(data)).Records[0]" +S3_EVENTBRIDGE_SQS = "Records[*].powertools_json(body).detail" diff --git a/docs/utilities/jmespath_functions.md b/docs/utilities/jmespath_functions.md index a01a72ced16..41b8c3704ce 100644 --- a/docs/utilities/jmespath_functions.md +++ b/docs/utilities/jmespath_functions.md @@ -64,16 +64,24 @@ We provide built-in envelopes for popular AWS Lambda event sources to easily dec These are all built-in envelopes you can use along with their expression as a reference: -| Envelope | JMESPath expression | -| --------------------------------- | ------------------------------------------------------------- | -| **`API_GATEWAY_REST`** | `powertools_json(body)` | -| **`API_GATEWAY_HTTP`** | `API_GATEWAY_REST` | -| **`SQS`** | `Records[*].powertools_json(body)` | -| **`SNS`** | `Records[0].Sns.Message | powertools_json(@)` | -| **`EVENTBRIDGE`** | `detail` | -| **`CLOUDWATCH_EVENTS_SCHEDULED`** | `EVENTBRIDGE` | -| **`KINESIS_DATA_STREAM`** | `Records[*].kinesis.powertools_json(powertools_base64(data))` | -| **`CLOUDWATCH_LOGS`** | `awslogs.powertools_base64_gzip(data) | powertools_json(@).logEvents[*]` | +| Envelope | JMESPath expression | +| --------------------------------- | ------------------------------------------------------------------------------------------ | +| **`API_GATEWAY_HTTP`** | `powertools_json(body)` | +| **`API_GATEWAY_REST`** | `powertools_json(body)` | +| **`CLOUDWATCH_EVENTS_SCHEDULED`** | `detail` | +| **`CLOUDWATCH_LOGS`** | `awslogs.powertools_base64_gzip(data) | powertools_json(@).logEvents[*]` | +| **`EVENTBRIDGE`** | `detail` | +| **`KINESIS_DATA_STREAM`** | `Records[*].kinesis.powertools_json(powertools_base64(data))` | +| **`S3_EVENTBRIDGE_SQS`** | `Records[*].powertools_json(body).detail` | +| **`S3_KINESIS_FIREHOSE`** | `records[*].powertools_json(powertools_base64(data)).Records[0]` | +| **`S3_SNS_KINESIS_FIREHOSE`** | `records[*].powertools_json(powertools_base64(data)).powertools_json(Message).Records[0]` | +| **`S3_SNS_SQS`** | `Records[*].powertools_json(body).powertools_json(Message).Records[0]` | +| **`S3_SQS`** | `Records[*].powertools_json(body).Records[0]` | +| **`SNS`** | `Records[0].Sns.Message | powertools_json(@)` | +| **`SQS`** | `Records[*].powertools_json(body)` | + +???+ tip "Using SNS?" + If you don't require SNS metadata, enable [raw message delivery](https://docs.aws.amazon.com/sns/latest/dg/sns-large-payload-raw-message-delivery.html){target="_blank"}. It will reduce multiple payload layers and size, when using SNS in combination with other services _(e.g., SQS, S3, etc)_. ## Advanced diff --git a/docs/utilities/validation.md b/docs/utilities/validation.md index ca5907a5fe1..277a1f91f81 100644 --- a/docs/utilities/validation.md +++ b/docs/utilities/validation.md @@ -141,16 +141,16 @@ We provide built-in envelopes to easily extract the payload from popular event s Here is a handy table with built-in envelopes along with their JMESPath expressions in case you want to build your own. -| Envelope name | JMESPath expression | -| ------------------------------- | ------------------------------------------------------------- | -| **API_GATEWAY_REST** | "powertools_json(body)" | -| **API_GATEWAY_HTTP** | "powertools_json(body)" | -| **SQS** | "Records[*].powertools_json(body)" | -| **SNS** | "Records[0].Sns.Message | powertools_json(@)" | -| **EVENTBRIDGE** | "detail" | -| **CLOUDWATCH_EVENTS_SCHEDULED** | "detail" | -| **KINESIS_DATA_STREAM** | "Records[*].kinesis.powertools_json(powertools_base64(data))" | -| **CLOUDWATCH_LOGS** | "awslogs.powertools_base64_gzip(data) | powertools_json(@).logEvents[*]" | +| Envelope | JMESPath expression | +| --------------------------------- | ------------------------------------------------------------------------ | +| **`API_GATEWAY_HTTP`** | `powertools_json(body)` | +| **`API_GATEWAY_REST`** | `powertools_json(body)` | +| **`CLOUDWATCH_EVENTS_SCHEDULED`** | `detail` | +| **`CLOUDWATCH_LOGS`** | `awslogs.powertools_base64_gzip(data) | powertools_json(@).logEvents[*]` | +| **`EVENTBRIDGE`** | `detail` | +| **`KINESIS_DATA_STREAM`** | `Records[*].kinesis.powertools_json(powertools_base64(data))` | +| **`SNS`** | `Records[0].Sns.Message | powertools_json(@)` | +| **`SQS`** | `Records[*].powertools_json(body)` | ## Advanced diff --git a/examples/jmespath_functions/src/extract_data_from_builtin_envelope.py b/examples/jmespath_functions/src/extract_data_from_builtin_envelope.py index 31ae6cf268c..d078e396519 100644 --- a/examples/jmespath_functions/src/extract_data_from_builtin_envelope.py +++ b/examples/jmespath_functions/src/extract_data_from_builtin_envelope.py @@ -1,12 +1,18 @@ +from __future__ import annotations + +from aws_lambda_powertools import Logger from aws_lambda_powertools.utilities.jmespath_utils import ( envelopes, extract_data_from_envelope, ) from aws_lambda_powertools.utilities.typing import LambdaContext +logger = Logger() + def handler(event: dict, context: LambdaContext) -> dict: - payload = extract_data_from_envelope(data=event, envelope=envelopes.SQS) - customer_id = payload.get("customerId") # now deserialized + records: list = extract_data_from_envelope(data=event, envelope=envelopes.SQS) + for record in records: # records is a list + logger.info(record.get("customerId")) # now deserialized - return {"customer_id": customer_id, "message": "success", "statusCode": 200} + return {"message": "success", "statusCode": 200}