Skip to content

Commit 3314893

Browse files
docs(parameters): snippets split, improved, and lint (#1564)
* chore(parameters): refactoring examples * chore(parameters): adding cache examples * chore(parameters): adding builtin examples and fix mypy errors * chore(parameters): adding all providers with custom config * chore(parameters): adding custom provider * chore(parameters): adding custom provider * chore(parameters): adding custom provider * chore(parameters): adding DynamoDB provider * chore(parameters): adding tests - mock * chore(parameters): adding more tests * chore(parameters): adding appconfig builtin provider * chore(parameters): adding final examples * chore(parameters): adding final examples * chore(parameters): highlights - small changes * fix(docs): broken link in boto3_session * fix(docs): improve constrast ratio * fix(docs): typing and correctness on null endpoint * (chore): addressing Ruben's feedbacks * (chore): import errors --------- Signed-off-by: Leandro Damascena <[email protected]> Co-authored-by: heitorlessa <[email protected]>
1 parent 04ee1d0 commit 3314893

File tree

52 files changed

+1638
-744
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+1638
-744
lines changed

docs/utilities/parameters.md

+219-503
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
AWSTemplateFormatVersion: '2010-09-09'
2+
Transform: AWS::Serverless-2016-10-31
3+
Description: 'DynamoDB Table example'
4+
Resources:
5+
ParameterTable:
6+
Type: AWS::DynamoDB::Table
7+
Properties:
8+
TableName: ParameterTable
9+
AttributeDefinitions:
10+
- AttributeName: IdKeyAttr
11+
AttributeType: S
12+
- AttributeName: SkKeyAttr
13+
AttributeType: S
14+
KeySchema:
15+
- AttributeName: IdKeyAttr
16+
KeyType: HASH
17+
- AttributeName: SkKeyAttr
18+
KeyType: RANGE
19+
TimeToLiveSpecification:
20+
AttributeName: expiration
21+
Enabled: true
22+
BillingMode: PAY_PER_REQUEST
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
AWSTemplateFormatVersion: '2010-09-09'
2+
Transform: AWS::Serverless-2016-10-31
3+
Description: 'DynamoDB Table example'
4+
Resources:
5+
ParameterTable:
6+
Type: AWS::DynamoDB::Table
7+
Properties:
8+
TableName: ParameterTable
9+
AttributeDefinitions:
10+
- AttributeName: id
11+
AttributeType: S
12+
- AttributeName: sk
13+
AttributeType: S
14+
KeySchema:
15+
- AttributeName: id
16+
KeyType: HASH
17+
- AttributeName: sk
18+
KeyType: RANGE
19+
TimeToLiveSpecification:
20+
AttributeName: expiration
21+
Enabled: true
22+
BillingMode: PAY_PER_REQUEST
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
AWSTemplateFormatVersion: '2010-09-09'
2+
Transform: AWS::Serverless-2016-10-31
3+
Description: 'DynamoDB Table example'
4+
Resources:
5+
ParameterTable:
6+
Type: AWS::DynamoDB::Table
7+
Properties:
8+
TableName: ParameterTable
9+
AttributeDefinitions:
10+
- AttributeName: id
11+
AttributeType: S
12+
KeySchema:
13+
- AttributeName: id
14+
KeyType: HASH
15+
TimeToLiveSpecification:
16+
AttributeName: expiration
17+
Enabled: true
18+
BillingMode: PAY_PER_REQUEST
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from typing import Any
2+
3+
import requests
4+
5+
from aws_lambda_powertools.utilities import parameters
6+
from aws_lambda_powertools.utilities.typing import LambdaContext
7+
8+
9+
def lambda_handler(event: dict, context: LambdaContext):
10+
try:
11+
# Retrieve a single parameter
12+
endpoint_comments: Any = parameters.get_app_config(
13+
name="config", environment="dev", application="comments", force_fetch=True
14+
)
15+
16+
# the value of this parameter is https://jsonplaceholder.typicode.com/comments/
17+
comments: requests.Response = requests.get(endpoint_comments)
18+
19+
return {"comments": comments.json()[:10], "statusCode": 200}
20+
except parameters.exceptions.GetParameterError as error:
21+
return {"comments": None, "message": str(error), "statusCode": 400}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from typing import Any
2+
3+
import requests
4+
5+
from aws_lambda_powertools.utilities import parameters
6+
from aws_lambda_powertools.utilities.typing import LambdaContext
7+
8+
9+
def lambda_handler(event: dict, context: LambdaContext):
10+
try:
11+
# Retrieve a single parameter
12+
endpoint_comments: Any = parameters.get_app_config(
13+
name="config", environment="dev", application="comments", max_age=20
14+
)
15+
16+
# the value of this parameter is https://jsonplaceholder.typicode.com/comments/
17+
comments: requests.Response = requests.get(endpoint_comments)
18+
19+
return {"comments": comments.json()[:10], "statusCode": 200}
20+
except parameters.exceptions.GetParameterError as error:
21+
return {"comments": None, "message": str(error), "statusCode": 400}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from typing import Any
2+
3+
import requests
4+
from botocore.config import Config
5+
6+
from aws_lambda_powertools.utilities import parameters
7+
from aws_lambda_powertools.utilities.typing import LambdaContext
8+
9+
config = Config(region_name="sa-east-1")
10+
appconf_provider = parameters.AppConfigProvider(environment="dev", application="comments", config=config)
11+
12+
13+
def lambda_handler(event: dict, context: LambdaContext):
14+
try:
15+
# Retrieve a single parameter
16+
endpoint_comments: Any = appconf_provider.get("config")
17+
18+
# the value of this parameter is https://jsonplaceholder.typicode.com/comments/
19+
comments: requests.Response = requests.get(endpoint_comments)
20+
21+
return {"comments": comments.json()[:10], "statusCode": 200}
22+
except parameters.exceptions.GetParameterError as error:
23+
return {"comments": None, "message": str(error), "statusCode": 400}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from typing import Any
2+
3+
import requests
4+
5+
from aws_lambda_powertools.utilities import parameters
6+
from aws_lambda_powertools.utilities.typing import LambdaContext
7+
8+
dynamodb_provider = parameters.DynamoDBProvider(table_name="ParameterTable", endpoint_url="http://localhost:8000")
9+
10+
11+
def lambda_handler(event: dict, context: LambdaContext):
12+
13+
try:
14+
# Usually an endpoint is not sensitive data, so we store it in DynamoDB Table
15+
endpoint_comments: Any = dynamodb_provider.get("comments_endpoint")
16+
17+
comments: requests.Response = requests.get(endpoint_comments)
18+
19+
return {"comments": comments.json()[:10], "statusCode": 200}
20+
# general exception
21+
except Exception as error:
22+
return {"comments": None, "message": str(error), "statusCode": 400}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from typing import Any
2+
3+
import requests
4+
5+
from aws_lambda_powertools.utilities import parameters
6+
from aws_lambda_powertools.utilities.typing import LambdaContext
7+
8+
dynamodb_provider = parameters.DynamoDBProvider(
9+
table_name="ParameterTable", key_attr="IdKeyAttr", sort_attr="SkKeyAttr", value_attr="ValueAttr"
10+
)
11+
12+
13+
def lambda_handler(event: dict, context: LambdaContext):
14+
15+
try:
16+
# Usually an endpoint is not sensitive data, so we store it in DynamoDB Table
17+
endpoint_comments: Any = dynamodb_provider.get("comments_endpoint")
18+
19+
comments: requests.Response = requests.get(endpoint_comments)
20+
21+
return {"comments": comments.json()[:10], "statusCode": 200}
22+
# general exception
23+
except Exception as error:
24+
return {"comments": None, "message": str(error), "statusCode": 400}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from typing import Any
2+
3+
import requests
4+
5+
from aws_lambda_powertools.utilities import parameters
6+
from aws_lambda_powertools.utilities.typing import LambdaContext
7+
8+
dynamodb_provider = parameters.DynamoDBProvider(table_name="ParameterTable")
9+
10+
11+
def lambda_handler(event: dict, context: LambdaContext):
12+
13+
try:
14+
# Retrieve multiple parameters using HASH KEY
15+
all_parameters: Any = dynamodb_provider.get_multiple("config")
16+
endpoint_comments = "https://jsonplaceholder.typicode.com/noexists/"
17+
limit = 2
18+
19+
for parameter, value in all_parameters.items():
20+
21+
if parameter == "endpoint_comments":
22+
endpoint_comments = value
23+
24+
if parameter == "limit":
25+
limit = int(value)
26+
27+
# the value of parameter is https://jsonplaceholder.typicode.com/comments/
28+
comments: requests.Response = requests.get(endpoint_comments)
29+
30+
return {"comments": comments.json()[limit]}
31+
# general exception
32+
except Exception as error:
33+
return {"comments": None, "message": str(error), "statusCode": 400}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from typing import Any
2+
3+
import requests
4+
5+
from aws_lambda_powertools.utilities import parameters
6+
from aws_lambda_powertools.utilities.typing import LambdaContext
7+
8+
dynamodb_provider = parameters.DynamoDBProvider(table_name="ParameterTable")
9+
10+
11+
def lambda_handler(event: dict, context: LambdaContext):
12+
13+
try:
14+
# Usually an endpoint is not sensitive data, so we store it in DynamoDB Table
15+
endpoint_comments: Any = dynamodb_provider.get("comments_endpoint")
16+
17+
comments: requests.Response = requests.get(endpoint_comments)
18+
19+
return {"comments": comments.json()[:10], "statusCode": 200}
20+
# general exception
21+
except Exception as error:
22+
return {"comments": None, "message": str(error), "statusCode": 400}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from typing import Any
2+
3+
import requests
4+
from botocore.config import Config
5+
6+
from aws_lambda_powertools.utilities import parameters
7+
from aws_lambda_powertools.utilities.typing import LambdaContext
8+
9+
config = Config(region_name="sa-east-1", connect_timeout=1, retries={"total_max_attempts": 2, "max_attempts": 5})
10+
ssm_provider = parameters.SecretsProvider(config=config)
11+
12+
13+
def lambda_handler(event: dict, context: LambdaContext):
14+
15+
try:
16+
# Usually an endpoint is not sensitive data, so we store it in SSM Parameters
17+
endpoint_comments: Any = parameters.get_parameter("/lambda-powertools/endpoint_comments")
18+
# An API-KEY is a sensitive data and should be stored in SecretsManager
19+
api_key: Any = ssm_provider.get("/lambda-powertools/api-key")
20+
21+
headers: dict = {"X-API-Key": api_key}
22+
23+
comments: requests.Response = requests.get(endpoint_comments, headers=headers)
24+
25+
return {"comments": comments.json()[:10], "statusCode": 200}
26+
except parameters.exceptions.GetParameterError as error:
27+
return {"comments": None, "message": str(error), "statusCode": 400}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
from typing import Any
2+
3+
import boto3
4+
import requests
5+
6+
from aws_lambda_powertools.utilities import parameters
7+
from aws_lambda_powertools.utilities.typing import LambdaContext
8+
9+
# assuming role from another account to get parameter there
10+
# see: https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html
11+
sts_client = boto3.client("sts")
12+
assumed_role_object = sts_client.assume_role(
13+
RoleArn="arn:aws:iam::account-of-role-to-assume:role/name-of-role", RoleSessionName="RoleAssume1"
14+
)
15+
credentials = assumed_role_object["Credentials"]
16+
17+
# using temporary credentials in your SSMProvider provider
18+
# see: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/core/session.html#module-boto3.session
19+
boto3_session = boto3.session.Session(
20+
region_name="us-east-1",
21+
aws_access_key_id=credentials["AccessKeyId"],
22+
aws_secret_access_key=credentials["SecretAccessKey"],
23+
aws_session_token=credentials["SessionToken"],
24+
)
25+
ssm_provider = parameters.SSMProvider(boto3_session=boto3_session)
26+
27+
28+
def lambda_handler(event: dict, context: LambdaContext):
29+
try:
30+
# Retrieve multiple parameters from a path prefix
31+
all_parameters: Any = ssm_provider.get_multiple("/lambda-powertools/")
32+
endpoint_comments = "https://jsonplaceholder.typicode.com/noexists/"
33+
34+
for parameter, value in all_parameters.items():
35+
36+
if parameter == "endpoint_comments":
37+
endpoint_comments = value
38+
39+
# the value of parameter is https://jsonplaceholder.typicode.com/comments/
40+
comments: requests.Response = requests.get(endpoint_comments)
41+
42+
return {"comments": comments.json()[:10]}
43+
except parameters.exceptions.GetParameterError as error:
44+
return {"comments": None, "message": str(error), "statusCode": 400}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from typing import Any
2+
3+
import requests
4+
from botocore.config import Config
5+
6+
from aws_lambda_powertools.utilities import parameters
7+
from aws_lambda_powertools.utilities.typing import LambdaContext
8+
9+
# changing region_name, connect_timeout and retrie configurations
10+
# see: https://botocore.amazonaws.com/v1/documentation/api/latest/reference/config.html
11+
config = Config(region_name="sa-east-1", connect_timeout=1, retries={"total_max_attempts": 2, "max_attempts": 5})
12+
ssm_provider = parameters.SSMProvider(config=config)
13+
14+
15+
def lambda_handler(event: dict, context: LambdaContext):
16+
try:
17+
# Retrieve a single parameter
18+
endpoint_comments: Any = ssm_provider.get("/lambda-powertools/endpoint_comments")
19+
20+
# the value of this parameter is https://jsonplaceholder.typicode.com/comments/
21+
comments: requests.Response = requests.get(endpoint_comments)
22+
23+
return {"comments": comments.json()[:10], "statusCode": 200}
24+
except parameters.exceptions.GetParameterError as error:
25+
return {"comments": None, "message": str(error), "statusCode": 400}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from typing import Any
2+
from uuid import uuid4
3+
4+
import boto3
5+
6+
from aws_lambda_powertools.utilities import parameters
7+
from aws_lambda_powertools.utilities.typing import LambdaContext
8+
9+
ec2 = boto3.resource("ec2")
10+
ssm_provider = parameters.SSMProvider()
11+
12+
13+
def lambda_handler(event: dict, context: LambdaContext):
14+
try:
15+
# Retrieve the key pair from secure string parameter
16+
ec2_pem: Any = ssm_provider.get("/lambda-powertools/ec2_pem", decrypt=True)
17+
18+
name_key_pair = f"kp_{uuid4()}"
19+
20+
ec2.import_key_pair(KeyName=name_key_pair, PublicKeyMaterial=ec2_pem)
21+
22+
ec2.create_instances(
23+
ImageId="ami-026b57f3c383c2eec", InstanceType="t2.micro", MinCount=1, MaxCount=1, KeyName=name_key_pair
24+
)
25+
26+
return {"message": "EC2 created", "success": True}
27+
except parameters.exceptions.GetParameterError as error:
28+
return {"message": f"Error creating EC2 => {str(error)}", "success": False}

0 commit comments

Comments
 (0)