L'article décrit les étapes pour automatiser la gestion des certificats SSL à partir de en utilisant О AWS.
est un outil qui nous permettra d'implémenter cette fonctionnalité. Il peut fonctionner avec 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, enfin, envoyer des notifications push vers SNS. DANS acme-dns-route53 Il existe également des fonctionnalités intégrées à 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 s'exécute acme-dns-route53;
- créer une minuterie CloudWatch qui déclenche une fonction 2 fois par jour ;
Ă noter: Avant de commencer, vous devez installer Đž
Création d'un fichier zip
acme-dns-route53 est écrit en GoLang et prend en charge la version non inférieure à 1.9.
Nous devons créer un fichier zip avec un binaire acme-dns-route53 à l'intérieur. Pour ce faire, vous devez installer acme-dns-route53 depuis le référentiel GitHub à l'aide de la commande go install:
$ env GOOS=linux GOARCH=amd64 go install github.com/begmaroman/acme-dns-route53Le binaire est installé dans $GOPATH/bin annuaire. Veuillez noter que lors de l'installation, nous avons spécifié deux environnements modifiés : GOOS=linux О GOARCH=amd64Ils indiquent au compilateur Go de créer un binaire adapté à Linux Les systÚmes d'exploitation et les architectures amd64 sont ceux qui fonctionnent sur AWS.
AWS s'attend à ce que notre programme soit déployé dans un fichier zip, alors créons acme-dns-route53.zip archive qui contiendra le binaire nouvellement installé :
$ zip -j ~/acme-dns-route53.zip $GOPATH/bin/acme-dns-route53Ă noter: Le binaire doit ĂȘtre Ă la racine de l'archive zip. Pour cela nous utilisons -j drapeau.
Maintenant notre pseudo zip est prĂȘt Ă ĂȘtre dĂ©ployĂ©, il ne reste plus qu'Ă crĂ©er un rĂŽle avec les droits nĂ©cessaires.
Création d'un rÎle IAM
Nous devons mettre en place un rÎle IAM avec les droits requis par notre lambda lors de son exécution.
Appelons cette politique lambda-acme-dns-route53-executor et donnez-lui immédiatement un rÎle de base AWSLambdaBasicExecutionRole. Cela permettra à notre lambda d'exécuter et d'écrire des journaux sur le service AWS CloudWatch.
Tout d'abord, nous créons 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.jsonLe 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:${var.region}:<AWS_ACCOUNT_ID>:<TOPIC_NAME>",
"arn:aws:route53:::hostedzone/*",
"arn:aws:route53:::change/*",
"arn:aws:acm:<AWS_REGION>:<AWS_ACCOUNT_ID>:certificate/*"
]
}
]
}Maintenant, exécutons la commande aws iam create-role pour créer un rÎle :
$ aws iam create-role --role-name lambda-acme-dns-route53-executor
--assume-role-policy-document ~/lambda-acme-dns-route53-executor-policy.jsonà noter: rappelez-vous l'ARN de la politique (Amazon Resource Name) - nous en aurons besoin dans les prochaines étapes.
RÎle lambda-acme-dns-route53-executor créé, nous devons maintenant spécifier les autorisations pour celui-ci. Le moyen le plus simple de procéder est d'utiliser la commande aws iam attach-role-policy, en transmettant l'ARN de la stratégie 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Ă noter: une liste avec d'autres politiques peut ĂȘtre trouvĂ©e .
Création d'une fonction lambda qui s'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- c'est clair acme-dns-route53 cette exĂ©cution a lieu dans AWS Lambda.DOMAINSâ une liste de domaines sĂ©parĂ©s par des virgules.LETSENCRYPT_EMAIL- contient .NOTIFICATION_TOPICâ nom du sujet de notification SNS (facultatif).STAGING- Ă la valeur1un environnement de prĂ©paration est utilisĂ©.1024Mo - limite de mĂ©moire, peut ĂȘtre modifiĂ©e.900secondes (15 min) â dĂ©lai d'attente.acme-dns-route53â le nom de notre binaire, qui se trouve dans l'archive.fileb://~/acme-dns-route53.zipâ le chemin d'accĂšs Ă l'archive que nous avons créée.
Déployons 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}"
--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",
"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 cron, qui appelle notre fonction deux fois par jour :
- créer une rÚgle CloudWatch avec la valeur
schedule_expression. - crĂ©ez une cible de rĂšgle (ce qui doit ĂȘtre exĂ©cutĂ©) en spĂ©cifiant l'ARN de la fonction lambda.
- autorisez la rĂšgle Ă appeler la fonction lambda.
Ci-dessous, j'ai joint 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 mettre Ă jour automatiquement les certificats SSL
Source: habr.com
