CloudFormation规则验证异常求助:UseSSL为Yes时证书ARN非空校验失效
解决CloudFormation规则验证不生效的问题
我帮你仔细排查了这段CloudFormation规则代码,核心问题出在YAML缩进错误,导致Fn::Equals的逻辑没有被正确解析,进而让整个断言失效。
问题分析
你当前的Fn::Not嵌套Fn::Equals的写法里,Fn::Equals的两个比较参数(证书ARN引用和空字符串)缩进层级不对,CloudFormation无法识别这是Fn::Equals的比较项,导致整个断言逻辑没有按预期执行。
至于你提到移除Fn::Not后验证成功但逻辑相反,那是因为移除后断言变成了「当UseSSL为Yes时,证书ARN必须为空」,这和你的需求完全颠倒,所以会出现逻辑反向的情况。
修正后的代码
把Fn::Equals的两个参数缩进调整到它的子层级,确保CloudFormation能正确解析比较逻辑:
Rules: ValidateHostedZone: RuleCondition: Fn::Equals: - Ref: UseSSL - 'Yes' Assertions: - Assert: Fn::Not: - Fn::Equals: - Ref: ALBSSLCertificateARN - '' AssertDescription: ACM Certificate value cannot be empty if SSL is required
额外排查点
如果调整缩进后还是有问题,可以检查这两个细节:
- 确认
UseSSL参数的取值确实是字符串'Yes'(CloudFormation的字符串比较是大小写敏感的,注意不要写成'yes'或'YES') - 确认
ALBSSLCertificateARN参数的类型是String,且没有设置默认值为非空字符串(如果默认值不是空,即使用户没输入,也会绕过验证)
调整后,当UseSSL为'Yes'时,CloudFormation会自动检查ALBSSLCertificateARN是否为空字符串,如果为空就会抛出你定义的错误提示,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Abhishek Verma




