Skip to content

Commit 46eb971

Browse files
fix(parameters): return only requested secret names (#8621)
Co-authored-by: Leandro Damascena <lcdama@amazon.pt>
1 parent 246aa01 commit 46eb971

2 files changed

Lines changed: 60 additions & 0 deletions

File tree

‎aws_lambda_powertools/utilities/parameters/secrets.py‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ def _get_multiple(self, names: list[str], **sdk_options) -> dict[str, Any]: # t
164164
sdk_options.pop("SecretIdList", None)
165165

166166
secrets: dict[str, Any] = {}
167+
requested_names = set(names)
167168
next_token = None
168169

169170
# Handle pagination automatically
@@ -182,6 +183,8 @@ def _get_multiple(self, names: list[str], **sdk_options) -> dict[str, Any]: # t
182183
# Process successful secrets
183184
for secret in response.get("SecretValues", []):
184185
secret_name = secret["Name"]
186+
if secret_name not in requested_names:
187+
continue
185188

186189
# Extract secret value (SecretString or SecretBinary)
187190
if "SecretString" in secret:

‎tests/functional/parameters/_boto3/test_utilities_parameters.py‎

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3865,3 +3865,60 @@ def test_secrets_provider_get_multiple_with_json_transform_error(config):
38653865

38663866
with pytest.raises(parameters.TransformParameterError):
38673867
provider.get_multiple(secret_names, transform="binary", raise_on_transform_error=True)
3868+
3869+
3870+
@pytest.mark.parametrize("force_fetch", [False, True])
3871+
@pytest.mark.parametrize("secret_value", [{"SecretString": "value"}, {"SecretBinary": b"value"}])
3872+
def test_secrets_provider_get_multiple_excludes_prefix_matches(config, force_fetch, secret_value):
3873+
provider = parameters.SecretsProvider(boto_config=config)
3874+
names = ["db", "db-password"]
3875+
response = {
3876+
"SecretValues": [{"Name": name, **secret_value} for name in ["db", "db-password", "db2", "db-password-old"]],
3877+
}
3878+
expected_params = {"Filters": [{"Key": "name", "Values": names}]}
3879+
expected = dict.fromkeys(names, next(iter(secret_value.values())))
3880+
3881+
with stub.Stubber(provider.client) as stubber:
3882+
stubber.add_response("batch_get_secret_value", response, expected_params)
3883+
assert provider.get_multiple(names) == expected
3884+
if force_fetch:
3885+
stubber.add_response("batch_get_secret_value", response, expected_params)
3886+
assert provider.get_multiple(names, force_fetch=force_fetch) == expected
3887+
key = provider._build_cache_key(name="|".join(sorted(names)), transform=None, is_nested=True)
3888+
assert provider.fetch_from_cache(key) == expected
3889+
stubber.assert_no_pending_responses()
3890+
3891+
3892+
def test_secrets_provider_get_multiple_skips_prefix_only_page(config):
3893+
provider = parameters.SecretsProvider(boto_config=config)
3894+
names = ["db"]
3895+
expected_params = {"Filters": [{"Key": "name", "Values": names}]}
3896+
with stub.Stubber(provider.client) as stubber:
3897+
stubber.add_response(
3898+
"batch_get_secret_value",
3899+
{"SecretValues": [{"Name": "db-old", "SecretString": "not json"}], "NextToken": "next-page"},
3900+
expected_params,
3901+
)
3902+
stubber.add_response(
3903+
"batch_get_secret_value",
3904+
{"SecretValues": [{"Name": "db", "SecretString": '{"enabled": true}'}]},
3905+
{**expected_params, "NextToken": "next-page"},
3906+
)
3907+
assert provider.get_multiple(names, transform="json", raise_on_transform_error=True) == {
3908+
"db": {"enabled": True},
3909+
}
3910+
stubber.assert_no_pending_responses()
3911+
3912+
3913+
def test_secrets_provider_get_multiple_only_prefix_matches(config):
3914+
provider = parameters.SecretsProvider(boto_config=config)
3915+
with stub.Stubber(provider.client) as stubber:
3916+
stubber.add_response(
3917+
"batch_get_secret_value",
3918+
{"SecretValues": [{"Name": "db-old", "SecretString": "value"}]},
3919+
{"Filters": [{"Key": "name", "Values": ["db"]}]},
3920+
)
3921+
with pytest.raises(GetSecretError, match="No secrets found matching the provided names"):
3922+
provider.get_multiple(["db"])
3923+
assert not provider.store
3924+
stubber.assert_no_pending_responses()

0 commit comments

Comments
 (0)