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..cfa5c438535 100644 --- a/tests/functional/parameters/_boto3/test_utilities_parameters.py +++ b/tests/functional/parameters/_boto3/test_utilities_parameters.py @@ -2347,6 +2347,38 @@ def _get_parameters_by_name( parameters.get_parameters_by_name(parameters=params) +def test_get_parameters_by_name_accumulates_results_across_chunks(monkeypatch, config): + # GIVEN a batch of 12 parameters (more than 10, which is the max batch size) + # This test verifies the fix for GitHub issue #7832: + # When fetching more than 10 parameters, results from all chunks should be accumulated + params = {f"/dev/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: dict[str, dict], + raise_on_error: bool = True, + decrypt: bool = False, + ) -> tuple[dict[str, Any], list[str]]: + # Return a value for each parameter in this chunk + return {name: f"value_{name}" for name in parameters.keys()}, [] + + monkeypatch.setitem(parameters.base.DEFAULT_PROVIDERS, "ssm", TestProvider()) + + # WHEN get_parameters_by_name is called with more than 10 parameters + result = parameters.get_parameters_by_name(parameters=params) + + # THEN all 12 parameters should be returned (not just the last chunk of 2) + assert len(result) == 12 + for i in range(12): + param_name = f"/dev/param{i}" + assert param_name in result + assert result[param_name] == f"value_{param_name}" + + 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: {}}