Skip to content

Releases: aws-powertools/powertools-lambda-python

v1.4.0

25 Aug 16:10
814062e
Compare
Choose a tag to compare

Changes

Official Lambda Layer

We now provide an official Lambda Layer via AWS Serverless Application Repository (SAR) App. SAR App follows semantic versioning, and it is synchronized with what's published on PyPi.

SAR App ARN
aws-lambda-powertools-python-layer arn:aws:serverlessrepo:eu-west-1:057560766410:applications/aws-lambda-powertools-python-layer

A big thanks to @am29d for the implementation, and to Keith Rosario, a long standing contributor, and beta customer, who created the first Layers through his KLayers project - Lambda Layers for Python on GitHub before.

Auto-complete for SSMProvider on Parameters utility

Thanks to @michaelbrewer, SSMProvider within Parameters utility now have decrypt and recursive parameters correctly defined to support autocompletion.

Tracer support to not capture response as metadata

For customers returning sensitive information from their methods and Lambda handlers, Tracer decorators capture_method and capture_lambda_handler now support capture_response=False parameter to override this behaviour.

Cold start metric bugfix

This release ensures Metrics utility creates a Cold Start metric with dedicated CloudWatch dimensions function_name and service to explicitly separate Application metrics from System metrics.
Previously, when capturing cold start metric via capture_cold_start_metric parameter, we would add ColdStart metric to an existing metric set along with function_name as a dimension. This caused the problem of Application metrics having data points in two separate metrics with the same name, since one of them would have an additional function_name dimension in the event of a cold start.

Minor improvements to docs

Content in Tracer and Logger have been reordered to match what customers are looking for. Tracer docs have less main sections to improve navigation, a new section named Patching Modules, and a note for customers capturing sensitive information they might not want Tracer to capture it.

