如何解决 AWS CloudFormation 中的“参数验证失败:参数名称‘ABC’的参数值‘abc’不存在”错误?

上次更新时间:2020 年 7 月 8 日

当我创建或更新 AWS CloudFormation 堆栈时,我收到以下错误:“参数验证失败:参数名称‘ABC’的参数值‘abc’不存在”。 如何解决此错误?

简短描述

当 AWS CloudFormation 模板中使用的参数之一是 AWS 特定的参数类型时,AWS CloudFormation 会返回此错误。

当您将 AWS 特定的参数用于以下目的时,可能会收到此错误:

  • 传递在堆栈创建期间 AWS 区域或账户中不存在的值。
  • 作为资源属性,然后在堆栈更新过程中,更新资源之前删除此带外值。
  • 作为子堆栈中的参数。当从父堆栈传递来的子堆栈的值参数类型不匹配,或者参数的资源在该区域的账户中不存在时,将会发生错误。

解决方法

创建堆栈

1.    打开 AWS CloudFormation 控制台

2.    在导航窗格中,选择堆栈

3.    从堆栈名称列中,选择未能创建或更新的堆栈。

4.    选择参数选项卡。

5.    在列中,搜索值为 abc 的参数 ABC

6.    要验证资源 abc 与 AWS 特定的参数类型的类型匹配,请选中用于创建堆栈的 AWS CloudFormation 模板的参数部分。

7.    要验证区域或账户中存在参数 ABC 的资源 abc,请使用 AWS 管理控制台或用于描述资源的 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 (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 的值,则包含 abcnamePhysicalID 的资源可能已从带外账户中删除。

1.    要验证资源是否存在,请使用 AWS 管理控制台或用于描述资源的 AWS CLI 命令。要查找适用于您的资源的正确命令,请参阅查找资源的描述命令部分。

2.    如果您通过更新参数 ABC 来更新堆栈,则遵循前面的创建堆栈部分中的步骤 6、7 和 8。

3.    向参数 ABC 传递有效值以更新堆栈。

现在,您的堆栈应当更新成功。

查找资源的描述命令

为您的资源选择正确的命令:

  • 对于 AWS::EC2::Image::IdList<AWS::EC2::Image::Id>,请使用适用于 AWS CLI 版本 1版本 2 的命令。
  • 对于 AWS::EC2::Instance::IdList<AWS::EC2::Instance::Id>,请使用适用于 AWS CLI 版本 1版本 2 的命令。
  • 对于 AWS::EC2::KeyPair::KeyName,请使用适用于 AWS CLI 版本 1版本 2 的命令。
  • 对于 AWS::EC2::SecurityGroup::GroupNameAWS::EC2::SecurityGroup::IdList<AWS::EC2::SecurityGroup::GroupName>List<AWS::EC2::SecurityGroup::Id>,请使用适用于 AWS CLI 版本 1版本 2 的命令。
  • 对于 AWS::EC2::Subnet::IdList<AWS::EC2::Subnet::Id>,请使用适用于 AWS CLI 版本 1版本 2 的命令。
  • 对于 AWS::EC2::VPC::IdList<AWS::EC2::VPC::Id>,请使用适用于 AWS CLI 版本 1版本 2 的命令。
  • 对于 AWS::Route53::HostedZone::IdList<AWS::Route53::HostedZone::Id>,请使用适用于 AWS CLI 版本 1版本 2 的命令。

这篇文章对您有帮助吗?


您是否需要账单或技术支持?