CloudFormation のテンプレートの検証エラーや形式エラーはどのように解決すればよいですか?

最終更新日: 2022 年 2 月 23 日

AWS CloudFormation スタックを作成しようとすると、エラーメッセージが表示されます。

簡単な説明

受け取ったエラーメッセージに基づいて、次の解決策のいずれかを選択してください。

  • 「JSON が整形式ではありません」または「YAML が整形式ではありません」エラーについては、テンプレート構文を検証するセクションをご参照ください。
  • 「テンプレートのリソースブロックにある未解決のリソース依存関係 [XXXXXXXX]」エラーについては、論理 ID とパラメータの検証セクションをご参照ください。
  • 「認識不能なパラメータタイプ: XXXXXXXX」または「無効なテンプレートパラメータプロパティ「XXXXXXXX」」エラーについては、パラメータ定義を検証するセクションをご参照ください。
  • 「すべての Condition メンバーは文字列でなければなりません」エラーについては、Condition が文字列として指定されていることを確認するセクションをご参照ください。
  • 「認識されないリソースタイプ: [XXXXXXXX]」エラーについては、リソースタイプの可用性を確認するセクションをご参照ください。
  • 「[環境リソース]「XXXXXXXX」が存在しません」エラーについては、リソースがスタック外に存在することを確認するか、同じスタック内のリソースの依存関係を検証するセクションをご参照ください。
  • 「無効なテンプレートプロパティまたはプロパティ [XXXXXXXX]」エラーについては、テンプレートプロパティを確認するセクションをご参照ください。

解決方法

注意: AWS コマンドラインインターフェイス (AWS CLI) のコマンド実行時にエラーが発生した場合は、最新バージョンの AWS CLI を使用していることを確認してください

テンプレート構文を検証する

CloudFormation テンプレートで適切な JSON または YAML 構文に従うには、以下を検討します。

論理 ID とパラメータの検証

リソースの論理 ID とパラメータがテンプレートで定義されていることを確認します。

以下の JSON テンプレートと YAML テンプレートでは、ImageId のプロパティで test が参照されています。どちらのテンプレートにもリソースの論理 ID または test という名前のパラメータが含まれていません。これらのテンプレートにより、「テンプレートのリソースブロックにある未解決のリソース依存関係 [test]」というエラーが返されます。 リソースの定義と構文に関する詳細については、「リソース」を参照してください。

JSON の例 (正しくない):

{
  "Resources" : {
    "EC2Instance01" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "ImageId" : {"Ref": "test"}
      }
    }
  }
}

YAML の例 (正しくない):

Resources:
  EC2Instance01:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref test

この問題を解決するには、test という名前のリソース論理 ID を追加します。または、参照が imageId 値を返す test という名前のパラメータを作成します。次の JSON および YAML テンプレートの例には、test という名前で imageId を値とするパラメータが含まれています。

JSON の例 (正しい):

{
  "Parameters": {
     "test": {
         "Type": "String",
         "Default": "ami-xxx"
       }
  },
  "Resources" : {
    "EC2Instance01" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "ImageId" : {"Ref": "test"}
      }
    }
  }
}

YAML の例 (正しい):

Parameters:
  test:
    Type: String
    Default: ami-xxx
Resources:
  EC2Instance01:
    Type: 'AWS::EC2::Instance'
    Properties:
      ImageId: !Ref test

パラメータ定義を検証する

1.    Type を、サポートされている次のプロパティのいずれかに設定します。

2.    CloudFormation テンプレートで、パラメータに以下の許可されたプロパティのみが含まれていることを確認します。

