AWS CloudFormation テンプレートの検証エラーまたは形式エラーを解決する方法を教えてください。

最終更新日: 2020 年 3 月 18 日

AWS CloudFormation スタックを作成しようとすると、エラーメッセージが表示されます。このエラーの解決方法を教えてください。

簡単な説明

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

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

解決方法

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

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

論理的および物理的な ID を検証する

テンプレートでリソースの論理 ID が定義されており、環境内にリソースの物理 ID が存在することを確認します。

たとえば、以下の JSON テンプレートでは ImageId プロパティ、YAML テンプレートでは ImageID プロパティについて test が参照されていますが、どちらのテンプレートにもリソースの論理 ID または test という名前のパラメータが含まれていません。

リソース ID は、次の JSON と YAML テンプレートで正しく定義されていません。これらのテンプレートを使用すると、「テンプレートのリソースブロックにある未解決のリソース依存関係 [test]」というエラーが返されます。 リソースの定義と構文に関する詳細については、「リソース」を参照してください。

JSON:

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

YAML:

Parameters:
Resources:
  EC2Instance01:
    Type: AWS::EC2::Instance
    Properties:
      ImageID: !Ref: test

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

1.    Type を次のプロパティのいずれかにのみ設定します。StringNumberList<Number>、または CommaDelimitedList (AWS 固有のパラメータタイプと SSM パラメータタイプを含む)。

2.    AWS 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.    AWS 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 が文字列として指定されていることを確認する

AWS 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 をテンプレートに追加し、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:

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

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

すべてのリソースタイプがすべての AWS リージョンで使用できるわけではありません。例えば、次の JSON および YAML テンプレートにおける AWS::WAFRegional::IPSet というリソースタイプは、現在 ap-south-1 では使用できません。こういったテンプレートの使用は、「Unrecognized resource types: [XXXXXXXX]」というエラーの原因になります。

JSON:

{
  "IPSetBlacklistA": {
    "Type": "AWS::WAFRegional::IPSet",
    "Properties": {
      "Name": "IPSet for blacklisted IP addresses",
      "IPSetDescriptors": [
        {
          "Type": "IPV4",
          "Value": "x.x.x.x/x"
        },
        {
          "Type": "IPV4",
          "Value": "x.x.x.x/x"
        }
      ]
    }
  }
}

YAML:

IPSetBlacklistA:
 Type: 'AWS::WAFRegional::IPSet'
 Properties:
  Name: IPSet for blacklisted IP addresses
  IPSetDescriptors:
   - Type: IPV4
    Value: x.x.x.x/x
   - Type: IPV4
    Value: x.x.x.x/x

注意: AWS CloudFormation テンプレートは、JSON または YAML の標準に適合する形式を使用したテキストファイルとして保存されています。上記の JSON および YAML のテンプレートは同じテンプレートを使っていますが、形式が異なります。YAML サポートの詳細については、「テンプレートの基礎についての学習」、「AWS CloudFormation の更新 – YAML、クロススタック参照、簡略化された置換」と「YAML Version 1.2」を参照してください。

プロパティ、値、および値の型を検証する

テンプレートのセクションとリソース定義で有効なプロパティ、値、および値の型を使用します。

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

AWS CloudFormation スタックの外部に存在するリソースのリソースまたは Amazon リソースネーム (ARN) をスタックのリソースの 1 つにハードコーディングする場合、以下を確認します。

  • リソース名または ARN が正しい
  • リソースが存在する
  • リソースがスタックと同じ AWS リージョンに存在する (一部のリソースはリージョンまたはアカウント全体でプロパティを受け入れます)。

たとえば、AWS::EC2::Instance リソース (セキュリティグループ (sg-1234567890) を指定しているスタック内にある) のセキュリティグループが、スタックの AWS リージョンに存在しない場合、AWS::EC2::Instance リソースは失敗します。「The sg-1234567890 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 region as the stack>

テンプレートに Resources セクションを含める

AWS CloudFormation テンプレートに Resources セクションを含める必要があります。そうしないと、エラーが発生します。

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

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

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

JSON:

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

YAML:

Resources:
  WaitCondition:
    Type: AWS::CloudFormation::WaitCondition
Bucket:
  Type: AWS::S3::Bucket
  Properties:
    Name: examplebucketname

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

改善できることはありますか?


さらにサポートが必要な場合