如何解决 CloudFormation 中的“Model validation failed (#: extraneous key [Key] is not permitted)”错误?

2 分钟阅读
0

我在 AWS CloudFormation 命令行界面(CFN-CLI)中使用了自定义资源提供程序来创建资源。但是,我在 CloudFormation 堆栈事件中收到“Model validation failed (#: extraneous key [Key] is not permitted)”错误。

解决方法

可以仅使用资源提供者创建具有属性的资源类型。如果没有在资源类型架构中定义属性,或使用的是预留属性,则会收到模型验证错误。

要解决此问题,请完成以下步骤:

  1. 确认 CloudFormation 模板中定义的属性也在资源类型架构文件中定义。可以在项目的根目录中找到该文件。
    **注意:**该文件使用 organization-service-resource.json 命名格式。例如,对于名为 Article::EC2::Subnet 的 Amazon Elastic Cloud Compute(Amazon EC2)资源,文件名为 article-ec2-subnet.json

  2. 检查是否使用预留属性。如果使用的是预留属性,请在资源类型架构和 CloudFormation 模板中更改该属性的名称。

  3. 要验证项目是否构建成功,请依次运行 cfn validatecfn generatecfn submit 命令。如果使用的是 Java 插件,请依次运行 cfn validatecfn generatemvn packagecfn submit 命令。
    示例:

    cfn validate
    Resource schema is valid.
    
    cfn generate
    Generated files for Organization::Service::Resource
    
    mvn package
    [INFO] Scanning for projects...
    [INFO]
    [INFO] --< software.organization.service.resource:organization-service-resource-handler >--
    [INFO] Building organization-service-resource-handler 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    ...
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  21.690 s
    [INFO] Finished at: 2020-07-14T16:02:47-05:00
    [INFO] ------------------------------------------------------------------------
    
    cfn submit
    Successfully submitted type. Waiting for registration with token '12345a-abcde-6789-abc1-a1234b567891' to complete.
    {'ProgressStatus': 'COMPLETE', 'Description': 'Deployment is currently in DEPLOY_STAGE of status COMPLETED' , 'TypeArn': 'arn:aws:cloudformation:us-east-1:1234567891:type/resource/Organization-Service-Resource', 'TypeVersionArn': 'arn:aws:cloudformation:us-east-1:1234567891:type/resource/Organization-Service-Resource/00000035', 'ResponseMetadata': {'RequestId': '123a1234-b123-4567-abcd-123a123b1c1d', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': '123a1234-b123-4567-abcd-123a123b1c1d', 'content-type': 'text/xml', 'content-length': '952', 'date': 'Tue, 14 Jul 2020 21:16:17 GMT'}, 'RetryAttempts': 0}}

    **注意:**如果单元测试未完成而又想跳过测试,请运行 mvn -Dmaven.test.skip=true 包 而不是 mvn 包

  4. 要将项目的当前版本设置为默认版本,请运行 set-type-default-version AWS 命令行界面(AWS-CLI)命令:

    aws cloudformation set-type-default-version --type RESOURCE --type-name Organization::Service::Resource --version-id 00000005

    **注意:**将 Organization::Service::Resource 替换为资源类型的名称。另外,将 00000005 替换为 cfn submitTypeVersionArn 密钥中返回的最新构建版本。如果在运行 AWS CLI 命令时收到错误,请参阅排查 AWS CLI 错误。此外,请确保使用的是最新版本的 AWS CLI

  5. 运行以下命令,将当前类型版本设置为默认值:

    cfn submit --set-default

    有关更多信息,请参阅 submit 命令。

  6. 要对测试进行故障排除,请使用项目根目录中的 rpdk.log 文件。

如果使用资源提供程序并收到其他类型的错误,请参阅以下 AWS Knowledge Center 文章,了解其他故障排除步骤:

相关信息

GitHub 网站上的 CloudFormation CLI

AWS 官方
AWS 官方已更新 3 个月前