AWS CloudFormation コマンドラインインターフェイス (CFN-CLI) のカスタムリソースプロバイダーを使用してリソースを作成しました。しかし、CloudFormation スタックイベントで「Model validation failed (#: extraneous key [Key] is not permitted)」というエラーが表示されました。
解決策
リソースプロバイダーを使用すると、プロパティを持つリソースタイプのみを作成できます。リソースタイプのスキーマでプロパティを定義しない場合、または予約済みのプロパティを使用している場合は、Model validation エラーが表示されます。
この問題を解決するには、次のステップを実行してください。
-
CloudFormation テンプレートで定義されているプロパティが、リソースタイプのスキーマファイルでも定義されていることを確認します。このファイルはプロジェクトのルートディレクトリにあります。
注: このファイルは、organization-service-resource.json という名前形式を使用しています。例えば、article-ec2-subnet.json は Article::EC2::Subnet という名前の Amazon Elastic Cloud Compute (Amazon EC2) リソースのファイル名です。
-
予約済みのプロパティを利用しているかどうかを確認します。予約済みのプロパティを使用している場合は、リソースタイプのスキーマと 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 package の代わりに mvn -Dmaven.test.skip=true package を実行してください。
-
プロジェクトの現在のバージョンをデフォルトとして設定するには、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 ナレッジセンターの以下の記事で追加のトラブルシューティング手順を参照してください。
関連情報
GitHub ウェブサイト上の CloudFormation CLI