AWS CloudFormation模板可选可用区List参数报错的解决方法
问题:CloudFormation可选可用区参数配置报错
尝试在AWS CloudFormation模板中用EnableAZLogic参数控制可选可用区列表的生效,配置代码如下:
AWSTemplateFormatVersion: '2010-09-09' Parameters: AvailabilityZones: Type: List<AWS::EC2::AvailabilityZone::Name> EnableAZLogic: Type: String Default: 'Disabled' AllowedValues: - 'Disabled' - 'Enabled' Conditions: AZEnabled: !Equals [ !Ref EnableAZLogic, 'Enabled' ] Resources: MyResource: Condition: AZEnabled Type: "AWS::CloudFormation::CustomResource" Properties: ServiceToken: !GetAtt MyResourceLambda.Arn StackName: !Ref "AWS::StackName" AvailabilityZones: !Ref AvailabilityZones ...
当选择EnableAZLogic为Disabled且不选任何可用区时,会弹出错误:
Parameter validation failed: parameter value for parameter name AvailabilityZones does not exist
需求是允许用户不指定任何可用区(Lambda会自行检查该列表),解决这个报错。
解决方案
方法1:换用CommaDelimitedList类型并允许空值
List<AWS::EC2::AvailabilityZone::Name>类型强制要求至少选一个有效AZ,换成CommaDelimitedList并设置规则允许空输入,再结合AWS::NoValue在禁用AZ逻辑时不传递该参数:
AWSTemplateFormatVersion: '2010-09-09' Parameters: AvailabilityZones: Type: CommaDelimitedList Description: 可选可用区列表,留空则由Lambda自行处理 AllowedPattern: '^$|([a-z0-9-]+,)*[a-z0-9-]+$' ConstraintDescription: 输入有效可用区名称,多个用逗号分隔,或直接留空 EnableAZLogic: Type: String Default: 'Disabled' AllowedValues: - 'Disabled' - 'Enabled' Conditions: AZEnabled: !Equals [ !Ref EnableAZLogic, 'Enabled' ] Resources: MyResource: Condition: AZEnabled Type: "AWS::CloudFormation::CustomResource" Properties: ServiceToken: !GetAtt MyResourceLambda.Arn StackName: !Ref "AWS::StackName" AvailabilityZones: !If [AZEnabled, !Ref AvailabilityZones, !Ref "AWS::NoValue"]
方法2:给参数设空默认值,配合条件判断
给AvailabilityZones设置默认空列表,再用!If动态决定是否传递参数:
AWSTemplateFormatVersion: '2010-09-09' Parameters: AvailabilityZones: Type: List<AWS::EC2::AvailabilityZone::Name> Default: [] Description: 可选可用区列表,留空则由Lambda自行处理 EnableAZLogic: Type: String Default: 'Disabled' AllowedValues: - 'Disabled' - 'Enabled' Conditions: AZEnabled: !Equals [ !Ref EnableAZLogic, 'Enabled' ] Resources: MyResource: Condition: AZEnabled Type: "AWS::CloudFormation::CustomResource" Properties: ServiceToken: !GetAtt MyResourceLambda.Arn StackName: !Ref "AWS::StackName" AvailabilityZones: !If [AZEnabled, !Ref AvailabilityZones, !Ref "AWS::NoValue"]
注意:部分CloudFormation控制台可能不支持直接输入空列表,这种情况下方法1的兼容性更好。
方法3:Lambda配合默认无效值处理
不想改参数类型的话,给AvailabilityZones设一个默认空字符串,在Lambda里判断如果是这个值就当作空列表处理:
AWSTemplateFormatVersion: '2010-09-09' Parameters: AvailabilityZones: Type: List<AWS::EC2::AvailabilityZone::Name> Default: [''] Description: 可选可用区列表,留空则由Lambda自行处理 EnableAZLogic: Type: String Default: 'Disabled' AllowedValues: - 'Disabled' - 'Enabled' Conditions: AZEnabled: !Equals [ !Ref EnableAZLogic, 'Enabled' ] Resources: MyResource: Condition: AZEnabled Type: "AWS::CloudFormation::CustomResource" Properties: ServiceToken: !GetAtt MyResourceLambda.Arn StackName: !Ref "AWS::StackName" AvailabilityZones: !Ref AvailabilityZones
Lambda代码里加个判断:如果AvailabilityZones包含空字符串,就按空列表逻辑执行。
内容的提问来源于stack exchange,提问作者yoka791
相关产品推荐
相关产品推荐

