如何在 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 验证类型设置为链接