Ky postim 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 mund tĂ« punojĂ« me certifikatate SSL nga Letâs Encrypt, t'i ruajĂ« ato nĂ« Amazon Certificate Manager, tĂ« pĂ«rdorĂ« API-nĂ« e Route53 pĂ«r realizimin e sfidĂ«s DNS-01 dhe, nĂ« fund, tĂ« dĂ«rgojĂ« njoftime nĂ« SNS. NĂ« acme-dns-route53 nĂ« tĂ« njĂ«jtĂ«n kohĂ«, ka funksionalitet tĂ« integruar pĂ«r t'u pĂ«rdorur brenda AWS Lambda, dhe kjo Ă«shtĂ« ajo qĂ« na nevojitet.
Ky artikull është i ndarë në 4 seksione:
- krijimi i skedhës zip;
- krijimi i rolit IAM;
- krijimi i funksionit lambda që ekzekuton acme-dns-route53;
- krijimi i një timer-i në CloudWatch që aktivizon funksionin 2 herë në ditë;
Shënim: para fillimit, nevojitet instalimi i dhe
Krijimi i skedhës zip
acme-dns-route53 është shkruar në GoLang dhe mbështet versionin 1.9 ose më të lartë.
Na nevojitet të krijojmë një skedhë zip me binarin acme-dns-route53 brenda. Për këtë është e nevojshme të instalohet acme-dns-route53 nga repository GitHub duke përdorur komandën go install:
$ env GOOS=linux GOARCH=amd64 go install github.com/begmaroman/acme-dns-route53Binar Ă«shtĂ« instaluar nĂ« $GOPATH/bin direktorinĂ«. Vini re se gjatĂ« instalimit ne caktuam dy variabla tĂ« mjedisit: GOOS=linux dhe GOARCH=amd64. KĂ«ta i tregojnĂ« kompajlerit Go pĂ«r tĂ« krijuar njĂ« binar tĂ« pĂ«rshtatshĂ«m pĂ«r sistemin operativ Linux dhe arkitekturĂ«n amd64 â ky Ă«shtĂ« ai qĂ« ekzekutohet nĂ« AWS.
AWS parashikon vendosjen e programit tonë në një skedar zip, kështu që le të krijojmë acme-dns-route53.zip arkivin që do të përmbajë binarin e sapo instaluar:
$ zip -j ~/acme-dns-route53.zip $GOPATH/bin/acme-dns-route53Shënim: bineri duhet të jetë në rrënjën e arkivit zip. Për këtë ne përdorim -j flakun.
Tani zip-i ynë është gati për vendosje, duhet vetëm të krijojmë një rol me të drejtat e nevojshme.
Krijimi i rolit IAM
Na nevojitet të vendosim rolin IAM me të drejtat e nevojshme për lambdën tonë gjatë ekzekutimit të saj.
Le të quajmë këtë politikë lambda-acme-dns-route53-executor dhe menjëherë t'i japim asaj rolin e bazës AWSLambdaBasicExecutionRole. Kjo do t'i lejojë lambdës tonë të startojë dhe të shkruajë logje në shërbimin AWS CloudWatch.
Për fillim, krijojmë një skedar JSON në të cilin përshkruhen të drejtat tona. Kjo, për esencë, do të lejojë shërbimet lambda të përdorin rolin lambda-acme-dns-route53-executor:
$ touch ~/lambda-acme-dns-route53-executor-policy.jsonPërmbajtja e skedarit tonë është si vijon:
{
"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 do ta shkojmë te komanda aws iam create-role për krijimin e rolit:
$ 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 policy ARN (Emri i Burimit Amazon) â do na nevojitet nĂ« hapat e ardhshĂ«m.
Roli lambda-acme-dns-route53-executor është krijuar, tani na nevojitet të përcaktojmë 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 policy ARN AWSLambdaBasicExecutionRole si nga:
$ aws iam attach-role-policy --role-name lambda-acme-dns-route53-executor
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRoleShënim: listën e politikave të tjera mund ta gjeni .
Krijimi i funksionit lambda që ekzekuton acme-dns-route53
Ura! Tani mund ta publikojmë funksionin tonë në AWS me komandën aws lambda create-function. Lambda duhet të konfigurohet duke përdorur këto variabla ambienti:
AWS_LAMBDAâ bĂ«n tĂ« ditur acme-dns-route53 se ekzekutimi ndodh brenda AWS Lambda.DOMENETâ lista e domain-eve, tĂ« ndara me vĂrgula.LETSENCRYPT_EMAILâ pĂ«rmban .NOTIFICATION_TOPICâ emri i SNS Notification Topic (opsional).STAGINGâ kur ka vlerĂ«1pĂ«rdoret ambienti i staging.1024MB â limiti i memories, mund tĂ« ndryshohet.900secs (15 min) â koha e skadencĂ«s.acme-dns-route53â emri i binarit tonĂ«, qĂ« ndodhet nĂ« arkiv.fileb://~/acme-dns-route53.zipâ rruga drejt arkivĂ«s qĂ« krijuam.
Tani po bëjmë publikimin:
$ 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ë timer-i CloudWatch që aktivizon funksionin 2 herë në ditë
Hapi i fundit është të konfigurojmë një cron që thërret funksionin tonë dy herë në ditë:
- krijoni një rregull CloudWatch me vlerën
schedule_expression. - krijoni një target të rregullit (çfarë duhet të ekzekutohet), duke treguar ARN e funksionit lambda.
- jepni leje rregullit të thërrasë 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 konfiguruar krijimin dhe përditësimin automatik të certifikatave SSL.
Burimi: habr.com
