From 78c02230f96cd3e49ce576b323da7e1ea208e0dd Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Wed, 25 Feb 2026 12:36:36 +0100 Subject: [PATCH] fix(parameters): fix variable shadowing in SSM parameter chunking Fixes bug where get_parameters_by_name returned only the last chunk when fetching more than 10 parameters due to variable shadowing in _get_parameters_by_name_in_chunks loop. Closes #7832 --- .../utilities/parameters/ssm.py | 4 ++-- .../_boto3/test_utilities_parameters.py | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/aws_lambda_powertools/utilities/parameters/ssm.py b/aws_lambda_powertools/utilities/parameters/ssm.py index 696a80cc1c9..277f1ac5ae5 100644 --- a/aws_lambda_powertools/utilities/parameters/ssm.py +++ b/aws_lambda_powertools/utilities/parameters/ssm.py @@ -583,12 +583,12 @@ def _get_parameters_by_name_in_chunks( diff = {key: value for key, value in batch.items() if key not in cache} for chunk in slice_dictionary(data=diff, chunk_size=self._MAX_GET_PARAMETERS_ITEM): - response, possible_errors = self._get_parameters_by_name( + chunk_response, possible_errors = self._get_parameters_by_name( parameters=chunk, raise_on_error=raise_on_error, decrypt=decrypt, ) - response.update(response) + response.update(chunk_response) errors.extend(possible_errors) return response, errors diff --git a/tests/functional/parameters/_boto3/test_utilities_parameters.py b/tests/functional/parameters/_boto3/test_utilities_parameters.py index 6f461c6a7c7..71a5841d05c 100644 --- a/tests/functional/parameters/_boto3/test_utilities_parameters.py +++ b/tests/functional/parameters/_boto3/test_utilities_parameters.py @@ -2347,6 +2347,26 @@ def _get_parameters_by_name( parameters.get_parameters_by_name(parameters=params) +def test_get_parameters_by_name_chunks(monkeypatch, config): + # GIVEN a batch of 12 parameters (more than max batch size of 10) + params = {f"param{i}": {} for i in range(12)} + + class TestProvider(SSMProvider): + def __init__(self, boto_config: Config = config, **kwargs): + super().__init__(boto_config=boto_config, **kwargs) + + def _get_parameters_by_name(self, parameters, raise_on_error=True, decrypt=False): + return {name: f"val_{name}" for name in parameters}, [] + + monkeypatch.setitem(parameters.base.DEFAULT_PROVIDERS, "ssm", TestProvider()) + + # WHEN get_parameters_by_name is called + result = parameters.get_parameters_by_name(parameters=params) + + # THEN all parameters should be returned across chunks + assert len(result) == 12 + + def test_get_parameters_by_name_cache(monkeypatch, mock_name, mock_value, config): # GIVEN we have a parameter to fetch but is already in cache params = {mock_name: {}}