当我创建或更新 AWS CloudFormation 堆栈时,我收到以下错误消息:“参数验证失败:参数名称‘ABC’的参数值‘abc’不存在”。 如何解决此错误?
简短描述
当 CloudFormation 模板中使用的参数之一是 AWS 特定的参数类型时,AWS CloudFormation 会返回参数验证失败错误。
当您将 AWS 特定的参数用于以下目的时,可能会收到此错误:
- 传递在堆栈创建期间 AWS 区域或账户中不存在的值。
- 作为资源属性,然后在堆栈更新过程中,更新资源之前删除此带外值。
- 作为子堆栈中的参数。当从父堆栈传递的子堆栈的值与参数类型不匹配时,就会出现错误。当该区域的账户中不存在参数的资源时,也会发生该错误。
解决方法
**注意:**如果您在运行 AWS 命令行界面(AWS CLI)命令时遇到错误,请确保您使用的是最新版本的 AWS CLI。
创建堆栈
1. 打开 AWS CloudFormation 控制台。
2. 在导航窗格中,选择堆栈。
3. 从 Stack name(堆栈名称)列中,选择失败的堆栈。
4. 选择参数选项卡。
5. 在 Key(键)列中,搜索带有 abc 值的 ABC 参数。
6. 查看用于创建堆栈的模板的 Parameters(参数)部分,以验证资源 abc 是否与 AWS 特定的参数类型匹配。
7. 验证区域或账户中是否存在 ABC 参数的 abc 资源。使用 AWS 管理控制台或 AWS CLI 命令来描述资源。要查找适用于您的资源的正确命令,请参阅查找资源的描述命令部分。
**注意:**例如,如果使用参数类型 AWS::EC2::VPC::Id,则查看适用于资源的 Amazon Virtual Private Cloud(Amazon VPC)控制台。
8. 如果 ABC 是子堆栈的参数,则必须传递 abc 值。选择选项 A 或选项 B。
**(选项 A)**如果您引用父堆栈中的其他资源,则验证此资源与子堆栈中使用的 AWS 特定的参数类型匹配。
**注意:**例如,如果使用参数类型 AWS::EC2::Subnet::Id 并引用资源类型 AWS::EC2::VPC,则堆栈失败。
·(选项 B)如果 abc 值直接从父堆栈传递,则验证区域或账户中是否存在 ABC 参数的 abc 资源。使用 AWS 管理控制台或 AWS CLI 命令来描述资源。要查找适用于您的资源的正确命令,请参阅查找资源的描述命令部分。
例如,考虑子堆栈中的以下 List 参数:
"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 特定的参数类型匹配的有效参数值创建新堆栈。
更新堆栈
当堆栈更新失败时,CloudFormation 会回滚这些更改。这意味着您无法看到通过 AWS CloudFormation 控制台更新的参数值。
在更新期间,必须更改 ABC 参数的值。如果您不更改该值,则名称 或 PhysicalID 为 abc 的资源可能会从带外账户中删除。
1. 要验证资源是否存在,请使用 AWS 管理控制台或 AWS CLI 命令来描述资源。要查找适用于您的资源的正确命令,请参阅查找资源的描述命令部分。
2. 如果您通过更新 ABC 参数来更新堆栈,则按照上文创建堆栈部分中的步骤 6、7 和 8 执行操作。
3. 向 ABC 参数传递有效值以更新堆栈。
查找资源的描述命令
为您的资源选择正确的命令:
- 对于 AWS::EC2::Image::Id or List ,请使用适用于 AWS CLI 版本 1 或版本 2 的命令。
- 对于 AWS::EC2::Instance::Id 或 List ,请使用适用于 AWS CLI 版本 1 或版本 2 的命令。
- 对于 AWS::EC2::KeyPair::KeyName,请使用适用于 AWS CLI 版本 1 或版本 2 的命令。
- 对于 AWS::EC2::SecurityGroup::GroupName、AWS::EC2::SecurityGroup::Id、List 或 List ,请使用适用于 AWS CLI 版本 1 或版本 2 的命令。
- 对于 AWS::EC2::Subnet::Id or List ,请使用适用于 AWS CLI 版本 1 或版本 2 的命令。
- 对于 AWS::EC2::VPC::Id 或 List ,请使用适用于 AWS CLI 版本 1 或版本 2 的命令。
- 对于 AWS::Route53::HostedZone::Id 或 List ,请使用适用于 AWS CLI 版本 1 或版本 2 的命令。
- 对于 AWS::EC2::AvailabilityZone::Name 或 List ,请使用适用于 AWS CLI 版本 1 或版本 2 的命令。
- 对于 AWS::EC2::Volume::Id 或 List ,请使用适用于 AWS CLI 版本 1 或版本 2 的命令。