インフラ

CDKでリソースグループ作ろうとするとModel validation failedのエラーがでる

cdk

CDKでリソースグループを作ろうとしたら、以下のようなエラーがでました。

Resource handler returned message: "Model validation failed (#/Tags: expected type: JSONArray, found: JSON Object)"

解決まで時間かかってしまったので、ブログにします。
結論は、リソースグループにつくTagsを「addPropertyOverride」で上書きしました。

github aws/aws-cdk Issue #9040

Contents

リソースグループ作成でModel validation failedのエラーがでる

コードを交えて解説します。

  • CDK: version 1.107.0

エラー内容

こんな感じで、リソースグループを定義してみます。

import * as cdk from '@aws-cdk/core';
import * as resourcegroups from '@aws-cdk/aws-resourcegroups';

export class ResourceGroupStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const group = new resourcegroups.CfnGroup(this, "resourcegroup", {
      name: "hoge-group3",
    })
  }
}

「cdk deploy」してみると、以下のようなエラーがでてスタックの作成ができません。
どうも生成されるJSONがよくない様子です。

Resource handler returned message: "Model validation failed (#/Tags: expected type: JSONArray, found: JSONObject)" (RequestToken: c1e3f533-e3d4-3662-272d-98d7bf454cf3, HandlerErrorCode: InvalidRequest)

原因

原因はCDKで生成されるリソースグループのJSONのTag部分のTypeが正しくありませんでした。

失敗する場合と、理想形を見比べます。

まずは、失敗する場合です。上記のCDKで生成されたものです。

resourcegroup:
    Type: AWS::ResourceGroups::Group
    Properties:
      Name: hoge-group
      Tags: 
        Name: hoge-groupe #listになっていない

CloudFormationのドキュメントを見たところ、Tagsの部分のTypeは「List of Tag」でした。
失敗した場合の方とは、Typeが異なっていました。

理想形は以下です。

resourcegroup:
    Type: AWS::ResourceGroups::Group
    Properties:
      Name: hoge-group
      Tags: 
        - Key: Name #listでTag
        - Value: hoge-groupe

解決策

CloudFormationを理想形の状態にするために、「addPropertyOverride」を使って「Tags」を書き換えました。

import * as cdk from '@aws-cdk/core';
import * as resourcegroups from '@aws-cdk/aws-resourcegroups';

export class ResourceGroupStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const group = new resourcegroups.CfnGroup(this, "resourcegroup", {
      name: "hoge-group",
    })
    group.addPropertyOverride('Tags', [
      {
        Key: "Name",
        Value: "hoge-group"
      }
    ])
  }
}

CloudFormationも意図した状態になり、スタックを作成できました。

resourcegroup:
    Type: AWS::ResourceGroups::Group
    Properties:
      Name: hoge-group4
      Tags:
        - Key: Name
          Value: hoge-group

まとめ

CDKでリソースグループを作成する際のエラーについてでした。
現時点では、対応していない様子だったのでaddPropertyOverrideでCloudFormationを書き換える方法を使いました。
(CDKでTagsのプロパティをしてしても同様)

Amzonで「AWS」の本を見てみる

楽天で「AWS」の本をみてみる!!

cdk
CDKでNATGatewayのEIPをOutput・Prefixlistに登録するこんにちは、ちゃりおです。 CDKで作成したVPCのNAT GatewayのEIPを他のスタックで使ったり、プレフィックスリストに登録...
ECS
AWS CDKでECS Fargateに必要なVPCエンドポイントを作成するこんにちは、ちゃりおです。 ECSのデプロイ時のPullはNATGWを通すと通信量が高額になることがあると思います。 VPCエンドポイ...
aws saa
AWS初心者が3週間でAWSソリューションアーキテクト(SAA)を取った勉強法こんにちは、ちゃりお(@chari7311)です! 以前社内の事情でAWSソリューションアーキテクトを3週間で取るよう言われました。 ...