如何在 CloudFormation 模板中将预上传的 SSL 证书附加到 ELB?

Posted

技术标签:

【中文标题】如何在 CloudFormation 模板中将预上传的 SSL 证书附加到 ELB?【英文标题】:How to attach pre-uploaded SSL cert to ELB in CloudFormation template? 【发布时间】:2013-02-11 01:29:33 【问题描述】:

我一直在尝试在新的 Cloud Formation 模板上附加我当前用于我的 Elastic Load Balancing 实例之一的 SSL 证书,但每次我得到:找不到服务器证书钥匙 然后 Cloudformation 模板在该点开始回滚。

            "Listeners" : [ 
         
          "LoadBalancerPort" : "443",
          "InstancePort" : "80",
          "SSLCertificateId" : "start_certname_com",
          "Protocol" : "HTTPS"
         ,...

亚马逊要求 使用 SSL 证书的 ARN。 我相信这是正确的,因为这是当前设置 ELB 的下拉列表中出现的确切字符串,需要 443到实例上的端口 80。

我的 Listener 是否遗漏了什么?

【问题讨论】:

【参考方案1】:

您可以仅使用证书名称为 CloudFormation 中的证书派生 ARN。无需运行命令行工具并将值硬编码到 CloudFormation 模板中。

    "Parameters":
      "Path":
         "Description":"AWS Path",
         "Default":"/",
         "Type":"String"
      
    
     ...
        "Listeners" : [ 
     
      "LoadBalancerPort" : "443",
      "InstancePort" : "80",
      "SSLCertificateId" : 
        "Fn::Join":[
           "",
           [
              "arn:aws:iam::",
              
                 "Ref":"AWS::AccountId"
              ,
              ":server-certificate",
              
                 "Ref":"Path"
              ,
              "start_certname_com"
           ]
        ]
      ,
      "Protocol" : "HTTPS"
     ,...

这将确定您的帐户 ID 与 "Ref":"AWS::AccountId" pseudo parameter 和 combines 它与形成 ARN 所需的其他元素。请注意,如果您为证书设置了路径,我将使用一个名为 Path 的变量。如果不是“/”的默认值,则可以正常工作。

@Tristan 提到了这个解决方案,它是merrix143243's solution 的扩展

【讨论】:

绝对是最佳答案! 非常酷!如果有人使用cloudformation-ruby-dsl,这里有一个受此答案启发的单行::SSLCertificateId => join('', 'arn:aws:iam::', aws_account_id(), ':server-certificate/', ref('SSLCertificateName')) @gene_wood 答案适合亚马逊颁发的证书,但可能不适合我(从其他证书颁发机构)导入的证书。导入的被分配一个 GUID,在 ACM(亚马逊证书管理)的“标识符”字段中可见。此外,在 2018 年 3 月,1)“arn:aws:acm::”似乎不是前缀“:iam::”,2)“:server-certificate”看起来像“:certificate”(除非我导入错了)。问题:您的“start_certname_com”对应ACM中的哪个字段:“域名”、“附加名称”、“标识符”、“名称”(用户标签)?【参考方案2】:

其实我在等待答案的时候已经想好了怎么做,需要使用amazon提供的IAM CLI工具,然后使用命令iam-servercertgetattributes -s certname

这将为您提供如下字符串:

arn:aws:iam::123456789123:server-certificate/start_certname_com

这是您在“SSLCertificateId”值对字段中放置的值

IAM 命令行工具 (CLI) 的设置说明可在以下位置找到:http://docs.aws.amazon.com/IAM/latest/CLIReference/Setup.html

在此处从 aws 下载工具包http://aws.amazon.com/developertools/AWS-Identity-and-Access-Management/4143

总而言之,您的最终块将如下所示:

 "Listeners" : [ 
      
      "LoadBalancerPort" : "443",  
      "InstancePort" : "80",  
      "SSLCertificateId" : "arn:aws:iam::123456789123:server-certificate/start_certname_com",  
      "Protocol" : "HTTPS"  
     ,...  

【讨论】:

很好的后续回答 - 帮助很大。 也可以直接在云形成中进行此查找。见forums.aws.amazon.com/message.jspa?messageID=248285。 特里斯坦的答案在下面的答案中得到了@gene_wood 的充分解释。 我正在使用Troposphere创建cloudformation堆栈,Listener = t.add_resource(elb.Listener( "Listener", Certificates=elb.Certificate( CertificateArn="", ), Port="443", Protocol="HTTPS", LoadBalancerArn=Ref(ApplicationLoadBalancer), SslPolicy="ELBSecurityPolicy-TLS-1-2-Ext-2018-06", DefaultActions=[elb.Action( Type="forward", TargetGroupArn=Ref(TargetGroupApp) )] ))certificatearn需要添加什么【参考方案3】:

以下是使用最新 AWS CLI 获取长证书名称的方法:

pip install awscli
aws iam list-server-certificates

【讨论】:

以上是关于如何在 CloudFormation 模板中将预上传的 SSL 证书附加到 ELB?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CloudFormation 中将字符串列表作为参数传递?

我可以在参数部分 AWS CloudFormation 模板中将标签定义为参数吗

在 CloudFormation 中将 Cognito 验证类型设置为链接

在 cloudformation 中将标签作为参数传递

如何在 Cloudformation 模板/CDK 中添加 AWS IoT 配置模板

如何使用 cloudformation 模板创建 cloudwatch 事件?