Tom*_*Tom 5 amazon-web-services aws-cloudformation aws-lambda serverless-framework
上下文:为了实现完整的"基础架构作为代码",我想编写使用SSL证书请求SSL证书的过程,certbot
使用DNS TXT
记录验证域,将证书上载到Amazon Certificate Manager(ACM),最后将证书ACM ARN附加到我的Cloudfront发行版.这应该都是通过无服务器框架完成的.
我看到了两个潜在的选择来完成这项工作.
选项1:使用异步javascript文件变量
即serverless.yml
我将定义如下条目:
custom:
domains:
prod: tommedema.tk
ssl:
prod:
dnsTxtRoot: ${{file(scripts/request-cert.js):cert.dnsTxtRoot}}
dnsTxtWww: ${{file(scripts/request-cert.js):cert.dnsTxtWww}}
certArn: ${{file(scripts/request-cert.js):cert.certArn}}
Run Code Online (Sandbox Code Playgroud)
那么资源将使用这些变量,如下所示:
- Type: TXT
Name: _acme-challenge.www.${{self:custom.domains.${{self:provider.stage}}, ''}}
TTL: '86400'
ResourceRecords:
- ${{self:custom.ssl.${{self:provider.stage}}.dnsTxtWww}}
Run Code Online (Sandbox Code Playgroud)
在哪里scripts/request-cert.js
看起来像:
module.exports.cert = () => {
console.log('running async logic')
// TODO: run certbot, get DNS records, upload to ACM
return Promise.resolve({
dnsTxtRoot: '"LnaKMkgqlIkXXXXXXXX-7PkKvqb_wqwVnC4q0"',
dnsTxtWww: '"c43VS-XXXXXXXXXWVBRPCXXcA"',
certArn: 'arn:aws:acm:us-east-1:XXXX95:certificate/XXXXXX'
})
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是,似乎不可能发送参数request-cert.js
,或者让这个脚本知道serverless
或options
插件参数(因为它不是插件,而是没有上下文的简单脚本).这意味着脚本无法知道部署所针对的阶段和域等,因此它缺少必要的变量以便请求证书.
因此,选项1似乎是不可能的.
选项2:创建一个插件
当然我可以创建一个插件,它将包含所有必需的变量,因为它可以访问serverless
和options
对象.现在的问题是我必须访问内部插件的输出,serverless.yml
到目前为止我还没有看到如何做到这一点.即我希望能够做这样的事情:
custom:
domains:
prod: tommedema.tk
ssl:
prod:
dnsTxtRoot: ${{myPlugin:cert.dnsTxtRoot}}
dnsTxtWww: ${{myPlugin:cert.dnsTxtWww}}
certArn: ${{myPlugin:cert.certArn}}
Run Code Online (Sandbox Code Playgroud)
但这似乎不太可能.是对的吗?
如果这也是不可能的,我怎样才能以编程方式实现我的目的(即遵循基础设施作为代码原则)使用自定义SSL证书部署我的服务,而无需任何手动步骤?即
小智 1
您可以在部署时执行此操作,但证书会过期,因此最好使其成为重复的事情。
当我遇到这个问题时,我创建了一个 Lambda 来更新插入 SSL 证书并安装它。(它需要很长的超时,但这很好 - 它不需要经常运行)。它所需的密钥可以作为安全环境变量给出。
然后我serverless-warmup-plugin
设置每日触发器来检查证书是否需要刷新。该插件也可配置为在部署时预热相关的 lambda,这使我能够在每次部署时检查过期或丢失的 SSL 证书。
也许你可以做类似的事情。
归档时间: |
|
查看次数: |
425 次 |
最近记录: |