Această postare descrie pașii pentru automatizarea gestionării certificatelor SSL de la folosind și AWS.
— este un instrument care ne va permite să implementăm această funcție. Acesta poate lucra cu certificatul SSL de la Let’s Encrypt, le poate salva în Amazon Certificate Manager, folosește API-ul Route53 pentru a implementa provocarea DNS-01 și, la final, trimite notificări în SNS. În acme-dns-route53 de asemenea, este prezent un funcțional built-in pentru utilizarea în interiorul AWS Lambda, iar aceasta este ceea ce avem nevoie.
Acest articol este împărțit în 4 secțiuni:
- crearea fișierului zip;
- crearea rolului IAM;
- crearea funcției lambda care pornește acme-dns-route53;
- crearea unui cronometru CloudWatch care declanșează funcția de 2 ori pe zi;
Notă: înainte de a începe, este necesar să instalați și
Crearea fișierului zip
acme-dns-route53 este scris în GoLang și suportă versiuni de 1.9 sau mai mari.
Trebuie să creăm un fișier zip cu bibliotecile binare acme-dns-route53 în interior. În acest sens, este necesar să instalați acme-dns-route53 din depozitul GitHub folosind comanda go install:
$ env GOOS=linux GOARCH=amd64 go install github.com/begmaroman/acme-dns-route53Binarul este instalat în $GOPATH/bin director. Rețineți că, la instalare, am specificat două variabile de mediu: GOOS=linux și GOARCH=amd64. Acestea îi comunică compilatorului Go necesitatea de a crea un fișier binar potrivit pentru OS Linux și arhitectura amd64 — aceasta este ceea ce rulează în AWS.
AWS presupune desfășurarea programului nostru într-un fișier zip, așa că să creăm acme-dns-route53.zip un arhivă care va conține binarul tocmai instalat:
$ zip -j ~/acme-dns-route53.zip $GOPATH/bin/acme-dns-route53Notă: binarul trebuie să fie în rădăcina arhivei zip. Pentru aceasta, folosim -j flag.
Acum zip-ul nostru este gata pentru desfășurare, rămâne să creăm un rol cu permisiunile necesare.
Crearea rolului IAM
Trebuie să configurăm rolul IAM cu permisiunile necesare funcționării lambda-ului nostru.
Să numim această politică lambda-acme-dns-route53-executor și imediat să-i dăm rolul de bază AWSLambdaBasicExecutionRole. Aceasta va permite lambda-ului nostru să pornească și să scrie jurnale în serviciul AWS CloudWatch.
Pentru început, creăm un fișier JSON în care descriem permisiunile noastre. Acesta, practic, va permite serviciilor lambda să utilizeze rolul lambda-acme-dns-route53-executor:
$ touch ~/lambda-acme-dns-route53-executor-policy.jsonConținutul fișierului nostru este următorul:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup"
],
"Resource": "arn:aws:logs:::*"
},
{
"Effect": "Allow",
"Action": [
"logs:PutLogEvents",
"logs:CreateLogStream"
],
"Resource": "arn:aws:logs:::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}::",
"arn:aws:route53:::hostedzone/*",
"arn:aws:route53:::change/*",
"arn:aws:acm:::certificate/*"
]
}
]
}Acum să executăm comanda aws iam create-role pentru a crea un rol:
$ aws iam create-role --role-name lambda-acme-dns-route53-executor
--assume-role-policy-document ~/lambda-acme-dns-route53-executor-policy.jsonNotă: rețineți ARN-ul politicii (Amazon Resource Name) — îl vom folosi în etapele următoare.
Rolul lambda-acme-dns-route53-executor a fost creat, acum trebuie să specificăm permisiunile pentru acesta. Cea mai simplă modalitate de a face acest lucru este să folosim comanda aws iam attach-role-policy, transmitând ARN-ul politicii AWSLambdaBasicExecutionRole în următorul mod:
$ aws iam attach-role-policy --role-name lambda-acme-dns-route53-executor
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRoleNotă: lista cu celelalte politici o puteți găsi .
Crearea funcției lambda care va rula acme-dns-route53
Ura! Acum putem să ne implementăm funcția pe AWS folosind comanda aws lambda create-function. Funcția lambda trebuie configurată folosind următoarele variabile de mediu:
AWS_LAMBDA— indică faptul că execuția se desfășoară în interiorul AWS Lambda. acme-dns-route53 DOMAINS— o listă de domenii, separate prin virgule.LETSENCRYPT_EMAIL— conțineEmail-ul Let’s Encrypt .— numele SNS Notification Topic (opțional).STAGING— cu valoareaeste utilizat mediul de staging.1MB — limita de memorie, poate fi modificată.1024secs (15 min) — timeout.900— numele bursierului nostru, care se află în arhivă.acme-dns-route53— calea către arhivă, pe care am creat-o.fileb://~/acme-dns-route53.zipAcum implementăm:
Acum desfășurăm:
$ aws lambda create-function
--function-name acme-dns-route53
--runtime go1.x
--role arn:aws:iam:::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:::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::function:acme-dns-route53",
"Handler": "acme-dns-route53"
}Crearea unui trigger CloudWatch care declanșează funcția de două ori pe zi
Ultimul pas este să configurăm un cron care să cheme funcția noastră de două ori pe zi:
- creați o regulă CloudWatch cu valoarea
schedule_expression. - creați un obiectiv al regulii (ce trebuie să se execute), specificând ARN-ul funcției lambda.
- dați permisiunea regulii de a apela funcția lambda.
Mai jos am atașat configurația mea Terraform, dar de fapt se face foarte ușor cu ajutorul consolei AWS sau 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}"
}Acum și voi aveți configurarea automată a creării și actualizării certificatelor SSL
Sursa: habr.com
