CloudFormation和PowerShell:模板格式错误:

时间:2017-07-24 20:31:55

标签: powershell amazon-web-services amazon-cloudformation

在使用PowerShell时,我无法使用任何CloudFormation模板进行部署或验证,但使用确切模板我使用AWS CLI或使用AWS控制台时没有遇到任何问题。

让我们采用一个基本的CloudFormation模板,让我们称之为Test.template

{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Description" : "Simple template.",
  "Parameters" : {    
    "KeyName" : {
      "Type" : "String", 
      "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the web server"
    }
  }, 

  "Resources" : {
    "Ec2Instance" : {
      "Type" : "AWS::EC2::Instance", 
      "Properties" : {        
        "KeyName" : "test",        
      }
    }
  }
}

没什么特别的,非常基本的。在创建EC2资源时忽略这会失败,这是一个格式正确的JSON CloudFormation模板。

现在,如果我使用AWS CLI运行此命令,它会成功返回并输出参数:

aws cloudformation validate-template --template-body file://c:/temp/Test.template

使用完全相同的文件,如果我在PowerShell中运行它,我会收到错误:

Test-CFNTemplate -TemplateBody file://c:/temp/Test.template
  

Test-CFNTemplate:模板格式错误:不支持的结构。在   line:1 char:1   + Test-CFNTemplate -TemplateBody file:// c:/temp/Test.template   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~       + CategoryInfo:InvalidOperation:(Amazon.PowerShe ... NTemplateCmdlet:TestCFNTemplateCmdlet)   [Test-CFNTemplate],InvalidOperationException       + FullyQualifiedErrorId:Amazon.CloudFormation.AmazonCloudFormationException,Amazon.PowerShell.Cmdlets.CFN.TestCFNTemplateCmdlet

使用AWS控制台或使用aws cloudformation create-stack部署此模板也没有问题我无法弄清楚为什么我无法使用PowerShell执行此操作。

New-CFNStack也会返回相同的错误:

  

模板格式错误:不支持的结构。

我安装了最新版本的AWS PowerShell模块,并且我正在运行Powershell 5.1.14409.1012

我发现的有关此错误的其他所有内容都来自有问题的人,因为他们在TemplateBody中没有使用file://,但在这里似乎并非如此。

2 个答案:

答案 0 :(得分:3)

显然-TemplateBody不支持本地文件URI。您首先需要将模板读入变量,并使用如下所示。

$content = [IO.File]::ReadAllText("c:\test.template")
Test-CFNTemplate -TemplateBody $content

这样做之后,它现在会给你预期的输出。

Test-CFNTemplate -TemplateBody $content

Capabilities       : {}
CapabilitiesReason : 
DeclaredTransforms : {}
Description        : Simple template.
Parameters         : {KeyName}

答案 1 :(得分:0)

-TemplateBody不支持本地文件URI太糟糕了。幸运的是,您仍然可以明确指定它们是内联文件。

Test-CFNTemplate -TemplateBody (get-content c:\test.template -Raw)

该命令应返回预期结果。

Test-CFNTemplate -TemplateBody (get-content c:\test.template -Raw)

Capabilities       : {}
CapabilitiesReason : 
DeclaredTransforms : {}
Description        : Simple template.
Parameters         : {KeyName}

我不能声称这是我的解决方案,就像我从以下博客中读过的那样:https://matthewdavis111.com/aws/test-cloudformation-powershell/