"Parameters" : {
  "ParameterName" : {
    "AllowedPattern" : "A regular expression that represents the patterns to allow for String types.",
    "AllowedValues" : "An array containing the list of values allowed for the parameter",
    "ConstraintDescription" : "A string that explains a constraint when the constraint is violated"
    "Default" : "A value of the appropriate type for the template to use if no value is specified when a stack is created. If you define constraints for the parameter, you must specify a value that adheres to those constraints",
    "Description" : "A string of up to 4000 characters that describes the parameter",
    "MaxLength" : "An integer value that determines the largest number of characters you want to allow for String types",
    "MaxValue" : "A numeric value that determines the largest numeric value you want to allow for Number types.",
    "MinLength" : "An integer value that determines the smallest number of characters you want to allow for String types.",
    "MinValue" : "A numeric value that determines the smallest numeric value you want to allow for Number types.",
    "NoEcho" : "Whether to mask the parameter value when a call is made that describes the stack.
                 If you set the value to true, the parameter value is masked with asterisks (*****).",
    "Type" : "The data type for the parameter (DataType)."
 },

3.    CloudFormation テンプレートの Parameters セクションに組み込み関数が含まれていないことを確認します。

次の JSON および YAML テンプレートでは、ParameterC のデフォルト値には、組み込み関数 Fn::Sub が含まれています。この組み込み関数により、検証エラー(「すべての Default メンバーは文字列でなければなりません」)が発生します。

JSON の例 (正しくない):

{
  "Parameters": {
    "ParameterA": {
      "Type": "String",
      "Default": "abc"
    },
    "ParameterB": {
      "Type": "String",
      "Default": "def"
    },
    "ParameterC": {
      "Type": "String",
      "Default": {
        "Fn::Sub": "${ParameterA}-${ParameterB}"
      }
    }
  },
  "Resources": {
    "MyS3Bucket": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
        "BucketName": {
          "Ref": "ParameterC"
        }
      }
    }
  }
}

YAML の例 (正しくない):

Parameters:
 ParameterA:
  Type: String
  Default: abc
 ParameterB:
  Type: String
  Default: def
 ParameterC:
  Type: String
  Default: !Sub '${ParameterA}-${ParameterB}'
Resources:
 MyS3Bucket:
  Type: 'AWS::S3::Bucket'
  Properties:
   BucketName: !Ref ParameterC

Conditions が文字列として指定されていることを確認する

CloudFormation テンプレートで、Conditions を文字列として指定します。

次の JSON および YAML テンプレートでは、EC2RouteA リソースの条件が 1 つの文字列ではなく複数の文字列のリストとして指定されています。これらのテンプレートにより、検証エラー(「すべての Condition メンバーは文字列でなければなりません」)が発生します。

JSON の例 (正しくない):

{
  "Conditions": {
    "ConditionA": {
      "Fn::Not": [
        {
          "Fn::Equals": [
            "",
            "Sample"
          ]
        }
      ]
    },
    "ConditionB": {
      "Fn::Not": [
        {
          "Fn::Equals": [
            "",
            "Sample"
          ]
        }
      ]
    }
  },
  "Resources": {
    "EC2RouteA": {
      "Type": "AWS::EC2::Route",
      "Condition": [
        "ConditionA",
        "ConditionB"
      ],
      "Properties": {
       ...
      }
    }
  }
}

YAML の例 (正しくない):

Conditions:
 ConditionA: !Not 
  - !Equals 
   - ''
   - Sample
 ConditionB: !Not 
  - !Equals 
   - ''
   - Sample
Resources:
  EC2RouteA:
  Type: 'AWS::EC2::Route'
  Condition:
   - ConditionA
   - ConditionB
  Properties:

このエラーを解決するには、ConditionAandB をテンプレートの Conditions セクションに追加し、EC2RouteA リソースの条件として ConditionAandB を使用します。次に示す JSON と YAML テンプレートの例をご参照ください。

JSON の例 (正しい):

{
  "Conditions": {
    "ConditionA": {
      "Fn::Not": [
        {
          "Fn::Equals": [
            "",
            "Sample"
          ]
        }
      ]
    },
    "ConditionB": {
      "Fn::Not": [
        {
          "Fn::Equals": [
            "",
            "Sample"
          ]
        }
      ]
    },
    "ConditionAandB": {
      "Fn::And": [
        {
          "Condition": "ConditionA"
        },
        {
          "Condition": "ConditionB"
        }
      ]
    }
  },
  "Resources": {
    "EC2RouteA": {
      "Type": "AWS::EC2::Route",
      "Condition": "ConditionAandB",
      "Properties": {
        ...
      }
    }
  }
}

YAML の例 (正しい):

Conditions:
  ConditionA:
    Fn::Not:
    - Fn::Equals:
      - ''
      - Sample
  ConditionB:
    Fn::Not:
    - Fn::Equals:
      - ''
      - Sample
  ConditionAandB:
    Fn::And:
    - Condition: ConditionA
    - Condition: ConditionB
