Description
Key information
- RFC PR: feat: add parameter utility #96
- Related issue(s), if known:
- Area: Utilities
- Meet tenets: Yes
Summary
Add a utility to facilitate retrieval of parameters from the SSM Parameter store or Secrets Manager. This would have support for caching parameter values, preventing retrieving the value at every execution.
Motivation
Many Lambda users use either the Parameter Store or Secrets Manager to store things such as feature flags, third-party API keys, etc. In a serverless context, a simple approach is to either fetch at every invocation (which might be costly/run into limits) or fetch at initialisation (meaning no control over expiration and refresh). This would simplify that experience for customers.
Proposal
This utility should provide a very simple to use interface for customers that don't want to deep-dive into how this utility works. To prevent hitting the throughput limit for the Parameter Store, this should have a default cache value in the single digit seconds (e.g. 5).
Basic usage
# For SSM Parameter
from aws_lambda_powertools.utilities import get_parameter
# For Secrets Manager
from aws_lambda_powertools.utilities import get_secret
def handler(event, context):
param = get_parameter("my-parameter")
secret = get_secret("my-secret")
Changing the default cache duration
from aws_lambda_powertools.utilities import get_parameter
def handler(event, context):
# Only refresh after 300 seconds
param = get_parameter("my-parameter", max_age=300)
Convert from specific format
from aws_lambda_powertools.utilities import get_parameter
def handler(event, context):
# Transform into a dict from a json string
param = get_parameter("my-parameter", format="json")
# Transform into bytes from base64
param = get_parameter("my-parameter", format="binary")
Retrieve multiple parameters from a path
from aws_lambda_powertools.utilities import get_parameters
def handler(event, context):
params = get_parameters("/param/path")
# Access the item using a param.name notation
print(params.Subparam)
# Other modifications are supported
params = get_parameters("/param/path", format="json")
print(params.Subparam["key"])
# Supports recursive fetching
params = get_parameters("/param/path", recursive=true)
print(params.Subparam.Subsubparam)
Drawbacks
- This would add a dependency on boto3. Many functions probably use it in some form, but the Powertools don't require it directly at the moment. However, this is already pulled through the X-Ray SDK.
- Many problems around parameters can be solved using environment variables, thus the usefulness is limited to cases where value could change with a short notice.
Rationale and alternatives
- What other designs have been considered? Why not them? Replicating ssm-cache-python feature set, however this might be too feature-rich for this use-case.
- What is the impact of not doing this? Users who want to retrieve dynamic parameters will have to think about the expiration logic if they don't want to risk getting throttles at scale.
Unresolved questions
Optional, stash area for topics that need further development e.g. TBD
Metadata
Metadata
Assignees
Type
Projects
Status