a4b1498665
* Support rotating secrets using Lambda The Secrets manager rotation process uses an AWS Lambda function to perform the rotation of a secret. [1] In fact, it's not possible to trigger rotation of a Secret without specifying a Lambda function at some point in the life of the secret: ``` $ aws secretsmanager rotate-secret --secret-id /rotationTest An error occurred (InvalidRequestException) when calling the RotateSecret operation: No Lambda rotation function ARN is associated with this secret. ``` `moto` can be a little more lenient in this regard and allow `rotate_secret` to be called without a Lambda function being present, if only to allow simulation of the `AWSCURRENT` and `AWSPREVIOUS` labels moving across versions. However, if a lambda function _has_ been specified when calling `rotate_secret`, it should be invoked therefore providing the developer with the full multi-stage process [3] which can be used to test the Lambda function itself and ensuring that full end-to-end testing is performed. Without this there's no easy way to configure the Secret in the state needed to provide the Lambda function with the data in the format it needs to be in at each step of the invocation process. [1]: https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets-lambda-function-overview.html [2]: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.rotate_secret [3]: https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets-lambda-function-overview.html#rotation-explanation-of-steps * Run `black` over `secretsmanager/models.py` * Make `lambda_backends` import local to the condition * Implement `update_secret_version_stage` Allow a staging label to be moved across versions. https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.update_secret_version_stage * Add an integration test for Secrets Manager & Lambda * Support passing `ClientRequestToken` to `put_secret_value` By passing `ClientRequestToken` to `put_secret_value` within the lambda function invoked by calling `rotate_secret`, one can update the value associated with the existing (pending) version, without causing a new secret version to be created. * Add application logic for `AWSPENDING` The rotation function must end with the versions of the secret in one of two states: - The `AWSPENDING` and `AWSCURRENT` staging labels are attached to the same version of the secret, or - The `AWSPENDING` staging label is not attached to any version of the secret. If the `AWSPENDING` staging label is present but not attached to the same version as `AWSCURRENT` then any later invocation of RotateSecret assumes that a previous rotation request is still in progress and returns an error. * Update `default_version_id` after Lambda rotation concludes Call `set_default_version_id` directly, rather than going through `reset_default_version` as the Lambda function is responsible for moving the version labels around, not `rotate_secret`. * Run `black` over changed files * Fix Python 2.7 compatibility * Add additional test coverage for Secrets Manager * Fix bug found by tests AWSPENDING + AWSCURRENT check wasn't using `version_stages`. Also tidy up the AWSCURRENT moving in `update_secret_version_stage` to remove AWSPREVIOUS it from the new stage. * Run `black` over changed files * Add additional `rotate_secret` tests * Skip `test_rotate_secret_lambda_invocations` in test server mode * Add test for invalid Lambda ARN |
||
---|---|---|
.. | ||
test_acm | ||
test_apigateway | ||
test_applicationautoscaling | ||
test_athena | ||
test_autoscaling | ||
test_awslambda | ||
test_batch | ||
test_cloudformation | ||
test_cloudwatch | ||
test_codecommit | ||
test_codepipeline | ||
test_cognitoidentity | ||
test_cognitoidp | ||
test_config | ||
test_core | ||
test_datapipeline | ||
test_datasync | ||
test_dms | ||
test_dynamodb | ||
test_dynamodb2 | ||
test_dynamodbstreams | ||
test_ec2 | ||
test_ec2instanceconnect | ||
test_ecr | ||
test_ecs | ||
test_elasticbeanstalk | ||
test_elb | ||
test_elbv2 | ||
test_emr | ||
test_events | ||
test_forecast | ||
test_glacier | ||
test_glue | ||
test_iam | ||
test_iot | ||
test_iotdata | ||
test_kinesis | ||
test_kinesisvideo | ||
test_kinesisvideoarchivedmedia | ||
test_kms | ||
test_logs | ||
test_managedblockchain | ||
test_mediaconnect | ||
test_medialive | ||
test_mediapackage | ||
test_mediastore | ||
test_opsworks | ||
test_organizations | ||
test_packages | ||
test_polly | ||
test_ram | ||
test_rds | ||
test_rds2 | ||
test_redshift | ||
test_resourcegroups | ||
test_resourcegroupstaggingapi | ||
test_route53 | ||
test_s3 | ||
test_s3bucket_path | ||
test_sagemaker | ||
test_secretsmanager | ||
test_ses | ||
test_sns | ||
test_sqs | ||
test_ssm | ||
test_stepfunctions | ||
test_sts | ||
test_support | ||
test_swf | ||
test_transcribe | ||
test_utilities | ||
test_xray | ||
__init__.py | ||
compat.py | ||
helpers.py |