如何访问Serverless Framework的serverless.yml中的插件输出?

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,或者让这个脚本知道serverlessoptions插件参数(因为它不是插件,而是没有上下文的简单脚本).这意味着脚本无法知道部署所针对的阶段和域等,因此它缺少必要的变量以便请求证书.

因此,选项1似乎是不可能的.

选项2:创建一个插件

当然我可以创建一个插件,它将包含所有必需的变量,因为它可以访问serverlessoptions对象.现在的问题是我必须访问内部插件的输出,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. 从certbot请求证书
  2. 从certbot接收DNS txt记录以进行验证
  3. 将DNS txt记录附加到route53记录集
  4. 部署DNS记录并验证证书
  5. 从certbot下载证书并将其上传到ACM
  6. 从ACM收到证书ARN
  7. 从cloudformation模板内的cloudfront分发中引用证书ARN
  8. 使用附加的证书ARN重新部署

小智 1

可以在部署时执行此操作,但证书会过期,因此最好使其成为重复的事情。

当我遇到这个问题时,我创建了一个 Lambda 来更新插入 SSL 证书并安装它。(它需要很长的超时,但这很好 - 它不需要经常运行)。它所需的密钥可以作为安全环境变量给出。

然后我serverless-warmup-plugin设置每日触发器来检查证书是否需要刷新。该插件也可配置为在部署时预热相关的 lambda,这使我能够在每次部署时检查过期或丢失的 SSL 证书。

也许你可以做类似的事情。