CloudFormation 和 PowerShell:模板格式错误:结构不受支持

Posted

技术标签:

【中文标题】CloudFormation 和 PowerShell:模板格式错误:结构不受支持【英文标题】:CloudFormation and PowerShell: Template format error: unsupported structure with 【发布时间】:2017-12-30 13:38:07 【问题描述】:

在使用 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:模板格式错误:结构不受支持。在 行:1 字符:1 + Test-CFNTemplate -TemplateBody file://c:/temp/Test.template + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~ + CategoryInfo : InvalidOperation: (Amazon.PowerShe...NTemplateCmdlet:TestCFNTemplateCmdlet) [测试-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://,但这里似乎并非如此。

【问题讨论】:

【参考方案1】:

-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/

【讨论】:

【参考方案2】:

显然-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

【讨论】:

以上是关于CloudFormation 和 PowerShell:模板格式错误:结构不受支持的主要内容,如果未能解决你的问题,请参考以下文章

sql Powershell Migration工具http://stackingcode.com/blog/2011/10/12/database-migrations-with-powershel

powershell 来自https://stackoverflow.com/questions/31051103/how-to-export-a-class-in-powershell-v5-mod

SAM 模板和 Cloudformation 模板的区别

AWS CloudFormation:Cognito LambdaTrigger CustomEmailSender - 属性“AWS CloudFormation 目前不支持。”和 CDK 的使用

AWS Cloudformation的相关概念

VPC 内部的 CloudFormation?