AWS CloudFormation - 将新证书添加到现有侦听器

时间:2017-11-15 02:36:05

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

我所拥有的是一个平台堆栈,可能还有多个Web应用程序堆栈(每个堆栈代表一个Web应用程序)。平台堆栈部署了一个ECS平台,允许托管多个Web应用程序,但实际上并没有任何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的新证书。

我试过四处寻找但未找到任何答案。

有谁知道怎么做?非常感谢您的帮助。谢谢!

1 个答案:

答案 0 :(得分: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。