Ky posti përshkruan hapat për automatizimin e menaxhimit të certifikatave SSL nga duke përdorur dhe AWS.
â Ă«shtĂ« njĂ« mjet qĂ« na lejon tĂ« realizojmĂ« kĂ«tĂ« funksionalitet. Ai di tĂ« punojĂ« me certifikatat SSL nga Letâs Encrypt, t'i ruajĂ« ato nĂ« Amazon Certificate Manager, tĂ« pĂ«rdorĂ« API-nĂ« e Route53 pĂ«r tĂ« realizuar sfidĂ«n DNS-01, dhe, nĂ« pĂ«rfundim, tĂ« çojĂ« njoftimet nĂ« SNS. NĂ« acme-dns-route53 po ashtu ka funksionalitetin e integruar pĂ«r t'u pĂ«rdorur brenda AWS Lambda, dhe kjo Ă«shtĂ« ajo qĂ« na nevojitet.
Ky artikull është ndarë në 4 pjesë:
- krijimi i skedarit zip;
- krijimi i rolit IAM;
- krijimi i funksionit lambda që aktivizon acme-dns-route53;
- krijimin e një timer-i CloudWatch që aktivizon funksionin 2 herë në ditë;
Shënim: para se të filloni, duhet të instaloni dhe
Krijimi i skedarit zip
acme-dns-route53 është shkruar në GoLang dhe mbështet versionin 1.9 ose më të lartë.
Na nevojitet të krijojmë një skedar zip me binarin acme-dns-route53 brenda. Për këtë, duhet të instaloni acme-dns-route53 nga depoja GitHub duke përdorur komandën go install:
$ env GOOS=linux GOARCH=amd64 go install github.com/begmaroman/acme-dns-route53Binarin Ă«shtĂ« instaluar nĂ« $GOPATH/bin direktorinĂ«. Kur instaloni, vini re se kemi caktuar dy variabla mjedisi: GOOS=linux dhe GOARCH=amd64. KĂ«to i japin tĂ« kuptojnĂ« kompilatorit Go se nevoja pĂ«r tĂ« krijuar njĂ« binar tĂ« pĂ«rshtatshĂ«m pĂ«r sistemin operativ Linux dhe arkitekturĂ«n amd64 â kjo Ă«shtĂ« ajo qĂ« ekzekutohet nĂ« AWS.
AWS parashikon që programi ynë të vihet në dispozitë si skedar zip, kështu që le të krijojmë acme-dns-route53.zip një arkiv që do të përmbajë ergatisht instalimin e fundit:
$ zip -j ~/acme-dns-route53.zip $GOPATH/bin/acme-dns-route53Shënim: binarin duhet të jetë në rrënjën e arkivës zip. Për këtë, ne përdorim -j flakun.
Tani zip-i ynë është gati për ndihmës, vetëm duhet të krijojmë një rol me të drejtat e nevojshme.
Krijimi i rolit IAM
Na nevojitet të krijojmë një rol IAM me të drejtat e nevojshme për lambdën gjatë ekzekutimit të saj.
Le të quajmë këtë politikë lambda-acme-dns-route53-executor dhe menjëherë t'i japim asaj rolin bazik AWSLambdaBasicExecutionRole. Kjo do t'i lejojë lambdës tonë të aktivizohet dhe të shkruajë logje në shërbimin AWS CloudWatch.
Fillimisht krijojmë një skedar JSON në të cilin përshkruhen të drejtat tona. Kjo, në thelb, do t'i lejojë shërbimeve lambda të përdorin rolin lambda-acme-dns-route53-executor:
$ touch ~/lambda-acme-dns-route53-executor-policy.jsonPërmbajtja e skedarit tonë është si vjen:
{
"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/*"
]
}
]
}Tani tani ekzekutojmë komandën aws iam create-role për të krijuar një rol:
$ aws iam create-role --role-name lambda-acme-dns-route53-executor
--assume-role-policy-document ~/lambda-acme-dns-route53-executor-policy.jsonShĂ«nim: mbani mend ARN-nĂ« e politikĂ«s (Emri i Burimit Amazon) â do tĂ« na nevojitet nĂ« hapat e ardhshĂ«m.
Roli lambda-acme-dns-route53-executor u krijua, tani na nevojitet të specifikojmë lejet për të. Mënyra më e thjeshtë për ta bërë këtë është të përdorim komandën aws iam attach-role-policy, duke kaluar ARN-në e politikës AWSLambdaBasicExecutionRole në mënyrë të tillë:
$ aws iam attach-role-policy --role-name lambda-acme-dns-route53-executor
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRoleShënim: lista me politikat e tjera mund të gjendet .
Krijimi i funksionit lambda që aktivizon acme-dns-route53
Hurrah! Tani mund të deploymë funksionin tonë në AWS duke përdorur komandën aws lambda create-function. Lambda duhet të konfigurohet duke përdorur variablat e mëposhtëm të mjedisit:
AWS_LAMBDAâ tregon acme-dns-route53 se ekzekutimi po ndodh brenda AWS Lambda.DOMAINSâ lista e domain-eve, tĂ« ndara me presje.LETSENCRYPT_EMAILâ pĂ«rmban .NOTIFICATION_TOPICâ emri i SNS Notification Topic (opsional).STAGINGâ kur vlera Ă«shtĂ«1pĂ«rdoret mjedisi i staging.1024MB â kufiri i memories, mund tĂ« ndryshohet.900secs (15 minuta) â koha e skadencĂ«s.acme-dns-route53â emri i binarit tonĂ«, i cili ndodhet nĂ« arkiv.fileb://~/acme-dns-route53.zipâ rruga drejt arkivit, qĂ« kemi krijuar.
Tani po e deploymë:
$ 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"
}Krijimi i një timeri CloudWatch që aktivizon funksionin dy herë në ditë
Hapi i fundit është të konfiguroni një cron që thërret funksionin tonë dy herë në ditë:
- krijoni një rregull CloudWatch me vlerën
schedule_expression. - krijoni një objektiv për rregullin (çfarë duhet të ekzekutohet), duke treguar ARN e funksionit lambda.
- jepni leje rregullit për të thirrur funksionin lambda.
Më poshtë kam bashkangjitur konfigurimin tim Terraform, por në të vërtetë kjo bëhet shumë lehtë përmes konsolës AWS ose 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}"
}Tani edhe ju keni të konfiguruar automatikisht krijimin dhe përditësimin e certifikatave SSL
Burimi: habr.com