Resources:
  EC2RouteA:
    Type: AWS::EC2::Route
    Condition: ConditionAandB
    Properties:

リソースタイプの可用性を確認する

1.    リソースが AWS リージョンで使用可能であることを検証します。

すべてのリソースタイプがすべての AWS リージョンで使用できるわけではありません。お使いの AWS リージョンでは利用できないリソースタイプを含むテンプレートでは、「認識できないリソースタイプ:[XXXXXXXX]」というエラーが表示されます。

2.    テンプレートがサーバーレスリソースで構成されている場合は、 Transform 宣言を含めます。次に示す JSON と YAML テンプレートの例をご参照ください。

JSONの例:

{
    "Transform": "AWS::Serverless-2016-10-31", #Please make sure to include this.
    "Resources": {
        "MyServerlessFunctionLogicalID": {
            "Type": "AWS::Serverless::Function",
            "Properties": {
                "Handler": "index.handler",
                "Runtime": "nodejs8.10",
                "CodeUri": "s3://testBucket/mySourceCode.zip"
            }
        }
    }
}

YAML の例:

Transform: AWS::Serverless-2016-10-31 #Please make sure to include this.
Resources:
  MyServerlessFunctionLogicalID:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs8.10
      CodeUri: 's3://testBucket/mySourceCode.zip'

リソースがスタック外に存在することを確認する、または同じスタック内のリソースの依存関係を検証する

1 つのリソースまたは Amazon Resource Name (ARN) を CloudFormation スタックの外部のリソースのスタックに 1 つのリソースまたは Amazon リソースネーム (ARN) をハードコーディングする場合は、以下のことを確認してください。

  • リソース名または ARN が正しい
  • リソースが存在する
  • リソースは、スタックと同じ AWS リージョンに存在します。一部のリソースは、AWS リージョンまたはアカウント間でプロパティを受け入れることを考慮してください。

たとえば、セキュリティグループ (sg-1234567890) を指定するスタック内のAWS::EC2::Instance リソースは、次の場合に失敗します。

  • セキュリティグループが存在しない。
  • セキュリティグループがスタックの AWS リージョンに存在しない。

結果として、「The sg-1234567890 does not exist」というエラーメッセージが表示されます。 以下の例をご覧ください。

LinuxInstance:
    Type: AWS::EC2::Instance
    Properties:
      SubnetId: !Ref ServerSubnetID 
      KeyName: !Ref EC2KeyPairName
      SecurityGroupIds: sg-1234567890 #<This resource must exist and be in the same AWS Region as the stack.>

テンプレートプロパティを確認する

CloudFormation テンプレートでは許可されたテンプレートプロパティのみを使用します。

次の JSON と YAML テンプレートの例では、バケットリソースは Resources セクションと同じレベルにあります。これにより、「テンプレート検証エラー: 無効なテンプレートプロパティまたはプロパティ [バケット]」というエラーが返されます。 このエラーは、CloudFormation テンプレート検証ツールがバケットリソースをセクションレベルの仕様として認識するために発生します。セクションレベルの仕様は、テンプレートプロパティとして許可されません。

JSON の例 (正しくない):

{
   "Resources": {
      "WaitCondition": {
         "Type": "AWS::CloudFormation::WaitCondition"
      }
   },  #<There is an extra '}' causing the Resources section to be closed off after the WaitCondition resource.>
   "Bucket": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
         "Name": "BucketName"
      }
   }
}

YAML の例 (正しくない):

Resources:
  WaitCondition:
    Type: AWS::CloudFormation::WaitCondition
Bucket: # <The spacing for the entire Bucket resource is incorrect and needs to be shifted 2 spaces to the right.>
  Type: AWS::S3::Bucket
  Properties:
    Name: BucketName

この問題を解決するには、バケットリソースが Resources セクション内で指定されるように書式を修正します。正しくフォーマットされた JSON および YAML テンプレートの例を以下に示します。

JSON の例 (正しい):

{
   "Resources": {
      "WaitCondition": {
         "Type": "AWS::CloudFormation::WaitCondition"
      },
   "Bucket": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
         "Name": "BucketName"
      }
   }
}
}

YAML の例 (正しい):

Resources:
  WaitCondition:
    Type: 'AWS::CloudFormation::WaitCondition'
  Bucket:
    Type: 'AWS::S3::Bucket'
    Properties:
      Name: BucketName

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?