Skip to content

Commit ea30084

Browse files
feat(event_sources): add Secrets Manager secret rotation event (#3061)
Co-authored-by: Leandro Damascena <[email protected]>
1 parent 0f3cebf commit ea30084

File tree

7 files changed

+81
-0
lines changed

7 files changed

+81
-0
lines changed

aws_lambda_powertools/utilities/data_classes/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from .kinesis_stream_event import KinesisStreamEvent
1919
from .lambda_function_url_event import LambdaFunctionUrlEvent
2020
from .s3_event import S3Event, S3EventBridgeNotificationEvent
21+
from .secrets_manager_event import SecretsManagerEvent
2122
from .ses_event import SESEvent
2223
from .sns_event import SNSEvent
2324
from .sqs_event import SQSEvent
@@ -26,6 +27,7 @@
2627
__all__ = [
2728
"APIGatewayProxyEvent",
2829
"APIGatewayProxyEventV2",
30+
"SecretsManagerEvent",
2931
"AppSyncResolverEvent",
3032
"ALBEvent",
3133
"CloudWatchDashboardCustomWidgetEvent",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from typing_extensions import Literal
2+
3+
from aws_lambda_powertools.utilities.data_classes.common import DictWrapper
4+
5+
6+
class SecretsManagerEvent(DictWrapper):
7+
@property
8+
def secret_id(self) -> str:
9+
"""SecretId: The secret ARN or identifier"""
10+
return self["SecretId"]
11+
12+
@property
13+
def client_request_token(self) -> str:
14+
"""ClientRequestToken: The ClientRequestToken associated with the secret version"""
15+
return self["ClientRequestToken"]
16+
17+
@property
18+
def version_id(self) -> str:
19+
"""Alias to ClientRequestToken to get token associated to version"""
20+
return self["ClientRequestToken"]
21+
22+
@property
23+
def step(self) -> Literal["createSecret", "setSecret", "testSecret", "finishSecret"]:
24+
"""Step: The rotation step (one of createSecret, setSecret, testSecret, or finishSecret)"""
25+
return self["Step"]

docs/utilities/data_classes.md

+16
Original file line numberDiff line numberDiff line change
@@ -1095,6 +1095,22 @@ This example is based on the AWS Blog post [Introducing Amazon S3 Object Lambda
10951095
file_key = event.detail.object.key
10961096
```
10971097

1098+
### Secrets Manager
1099+
1100+
AWS Secrets Manager rotation uses an AWS Lambda function to update the secret. [Click here](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html){target="_blank"} for more information about rotating AWS Secrets Manager secrets.
1101+
1102+
=== "app.py"
1103+
1104+
```python hl_lines="2 7 11"
1105+
--8<-- "examples/event_sources/src/secrets_manager.py"
1106+
```
1107+
1108+
=== "Secrets Manager Example Event"
1109+
1110+
```json
1111+
--8<-- "tests/events/secretsManagerEvent.json"
1112+
```
1113+
10981114
### SES
10991115

11001116
=== "app.py"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from aws_lambda_powertools.utilities import parameters
2+
from aws_lambda_powertools.utilities.data_classes import SecretsManagerEvent, event_source
3+
4+
secrets_provider = parameters.SecretsProvider()
5+
6+
7+
@event_source(data_class=SecretsManagerEvent)
8+
def lambda_handler(event: SecretsManagerEvent, context):
9+
# Getting secret value using Parameter utility
10+
# See https://docs.powertools.aws.dev/lambda/python/latest/utilities/parameters/
11+
secret = secrets_provider.get(event.secret_id, VersionId=event.version_id, VersionStage="AWSCURRENT")
12+
13+
# You need to work with secrets afterwards
14+
# Check more examples: https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas
15+
16+
return secret
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"SecretId":"arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
3+
"ClientRequestToken":"550e8400-e29b-41d4-a716-446655440000",
4+
"Step":"createSecret"
5+
}

tests/events/secretsManagerEvent.json

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"SecretId":"arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
3+
"ClientRequestToken":"550e8400-e29b-41d4-a716-446655440000",
4+
"Step":"createSecret"
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from aws_lambda_powertools.utilities.data_classes.secrets_manager_event import SecretsManagerEvent
2+
from tests.functional.utils import load_event
3+
4+
5+
def test_secrets_manager_event():
6+
raw_event = load_event("secretsManagerEvent.json")
7+
parsed_event = SecretsManagerEvent(raw_event)
8+
9+
assert parsed_event.secret_id == raw_event["SecretId"]
10+
assert parsed_event.client_request_token == raw_event["ClientRequestToken"]
11+
assert parsed_event.version_id == raw_event["ClientRequestToken"]
12+
assert parsed_event.step == raw_event["Step"]

0 commit comments

Comments
 (0)