CloudFormation能否在错误区域创建栈时主动报错?适配Lambda@Edge场景
解决方案
方案1:使用CloudFormation内置Rules规则做预校验(最推荐)
这是最优实现方式,CloudFormation的Rules字段支持在模板启动部署的预校验阶段就对环境、参数做合法性检查,校验不通过会直接终止部署并抛出你自定义的明确错误信息,完全不会进入后续资源创建流程,不会产生残留资源。
你可以直接在模板中加入如下规则配置,YAML格式示例:
Rules: ValidateLambdaEdgeRegion: RuleCondition: !Not [!Equals [!Ref 'AWS::Region', 'us-east-1']] Assertions: - Assert: !Equals [!Ref 'AWS::Region', 'us-east-1'] AssertDescription: "部署失败:Lambda@Edge关联资源必须在us-east-1(弗吉尼亚北部)区域部署,请切换到正确区域后重试。"
如果用户在非us-east-1区域部署,CloudFormation会直接在栈创建的初始阶段就抛出上述AssertDescription里的错误提示,用户在栈事件里可以直接看到明确的失败原因。
方案2:兼容不支持Rules的场景
如果你的模板运行环境不支持Rules字段(比如非常旧的CloudFormation私有部署版本),可以用条件判断+故意触发错误资源的方式实现:
- 定义条件
IsValidRegion:判断当前区域是否为us-east-1 - 创建一个仅在
IsValidRegion为false时才会部署的报错资源,比如AWS::CloudFormation::WaitCondition,设置超时时间为1分钟,并且在属性中明确写入错误提示相关的说明,部署时非us-east-1区域会触发该资源创建失败,直接抛出错误。
原逻辑的优化方案
如果你不想改动现有条件创建资源的逻辑,可以给Output也加上区域判断条件,只有在us-east-1区域才输出对应值,避免Output执行失败:
Outputs: LambdaEdgeFunctionArn: Condition: IsValidRegion Value: !GetAtt EdgeFunction.Arn
不过该方案仅能解决Output报错的问题,还是没有明确的错误提示,因此更推荐优先使用方案1。
内容的提问来源于stack exchange,提问作者Paul-Joseph de Werk
相关产品推荐
相关产品推荐

