Skip to content

Commit 5fb929d

Browse files
committed
feat: add override SDK options for parameter utilities
1 parent 1278d2c commit 5fb929d

File tree

4 files changed

+395
-15
lines changed

4 files changed

+395
-15
lines changed

aws_lambda_powertools/utilities/parameters/dynamodb.py

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,13 @@ class DynamoDBProvider(BaseProvider):
4949
>>>
5050
>>> ddb_provider.get("my-parameter")
5151
52+
**Retrieves a parameter value from a DynamoDB table passing options to the SDK call**
53+
54+
>>> from aws_lambda_powertools.utilities.parameters import DynamoDBProvider
55+
>>> ddb_provider = DynamoDBProvider("ParametersTable")
56+
>>>
57+
>>> ddb_provider.get("my-parameter", ConsistentRead=True)
58+
5259
**Retrieves multiple values from a DynamoDB table**
5360
5461
In this case, the provider will use a sort key to retrieve multiple values using a query under
@@ -69,6 +76,12 @@ class DynamoDBProvider(BaseProvider):
6976
>>>
7077
>>> ddb_provider.get_multiple("my-parameters", sort_attr="my-sort-attr")
7178
79+
**Retrieves multiple values from a DynamoDB table passing options to the SDK calls**
80+
81+
>>> from aws_lambda_powertools.utilities.parameters import DynamoDBProvider
82+
>>> ddb_provider = DynamoDBProvider("ParametersTable")
83+
>>>
84+
>>> ddb_provider.get("my-parameter", ConsistentRead=True)
7285
"""
7386

7487
table = None
@@ -90,14 +103,24 @@ def __init__(
90103

91104
super().__init__()
92105

93-
def _get(self, name: str, **kwargs) -> str:
106+
def _get(self, name: str, **sdk_options) -> str:
94107
"""
95108
Retrieve a parameter value from Amazon DynamoDB
109+
110+
Parameters
111+
----------
112+
name: str
113+
Name of the parameter
114+
sdk_options: dict
115+
Dictionary of options that will be passed to the get_item call
96116
"""
97117

98-
return self.table.get_item(Key={self.key_attr: name})["Item"][self.value_attr]
118+
# Explicit arguments will take precedence over keyword arguments
119+
sdk_options["Key"] = {self.key_attr: name}
120+
121+
return self.table.get_item(**sdk_options)["Item"][self.value_attr]
99122

100-
def _get_multiple(self, path: str, sort_attr: str = "sk", **kwargs) -> Dict[str, str]:
123+
def _get_multiple(self, path: str, sort_attr: str = "sk", **sdk_options) -> Dict[str, str]:
101124
"""
102125
Retrieve multiple parameter values from Amazon DynamoDB
103126
@@ -107,16 +130,20 @@ def _get_multiple(self, path: str, sort_attr: str = "sk", **kwargs) -> Dict[str,
107130
Path to retrieve the parameters
108131
sort_attr: str
109132
Name of the DynamoDB table sort key (defaults to 'sk')
133+
sdk_options: dict
134+
Dictionary of options that will be passed to the query call
110135
"""
111136

112-
response = self.table.query(KeyConditionExpression=Key(self.key_attr).eq(path))
137+
# Explicit arguments will take precedence over keyword arguments
138+
sdk_options["KeyConditionExpression"] = Key(self.key_attr).eq(path)
139+
140+
response = self.table.query(**sdk_options)
113141
items = response.get("Items", [])
114142

115143
# Keep querying while there are more items matching the partition key
116144
while "LastEvaluatedKey" in response:
117-
response = self.table.query(
118-
KeyConditionExpression=Key(self.key_attr).eq(path), ExclusiveStartKey=response["LastEvaluatedKey"],
119-
)
145+
sdk_options["ExclusiveStartKey"] = response["LastEvaluatedKey"]
146+
response = self.table.query(**sdk_options)
120147
items.extend(response.get("Items", []))
121148

122149
retval = {}

aws_lambda_powertools/utilities/parameters/secrets.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ class SecretsProvider(BaseProvider):
3333
>>> secrets_provider = SecretsProvider(config=config)
3434
>>>
3535
>>> secrets_provider.get("my-parameter")
36+
37+
**Retrieves a parameter value from Secrets Manager passing options to the SDK call**
38+
39+
>>> from aws_lambda_powertools.utilities.parameters import SecretsProvider
40+
>>> secrets_provider = SecretsProvider()
41+
>>>
42+
>>> secrets_provider.get("my-parameter", VersionId="f658cac0-98a5-41d9-b993-8a76a7799194")
3643
"""
3744

3845
client = None
@@ -48,14 +55,24 @@ def __init__(self, config: Optional[Config] = None):
4855

4956
super().__init__()
5057

51-
def _get(self, name: str, **kwargs) -> str:
58+
def _get(self, name: str, **sdk_options) -> str:
5259
"""
5360
Retrieve a parameter value from AWS Systems Manager Parameter Store
61+
62+
Parameters
63+
----------
64+
name: str
65+
Name of the parameter
66+
sdk_options: dict
67+
Dictionary of options that will be passed to the get_secret_value call
5468
"""
5569

56-
return self.client.get_secret_value(SecretId=name)["SecretString"]
70+
# Explicit arguments will take precedence over keyword arguments
71+
sdk_options["SecretId"] = name
72+
73+
return self.client.get_secret_value(**sdk_options)["SecretString"]
5774

58-
def _get_multiple(self, path: str, **kwargs) -> Dict[str, str]:
75+
def _get_multiple(self, path: str, **sdk_options) -> Dict[str, str]:
5976
"""
6077
Retrieving multiple parameter values is not supported with AWS Secrets Manager
6178
"""

aws_lambda_powertools/utilities/parameters/ssm.py

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,19 @@ class SSMProvider(BaseProvider):
3434
>>>
3535
>>> ssm_provider.get("/my/parameter")
3636
37-
**Retrieves multiple parameter values from Systes Manager Parameter Store using a path prefix**
37+
**Retrieves multiple parameter values from Systems Manager Parameter Store using a path prefix**
3838
3939
>>> from aws_lambda_powertools.utilities.parameters import SSMProvider
4040
>>> ssm_provider = SSMProvider()
4141
>>>
4242
>>> ssm_provider.get_multiple("/my/path/prefix")
43+
44+
**Retrieves multiple parameter values from Systems Manager Parameter Store passing options to the SDK call**
45+
46+
>>> from aws_lambda_powertools.utilities.parameters import SSMProvider
47+
>>> ssm_provider = SSMProvider()
48+
>>>
49+
>>> ssm_provider.get_multiple("/my/path/prefix", MaxResults=10)
4350
"""
4451

4552
client = None
@@ -56,7 +63,7 @@ def __init__(
5663

5764
super().__init__()
5865

59-
def _get(self, name: str, decrypt: bool = False, **kwargs) -> str:
66+
def _get(self, name: str, decrypt: bool = False, **sdk_options) -> str:
6067
"""
6168
Retrieve a parameter value from AWS Systems Manager Parameter Store
6269
@@ -66,11 +73,17 @@ def _get(self, name: str, decrypt: bool = False, **kwargs) -> str:
6673
Parameter name
6774
decrypt: bool
6875
If the parameter value should be decrypted
76+
sdk_options: dict
77+
Dictionary of options that will be passed to the get_parameter call
6978
"""
7079

71-
return self.client.get_parameter(Name=name, WithDecryption=decrypt)["Parameter"]["Value"]
80+
# Explicit arguments will take precedence over keyword arguments
81+
sdk_options["Name"] = name
82+
sdk_options["WithDecryption"] = decrypt
83+
84+
return self.client.get_parameter(**sdk_options)["Parameter"]["Value"]
7285

73-
def _get_multiple(self, path: str, decrypt: bool = False, recursive: bool = False, **kwargs) -> Dict[str, str]:
86+
def _get_multiple(self, path: str, decrypt: bool = False, recursive: bool = False, **sdk_options) -> Dict[str, str]:
7487
"""
7588
Retrieve multiple parameter values from AWS Systems Manager Parameter Store
7689
@@ -82,9 +95,16 @@ def _get_multiple(self, path: str, decrypt: bool = False, recursive: bool = Fals
8295
If the parameter values should be decrypted
8396
recursive: bool
8497
If this should retrieve the parameter values recursively or not
98+
sdk_options: dict
99+
Dictionary of options that will be passed to the get_parameters_by_path call
85100
"""
86101

87-
response = self.client.get_parameters_by_path(Path=path, WithDecryption=decrypt, Recursive=recursive)
102+
# Explicit arguments will take precedence over keyword arguments
103+
sdk_options["Path"] = path
104+
sdk_options["WithDecryption"] = decrypt
105+
sdk_options["Recursive"] = recursive
106+
107+
response = self.client.get_parameters_by_path(**sdk_options)
88108
parameters = response.get("Parameters", [])
89109

90110
# Keep retrieving parameters

0 commit comments

Comments
 (0)