🌟 Minor Changes

  • feat: add workflow to trigger external pipeline for publishing lambda layers (#129) by @am29d
  • feat: option to disallow tracer to capture response as metadata (#128) by @heitorlessa

📜 Documentation updates

🐛 Bug and hot fixes

  • fix: split cold start metric from application metrics to prevent duplicate app metrics (#126) by @heitorlessa
  • fix(ssm): Make decrypt an explicit option and refactoring (#123) by @michaelbrewer

This release was made possible by the following contributors:

@am29d, @heitorlessa and @michaelbrewer

v1.3.1

22 Aug 09:06
Compare
Choose a tag to compare

Changes

Fixed issue with capture_method returning not working properly when the decorated function made us of context managers during its execution.

Patch

  • fix(capture_method): should yield inside with for generator method using a context manager (#124) by @michaelbrewer

Chore

  • chore(deps): bump elliptic from 6.5.2 to 6.5.3 in /docs (#120) by @dependabot
  • chore(deps): bump prismjs from 1.20.0 to 1.21.0 in /docs (#121) by @dependabot

This release was made possible by the following contributors:

@cakepietoast, @dependabot, @heitorlessa and @michaelbrewer

v1.3.0

21 Aug 14:06
41824b1
Compare
Choose a tag to compare

Changes

Sample code snippet of the parameters utility

Add a new utility to fetch and cache parameter values from AWS Systems Manager Parameter Store, AWS Secrets Manager or Amazon DynamoDB. It also provides a base class to create your parameter provider implementation.

Retrieve values from Systems Manager Parameter Store:

from aws_lambda_powertools.utilities import parameters

def handler(event, context):
    # Retrieve a single parameter
    value = parameters.get_parameter("/my/parameter")

    # Retrieve multiple parameters from a path prefix recursively
    # This returns a dict with the parameter name as key
    values = parameters.get_parameters("/my/path/prefix")
    for k, v in values.items():
        print(f"{k}: {v}")

Retrieve secrets from AWS Secrets Managers:

from aws_lambda_powertools.utilities import parameters

def handler(event, context):
    # Retrieve a single secret
    value = parameters.get_secret("my-secret")

🌟 Minor Changes

This release was made possible by the following contributors:

@nmoutschen

v1.2.0

20 Aug 16:21
8621d4e
Compare
Choose a tag to compare

Changes

The Tracer capture_method decorator can now be used to capture execution of generator functions, including context managers.

  • chore: bump version to 1.2.0 (#119) by @cakepietoast

🌟 Minor Changes

  • feat: add support for tracing of generators using capture_method decorator (#113) by @cakepietoast

This release was made possible by the following contributors:

@cakepietoast

v1.1.3

18 Aug 20:28
81539a0
Compare
Choose a tag to compare

Changes

Fix logged messages being emitted twice, once structured and once unstructured - We now remove the root logger handler set by Lambda during initialization.

Patch

Chore

This release was made possible by the following contributors:

@heitorlessa

v1.1.2

16 Aug 17:39
6b66e0b
Compare
Choose a tag to compare

Changes

Minor patch to improve Tracer documentation on reusability, and ensures PyCharm/VSCode Jedi Language Server can autocomplete log statements for Logger.

📜 Documentation updates

This release was made possible by the following contributors:

@heitorlessa @michaelbrewer

v1.1.1

14 Aug 19:18
24a3bdf
Compare
Choose a tag to compare

Changes

Fix Logger regression introduced in 1.1.0 when using int for setting log level, for example Logger(level=logging.INFO).

Patch

Chore

This release was made possible by the following contributors:

@heitorlessa, and big thanks to @zroger for spotting and raising this regression

v1.1.0

14 Aug 16:10
d3feb63
Compare
Choose a tag to compare

Changes

This release add support for reusing Logger across multiple files in your code base via the new child parameter 🎉🎉🎉

Child Loggers will be named after the convention {service}.{filename} - It now follows the Python Logging inheritance mechanics. Here's a code excerpt to demonstrate how this feature looks like:

app.py - Your typical parent logger will be at your Lambda function handler

# POWERTOOLS_SERVICE_NAME: "payment"
import shared # Creates a child logger named "payment.shared"
from aws_lambda_powertools import Logger

logger = Logger()

def handler(event, context):
  shared.inject_payment_id(event) # highlight-line
  logger.structure_logs(append=True, order_id=event["order_id"]) # highlight-line
      ...

shared.py - You can use Logger(child=True) to explicit tell Logger this should be the child

# POWERTOOLS_SERVICE_NAME: "payment"
from aws_lambda_powertools import Logger

logger = Logger(child=True) # highlight-line

def inject_payment_id(event):
    logger.structure_logs(append=True, payment_id=event["payment_id"])

🌟 Minor Changes

Chore

  • chore(deps): bump lodash from 4.17.15 to 4.17.19 in /docs (#93) by @dependabot

This release was made possible by the following contributors:

@heitorlessa @alexanderluiscampino

v1.0.2

16 Jul 14:23
6db7263
Compare
Choose a tag to compare

Changes

This release allows the latest version of X-Ray SDK (2.6.0) to be installed, and no longer locks to the previous version (2.5.0).

Chore

This release was made possible by the following contributors:

@Nr18 and @heitorlessa

v1.0.1

05 Jul 19:46
0670e5e
Compare
Choose a tag to compare

Changes

Quick bugfix to Logger causing additional keys to be dropped when added before logger.inject_lambda_context was called.

This only happened in two typical situations, and is now fixed with this release

  1. Additional keys added as part of global scope
from aws_lambda_powertools import Logger

logger = Logger()
logger.structured_logs(some_key="some_value") # some_key won't be available within the handler

@logger.inject_lambda_context
def handler(evt, ctx):
    ...
  1. Additional keys added as part of a custom middleware or a Layer that executed before
from aws_lambda_powertools.middleware_factory import lambda_handler_decorator

@lambda_handler_decorator(trace_execution=True)
def process_booking_handler(
    handler: Callable, event: Dict, context: Any, logger: Logger = None
) -> Callable:
    if logger is None:
        logger = Logger()

    # Add Step Functions specific keys from state into the Logger
    # Add Lambda contextual info incl cold start into the Logger
    _logger_inject_process_booking_sfn(logger=logger, event=event)
    handler = logger.inject_lambda_context(handler)

    return handler(event, context)

🐛 Bug and hot fixes

  • fix: append structured logs when injecting lambda context (#86) by @heitorlessa

This release was made possible by the following contributors:

@heitorlessa