这篇文章描述了自动管理 SSL 证书的步骤 使用 и AWS.
是一个允许我们实现此功能的工具。 它可以使用 Let's Encrypt 的 SSL 证书,将其保存在 Amazon Certificate Manager 中,使用 Route53 API 实施 DNS-01 质询,最后将通知推送到 SNS。 在 acme-dns-route53 AWS Lambda 中还提供了内置功能,这正是我们所需要的。
本文分为 4 部分:
- 创建一个 zip 文件;
- 创建 IAM 角色;
- 创建一个运行的 lambda 函数 acme-dns-route53;
- 创建一个每天触发函数 2 次的 CloudWatch 计时器;
注意: 在开始之前您需要安装 и
创建 zip 文件
acme-dns-route53是用GoLang编写的,支持不低于1.9的版本。
我们需要创建一个带有二进制文件的 zip 文件 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它们告诉 Go 编译器创建一个适合的二进制文件。 Linux AWS 运行的是 OS 和 amd64 架构。
AWS 希望我们的程序部署在 zip 文件中,所以让我们创建 acme-dns-route53.zip 存档将包含新安装的二进制文件:
$ zip -j ~/acme-dns-route53.zip $GOPATH/bin/acme-dns-route53注意: 二进制文件应位于 zip 存档的根目录中。 为此我们使用 -j 旗帜。
现在我们的 zip 昵称已准备好部署,剩下的就是创建一个具有必要权限的角色。
创建 IAM 角色
我们需要设置一个 IAM 角色,并具有 lambda 在执行过程中所需的权限。
我们称这个政策为 lambda-acme-dns-route53-executor 并立即给她一个基本角色 AWSLambdaBasicExecutionRole。 这将允许我们的 lambda 运行并将日志写入 AWS CloudWatch 服务。
首先,我们创建一个描述我们权利的 JSON 文件。 这本质上将允许 lambda 服务使用该角色 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(Amazon 资源名称) - 我们将在后续步骤中需要它。
角色 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注意: 可以找到包含其他政策的列表 .
创建一个运行的 lambda 函数 acme-dns-route53
万岁! 现在您可以使用命令将我们的函数部署到AWS aws lambda create-function。 必须使用以下环境变量配置 lambda:
AWS_LAMBDA- 说清楚了 acme-dns-route53 该执行发生在 AWS Lambda 内部。DOMAINS— 以逗号分隔的域列表。LETSENCRYPT_EMAIL- 包含 .NOTIFICATION_TOPIC— SNS 通知主题的名称(可选)。STAGING- 按价值1使用暂存环境。1024MB——内存限制,可以更改。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",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"
}创建每天触发函数 2 次的 CloudWatch 计时器
最后一步是设置 cron,它每天调用我们的函数两次:
- 使用该值创建 CloudWatch 规则
schedule_expression. - 通过指定 lambda 函数的 ARN 创建规则目标(应执行的内容)。
- 授予规则调用 lambda 函数的权限。
下面我附上了我的 Terraform 配置,但实际上这是使用 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 证书
来源: habr.com
