如何通过 Cloudformation 在 Beanstalk 实例上获取 SSL 证书

Posted

技术标签:

【中文标题】如何通过 Cloudformation 在 Beanstalk 实例上获取 SSL 证书【英文标题】:How do you get an SSL cert on a Beanstalk instance via Cloudformation 【发布时间】:2018-04-08 12:41:23 【问题描述】:

根据 AWS 示例,我正在使用带有 https 直通的 ELB,因为我们需要在实例处终止 SSL。根据 AWS 的指南,我有一个现有的 .ebextensions YAML 文件,其中包含 files 密钥。这很好用,直到我想为不同的环境使用不同的证书。

我的问题是我希望能够通过 Cloudformation 上传不同的 SSL 证书,具体取决于我部署到的环境。例如,test 和 dev 获得测试证书,production 获得生产证书。

我知道如何使用映射,所以这不是问题,但我不知道如何从 Cloudformation 将文件上传到 Elastic Beanstalk 环境。

我尝试在 CloudFormation YAML 的各个位置添加以下代码 sn-p,但它没有上传文件。代码 sn-p 有什么问题,还是我遗漏了其他东西?我尝试添加 EC2::Instance 部分,但这会在 Beanstalk 之外创建一个新的 EC2 实例,这是我不想要的。

Metadata:
  AWS::CloudFormation::Authentication:
    S3Auth:
      type: "s3"
      buckets: ["s3-bucket"]
      roleName: aws-elasticbeanstalk-ec2-role
  AWS::Cloudformation:Init:
    config:
      files:
        /etc/pki/tls/certs/server.crt:
          mode: "000400"
          owner: root
          group: root
          authentication: "S3Auth"
          source: !FindInMap [Certificates, crt-file, !Ref Environment]
        /etc/pki/tls/certs/server.key:
          mode: "000400"
          owner: root
          group: root
          authentication: "S3Auth"
          source: !FindInMap [Certificates, key-file, !Ref Environment]

感谢您的帮助。

【问题讨论】:

【参考方案1】:

您可以使用 Elastic Beanstalk 的normal file creation method。在名为.ebextensions 的文件夹中创建一个名为certs.conf 的文件并将其放入其中:

Resources:
  AWSEBAutoScalingGroup:
    Metadata:
      AWS::CloudFormation::Authentication:
        S3Auth:
          type: "s3"
          buckets: ["s3-bucket"]
          roleName: aws-elasticbeanstalk-ec2-role

files:
  "/etc/pki/tls/certs/server.crt":
    mode: "000400"
    owner: root
    group: root
    authentication: "S3Auth"
    source: !FindInMap [Certificates, crt-file, !Ref Environment]
  "/etc/pki/tls/certs/server.key":
    mode: "000400"
    owner: root
    group: root
    authentication: "S3Auth"
    source: !FindInMap [Certificates, key-file, !Ref Environment]

如果!FindInMap 在该部分不起作用,您总是可以在调用eb deploy 之前使用一个小的构建脚本来放置正确的证书。

【讨论】:

太棒了。最后,我传入了一个环境变量,并编写了一个简单的 bash 脚本,其中 if env = x 然后复制 y,否则复制 z。它有效,但不够优雅。

以上是关于如何通过 Cloudformation 在 Beanstalk 实例上获取 SSL 证书的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 CloudFormation 在 Cognito 中要求电子邮件验证?

如何通过 Cloudformation 在 Beanstalk 实例上获取 SSL 证书

如何通过 CloudFormation 配置“预令牌生成”触发器?

如何下载通过CloudFormation创建的IoT证书?

如何通过 CloudFormation 设置 EC2 实例根卷的标签

我应该如何通过 cloudformation 部署我的 aws 状态机?