Comment créer une fonction de renouvèlement avec un secret AWS Secrets Manager pour une base de données non prise en charge ?

Date de la dernière mise à jour : 19/10/2020

Comment puis-je créer une fonction AWS Lambda pour renouveler les secrets AWS Secrets Manager pour d'autres bases de données ou des services tiers ?

Brève description

Les secrets Secrets Manager créés avec les bases de données prises en charge par Amazon Relational Database Service (Amazon RDS) et d'autres services de support AWS créent automatiquement la fonction de renouvèlement Lambda. Pour les bases de données et services AWS non pris en charge, vous pouvez créer manuellement la fonction Lambda.

Résolution

Utilisez le modèle générique de la fonction de renouvèlement pour renouveler les secrets. Avant d'activer le renouvèlement d'un secret pour une autre base de données ou un autre service, vous devez créer le code de la fonction de renouvèlement Lambda.

Important :

Création d'un jeu de modifications AWS CloudFormation basé sur le modèle générique de la fonction de renouvèlement

Exécutez la commande AWS CLI create-cloud-formation-change-set pour ces valeurs :

--stack-name : le nom de la pile AWS CloudFormation pour laquelle vous créez un jeu de modifications.

--parameter-override : les points de terminaison régionaux AWS Secrets Manager pour votre région, ainsi que le nom de la fonction de renouvèlement Lambda que le modèle crée.

aws serverlessrepo create-cloud-formation-change-set --application-id arn:aws:serverlessrepo:us-east-1:297356227824:applications/SecretsManagerRotationTemplate --stack-name MyLambdaCreationStack --parameter-overrides Name=endpoint,Value=https://secretsmanager.REGION.amazonaws.com Name=functionName,Value=MySecretsManagerRotationFunction --capabilities CAPABILITY_IAM CAPABILITY_RESOURCE_POLICY

Remarque : assurez-vous d'utiliser l'Amazon Resource Name (ARN) de arn:aws:serverlessrepo:us-east-1:297356227824:applications/SecretsManagerRotationTemplate exactement comme indiqué.

Un jeu de modifications AWS CloudFormation est créé pour le modèle. Le nom de la pile AWS CloudFormation commence par aws-serverless-repository- et le code de statut de la pile est réglé sur REVIEW_IN_PROGRESS.

Mise à jour d'une pile à l'aide du jeu de modifications

La commande create-cloud-formation-change-set renvoie les valeurs ApplicationId, ChangeSetId, SemanticVersion et StackId. Pour mettre à jour le statut de la pile, vous devez indiquer la valeur ChangeSetId pour la commande change-set-name. La commande change-set-name ne produit aucun résultat et entraîne le remplacement du code de statut de la pile par CREATE_COMPLETE. La pile AWS CloudFormation crée la fonction Lambda et un rôle IAM associé à cette dernière avec les autorisations requises.

Exécutez la commande AWS CLI suivante :

aws cloudformation execute-change-set --change-set-name arn:aws:cloudformation:region:123456789012:changeSet/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE/EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE

Vérification de la création des fonctions Lambda

Exécutez la commande AWS CLI suivante :

aws lambda list-functions

Output
{
    ...
    "FunctionName": "MySecretsManagerRotationFunction",
    ...
    "FunctionArn": "arn:aws:lambda:region:123456789012:function:MySecretsManagerRotationFunction",
    ... 
}

Remarque : le nom de la fonction Lambda est la valeur du nom de la fonction spécifiée dans --parameter-overrides.

Configuration de la fonction Lambda pour l'accès Amazon Virtual Private Cloud (Amazon VPC)

Si votre base de données ou votre service réside dans un VPC Amazon, exécutez la commande update-function-configuration similaire à la commande suivante. La commande update-function-configuration configure la fonction de renouvèlement Lambda pour qu'elle s'exécute dans le VPC. Assurez-vous de fournir les ID de sous-réseaux VPC et les ID de groupes de sécurité. Pour plus d'informations, consultez Configuration d'une fonction Lambda pour accéder aux ressources d'un VPC Amazon.

Remarque : si votre base de données ou votre service ne réside pas dans un VPC Amazon, ignorez cette étape.

$ aws lambda update-function-configuration --function-name your-lambda-function \
--vpc-config SubnetIds=subnet-076c28105d486f3bd,subnet-0af00c796ccdc725f,SecurityGroupIds=sg-0aed64f81acc4c037

Création du point de terminaison d'un VPC pour le service Secrets Manager

Si le VPC accompagné de votre base de données ou de votre service et la fonction de renouvèlement Lambda n'a pas d'accès Internet, configurez le VPC avec un point de terminaison de service privé pour Secrets Manager. Ceci permet à la fonction de renouvèlement d'accéder à Secrets Manager à un point de terminaison au sein du VPC. Exécutez la commande create-vpc-endpoint comme suit :

Remarque : si votre base de données ou votre service ne réside pas dans un VPC Amazon, ignorez cette étape.

$ aws ec2 create-vpc-endpoint --vpc-id  vpc-0abb11f5a28a8abe7 --vpc-endpoint-type Interface \
--service-name com.amazonaws.your-region.secretsmanager  --subnet-ids subnet-076c28105d486f3bd subnet-0af00c796ccdc725f \
--security-group-ids sg-0bacf4bbed67e4df5

Configuration de la connectivité réseau entre la fonction Lambda et la base de données ou le service

Assurez-vous que la fonction Lambda peut être acheminée vers votre base de données ou votre service via les ports réseau requis. Cela varie en fonction de la base de données ou du service et de sa configuration VPC associée.

Remarque : si votre base de données ou votre service ne réside pas dans un VPC Amazon, ignorez cette étape.

Personnalisation de la fonction de renouvèlement pour votre cas d'utilisation

Le modèle de renouvèlement implémente les étapes createSecret et finishSecret pour vous. Les étapes setSecret et testSecret nécessitent une implémentation manuelle pour votre cas d'utilisation et votre base de données. Pour plus d'informations, consultez Étapes de la fonction de renouvèlement Lambda.

Activation du renouvèlement pour votre secret

Spécifiez le nombre de jours entre les renouvèlements avec les paramètres --rotation-rules et AutomaticallyAfterDays :

aws secretsmanager rotate-secret --secret-id production/MyAwesomeAppSecret --rotation-lambda-arn arn:aws:lambda:region:123456789012:function:MySecretsManagerRotationFunction --rotation-rules AutomaticallyAfterDays=7