CloudFormation のテンプレートの検証エラーや形式エラーはどのように解決すればよいですか?
最終更新日: 2022 年 9 月 21 日
AWS CloudFormation スタックを作成しようとすると、エラーメッセージが表示されます。
簡単な説明
受け取ったエラーメッセージに基づいて、次の解決策のいずれかを選択してください。
- 「JSON not well-formed」(JSON が整形式ではありません) または「YAML not well-formed」(YAML が整形式ではありません) エラーについては、「テンプレート構文を検証する」セクションを参照してください。
- 「Unresolved resource dependencies [XXXXXXXX] in the Resources block of the template」(テンプレートのリソースブロックにある未解決のリソース依存関係 [XXXXXXXX]) エラーについては、「論理 ID とパラメータを検証する」のセクションを参照してください。
- 「Unrecognized parameter type: XXXXXXXX」(認識不能なパラメータタイプ: XXXXXXXX) または「Invalid template parameter property 'XXXXXXXX'」(無効なテンプレートパラメータプロパティ「XXXXXXXX」) エラーについては、「パラメータ定義を検証する」セクションを参照してください。
- 「すべての Condition メンバーは文字列でなければなりません」エラーについては、Condition が文字列として指定されていることを確認するセクションをご参照ください。
- 「認識されないリソースタイプ: [XXXXXXXX]」エラーについては、リソースタイプの可用性を確認するセクションをご参照ください。
- 「[環境リソース]「XXXXXXXX」が存在しません」エラーについては、リソースがスタック外に存在することを確認するか、同じスタック内のリソースの依存関係を検証するセクションをご参照ください。
- 「無効なテンプレートプロパティまたはプロパティ [XXXXXXXX]」エラーについては、テンプレートプロパティを確認するセクションをご参照ください。
解決方法
注意: AWS コマンドラインインターフェイス (AWS CLI) のコマンド実行時にエラーが発生した場合は、最新バージョンの AWS CLI を使用していることを確認してください。
テンプレート構文を検証する
CloudFormation テンプレートで適切な JSON または YAML 構文に従うには、以下を検討します。
- AWS CloudFormation Designer を使ってスタックを作成する。
- テキストエディタ、または AWS CLI テンプレート検証ツールなどのコマンドラインツールを使って JSON 構文を検証する。
- aws cloudformation validate-template コマンドを使って YAML 構文を検証する。
- GitHub ウェブサイトの AWS 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] (タイプ) を、サポートされている次のプロパティのいずれかに設定します。
- String、Number、List
、または CommaDelimitedList - AWS 固有のパラメータタイプ
- SSM パラメータタイプ
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'
リソースがスタック外に存在することを確認する、または同じスタック内のリソースの依存関係を検証する
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