Įraše aprašomi žingsniai, kaip automatizuoti SSL sertifikatų valdymą naudojant и AWS.
yra įrankis, kuris leis mums įgyvendinti šią funkciją. Jis gali dirbti su SSL sertifikatais iš Let's Encrypt, išsaugoti juos Amazon Certificate Manager, naudoti Route53 API DNS-01 iššūkiui įgyvendinti ir galiausiai siųsti pranešimus SNS. IN acme-dns-route53 Taip pat yra įmontuota funkcija, skirta naudoti AWS Lambda viduje, ir tai yra tai, ko mums reikia.
Šis straipsnis suskirstytas į 4 skyrius:
- sukurti zip failą;
- sukurti IAM vaidmenį;
- sukurti lambda funkciją, kuri veikia acme-dns-route53;
- sukurti CloudWatch laikmatį, kuris suaktyvina funkciją 2 kartus per dieną;
Pastaba: Prieš pradėdami, turite įdiegti и
Kuriamas zip failas
acme-dns-route53 yra parašyta GoLang ir palaiko ne žemesnę nei 1.9 versiją.
Turime sukurti zip failą su dvejetainiu acme-dns-route53 viduje. Norėdami tai padaryti, turite įdiegti acme-dns-route53 iš GitHub saugyklos naudodami komandą go install:
$ env GOOS=linux GOARCH=amd64 go install github.com/begmaroman/acme-dns-route53Dvejetainė yra įdiegta $GOPATH/bin katalogas. Atkreipkite dėmesį, kad diegimo metu nurodėme dvi pakeistas aplinkas: GOOS=linux и GOARCH=amd64Jie nurodo „Go“ kompiliatoriui sukurti dvejetainį failą, tinkamą Linux AWS veikia OS ir amd64 architektūros.
AWS tikisi, kad mūsų programa bus įdiegta ZIP faile, todėl sukurkime acme-dns-route53.zip archyvas, kuriame bus naujai įdiegtas dvejetainis failas:
$ zip -j ~/acme-dns-route53.zip $GOPATH/bin/acme-dns-route53Pastaba: Dvejetainis failas turėtų būti ZIP archyvo šaknyje. Tam mes naudojame -j vėliava.
Dabar mūsų pašto slapyvardis yra paruoštas naudoti, belieka sukurti vaidmenį su reikiamomis teisėmis.
IAM vaidmens sukūrimas
Turime nustatyti IAM vaidmenį su teisėmis, kurių reikalauja mūsų lambda jo vykdymo metu.
Pavadinkime šią politiką lambda-acme-dns-route53-executor ir iš karto skirkite jai pagrindinį vaidmenį AWSLambdaBasicExecutionRole. Tai leis mūsų lambda paleisti ir rašyti žurnalus į AWS CloudWatch paslaugą.
Pirmiausia sukuriame JSON failą, kuriame aprašomos mūsų teisės. Tai iš esmės leis lambda paslaugoms naudoti vaidmenį lambda-acme-dns-route53-executor:
$ touch ~/lambda-acme-dns-route53-executor-policy.jsonMūsų failo turinys yra toks:
{
"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/*"
]
}
]
}Dabar vykdykime komandą aws iam create-role sukurti vaidmenį:
$ aws iam create-role --role-name lambda-acme-dns-route53-executor
--assume-role-policy-document ~/lambda-acme-dns-route53-executor-policy.jsonPastaba: prisiminkite politiką ARN (Amazon Resource Name) – jos mums reikės atliekant kitus veiksmus.
Vaidmuo lambda-acme-dns-route53-executor sukurta, dabar turime nurodyti jo teises. Lengviausias būdas tai padaryti yra naudoti komandą aws iam attach-role-policy, perduodamas ARN politika AWSLambdaBasicExecutionRole taip:
$ aws iam attach-role-policy --role-name lambda-acme-dns-route53-executor
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRolePastaba: galima rasti sąrašą su kitomis taisyklėmis .
Veikiančios lambda funkcijos sukūrimas acme-dns-route53
Sveika! Dabar galite įdiegti mūsų funkciją AWS naudodami komandą aws lambda create-function. Lambda turi būti sukonfigūruota naudojant šiuos aplinkos kintamuosius:
AWS_LAMBDA– aiškiai parodo acme-dns-route53 kad vykdymas įvyksta AWS Lambda viduje.DOMAINS— kableliais atskirtų domenų sąrašas.LETSENCRYPT_EMAIL- yra .NOTIFICATION_TOPIC— SNS pranešimų temos pavadinimas (neprivaloma).STAGING- pagal vertę1naudojama pastatymo aplinka.1024MB – atminties limitas, galima keisti.900sek. (15 min.) — skirtas laikas.acme-dns-route53- mūsų dvejetainio, esančio archyve, pavadinimas.fileb://~/acme-dns-route53.zip- kelias į mūsų sukurtą archyvą.
Dabar diegkime:
$ 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"
}„CloudWatch“ laikmačio, kuris suaktyvina funkciją 2 kartus per dieną, sukūrimas
Paskutinis veiksmas yra nustatyti cron, kuris du kartus per dieną iškviečia mūsų funkciją:
- sukurti „CloudWatch“ taisyklę su verte
schedule_expression. - sukurkite taisyklės tikslą (kas turėtų būti vykdoma), nurodydami lambda funkcijos ARN.
- duoti leidimą taisyklei iškviesti lambda funkciją.
Žemiau pridėjau savo „Terraform“ konfigūraciją, tačiau iš tikrųjų tai daroma labai paprastai naudojant AWS konsolę arba 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}"
}Dabar esate sukonfigūruotas automatiškai kurti ir atnaujinti SSL sertifikatus
Šaltinis: www.habr.com
