From 23c53653508880ef5efa5c4328116377a8519773 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Fri, 26 Sep 2025 20:27:54 +0100 Subject: [PATCH 1/4] Adding support for Python 3.14 --- .github/ISSUE_TEMPLATE/bug_report.yml | 1 + .github/ISSUE_TEMPLATE/static_typing.yml | 1 + .github/workflows/bootstrap_region.yml | 2 + .github/workflows/layer_govcloud.yml | 3 ++ .github/workflows/layer_govcloud_verify.yml | 3 ++ .github/workflows/layers_partition_verify.yml | 4 +- .github/workflows/layers_partitions.yml | 4 +- .github/workflows/pre-release.yml | 4 +- .github/workflows/publish_v3_layer.yml | 4 +- .github/workflows/quality_check.yml | 2 +- .github/workflows/quality_check_docs.yml | 2 +- .../quality_code_cdk_constructor.yml | 2 +- .github/workflows/release-v3.yml | 4 +- .../reusable_deploy_v3_layer_stack.yml | 4 +- .github/workflows/reusable_deploy_v3_sar.yml | 2 +- .github/workflows/run-e2e-tests.yml | 2 +- .github/workflows/update_ssm.yml | 6 ++- docs/automation.md | 2 +- docs/build_recipes/cross-platform.md | 1 + docs/includes/_layer_homepage_arm64.md | 36 ++++++++++++++++++ docs/includes/_layer_homepage_x86.md | 37 +++++++++++++++++++ docs/index.md | 12 +++--- docs/tutorial/index.md | 2 +- docs/upgrade.md | 4 +- docs/versioning.md | 6 +-- layer_v3/layer/canary_stack.py | 2 + layer_v3/layer/layer_stack.py | 2 + pyproject.toml | 1 + tests/e2e/utils/infrastructure.py | 5 ++- 29 files changed, 132 insertions(+), 28 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 77c028f7fed..40394c843de 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -63,6 +63,7 @@ body: - "3.11" - "3.12" - "3.13" + - "3.14" validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/static_typing.yml b/.github/ISSUE_TEMPLATE/static_typing.yml index 83bfd3dc361..7c09de950a8 100644 --- a/.github/ISSUE_TEMPLATE/static_typing.yml +++ b/.github/ISSUE_TEMPLATE/static_typing.yml @@ -30,6 +30,7 @@ body: - "3.11" - "3.12" - "3.13" + - "3.14" validations: required: true - type: input diff --git a/.github/workflows/bootstrap_region.yml b/.github/workflows/bootstrap_region.yml index 25a904495a2..a5a46b3ac22 100644 --- a/.github/workflows/bootstrap_region.yml +++ b/.github/workflows/bootstrap_region.yml @@ -85,11 +85,13 @@ jobs: - AWSLambdaPowertoolsPythonV3-python311-arm64 - AWSLambdaPowertoolsPythonV3-python312-arm64 - AWSLambdaPowertoolsPythonV3-python313-arm64 + - AWSLambdaPowertoolsPythonV3-python314-arm64 - AWSLambdaPowertoolsPythonV3-python39-x86_64 - AWSLambdaPowertoolsPythonV3-python310-x86_64 - AWSLambdaPowertoolsPythonV3-python311-x86_64 - AWSLambdaPowertoolsPythonV3-python312-x86_64 - AWSLambdaPowertoolsPythonV3-python313-x86_64 + - AWSLambdaPowertoolsPythonV3-python314-x86_64 environment: layer-${{ inputs.environment }} steps: - id: credentials diff --git a/.github/workflows/layer_govcloud.yml b/.github/workflows/layer_govcloud.yml index fceea7e6838..bbee878f5f1 100644 --- a/.github/workflows/layer_govcloud.yml +++ b/.github/workflows/layer_govcloud.yml @@ -53,6 +53,7 @@ jobs: - AWSLambdaPowertoolsPythonV3-python311 - AWSLambdaPowertoolsPythonV3-python312 - AWSLambdaPowertoolsPythonV3-python313 + - AWSLambdaPowertoolsPythonV3-python314 arch: - arm64 - x86_64 @@ -98,6 +99,7 @@ jobs: - AWSLambdaPowertoolsPythonV3-python311 - AWSLambdaPowertoolsPythonV3-python312 - AWSLambdaPowertoolsPythonV3-python313 + - AWSLambdaPowertoolsPythonV3-python314 arch: - arm64 - x86_64 @@ -166,6 +168,7 @@ jobs: - AWSLambdaPowertoolsPythonV3-python311 - AWSLambdaPowertoolsPythonV3-python312 - AWSLambdaPowertoolsPythonV3-python313 + - AWSLambdaPowertoolsPythonV3-python314 arch: - arm64 - x86_64 diff --git a/.github/workflows/layer_govcloud_verify.yml b/.github/workflows/layer_govcloud_verify.yml index c60b750b47e..a2b8fbc7476 100644 --- a/.github/workflows/layer_govcloud_verify.yml +++ b/.github/workflows/layer_govcloud_verify.yml @@ -33,6 +33,7 @@ jobs: - AWSLambdaPowertoolsPythonV3-python311 - AWSLambdaPowertoolsPythonV3-python312 - AWSLambdaPowertoolsPythonV3-python313 + - AWSLambdaPowertoolsPythonV3-python314 arch: - arm64 - x86_64 @@ -63,6 +64,7 @@ jobs: - AWSLambdaPowertoolsPythonV3-python311 - AWSLambdaPowertoolsPythonV3-python312 - AWSLambdaPowertoolsPythonV3-python313 + - AWSLambdaPowertoolsPythonV3-python314 arch: - arm64 - x86_64 @@ -94,6 +96,7 @@ jobs: - AWSLambdaPowertoolsPythonV3-python311 - AWSLambdaPowertoolsPythonV3-python312 - AWSLambdaPowertoolsPythonV3-python313 + - AWSLambdaPowertoolsPythonV3-python314 arch: - arm64 - x86_64 diff --git a/.github/workflows/layers_partition_verify.yml b/.github/workflows/layers_partition_verify.yml index 8fc0965d891..22433edf0f8 100644 --- a/.github/workflows/layers_partition_verify.yml +++ b/.github/workflows/layers_partition_verify.yml @@ -82,6 +82,7 @@ jobs: - AWSLambdaPowertoolsPythonV3-python311 - AWSLambdaPowertoolsPythonV3-python312 - AWSLambdaPowertoolsPythonV3-python313 + - AWSLambdaPowertoolsPythonV3-python314 arch: - arm64 - x86_64 @@ -124,6 +125,7 @@ jobs: - AWSLambdaPowertoolsPythonV3-python311 - AWSLambdaPowertoolsPythonV3-python312 - AWSLambdaPowertoolsPythonV3-python313 + - AWSLambdaPowertoolsPythonV3-python314 arch: - arm64 - x86_64 @@ -153,4 +155,4 @@ jobs: REMOTE_SHA=$(jq -r '.Content.CodeSha256' $layer_output) LOCAL_SHA=$(jq -r '.Content.CodeSha256' ${{ matrix.layer }}-${{ matrix.arch }}.json) test "$REMOTE_SHA" == "$LOCAL_SHA" && echo "SHA OK: ${LOCAL_SHA}" || exit 1 - jq -s -r '["Layer Arn", "Runtimes", "Version", "Description", "SHA256"], ([.[0], .[1]] | .[] | [.LayerArn, (.CompatibleRuntimes | join("/")), .Version, .Description, .Content.CodeSha256]) |@tsv' ${{ matrix.layer }}-${{ matrix.arch }}.json $layer_output | column -t -s $'\t' \ No newline at end of file + jq -s -r '["Layer Arn", "Runtimes", "Version", "Description", "SHA256"], ([.[0], .[1]] | .[] | [.LayerArn, (.CompatibleRuntimes | join("/")), .Version, .Description, .Content.CodeSha256]) |@tsv' ${{ matrix.layer }}-${{ matrix.arch }}.json $layer_output | column -t -s $'\t' diff --git a/.github/workflows/layers_partitions.yml b/.github/workflows/layers_partitions.yml index f92049b70d8..2a6187968bf 100644 --- a/.github/workflows/layers_partitions.yml +++ b/.github/workflows/layers_partitions.yml @@ -79,6 +79,7 @@ jobs: - AWSLambdaPowertoolsPythonV3-python311 - AWSLambdaPowertoolsPythonV3-python312 - AWSLambdaPowertoolsPythonV3-python313 + - AWSLambdaPowertoolsPythonV3-python314 arch: - arm64 - x86_64 @@ -128,6 +129,7 @@ jobs: - AWSLambdaPowertoolsPythonV3-python311 - AWSLambdaPowertoolsPythonV3-python312 - AWSLambdaPowertoolsPythonV3-python313 + - AWSLambdaPowertoolsPythonV3-python314 arch: - arm64 - x86_64 @@ -190,4 +192,4 @@ jobs: name: ${{ matrix.layer }}-${{ matrix.arch }}-${{ matrix.region }}.json path: ${{ matrix.layer }}-${{ matrix.arch }}-${{ matrix.region }}.json retention-days: 1 - if-no-files-found: error \ No newline at end of file + if-no-files-found: error diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index 27f78dfe44c..1001dc234bb 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -128,7 +128,7 @@ jobs: - name: Set up Python uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 with: - python-version: "3.12" + python-version: "3.14" cache: "poetry" - name: Install dependencies run: make dev @@ -166,7 +166,7 @@ jobs: - name: Set up Python uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 with: - python-version: "3.12" + python-version: "3.14" cache: "poetry" - name: Build python package and wheel diff --git a/.github/workflows/publish_v3_layer.yml b/.github/workflows/publish_v3_layer.yml index 439b8004e5d..9f3d426b109 100644 --- a/.github/workflows/publish_v3_layer.yml +++ b/.github/workflows/publish_v3_layer.yml @@ -2,7 +2,7 @@ name: Deploy v3 layer to all regions # PROCESS # -# 1. Compile Layer using cdk-aws-lambda-powertools-layer CDK construct for Python3.9-3.13 and x86_64/ARM architectures (uses custom runner as it's CPU heavy) +# 1. Compile Layer using cdk-aws-lambda-powertools-layer CDK construct for Python3.9-3.14 and x86_64/ARM architectures (uses custom runner as it's CPU heavy) # 2. Kick off pipeline for beta, prod, and canary releases # 3. Create PR to update trunk so staged docs also point to the latest Layer ARN, when merged # 4. Builds and publishes docs with latest Layer ARN using given version (generally coming from release) @@ -102,7 +102,7 @@ jobs: strategy: max-parallel: 5 matrix: - python-version: ["3.9","3.10","3.11","3.12","3.13"] + python-version: ["3.9","3.10","3.11","3.12","3.13","3.14"] defaults: run: working-directory: ./layer_v3 diff --git a/.github/workflows/quality_check.yml b/.github/workflows/quality_check.yml index 6a0465ebd47..c503e2aad56 100644 --- a/.github/workflows/quality_check.yml +++ b/.github/workflows/quality_check.yml @@ -46,7 +46,7 @@ jobs: strategy: max-parallel: 5 matrix: - python-version: ["3.9","3.10","3.11","3.12","3.13"] + python-version: ["3.9","3.10","3.11","3.12","3.13","3.14"] env: PYTHON: "${{ matrix.python-version }}" permissions: diff --git a/.github/workflows/quality_check_docs.yml b/.github/workflows/quality_check_docs.yml index 15bb6fa1349..4b35d5c12b9 100644 --- a/.github/workflows/quality_check_docs.yml +++ b/.github/workflows/quality_check_docs.yml @@ -39,7 +39,7 @@ jobs: - name: Set up Python uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 with: - python-version: 3.13 + python-version: 3.14 - name: Install doc generation dependencies run: | cat docs/requirements.txt diff --git a/.github/workflows/quality_code_cdk_constructor.yml b/.github/workflows/quality_code_cdk_constructor.yml index 7f1c8ef99de..31011db9d15 100644 --- a/.github/workflows/quality_code_cdk_constructor.yml +++ b/.github/workflows/quality_code_cdk_constructor.yml @@ -33,7 +33,7 @@ jobs: strategy: max-parallel: 4 matrix: - python-version: ["3.12"] + python-version: ["3.14"] env: PYTHON: "${{ matrix.python-version }}" permissions: diff --git a/.github/workflows/release-v3.yml b/.github/workflows/release-v3.yml index 2622d121d84..7b303e4a9c1 100644 --- a/.github/workflows/release-v3.yml +++ b/.github/workflows/release-v3.yml @@ -142,7 +142,7 @@ jobs: - name: Set up Python uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 with: - python-version: "3.12" + python-version: "3.14" cache: "poetry" - name: Install dependencies run: make dev @@ -180,7 +180,7 @@ jobs: - name: Set up Python uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 with: - python-version: "3.12" + python-version: "3.14" cache: "poetry" - name: Build python package and wheel diff --git a/.github/workflows/reusable_deploy_v3_layer_stack.yml b/.github/workflows/reusable_deploy_v3_layer_stack.yml index 47820a0b1d1..942923b51c2 100644 --- a/.github/workflows/reusable_deploy_v3_layer_stack.yml +++ b/.github/workflows/reusable_deploy_v3_layer_stack.yml @@ -3,7 +3,7 @@ name: Deploy CDK Layer v3 stack # PROCESS # # 1. Split what AWS regions support ARM vs regions that Lambda support ARM -# 2. We build the Lambda layer for 3.9 to 3.13 Python runtime and both x86_64 and arm64 (see `matrix` section) +# 2. We build the Lambda layer for 3.9 to 3.14 Python runtime and both x86_64 and arm64 (see `matrix` section) # 3. Deploy previously built layer for each AWS commercial region # 4. Export all published Layers as JSON # 5. Deploy Canaries to every deployed region to test whether Powertools can be imported etc. @@ -78,7 +78,7 @@ jobs: "eu-north-1", "eu-south-1", "eu-south-2", "eu-west-1", "eu-west-2", "eu-west-3", "il-central-1", "me-central-1", "me-south-1", "mx-central-1", "sa-east-1", "us-east-1", "us-east-2", "us-west-1", "us-west-2"] - python-version: ["3.9","3.10","3.11","3.12","3.13"] + python-version: ["3.9","3.10","3.11","3.12","3.13","3.14"] include: - region: "af-south-1" has_arm64_support: "true" diff --git a/.github/workflows/reusable_deploy_v3_sar.yml b/.github/workflows/reusable_deploy_v3_sar.yml index 87c12459d30..e378336121e 100644 --- a/.github/workflows/reusable_deploy_v3_sar.yml +++ b/.github/workflows/reusable_deploy_v3_sar.yml @@ -72,7 +72,7 @@ jobs: strategy: matrix: architecture: ["x86_64", "arm64"] - python-version: ["3.9","3.10","3.11","3.12","3.13"] + python-version: ["3.9","3.10","3.11","3.12","3.13","3.14"] steps: - name: checkout uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 diff --git a/.github/workflows/run-e2e-tests.yml b/.github/workflows/run-e2e-tests.yml index 7cd4f4c3b48..d654f79c122 100644 --- a/.github/workflows/run-e2e-tests.yml +++ b/.github/workflows/run-e2e-tests.yml @@ -48,7 +48,7 @@ jobs: strategy: fail-fast: false # needed so if a version fails, the others will still be able to complete and cleanup matrix: - version: ["3.9", "3.10", "3.11", "3.12","3.13"] + version: ["3.9", "3.10", "3.11", "3.12","3.13","3.14"] if: ${{ github.actor != 'dependabot[bot]' && github.repository == 'aws-powertools/powertools-lambda-python' }} steps: - name: "Checkout" diff --git a/.github/workflows/update_ssm.yml b/.github/workflows/update_ssm.yml index ee0ba119ded..0bf148882e1 100644 --- a/.github/workflows/update_ssm.yml +++ b/.github/workflows/update_ssm.yml @@ -10,7 +10,7 @@ name: SSM Parameters # * layer_version: this is sequential layer version from the ARN # # A successful parameter would look similar to: -# /aws/service/powertools/python/arm64/python3.13/3.1.0 +# /aws/service/powertools/python/arm64/python3.14/3.1.0 # And will have a value of: # arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:4 @@ -103,12 +103,14 @@ jobs: aws ssm put-parameter --name ${{ env.prefix }}/python/arm64/python3.11/${{ inputs.package_version }} --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/arm64/python3.12/${{ inputs.package_version }} --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/arm64/python3.13/${{ inputs.package_version }} --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:${{ inputs.layer_version }}" --type String --overwrite + aws ssm put-parameter --name ${{ env.prefix }}/python/arm64/python3.14/${{ inputs.package_version }} --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/x86_64/python3.9/${{ inputs.package_version }} --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/x86_64/python3.10/${{ inputs.package_version }} --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/x86_64/python3.11/${{ inputs.package_version }} --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/x86_64/python3.12/${{ inputs.package_version }} --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/x86_64/python3.13/${{ inputs.package_version }} --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:${{ inputs.layer_version }}" --type String --overwrite + aws ssm put-parameter --name ${{ env.prefix }}/python/x86_64/python3.14/${{ inputs.package_version }} --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:${{ inputs.layer_version }}" --type String --overwrite - id: write-latest if: inputs.write_latest == true @@ -120,9 +122,11 @@ jobs: aws ssm put-parameter --name ${{ env.prefix }}/python/arm64/python3.11/latest --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/arm64/python3.12/latest --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/arm64/python3.13/latest --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:${{ inputs.layer_version }}" --type String --overwrite + aws ssm put-parameter --name ${{ env.prefix }}/python/arm64/python3.14/latest --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/x86_64/python3.9/latest --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/x86_64/python3.10/latest --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/x86_64/python3.11/latest --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/x86_64/python3.12/latest --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:${{ inputs.layer_version }}" --type String --overwrite aws ssm put-parameter --name ${{ env.prefix }}/python/x86_64/python3.13/latest --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:${{ inputs.layer_version }}" --type String --overwrite + aws ssm put-parameter --name ${{ env.prefix }}/python/x86_64/python3.14/latest --value "arn:aws:lambda:${{ matrix.region }}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:${{ inputs.layer_version }}" --type String --overwrite diff --git a/docs/automation.md b/docs/automation.md index 918a062c11b..d564388cfbd 100644 --- a/docs/automation.md +++ b/docs/automation.md @@ -94,7 +94,7 @@ This is a snapshot of our automated checks at a glance. To build and deploy the Lambda Layers, we run a pipeline with the following steps: * We fetch the latest PyPi release and use it as the source for our layer. -* We build Python versions ranging from **3.9 to 3.13** for x86_64 and arm64 architectures. This is necessary because we use pre-compiled libraries like **Pydantic** and **Cryptography**, which require specific Python versions for each layer. +* We build Python versions ranging from **3.9 to 3.14** for x86_64 and arm64 architectures. This is necessary because we use pre-compiled libraries like **Pydantic** and **Cryptography**, which require specific Python versions for each layer. * We provide layer distributions for both the **x86_64** and **arm64** architectures. * For each Python version, we create a single CDK package containing both x86_64 and arm64 assets to optimize deployment performance. diff --git a/docs/build_recipes/cross-platform.md b/docs/build_recipes/cross-platform.md index 9f4c5caaefa..a945265452d 100644 --- a/docs/build_recipes/cross-platform.md +++ b/docs/build_recipes/cross-platform.md @@ -129,6 +129,7 @@ Lambda managed runtimes use [specific Amazon Linux versions](https://docs.aws.am | **python3.11** | Amazon Linux 2 | 2.26 | x86_64, arm64 | | **python3.12** | Amazon Linux 2023 | 2.34 | x86_64, arm64 | | **python3.13** | Amazon Linux 2023 | 2.34 | x86_64, arm64 | +| **python3.14** | Amazon Linux 2023 | 2.34 | x86_64, arm64 | ???+ warning "GLIBC Version Mismatch" Compiled libraries built on systems with newer GLIBC versions will fail on Lambda runtimes with older GLIBC versions. Ubuntu 24.04 (GLIBC 2.39) and Ubuntu 22.04 (GLIBC 2.35) are incompatible with Lambda python3.11 and earlier (GLIBC 2.26). Always use `--platform` flags or Docker with Lambda base images. diff --git a/docs/includes/_layer_homepage_arm64.md b/docs/includes/_layer_homepage_arm64.md index 204816aa6eb..0a46f880905 100644 --- a/docs/includes/_layer_homepage_arm64.md +++ b/docs/includes/_layer_homepage_arm64.md @@ -181,3 +181,39 @@ | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:23**{: .copyMe} | | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:23**{: .copyMe} | | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:23**{: .copyMe} | + + === "Python 3.14" + + | Region | Layer ARN | + | -------------------- | --------------------------------------------------------------------------------------------------------------- | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`ap-southeast-7`** | **arn:aws:lambda:ap-southeast-7:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`mx-central-1`** | **arn:aws:lambda:mx-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:23**{: .copyMe} | diff --git a/docs/includes/_layer_homepage_x86.md b/docs/includes/_layer_homepage_x86.md index 46f2abae31e..47d97d684ae 100644 --- a/docs/includes/_layer_homepage_x86.md +++ b/docs/includes/_layer_homepage_x86.md @@ -185,3 +185,40 @@ | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:23**{: .copyMe} | | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:23**{: .copyMe} | | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:23**{: .copyMe} | + + === "Python 3.14" + + | Region | Layer ARN | + | -------------------- | --------------------------------------------------------------------------------------------------------- | + | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`ap-southeast-7`** | **arn:aws:lambda:ap-southeast-7:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`mx-central-1`** | **arn:aws:lambda:mx-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | + | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:23**{: .copyMe} | diff --git a/docs/index.md b/docs/index.md index 75756b2162b..2421047ecfb 100644 --- a/docs/index.md +++ b/docs/index.md @@ -66,7 +66,7 @@ You can install Powertools for AWS Lambda (Python) using your favorite dependenc [Lambda Layer](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html){target="_blank"} is a .zip file archive that can contain additional code, pre-packaged dependencies, data, or configuration files. We compile and optimize [all dependencies](#install), and remove duplicate dependencies [already available in the Lambda runtime](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/layer_v3/docker/Dockerfile#L34){target="_blank"} to achieve the most optimal size. - For the latter, make sure to replace `{region}` with your AWS region, e.g., `eu-west-1`, and the `{python_version}` without the period (.), e.g., `python313` for `Python 3.13`. + For the latter, make sure to replace `{region}` with your AWS region, e.g., `eu-west-1`, and the `{python_version}` without the period (.), e.g., `python314` for `Python 3.14`. | Architecture | Layer ARN | | ------------ | ----------------------------------------------------------------------------------------------------------------------------- | @@ -89,7 +89,7 @@ You can install Powertools for AWS Lambda (Python) using your favorite dependenc Sample Placeholders: - `{arch}` is either `arm64` (Graviton based functions) or `x86_64` - - `{python_version}` is the Python runtime version, e.g., `python3.13` for `Python 3.13`. + - `{python_version}` is the Python runtime version, e.g., `python3.14` for `Python 3.14`. - `{version}` is the semantic version number (e,g. 3.1.0) for a release or `latest` ```yaml @@ -215,7 +215,7 @@ You can install Powertools for AWS Lambda (Python) using your favorite dependenc [Lambda Layer](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html){target="_blank"} is a .zip file archive that can contain additional code, pre-packaged dependencies, data, or configuration files. We compile and optimize [all dependencies](#install), and remove duplicate dependencies [already available in the Lambda runtime](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/layer_v3/docker/Dockerfile#L34){target="_blank"} to achieve the most optimal size. - For the latter, make sure to replace `{python_version}` without the period (.), e.g., `python313` for `Python 3.13`. + For the latter, make sure to replace `{python_version}` without the period (.), e.g., `python314` for `Python 3.14`. **AWS China Beijing (cn-north-1)** @@ -228,7 +228,7 @@ You can install Powertools for AWS Lambda (Python) using your favorite dependenc [Lambda Layer](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html){target="_blank"} is a .zip file archive that can contain additional code, pre-packaged dependencies, data, or configuration files. We compile and optimize [all dependencies](#install), and remove duplicate dependencies [already available in the Lambda runtime](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/layer_v3/docker/Dockerfile#L34){target="_blank"} to achieve the most optimal size. - For the latter, make sure to replace `{python_version}` without the period (.), e.g., `python313` for `Python 3.13`. + For the latter, make sure to replace `{python_version}` without the period (.), e.g., `python314` for `Python 3.14`. **AWS GovCloud (us-gov-east-1)** @@ -248,7 +248,7 @@ You can install Powertools for AWS Lambda (Python) using your favorite dependenc We provide a SAR App that deploys a CloudFormation stack with a copy of our Lambda Layer in your AWS account and region. - Compared with the [public Layer ARN](#lambda-layer) option, the advantage is being able to use a semantic version. Make sure to replace `{python_version}` without the period (.), e.g., `python313` for `Python 3.13`. + Compared with the [public Layer ARN](#lambda-layer) option, the advantage is being able to use a semantic version. Make sure to replace `{python_version}` without the period (.), e.g., `python314` for `Python 3.14`. | App | ARN | Architecture | | --- | --- | ------------ | @@ -351,11 +351,13 @@ Compared with the [public Layer ARN](#lambda-layer) option, SAR allows you to ch | [aws-lambda-powertools-python-layer-v3-python311-x86-64](https://serverlessrepo.aws.amazon.com/applications/eu-west-1/057560766410/aws-lambda-powertools-python-layer-v3-python11-x86-64){target="_blank"} | [arn:aws:serverlessrepo:eu-west-1:057560766410:applications/aws-lambda-powertools-python-layer-v3-python311-x86-64](#){: .copyMe} | Python 3.11 | X86_64 | | [aws-lambda-powertools-python-layer-v3-python312-x86-64](https://serverlessrepo.aws.amazon.com/applications/eu-west-1/057560766410/aws-lambda-powertools-python-layer-v3-python12-x86-64){target="_blank"} | [arn:aws:serverlessrepo:eu-west-1:057560766410:applications/aws-lambda-powertools-python-layer-v3-python312-x86-64](#){: .copyMe} | Python 3.12 | X86_64 | | [aws-lambda-powertools-python-layer-v3-python313-x86-64](https://serverlessrepo.aws.amazon.com/applications/eu-west-1/057560766410/aws-lambda-powertools-python-layer-v3-python313-x86-64){target="_blank"} | [arn:aws:serverlessrepo:eu-west-1:057560766410:applications/aws-lambda-powertools-python-layer-v3-python313-x86-64](#){: .copyMe} | Python 3.13 | X86_64 | +| [aws-lambda-powertools-python-layer-v3-python314-x86-64](https://serverlessrepo.aws.amazon.com/applications/eu-west-1/057560766410/aws-lambda-powertools-python-layer-v3-python314-x86-64){target="_blank"} | [arn:aws:serverlessrepo:eu-west-1:057560766410:applications/aws-lambda-powertools-python-layer-v3-python314-x86-64](#){: .copyMe} | Python 3.14 | X86_64 | | [aws-lambda-powertools-python-layer-v3-python39-arm64](https://serverlessrepo.aws.amazon.com/applications/eu-west-1/057560766410/aws-lambda-powertools-python-layer-v3-python39-arm64){target="_blank"} | [arn:aws:serverlessrepo:eu-west-1:057560766410:applications/aws-lambda-powertools-python-layer-v3-python39-arm64](#){: .copyMe} | Python 3.9 | ARM64 | | [aws-lambda-powertools-python-layer-v3-python310-arm64](https://serverlessrepo.aws.amazon.com/applications/eu-west-1/057560766410/aws-lambda-powertools-python-layer-v3-python310-arm64){target="_blank"} | [arn:aws:serverlessrepo:eu-west-1:057560766410:applications/aws-lambda-powertools-python-layer-v3-python310-arm64](#){: .copyMe} | Python 3.10 | ARM64 | | [aws-lambda-powertools-python-layer-v3-python311-arm64](https://serverlessrepo.aws.amazon.com/applications/eu-west-1/057560766410/aws-lambda-powertools-python-layer-v3-python11-arm64){target="_blank"} | [arn:aws:serverlessrepo:eu-west-1:057560766410:applications/aws-lambda-powertools-python-layer-v3-python311-arm64](#){: .copyMe} | Python 3.11 | ARM64 | | [aws-lambda-powertools-python-layer-v3-python312-arm64](https://serverlessrepo.aws.amazon.com/applications/eu-west-1/057560766410/aws-lambda-powertools-python-layer-v3-python12-arm64){target="_blank"} | [arn:aws:serverlessrepo:eu-west-1:057560766410:applications/aws-lambda-powertools-python-layer-v3-python312-arm64](#){: .copyMe} | Python 3.12 | ARM64 | | [aws-lambda-powertools-python-layer-v3-python313-arm64](https://serverlessrepo.aws.amazon.com/applications/eu-west-1/057560766410/aws-lambda-powertools-python-layer-v3-python313-arm64){target="_blank"} | [arn:aws:serverlessrepo:eu-west-1:057560766410:applications/aws-lambda-powertools-python-layer-v3-python313-arm64](#){: .copyMe} | Python 3.13 | ARM64 | +| [aws-lambda-powertools-python-layer-v3-python314-arm64](https://serverlessrepo.aws.amazon.com/applications/eu-west-1/057560766410/aws-lambda-powertools-python-layer-v3-python314-arm64){target="_blank"} | [arn:aws:serverlessrepo:eu-west-1:057560766410:applications/aws-lambda-powertools-python-layer-v3-python314-arm64](#){: .copyMe} | Python 3.14 | ARM64 | ??? note "Click to expand and copy SAR code snippets for popular frameworks" diff --git a/docs/tutorial/index.md b/docs/tutorial/index.md index c561dea8953..d4acd7b9978 100644 --- a/docs/tutorial/index.md +++ b/docs/tutorial/index.md @@ -20,7 +20,7 @@ Let's clone our sample project before we add one feature at a time. Bootstrap directly via SAM CLI: ```shell - sam init --app-template hello-world-powertools-python --name sam-app --package-type Zip --runtime python3.13 --no-tracing + sam init --app-template hello-world-powertools-python --name sam-app --package-type Zip --runtime python3.14 --no-tracing ``` ```bash title="Use SAM CLI to initialize the sample project" diff --git a/docs/upgrade.md b/docs/upgrade.md index 25de20fec23..b90622ee3c1 100644 --- a/docs/upgrade.md +++ b/docs/upgrade.md @@ -114,7 +114,7 @@ We have stopped exporting Pydantic objects directly from `aws_lambda_powertools. !!! note "No code changes required" -To give you better a better experience, we're now building Powertools for AWS Lambda (Python)'s Lambda layers for specific Python versions (`3.9-3.13`) and architectures (`x86_64` & `arm64`). +To give you better a better experience, we're now building Powertools for AWS Lambda (Python)'s Lambda layers for specific Python versions (`3.9-3.14`) and architectures (`x86_64` & `arm64`). This also allows us to include architecture-specific versions of both Pydantic v2 and AWS Encryption SDK and give you a more streamlined setup. @@ -127,11 +127,13 @@ To take advantage of the new layers, you need to update your functions or deploy | x86_64 | 3.11 | arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:{version} | | x86_64 | 3.12 | arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:{version} | | x86_64 | 3.13 | arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:{version} | +| x86_64 | 3.14 | arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-x86_64:{version} | | arm64 | 3.9 | arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:{version} | | arm64 | 3.10 | arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:{version} | | arm64 | 3.11 | arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:{version} | | arm64 | 3.12 | arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:{version} | | arm64 | 3.13 | arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:{version} | +| arm64 | 3.14 | arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python314-arm64:{version} | ## Event Handler: headers are case-insensitive diff --git a/docs/versioning.md b/docs/versioning.md index febcc616045..76fc55645f0 100644 --- a/docs/versioning.md +++ b/docs/versioning.md @@ -37,11 +37,11 @@ Most AWS SDKs have underlying dependencies, such as language runtimes, AWS Lambd The following terms are used to classify underlying third party dependencies: -* [**AWS Lambda Runtime**](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html): Examples include `nodejs20.x`, `python3.13`, etc. -* **Language Runtime**: Examples include Python 3.13, NodeJS 20, Java 17, .NET Core, etc. +* [**AWS Lambda Runtime**](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html): Examples include `nodejs20.x`, `python3.14`, etc. +* **Language Runtime**: Examples include Python 3.14, NodeJS 20, Java 17, .NET Core, etc. * **Third party Library**: Examples include Pydantic, AWS X-Ray SDK, AWS Encryption SDK, Middy.js, etc. -Powertools for AWS Lambda follows the [AWS Lambda Runtime deprecation policy cycle](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtime-support-policy), when it comes to Language Runtime. This means we will stop supporting their respective deprecated Language Runtime _(e.g., `python37`)_ without increasing the major SDK version. +Powertools for AWS Lambda follows the [AWS Lambda Runtime deprecation policy cycle](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtime-support-policy), when it comes to Language Runtime. This means we will stop supporting their respective deprecated Language Runtime _(e.g., `python39`)_ without increasing the major SDK version. !!! note "AWS reserves the right to stop support for an underlying dependency without increasing the major SDK version" diff --git a/layer_v3/layer/canary_stack.py b/layer_v3/layer/canary_stack.py index 1f9346e9d3d..64cb73aa7cd 100644 --- a/layer_v3/layer/canary_stack.py +++ b/layer_v3/layer/canary_stack.py @@ -141,6 +141,8 @@ def __init__( runtime = Runtime.PYTHON_3_12 elif python_version == "python3.13": runtime = Runtime.PYTHON_3_13 + elif python_version == "python3.14": + runtime = Runtime.PYTHON_3_14 else: raise ValueError("Unsupported Python version") diff --git a/layer_v3/layer/layer_stack.py b/layer_v3/layer/layer_stack.py index feb8a10dc2b..7370935acf0 100644 --- a/layer_v3/layer/layer_stack.py +++ b/layer_v3/layer/layer_stack.py @@ -93,6 +93,8 @@ def __init__( python_version = Runtime.PYTHON_3_12 if python_version == "python3.13": python_version = Runtime.PYTHON_3_13 + if python_version == "python3.14": + python_version = Runtime.PYTHON_3_14 has_arm64_support = CfnParameter( self, diff --git a/pyproject.toml b/pyproject.toml index e99051ed304..17648604aed 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,6 +14,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", ] repository = "https://github.com/aws-powertools/powertools-lambda-python" documentation = "https://docs.powertools.aws.dev/lambda/python/" diff --git a/tests/e2e/utils/infrastructure.py b/tests/e2e/utils/infrastructure.py index dc64499d14f..9b27afd141d 100644 --- a/tests/e2e/utils/infrastructure.py +++ b/tests/e2e/utils/infrastructure.py @@ -103,7 +103,7 @@ def create_lambda_functions( self.create_lambda_functions() ``` - Creating Lambda functions and override runtime to Python 3.13 + Creating Lambda functions and override runtime to Python 3.14 ```python from aws_cdk.aws_lambda import Runtime @@ -125,6 +125,7 @@ def create_lambda_functions( Runtime.PYTHON_3_11, Runtime.PYTHON_3_12, Runtime.PYTHON_3_13, + Runtime.PYTHON_3_14, ], compatible_architectures=[architecture], code=Code.from_asset(path=layer_build), @@ -266,6 +267,8 @@ def _determine_runtime_version(self) -> Runtime: return Runtime.PYTHON_3_12 elif version.major == 3 and version.minor == 13: return Runtime.PYTHON_3_13 + elif version.major == 3 and version.minor == 14: + return Runtime.PYTHON_3_14 else: raise ValueError(f"Unsupported Python version: {version}") From 6facfdf079c3f3ac36947e1951c1785ee4f635a3 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Sat, 27 Sep 2025 15:38:19 +0100 Subject: [PATCH 2/4] fix ruff error --- .github/workflows/quality_check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/quality_check.yml b/.github/workflows/quality_check.yml index c503e2aad56..46cdef2a68f 100644 --- a/.github/workflows/quality_check.yml +++ b/.github/workflows/quality_check.yml @@ -46,7 +46,7 @@ jobs: strategy: max-parallel: 5 matrix: - python-version: ["3.9","3.10","3.11","3.12","3.13","3.14"] + python-version: ["3.9","3.10","3.11","3.12","3.13","3.14.0-rc.3"] env: PYTHON: "${{ matrix.python-version }}" permissions: From 4b06511b1df0798d9b63e23fa7bb4f078c23ce1a Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Wed, 8 Oct 2025 09:09:46 +0100 Subject: [PATCH 3/4] Adding Python 3.14 --- .github/workflows/quality_check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/quality_check.yml b/.github/workflows/quality_check.yml index 46cdef2a68f..c503e2aad56 100644 --- a/.github/workflows/quality_check.yml +++ b/.github/workflows/quality_check.yml @@ -46,7 +46,7 @@ jobs: strategy: max-parallel: 5 matrix: - python-version: ["3.9","3.10","3.11","3.12","3.13","3.14.0-rc.3"] + python-version: ["3.9","3.10","3.11","3.12","3.13","3.14"] env: PYTHON: "${{ matrix.python-version }}" permissions: From 727c21494145262586c27e1fb624ac514e83607a Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Wed, 8 Oct 2025 10:28:05 +0100 Subject: [PATCH 4/4] Remove datadog --- poetry.lock | 67 ++++++++++++++++++++++++++++---------------------- pyproject.toml | 1 - 2 files changed, 38 insertions(+), 30 deletions(-) diff --git a/poetry.lock b/poetry.lock index a5763a9f31c..d464e398979 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.2.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.2 and should not be changed by hand. [[package]] name = "annotated-types" @@ -11,7 +11,7 @@ files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] -markers = {main = "extra == \"all\" or extra == \"parser\""} +markers = {main = "extra == \"parser\" or extra == \"all\""} [[package]] name = "anyio" @@ -336,7 +336,7 @@ description = "The AWS X-Ray SDK for Python (the SDK) enables Python developers optional = true python-versions = ">=3.7" groups = ["main"] -markers = "extra == \"all\" or extra == \"tracer\"" +markers = "extra == \"tracer\" or extra == \"all\"" files = [ {file = "aws_xray_sdk-2.14.0-py2.py3-none-any.whl", hash = "sha256:cfbe6feea3d26613a2a869d14c9246a844285c97087ad8f296f901633554ad94"}, {file = "aws_xray_sdk-2.14.0.tar.gz", hash = "sha256:aab843c331af9ab9ba5cefb3a303832a19db186140894a523edafc024cc0493c"}, @@ -953,9 +953,10 @@ botocore = ["botocore"] name = "bytecode" version = "0.16.2" description = "Python module to generate and modify bytecode" -optional = false +optional = true python-versions = ">=3.8" -groups = ["main", "dev"] +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "bytecode-0.16.2-py3-none-any.whl", hash = "sha256:0a7dea0387ec5cae5ec77578690c5ca7470c8a202c50ce64a426d86380cddd7f"}, {file = "bytecode-0.16.2.tar.gz", hash = "sha256:f05020b6dc1f48cdadd946f7c3a03131ba0f312bd103767c5d75559de5c308f8"}, @@ -1567,9 +1568,10 @@ test-randomorder = ["pytest-randomly"] name = "datadog" version = "0.51.0" description = "The Datadog Python library" -optional = false +optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["main", "dev"] +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "datadog-0.51.0-py2.py3-none-any.whl", hash = "sha256:a9764f091c96af4e0996d4400b168fc5fba380f911d6d672c9dcd4773e29ea3f"}, {file = "datadog-0.51.0.tar.gz", hash = "sha256:3279534f831ae0b4ae2d8ce42ef038b4ab38e667d7ed6ff7437982d7a0cf5250"}, @@ -1582,9 +1584,10 @@ requests = ">=2.6.0" name = "datadog-lambda" version = "6.111.0" description = "The Datadog AWS Lambda Library" -optional = false +optional = true python-versions = "<4,>=3.8.0" -groups = ["main", "dev"] +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "datadog_lambda-6.111.0-py3-none-any.whl", hash = "sha256:fed12c8cf8fd9e67fc4439c7efd98b0297c7bc7f252a7497b7a2cb59355c79b1"}, {file = "datadog_lambda-6.111.0.tar.gz", hash = "sha256:eed98c3563cac961fbd602a3317450fd478619bc4506203cbf54c583f1c722ad"}, @@ -1603,9 +1606,10 @@ dev = ["botocore (>=1.34.0,<2.0.0)", "flake8 (>=5.0.4,<6.0.0)", "pytest (>=8.0.0 name = "ddtrace" version = "3.9.4" description = "Datadog APM client library" -optional = false +optional = true python-versions = ">=3.8" -groups = ["main", "dev"] +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "ddtrace-3.9.4-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f59b3623fc792f4b820db740ba77e51c2169d9bbcc9d04894a1b698aa5ce0147"}, {file = "ddtrace-3.9.4-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:16671001252cf7bb7f95d0526dc53a28b3ec878ff2b8e41ddce94e6c39acf557"}, @@ -1771,9 +1775,10 @@ websockets = ["websocket-client (>=1.3.0)"] name = "envier" version = "0.6.1" description = "Python application configuration via the environment" -optional = false +optional = true python-versions = ">=3.7" -groups = ["main", "dev"] +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "envier-0.6.1-py3-none-any.whl", hash = "sha256:73609040a76be48bbcb97074d9969666484aa0de706183a6e9ef773156a8a6a9"}, {file = "envier-0.6.1.tar.gz", hash = "sha256:3309a01bb3d8850c9e7a31a5166d5a836846db2faecb79b9cb32654dd50ca9f9"}, @@ -1823,7 +1828,7 @@ description = "Fastest Python implementation of JSON schema" optional = true python-versions = "*" groups = ["main"] -markers = "extra == \"all\" or extra == \"validation\"" +markers = "extra == \"validation\" or extra == \"all\"" files = [ {file = "fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463"}, {file = "fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de"}, @@ -2109,6 +2114,7 @@ files = [ {file = "importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"}, {file = "importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000"}, ] +markers = {main = "extra == \"datadog\"", dev = "python_version == \"3.9\""} [package.dependencies] zipp = ">=3.20" @@ -2252,8 +2258,6 @@ groups = ["main"] markers = "extra == \"all\" or extra == \"datamasking\"" files = [ {file = "jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c"}, - {file = "jsonpath_ng-1.7.0-py2-none-any.whl", hash = "sha256:898c93fc173f0c336784a3fa63d7434297544b7198124a68f9a3ef9597b0ae6e"}, - {file = "jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6"}, ] [package.dependencies] @@ -2312,10 +2316,10 @@ referencing = ">=0.31.0" name = "legacy-cgi" version = "2.6.3" description = "Fork of the standard library cgi and cgitb modules removed in Python 3.13" -optional = false +optional = true python-versions = ">=3.8" -groups = ["main", "dev"] -markers = "python_version >= \"3.13.0\"" +groups = ["main"] +markers = "python_version >= \"3.13.0\" and extra == \"datadog\"" files = [ {file = "legacy_cgi-2.6.3-py3-none-any.whl", hash = "sha256:6df2ea5ae14c71ef6f097f8b6372b44f6685283dc018535a75c924564183cdab"}, {file = "legacy_cgi-2.6.3.tar.gz", hash = "sha256:4c119d6cb8e9d8b6ad7cc0ddad880552c62df4029622835d06dfd18f438a8154"}, @@ -3095,9 +3099,10 @@ uv = ["uv (>=0.1.6)"] name = "opentelemetry-api" version = "1.34.1" description = "OpenTelemetry Python API" -optional = false +optional = true python-versions = ">=3.9" -groups = ["main", "dev"] +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "opentelemetry_api-1.34.1-py3-none-any.whl", hash = "sha256:b7df4cb0830d5a6c29ad0c0691dbae874d8daefa934b8b1d642de48323d32a8c"}, {file = "opentelemetry_api-1.34.1.tar.gz", hash = "sha256:64f0bd06d42824843731d05beea88d4d4b6ae59f9fe347ff7dfa2cc14233bbb3"}, @@ -3275,7 +3280,7 @@ files = [ {file = "pydantic-2.12.0-py3-none-any.whl", hash = "sha256:f6a1da352d42790537e95e83a8bdfb91c7efbae63ffd0b86fa823899e807116f"}, {file = "pydantic-2.12.0.tar.gz", hash = "sha256:c1a077e6270dbfb37bfd8b498b3981e2bb18f68103720e51fa6c306a5a9af563"}, ] -markers = {main = "extra == \"all\" or extra == \"parser\""} +markers = {main = "extra == \"parser\" or extra == \"all\""} [package.dependencies] annotated-types = ">=0.6.0" @@ -3409,7 +3414,7 @@ files = [ {file = "pydantic_core-2.41.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f1fc716c0eb1663c59699b024428ad5ec2bcc6b928527b8fe28de6cb89f47efb"}, {file = "pydantic_core-2.41.1.tar.gz", hash = "sha256:1ad375859a6d8c356b7704ec0f547a58e82ee80bb41baa811ad710e124bc8f2f"}, ] -markers = {main = "extra == \"all\" or extra == \"parser\""} +markers = {main = "extra == \"parser\" or extra == \"all\""} [package.dependencies] typing-extensions = ">=4.14.1" @@ -4608,7 +4613,7 @@ files = [ {file = "typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7"}, {file = "typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464"}, ] -markers = {main = "extra == \"all\" or extra == \"parser\""} +markers = {main = "extra == \"parser\" or extra == \"all\""} [package.dependencies] typing-extensions = ">=4.12.0" @@ -4617,9 +4622,10 @@ typing-extensions = ">=4.12.0" name = "ujson" version = "5.10.0" description = "Ultra fast JSON encoder and decoder for Python" -optional = false +optional = true python-versions = ">=3.8" -groups = ["main", "dev"] +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, @@ -4951,6 +4957,7 @@ files = [ {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, ] +markers = {main = "extra == \"tracer\" or extra == \"all\" or extra == \"datamasking\" or extra == \"datadog\""} [[package]] name = "xenon" @@ -4973,9 +4980,10 @@ requests = ">=2.0,<3.0" name = "xmltodict" version = "0.14.2" description = "Makes working with XML feel like you are working with JSON" -optional = false +optional = true python-versions = ">=3.6" -groups = ["main", "dev"] +groups = ["main"] +markers = "extra == \"datadog\"" files = [ {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, @@ -4992,6 +5000,7 @@ files = [ {file = "zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e"}, {file = "zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"}, ] +markers = {main = "extra == \"datadog\"", dev = "python_version == \"3.9\""} [package.extras] check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] @@ -5017,4 +5026,4 @@ valkey = ["valkey-glide"] [metadata] lock-version = "2.1" python-versions = ">=3.9,<4.0.0" -content-hash = "7dcff7ab71a77580752ae92207e737f706ec9bbed4dbefbcaa1a45a2a5b773e1" +content-hash = "bff524ad3b8cd4c59b9ba7f61f3e1b88ddd3441bcd3cb47c74cf35b058f82ac7" diff --git a/pyproject.toml b/pyproject.toml index f1a6983ffc4..145f16a40ba 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -129,7 +129,6 @@ multiprocess = "^0.70.16" boto3-stubs = {extras = ["appconfig", "appconfigdata", "cloudformation", "cloudwatch", "dynamodb", "lambda", "logs", "s3", "secretsmanager", "ssm", "xray"], version = "^1.34.139"} nox = "^2024.4.15" mkdocstrings-python = "^1.13.0" -datadog-lambda = "^6.106.0" mkdocs-llmstxt = ">=0.2,<0.5" avro = "^1.12.0" protobuf = "^6.30.2"