我在 AWS CloudFormation 命令行界面(CFN-CLI)中使用了自定义资源提供程序来创建资源。但是,我在 CloudFormation 堆栈事件中收到“Model validation failed (#: extraneous key [Key] is not permitted)”错误。
解决方法
可以仅使用资源提供者创建具有属性的资源类型。如果没有在资源类型架构中定义属性,或使用的是预留属性,则会收到模型验证错误。
要解决此问题,请完成以下步骤:
-
确认 CloudFormation 模板中定义的属性也在资源类型架构文件中定义。可以在项目的根目录中找到该文件。
**注意:**该文件使用 organization-service-resource.json 命名格式。例如,对于名为 Article::EC2::Subnet 的 Amazon Elastic Cloud Compute(Amazon EC2)资源,文件名为 article-ec2-subnet.json。
-
检查是否使用预留属性。如果使用的是预留属性,请在资源类型架构和 CloudFormation 模板中更改该属性的名称。
-
要验证项目是否构建成功,请依次运行 cfn validate、cfn generate 和 cfn submit 命令。如果使用的是 Java 插件,请依次运行 cfn validate、cfn generate、mvn package 和 cfn 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 包。
-
要将项目的当前版本设置为默认版本,请运行 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 submit 在 TypeVersionArn 密钥中返回的最新构建版本。如果在运行 AWS CLI 命令时收到错误,请参阅排查 AWS CLI 错误。此外,请确保使用的是最新版本的 AWS CLI。
-
运行以下命令,将当前类型版本设置为默认值:
cfn submit --set-default
有关更多信息,请参阅 submit 命令。
-
要对测试进行故障排除,请使用项目根目录中的 rpdk.log 文件。
如果使用资源提供程序并收到其他类型的错误,请参阅以下 AWS Knowledge Center 文章,了解其他故障排除步骤:
相关信息
GitHub 网站上的 CloudFormation CLI。