如何解决 AWS CloudFormation 中的“参数验证失败:参数名称‘ABC’的参数值‘abc’不存在”错误?
上次更新时间:2020 年 7 月 8 日
当我创建或更新 AWS CloudFormation 堆栈时,我收到以下错误消息:“参数验证失败:参数名称‘ABC’的参数值‘abc’不存在”。 如何解决此错误?
简短描述
当 AWS CloudFormation 模板中使用的参数中有 AWS 特定的参数类型时,AWS CloudFormation 会返回此错误。
当您将 AWS 特定的参数用于以下目的时,可能会收到此错误:
- 传递在堆栈创建期间 AWS 区域或账户中不存在的值。
- 作为资源属性,然后在堆栈更新过程中,更新资源之前删除此带外值。
- 作为子堆栈中的参数。 当从父堆栈传递来的子堆栈的值参数类型不匹配,或者参数的资源在该区域的账户中不存在时,将会发生错误。
注意:如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请确保您运行的是最新版本的 AWS CLI。
解决方法
创建堆栈
1. 打开 AWS CloudFormation 控制台。
2. 在导航窗格中,选择堆栈。
3. 从堆栈名称列中,选择未能创建或更新的堆栈。
4. 选择参数选项卡。
5. 在键列中,搜索值为 abc 的参数 ABC。
6. 要验证资源 abc 与 AWS 特定的参数类型的类型匹配,请选中用于创建堆栈的 AWS CloudFormation 模板的参数部分。
7. 要验证区域或账户中存在参数 ABC 的资源 abc,请使用 AWS 管理控制台或 AWS CLI 命令来描述资源。要查找适用于您的资源的正确命令,请参阅查找资源的描述命令部分。
注意:例如,如果使用参数类型 AWS::EC2::VPC::Id,则查看适用于资源的 Amazon Virtual Private Cloud (Amazon VPC) 控制台。
8. 如果 ABC 是子堆栈的参数,则必须选择选项 A 或选项 B 以传递值 abc。
(选项 A)如果您引用父堆栈中的其他资源,则验证来自正在引用的父堆栈的资源与子堆栈中使用的 AWS 特定的参数类型匹配。
注意:例如,如果使用参数类型 AWS::EC2::Subnet::Id(子网)并引用资源类型 AWS::EC2::VPC,则堆栈失败。
(选项 B)如果直接从父堆栈传递参数值 abc,则验证该区域或账户中存在参数 ABC 的资源 abc。使用 AWS 管理控制台或 AWS CLI 命令来描述资源。要查找适用于您的资源的正确命令,请参阅查找资源的描述命令部分。
例如,考虑子堆栈中的以下 List<AWS::EC2::SecurityGroup::Id> 参数:
"SecurityGroups": {
"Description": "List of security group IDs for the instances",
"Type": "List<AWS::EC2::SecurityGroup::Id>"
}
值从父堆栈传递到参数。例如:
"ChildStack" : {
"Type" : "AWS::CloudFormation::Stack",
"Properties" : {
"Parameters":{
"KeyPair" : { "Ref": "KeyPair" },
"ImageID" : { "Ref": "ImageID" },
"InstanceType" : { "Ref": "InstanceType" },
"SecurityGroups" : { "Ref": "SecurityGroup" }
}
重要提示:在前面的示例中,您必须验证该区域或账户中存在传递到参数 SecurityGroup 的安全组 ID 的值。
9. 使用区域或账户中存在且与 AWS 特定的参数类型匹配的有效参数值创建新堆栈。
更新堆栈
当堆栈更新失败时,AWS CloudFormation 将会回滚更改。这意味着您无法看到通过 AWS CloudFormation 控制台更新的参数值。
如果您在更新过程中未更改参数 ABC 的值,则包含 abc 的 name 或 PhysicalID 的资源可能已从带外账户中删除。
1. 要验证资源是否存在,请使用 AWS 管理控制台或 AWS CLI 命令来描述资源。要查找适用于您的资源的正确命令,请参阅查找资源的描述命令部分。
2. 如果您通过更新参数 ABC 来更新堆栈,则按照上文创建堆栈部分中的步骤 6、7 和 8 执行操作。
3. 向参数 ABC 传递有效值以更新堆栈。
现在,您的堆栈应当更新成功。
查找资源的描述命令
为您的资源选择正确的命令:
- 对于 AWS::EC2::Image::Id 或 List<AWS::EC2::Image::Id>,请使用适用于 AWS CLI 版本 1 或版本 2 的命令。
- 对于 AWS::EC2::Instance::Id 或 List<AWS::EC2::Instance::Id>,请使用适用于 AWS CLI 版本 1 或版本 2 的命令。
- 对于 AWS::EC2::KeyPair::KeyName,请使用适用于 AWS CLI 版本 1 或版本 2 的命令。
- 对于 AWS::EC2::SecurityGroup::GroupName、AWS::EC2::SecurityGroup::Id、List<AWS::EC2::SecurityGroup::GroupName> 或 List<AWS::EC2::SecurityGroup::Id>,请使用适用于 AWS CLI 版本 1 或版本 2 的命令。
- 对于 AWS::EC2::Subnet::Id 或 List<AWS::EC2::Subnet::Id>,请使用适用于 AWS CLI 版本 1 或版本 2 的命令。
- 对于 AWS::EC2::VPC::Id 或 List<AWS::EC2::VPC::Id>,请使用适用于 AWS CLI 版本 1 或版本 2 的命令。
- 对于 AWS::Route53::HostedZone::Id 或 List<AWS::Route53::HostedZone::Id>,请使用适用于 AWS CLI 版本 1 或版本 2 的命令。