La publication décrit les étapes pour automatiser la gestion des certificats SSL à partir de Let's Encrypt CA en utilisant le défi DNS-01 et AWS .
acme-dns-route53 est un outil qui nous permettra d'implémenter cette fonctionnalité. Il sait comment utiliser les certificats SSL de Let's Encrypt, les enregistrer dans Amazon Certificate Manager, utiliser l'API Route53 pour implémenter le défi DNS-01 et, finalement, pousser les notifications dans SNS. Acme-dns-route53 a également une fonctionnalité intégrée à utiliser dans AWS Lambda, et c'est ce dont nous avons besoin.
Cet article est divisé en 4 sections:
- créer un fichier zip;
- créer un rÎle IAM;
- créer une fonction lambda qui exécute acme-dns-route53 ;
- créer une minuterie CloudWatch qui déclenche une fonction 2 fois par jour;
Remarque: Avant de commencer, vous devez installer GoLang 1.9+ et AWS CLI
Créer un fichier zip
acme-dns-route53 est écrit en GoLang et prend en charge une version non inférieure à 1.9.
Nous devons créer un fichier zip avec le acme-dns-route53
intérieur. Pour ce faire, installez acme-dns-route53
partir du référentiel GitHub à l'aide de la commande go install
:
$ env GOOS=linux GOARCH=amd64 go install github.com/begmaroman/acme-dns-route53
Le binaire est installé dans le $GOPATH/bin
. Veuillez noter que lors de l'installation, nous avons spécifié deux variables d'environnement: GOOS=linux
et GOARCH=amd64
. Ils indiquent clairement au compilateur Go la nécessité de créer un binaire adapté à l'architecture Linux OS et amd64 - c'est ce qui fonctionne dans AWS.
AWS suppose de déployer notre programme dans un fichier zip, alors créons une archive acme-dns-route53.zip
qui contiendra le binaire nouvellement installé:
$ zip -j ~/acme-dns-route53.zip $GOPATH/bin/acme-dns-route53
Remarque: le binaire doit ĂȘtre Ă la racine de l'archive zip. Pour cela, nous utilisons le drapeau -j
.
Maintenant notre pseudo zip est prĂȘt pour le dĂ©ploiement, il ne reste plus qu'Ă crĂ©er un rĂŽle avec les droits nĂ©cessaires.
Créer des rÎles IAM
Nous devons affirmer le rÎle IAM avec les privilÚges dont notre lambda a besoin lors de son exécution.
Appelons cette stratégie lambda-acme-dns-route53-executor
et lui donnons immédiatement le rÎle de base d' AWSLambdaBasicExecutionRole
. Cela permettra à notre lambda de démarrer et d'écrire des journaux sur le service AWS CloudWatch.
Créez d'abord un fichier JSON qui décrit nos droits. Cela permettra essentiellement aux services lambda d'utiliser le rÎle lambda-acme-dns-route53-executor
:
$ touch ~/lambda-acme-dns-route53-executor-policy.json
Le contenu de notre dossier est le suivant:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup" ], "Resource": "arn:aws:logs:<AWS_REGION>:<AWS_ACCOUNT_ID>:*" }, { "Effect": "Allow", "Action": [ "logs:PutLogEvents", "logs:CreateLogStream" ], "Resource": "arn:aws:logs:<AWS_REGION>:<AWS_ACCOUNT_ID>:log-group:/aws/lambda/acme-dns-route53:*" }, { "Sid": "", "Effect": "Allow", "Action": [ "route53:ListHostedZones", "cloudwatch:PutMetricData", "acm:ImportCertificate", "acm:ListCertificates" ], "Resource": "*" }, { "Sid": "", "Effect": "Allow", "Action": [ "sns:Publish", "route53:GetChange", "route53:ChangeResourceRecordSets", "acm:ImportCertificate", "acm:DescribeCertificate" ], "Resource": [ "arn:aws:sns:<AWS_REGION>:<AWS_ACCOUNT_ID>:<TOPIC_NAME>", "arn:aws:route53:::hostedzone/*", "arn:aws:route53:::change/*", "arn:aws:acm:<AWS_REGION>:<AWS_ACCOUNT_ID>:certificate/*" ] } ] }
Exécutez maintenant la commande aws iam create-role
pour créer le rÎle:
$ aws iam create-role --role-name lambda-acme-dns-route53-executor \ --assume-role-policy-document ~/lambda-acme-dns-route53-executor-policy.json
Remarque: rappelez - vous la stratégie ARN (Amazon Resource Name) - nous en aurons besoin dans les prochaines étapes.
Le rĂŽle lambda-acme-dns-route53-executor
a été créé, nous devons maintenant lui spécifier des autorisations. La méthode la plus simple consiste à utiliser la commande aws iam attach-role-policy
, en transmettant la AWSLambdaBasicExecutionRole
comme suit:
$ aws iam attach-role-policy --role-name lambda-acme-dns-route53-executor \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Remarque: une liste avec d'autres politiques peut ĂȘtre trouvĂ©e ici .
Création d'une fonction lambda qui exécute acme-dns-route53
Hourra! Vous pouvez maintenant déployer notre fonction sur AWS à l'aide de la commande aws lambda create-function
. Le lambda doit ĂȘtre configurĂ© Ă l'aide des variables d'environnement suivantes:
AWS_LAMBDA
- permet à acme-dns-route53 de comprendre que l'exécution se produit dans AWS Lambda.DOMAINS
- une liste de domaines séparés par des virgules.LETSENCRYPT_EMAIL
- Contient Let's Encrypt Email .NOTIFICATION_TOPIC
- Nom du sujet de notification SNS (facultatif).STAGING
- s'il est défini sur 1
, l'environnement de STAGING
est utilisé.RENEW_BEFORE
- le nombre de jours qui dĂ©terminent la pĂ©riode avant l'expiration de la pĂ©riode pendant laquelle le certificat doit ĂȘtre renouvelĂ©.1024
Mo - limite de mémoire, sous réserve de modifications.900
secondes (15 min) - timeout.acme-dns-route53
- le nom de notre binaire, qui est dans l'archive.fileb://~/acme-dns-route53.zip
- chemin vers l'archive que nous avons créée.
Déployez maintenant:
$ aws lambda create-function \ --function-name acme-dns-route53 \ --runtime go1.x \ --role arn:aws:iam::<AWS_ACCOUNT_ID>:role/lambda-acme-dns-route53-executor \ --environment Variables="{AWS_LAMBDA=1,DOMAINS=\"example1.com,example2.com\",LETSENCRYPT_EMAIL=begmaroman@gmail.com,STAGING=0,NOTIFICATION_TOPIC=acme-dns-route53-obtained,RENEW_BEFORE=7}" \ --memory-size 1024 \ --timeout 900 \ --handler acme-dns-route53 \ --zip-file fileb://~/acme-dns-route53.zip { "FunctionName": "acme-dns-route53", "LastModified": "2019-05-03T19:07:09.325+0000", "RevisionId": "e3fadec9-2180-4bff-bb9a-999b1b71a558", "MemorySize": 1024, "Environment": { "Variables": { "DOMAINS": "example1.com,example2.com", "STAGING": "1", "LETSENCRYPT_EMAIL": "your@email.com", "NOTIFICATION_TOPIC": "acme-dns-route53-obtained", "RENEW_BEFORE": "7", "AWS_LAMBDA": "1" } }, "Version": "$LATEST", "Role": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/lambda-acme-dns-route53-executor", "Timeout": 900, "Runtime": "go1.x", "TracingConfig": { "Mode": "PassThrough" }, "CodeSha256": "+2KgE5mh5LGaOsni36pdmPP9O35wgZ6TbddspyaIXXw=", "Description": "", "CodeSize": 8456317, "FunctionArn": "arn:aws:lambda:us-east-1:<AWS_ACCOUNT_ID>:function:acme-dns-route53", "Handler": "acme-dns-route53" }
Création d'une minuterie CloudWatch qui déclenche une fonction 2 fois par jour
La derniÚre étape consiste à configurer la couronne, qui appelle notre fonction deux fois par jour:
- Créez une rÚgle CloudWatch avec une valeur d'expression_horaire.
- crĂ©er l'objectif de la rĂšgle (ce qui doit ĂȘtre fait) en spĂ©cifiant l'ARN de la fonction lambda.
- donner l'autorisation Ă la rĂšgle appelant la fonction lambda.
Ci-dessous, j'ai attaché ma configuration Terraform, mais en fait, cela se fait trÚs simplement à l'aide de la console AWS ou de l'AWS CLI.
# Cloudwatch event rule that runs acme-dns-route53 lambda every 12 hours resource "aws_cloudwatch_event_rule" "acme_dns_route53_sheduler" { name = "acme-dns-route53-issuer-scheduler" schedule_expression = "cron(0 */12 * * ? *)" } # Specify the lambda function to run resource "aws_cloudwatch_event_target" "acme_dns_route53_sheduler_target" { rule = "${aws_cloudwatch_event_rule.acme_dns_route53_sheduler.name}" arn = "${aws_lambda_function.acme_dns_route53.arn}" } # Give CloudWatch permission to invoke the function resource "aws_lambda_permission" "permission" { action = "lambda:InvokeFunction" function_name = "${aws_lambda_function.acme_dns_route53.function_name}" principal = "events.amazonaws.com" source_arn = "${aws_cloudwatch_event_rule.acme_dns_route53_sheduler.arn}" }
Vous ĂȘtes maintenant configurĂ© pour crĂ©er et renouveler automatiquement les certificats SSL