เช เชชเซเชธเซเช SSL เชชเซเชฐเชฎเชพเชฃเชชเชคเซเชฐเซเชจเชพ เชธเชเชเชพเชฒเชจเชจเซ เชธเซเชตเชเชพเชฒเชฟเชค เชเชฐเชตเชพเชจเชพ เชชเชเชฒเชพเชเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเซ เชเซ
เช เชฒเซเช 4 เชตเชฟเชญเชพเชเซเชฎเชพเช เชตเชนเซเชเชเชพเชฏเซเชฒเซ เชเซ:
- เชเชฟเชช เชซเชพเชเชฒ เชฌเชจเชพเชตเชตเซ;
- IAM เชญเซเชฎเชฟเชเชพ เชฌเชจเชพเชตเชตเซ;
- เชฒเซเชฎเซเชฌเชกเชพ เชซเชเชเซเชถเชจ เชฌเชจเชพเชตเชตเซเช เชเซ เชเชพเชฒเซ เชเซ acme-dns-route53;
- CloudWatch เชเชพเชเชฎเชฐ เชฌเชจเชพเชตเชตเซเช เชเซ เชฆเชฟเชตเชธเชฎเชพเช 2 เชตเชเชค เชซเชเชเซเชถเชจเชจเซ เชเซเชฐเชฟเชเชฐ เชเชฐเซ เชเซ;
เชจเซเซ
เชง: เชคเชฎเซ เชชเซเชฐเชพเชฐเชเชญ เชเชฐเซ เชคเซ เชชเชนเซเชฒเชพเช เชคเชฎเชพเชฐเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ
เชเชฟเชช เชซเชพเชเชฒ เชฌเชจเชพเชตเซ เชฐเชนเซ เชเซ
acme-dns-route53 GoLang เชฎเชพเช เชฒเชเชพเชฏเซเชฒ เชเซ เช เชจเซ 1.9 เชเชฐเชคเชพ เชเชเชพ เชธเชเชธเซเชเชฐเชฃเชจเซ เชธเชชเซเชฐเซเช เชเชฐเซ เชเซ.
เชเชชเชฃเซ เชฌเชพเชเชจเชฐเซ เชธเชพเชฅเซ เชเชฟเชช เชซเชพเชเชฒ เชฌเชจเชพเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ acme-dns-route53
เช
เชเชฆเชฐ เช เชเชฐเชตเชพ เชฎเชพเชเซ เชคเชฎเชพเชฐเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ acme-dns-route53
เชเชฆเซเชถเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ GitHub เชฐเซเชชเซเชเซเชเชฐเซเชฎเชพเชเชฅเซ go install
:
$ env GOOS=linux GOARCH=amd64 go install github.com/begmaroman/acme-dns-route53
เชฆเซเชตเชฟเชธเชเชเซ เชฎเชพเช เชธเซเชฅเชพเชชเชฟเชค เชฅเชฏเซเชฒ เชเซ $GOPATH/bin
เชกเชฟเชฐเซเชเซเชเชฐเซ. เชฎเชนเซเชฐเชฌเชพเชจเซ เชเชฐเซเชจเซ เชจเซเชเชง เชเชฐเซ เชเซ เชเชจเซเชธเซเชเซเชฒเซเชถเชจ เชฆเชฐเชฎเชฟเชฏเชพเชจ เช
เชฎเซ เชฌเซ เชฌเชฆเชฒเชพเชฏเซเชฒเชพ เชตเชพเชคเชพเชตเชฐเชฃเชจเซ เชเชฒเซเชฒเซเช เชเชฐเซเชฏเซ เชเซ: GOOS=linux
ะธ GOARCH=amd64
. เชคเซเช เชเซ เชเชฎเซเชชเชพเชเชฒเชฐเชจเซ เชธเซเชชเชทเซเช เชเชฐเซ เชเซ เชเซ เชคเซเชจเซ Linux OS เช
เชจเซ amd64 เชเชฐเซเชเชฟเชเซเชเซเชเชฐ เชฎเชพเชเซ เชฏเซเชเซเชฏ เชฌเชพเชเชจเชฐเซ เชฌเชจเชพเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ - เช เชคเซ เชเซ เชเซ AWS เชชเชฐ เชเชพเชฒเซ เชเซ.
AWS เช
เชชเซเชเซเชทเชพ เชฐเชพเชเซ เชเซ เชเซ เช
เชฎเชพเชฐเซ เชชเซเชฐเซเชเซเชฐเชพเชฎ เชเชฟเชช เชซเชพเชเชฒเชฎเชพเช เชเชฎเชพเชตเชตเชพเชฎเชพเช เชเชตเซ, เชคเซเชฅเซ เชเชพเชฒเซ เชฌเชจเชพเชตเซเช acme-dns-route53.zip
เชเชฐเซเชเชพเชเชต เชเซเชฎเชพเช เชจเชตเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเซเชฒเซ เชฌเชพเชเชจเชฐเซ เชนเชถเซ:
$ zip -j ~/acme-dns-route53.zip $GOPATH/bin/acme-dns-route53
เชจเซเซ
เชง: เชฌเชพเชเชจเชฐเซ เชเชฟเชช เชเชฐเซเชเชพเชเชตเชจเชพ เชฐเซเชเชฎเชพเช เชนเซเชตเซ เชเซเชเช. เช เชฎเชพเชเซ เช
เชฎเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช -j
เชงเซเชตเช
เชนเชตเซ เช เชฎเชพเชฐเซเช เชเชฟเชช เชเชชเชจเชพเชฎ เชเชฎเชพเชตเช เชฎเชพเชเซ เชคเซเชฏเชพเชฐ เชเซ, เชเซ เชฌเชพเชเซ เชเซ เชคเซ เชเชฐเซเชฐเซ เช เชงเชฟเชเชพเชฐเซ เชธเชพเชฅเซ เชญเซเชฎเชฟเชเชพ เชฌเชจเชพเชตเชตเชพเชจเซเช เชเซ.
IAM เชญเซเชฎเชฟเชเชพ เชฌเชจเชพเชตเชตเซ
เช
เชฎเชพเชฐเซ เชคเซเชจเชพ เช
เชฎเชฒ เชฆเชฐเชฎเชฟเชฏเชพเชจ เช
เชฎเชพเชฐเชพ เชฒเซเชฎเซเชฌเชกเชพ เชฆเซเชตเชพเชฐเชพ เชเชฐเซเชฐเซ เช
เชงเชฟเชเชพเชฐเซ เชธเชพเชฅเซ IAM เชญเซเชฎเชฟเชเชพ เชธเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ.
เชเชพเชฒเซ เช เชจเซเชคเชฟ เชเชนเซเช lambda-acme-dns-route53-executor
เช
เชจเซ เชคเชฐเชค เช เชคเซเชฃเซเชจเซ เชฎเซเชณเชญเซเชค เชญเซเชฎเชฟเชเชพ เชเชชเซ AWSLambdaBasicExecutionRole
. เช เช
เชฎเชพเชฐเชพ เชฒเซเชฎเซเชฌเชกเชพเชจเซ AWS CloudWatch เชธเซเชตเชพ เชชเชฐ เชฒเซเชเซเชธ เชเชฒเชพเชตเชตเชพ เช
เชจเซ เชฒเชเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเชถเซ.
เชชเซเชฐเชฅเชฎ, เช
เชฎเซ เชเช JSON เชซเชพเชเชฒ เชฌเชจเชพเชตเซเช เชเซเช เชเซ เช
เชฎเชพเชฐเชพ เช
เชงเชฟเชเชพเชฐเซเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเซ เชเซ. เช เชเชตเชถเซเชฏเชเชชเชฃเซ เชฒเซเชฎเซเชฌเชกเชพ เชธเซเชตเชพเชเชจเซ เชญเซเชฎเชฟเชเชพเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเชถเซ lambda-acme-dns-route53-executor
:
$ touch ~/lambda-acme-dns-route53-executor-policy.json
เช เชฎเชพเชฐเซ เชซเชพเชเชฒเชจเซ เชธเชพเชฎเชเซเชฐเซ เชจเซเชเซ เชฎเซเชเชฌ เชเซ:
{
"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/*"
]
}
]
}
เชนเชตเซ เชเชพเชฒเซ เชเชฆเซเชถ เชเชฒเชพเชตเซเช aws iam create-role
เชญเซเชฎเชฟเชเชพ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ:
$ aws iam create-role --role-name lambda-acme-dns-route53-executor
--assume-role-policy-document ~/lambda-acme-dns-route53-executor-policy.json
เชจเซเซ เชง: เชชเซเชฒเชฟเชธเซ ARN (เชเชฎเซเชเซเชจ เชฐเชฟเชธเซเชฐเซเชธ เชจเซเชฎ) เชฏเชพเชฆ เชฐเชพเชเซ - เช เชฎเชจเซ เชเชเชณเชจเชพ เชชเชเชฒเชพเชเชฎเชพเช เชคเซเชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ.
เชญเซเชฎเชฟเชเชพ lambda-acme-dns-route53-executor
เชฌเชจเชพเชตเซเชฒ เชเซ, เชนเชตเซ เชเชชเชฃเซ เชคเซเชจเชพ เชฎเชพเชเซ เชชเชฐเชตเชพเชจเชเซเช เชธเซเชชเชทเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เช เชเชฐเชตเชพเชจเซ เชธเซเชฅเซ เชธเชนเซเชฒเซ เชฐเชธเซเชคเซ เชเชฆเซเชถเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซ เชเซ aws iam attach-role-policy
, เชชเชพเชธเชฟเชเช เชชเซเชฒเชฟเชธเซ ARN AWSLambdaBasicExecutionRole
เชจเซเชเซ เชชเซเชฐเชฎเชพเชฃเซ เชเซ:
$ aws iam attach-role-policy --role-name lambda-acme-dns-route53-executor
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
เชจเซเซ
เชง: เช
เชจเซเชฏ เชจเซเชคเชฟเช เชธเชพเชฅเซเชจเซ เชธเซเชเชฟ เชฎเชณเซ เชถเชเซ เชเซ
เชฒเซเชฎเซเชฌเชกเชพ เชซเชเชเซเชถเชจ เชฌเชจเชพเชตเชตเซเช เชเซ เชเชพเชฒเซ เชเซ acme-dns-route53
เชนเซเชฐเซ! เชนเชตเซ เชคเชฎเซ เชเชฆเซเชถเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เช
เชฎเชพเชฐเชพ เชเชพเชฐเซเชฏเชจเซ AWS เชชเชฐ เชเชฎเชพเชตเซ เชถเชเซ เชเซ aws lambda create-function
. เชฒเซเชฎเซเชฌเชกเชพเชจเซ เชจเซเชเซเชจเชพ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชเชฒเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชฐเซเชชเชฐเซเชเชพเชเชเชฟเชค เชเชฐเชตเซเช เชเชตเชถเซเชฏเช เชเซ:
AWS_LAMBDA
- เชคเซ เชธเซเชชเชทเซเช เชเชฐเซ เชเซ acme-dns-route53 เชคเซ เช เชฎเชฒ AWS Lambda เชจเซ เช เชเชฆเชฐ เชฅเชพเชฏ เชเซ.DOMAINS
- เช เชฒเซเชชเชตเชฟเชฐเชพเชฎ เชฆเซเชตเชพเชฐเชพ เชตเชฟเชญเชพเชเชฟเชค เชกเซเชฎเซเชจเซเชธเชจเซ เชธเซเชเชฟ.LETSENCRYPT_EMAIL
- เชธเชฎเชพเชตเซ เชเซเชเชพเชฒเซ เชเชฎเซเชฒ เชเชจเซเชเซเชฐเชฟเชชเซเช เชเชฐเซเช .NOTIFICATION_TOPIC
- SNS เชธเซเชเชจเชพ เชตเชฟเชทเชฏเชจเซเช เชจเชพเชฎ (เชตเซเชเชฒเซเชชเชฟเช).STAGING
- เชเชฟเชเชฎเชค เชชเชฐ1
เชธเซเชเซเชเซเชเช เชชเชฐเซเชฏเชพเชตเชฐเชฃเชจเซ เชเชชเชฏเซเช เชฅเชพเชฏ เชเซ.1024
MB - เชฎเซเชฎเชฐเซ เชฎเชฐเซเชฏเชพเชฆเชพ, เชฌเชฆเชฒเซ เชถเชเชพเชฏ เชเซ.900
เชธเซเชเชจเซเชก (15 เชฎเชฟเชจเชฟเช) โ เชธเชฎเชฏเชธเชฎเชพเชชเซเชคเชฟ.acme-dns-route53
- เช เชฎเชพเชฐเซ เชฌเชพเชเชจเชฐเซเชจเซเช เชจเชพเชฎ, เชเซ เชเชฐเซเชเชพเชเชตเชฎเชพเช เชเซ.fileb://~/acme-dns-route53.zip
- เช เชฎเซ เชฌเชจเชพเชตเซเชฒ เชเชฐเซเชเชพเชเชตเชจเซ เชฎเชพเชฐเซเช.
เชนเชตเซ เชเชฎเชพเชตเชตเชพ เชฆเซ:
$ 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",[email protected],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": "[email protected]",
"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 เชเชพเชเชฎเชฐ เชฌเชจเชพเชตเชตเซเช เชเซ เชฆเชฟเชตเชธเชฎเชพเช 2 เชตเชเชค เชซเชเชเซเชถเชจเชจเซ เชเซเชฐเชฟเชเชฐ เชเชฐเซ เชเซ
เชเซเชฒเซเชฒเซเช เชชเชเชฒเซเช เช เชเซเชฐเซเชจ เชธเซเช เชเชฐเชตเชพเชจเซเช เชเซ, เชเซ เช เชฎเชพเชฐเชพ เชเชพเชฐเซเชฏเชจเซ เชฆเชฟเชตเชธเชฎเชพเช เชฌเซ เชตเชพเชฐ เชเซเชฒ เชเชฐเซ เชเซ:
- เชฎเซเชฒเซเชฏ เชธเชพเชฅเซ CloudWatch เชจเชฟเชฏเชฎ เชฌเชจเชพเชตเซ
schedule_expression
. - เชฒเซเชฎเซเชฌเชกเชพ เชซเชเชเซเชถเชจเชจเชพ ARN เชจเซ เชเชฒเซเชฒเซเช เชเชฐเซเชจเซ เชจเชฟเชฏเชฎ เชฒเชเซเชทเซเชฏ (เชถเซเช เชเชฒเชพเชตเชตเซเช เชเซเชเช) เชฌเชจเชพเชตเซ.
- เชฒเซเชฎเซเชฌเชกเชพ เชซเชเชเซเชถเชจเชจเซ เชเซเชฒ เชเชฐเชตเชพ เชฎเชพเชเซ เชจเชฟเชฏเชฎเชจเซ เชชเชฐเชตเชพเชจเชเซ เชเชชเซ.
เชจเซเชเซ เชฎเซเช เชฎเชพเชฐเซ เชเซเชฐเชพเชซเซเชฐเซเชฎ เชฐเซเชชเชฐเซเชเชพ เชเซเชกเซ เชเซ, เชชเชฐเชเชคเซ เชตเชพเชธเซเชคเชตเชฎเชพเช เช AWS เชเชจเซเชธเซเชฒ เช เชฅเชตเชพ 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}"
}
เชนเชตเซ เชคเชฎเซ SSL เชชเซเชฐเชฎเชพเชฃเชชเชคเซเชฐเซ เชเชชเชฎเซเชณเซ เชฌเชจเชพเชตเชตเชพ เช เชจเซ เช เชชเชกเซเช เชเชฐเชตเชพ เชฎเชพเชเซ เชเซเช เชตเซเชฒ เชเซ
เชธเซเชฐเซเชธ: www.habr.com