【问题标题】:AWS CloudFormation - Add New Certificate to an existing listenerAWS CloudFormation - 将新证书添加到现有侦听器
【发布时间】:2018-04-28 03:36:04
【问题描述】:

我拥有的是一个平台堆栈,可能还有多个 Web 应用程序堆栈(每个代表一个 Web 应用程序)。平台堆栈部署了一个允许托管多个 Web 应用程序的 ECS 平台,但实际上并没有任何 Web 应用程序。这只是一个平台。然后,每个 Web 应用程序堆栈代表一个 Web 应用程序。

我的平台堆栈模板中的 HTTPS 侦听器之一就是这个。基本上我在端口 443 上有一个 HTTPS 监听器,并且会携带一个默认证书(根据要求,您需要至少一个证书来创建 https 监听器):

"BsAlbListenerHttps": {
  "Type": "AWS::ElasticLoadBalancingV2::Listener",
  "Properties": {
    "Certificates": [{
      "CertificateArn": {
        "Ref": "BsCertificate1"
      }
    }],
    ...
    "Port": "443",
    "Protocol": "HTTPS"
  }
},
...

现在,假设我想创建一个新的 Web 应用程序(例如 www.example.com),我部署 Web 应用程序堆栈,指定一些参数,显然,我必须创建一堆新的资源。但与此同时,我将不得不修改当前的“BsAlbListenerHttps”。

我能够将当前侦听器(使用 Imports 和 Exports)导入我的 Web 应用程序堆栈。但我想做的也是为监听器添加一个 www.example.com 的新证书。

我试过环顾四周,但没有找到任何答案。

有人知道怎么做吗?感谢您的帮助。谢谢!

【问题讨论】:

  • 您想只有一个证书,但有多个域可以使用它吗?因此,不是添加新证书,而是拥有一个证书,然后向其中添加域?这行得通吗?
  • 不,我实际上想要多个证书。这由 AWS 最近提供,用于将多个证书绑定到 ALB。由于上面的问题,我可以手动完成,但不能通过 CloudFormation。
  • 啊,好吧,只需将新证书添加到证书堆栈,然后使用额外的证书 ID 更新您的侦听器堆栈?
  • 因为会有一些“不那么技术性的东西”这样做,我想让它尽可能自动化。
  • 当然。好吧,把它包装在詹金斯的工作中。有人需要在某处输入 arns 列表。 Jenkins 会对非技术用户隐藏血腥细节。该作业将输出 json 并通过 cli 更新堆栈

标签: amazon-web-services ssl-certificate listener amazon-cloudformation amazon-elb


【解决方案1】:

在类似情况下,我的做法是为整个区域仅使用一个证书,并在我添加不同域上的应用程序/侦听器时向其中添加域。我也在每个环境中执行此操作,因此我在 2 个不同的模板中有一个暂存证书和一个生产证书。但是对于每个您都需要定义一个独立的证书堆栈,例如,certificate-production.json,但使用堆栈名称作为“证书”,这样无论环境如何,堆栈引用都是一致的:

{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Description" : "SSL certificates for production V2",

  "Resources" : {
    "Certificate" : {
      "Type": "AWS::CertificateManager::Certificate",
      "Properties": {
        "DomainName": "*.example.com",
        "SubjectAlternativeNames" : [ "*.example2.com","*.someotherdomain.com" ]
      }
    }
  },

  "Outputs": {
    "CertificateId" : {
        "Value" : {"Ref":"Certificate"},
        "Description" : "Certificate ID",
        "Export" : {  "Name" : {"Fn::Sub": "${AWS::StackName}-CertificateId" }} 
    }
  }  
}

正如您通过使用 SubjectAlternativeNames 属性所看到的,此证书将服务于 3 个通配符域。这样,我可以在添加服务时更新域,并重新运行堆栈。无论如何,依赖侦听器都不会更改 - 它们始终引用该区域中的单个应用程序证书。

一个警告:当您在 CloudFormation 中更新证书时,它将向给定域(hostmaster@example.com 等)上的所有主机管理员发送电子邮件。每个域都会收到一封确认邮件,并且每封邮件都必须再次确认。如果没有以这种方式确认所有域,则堆栈将无法创建/更新。

使用这种技术,我可以轻松地为我的所有应用管理 SSL,同时可以轻松地为新域添加新的 ssl 端点。

我在主 VPC 堆栈之后创建证书堆栈,因此所有后续堆栈都可以通过导出引用此处定义的证书 ID。

【讨论】:

  • 感谢您的建议。虽然我实际上想将多个证书绑定到域。您对此有什么建议吗?
  • 您是说您更喜欢每个域使用一个证书而不是所有域都使用一个证书?
  • 正确。如果你还没有听说过这个,最近 AWS 发布了这个:aws.amazon.com/blogs/aws/new-application-load-balancer-sni
猜你喜欢
  • 2019-02-04
  • 1970-01-01
  • 2020-08-29
  • 2021-12-28
  • 2013-02-17
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多