2016-09-05 29 views
0

我在驗證以下YAML代碼時遇到問題,因爲我無法解析Fn::Base64Fn::Join。我該如何解決這個問題?驗證YAML代碼時使用「Fn :: Base64」和「Fn :: Join」解析錯誤

AWSTemplateFormatVersion: "2010-09-09" 
Description: "test e2 ebs in vpc" 
Parameters: 
    KeyPairName: 
    Description: "Public/private key pairs allow you to securely connect to your instance after it launches" 
    Type: "AWS::EC2::KeyPair::KeyName" 
    VPC: 
    Description: "ID of the VPC (e.g., vpc-0343606e)" 
    Type: AWS::EC2::VPC::Id" 
    myWSFCNode1InstanceType: 
    ConstraintDescription: "Only EBS Optimized instance types r3.xlarge, r3.2xlarge, r3.4xlarge allowed" 
    Default: t2.small 
    Description: "Amazon EC2 instance type for the 1st WSFC Node" 
    Type: String 
Resources: 
    myWSFCNode1: 
    CreationPolicy: 
     ResourceSignal: 
     Count: "1" 
     Timeout: PT15M 
    Properties: 
     BlockDeviceMappings: 
     - DeviceName: /dev/sda1 
     Ebs: 
      VolumeSize: "100" 
      VolumeType: gp2 
     ImageId: ami-fd9cecc7 
     InstanceType: 
     Ref: myWSFCNode1InstanceType 
     KeyName: 
     Ref: KeyPairName 
     SecurityGroupIds: 
     - 
      Ref: myWSFCSecurityGroup 
     UserData: 
      ? "Fn::Base64" 
      : 
      ? "Fn::Join" 
      : 
      - "" 
      - 
    Type: "AWS::EC2::Instance" 
    myWSFCNode1Volume1: 
    Properties: 
     Size: 50 
    Type: "AWS::EC2::Volume" 
    myWSFCSecurityGroup: 
    Properties: 
     GroupDescription: "Enable the WSFC and SQL AlwaysOn Availability Group communications" 
     SecurityGroupIngress: 
     - 
      CidrIp: 0.0.0.0/0 
      FromPort: "22" 
      IpProtocol: tcp 
      ToPort: "22" 
     VpcId: Ref: VPC 
    Type: "AWS::EC2::SecurityGroup" 
    mySystemGroup: "ec2SG" 
+0

@LukaKerr如果你編輯一篇文章,請不要只在你打開它進行編輯時進行代碼格式化,清理整篇文章。 – Anthon

+0

你用什麼來驗證這個YAML。你可以在將文件交給目前進行驗證的進程之前預處理該文件嗎? – Anthon

回答

0

這部分是無效的YAML:

UserData: 
     ? "Fn::Base64" 
     : 
     ? "Fn::Join" 
     : 
     - "" 
     - 

?:分別表示明確的映射鍵和值。這使得UserData的值成爲YAML映射。然後,有兩個序列項目-。在YAML映射中不能有任何序列項,因此解析器失敗。

取決於你想要做什麼,這裏有一些變化,可能做你想做的:

  1. 具有序列映射內在價值:
? "Fn::Base64" 
: 
? "Fn::Join" 
: 
    - "" 
    - 
  1. 將兩個序列項轉換爲另一個鍵值對:
? "Fn::Base64" 
: 
? "Fn::Join" 
: 
? "" 
: 

注意YAML允許空值,在某些情況下被排除在外,這樣你就可以凝結成1:

? "Fn::Base64" 
? "Fn::Join" 
: 
    - 
    - 

和2到:

? "Fn::Base64" 
? "Fn::Join" 
? 
+0

帶有兩個元素(emtpy字符串和nill)的序列是鍵「Fn :: Join」的值,YAML允許非縮進的序列值。 – Anthon

+0

這是規範中一個相當模糊的話題。它說映射*和*序列指示符被認爲是縮進的一部分。雖然技術上正確的是,規範中的語法產品只處理順序指示符,因此可以解析,但實現可能也會尊重與其相矛盾的文本描述。所以我當然不會依賴它。 – flyx

+0

我不同意規範是blury:「由於人們將」 - 「指示符視爲縮進,所以嵌套的塊順序可能會縮短一個空間以進行補償,當然,如果嵌套在另一個塊順序中out context與block-in context)。「該規範有多個這種映射值的非縮進塊序列的例子。 – Anthon

0

你YAML文件有一個單一的錯誤,這是行:

 VpcId: Ref: VPC 

這或許應該是:

 VpcId: "Ref: VPC" 

,因爲你不能有:在非引用的字符串,或可能:

 VpcId: 
     Ref: VPC 

如果,糾正上述後,您的解析器不接受Fn::Base64串,那麼你應該升級你的解析器。

+0

嗨Anthon, 仍然我無法解決此錯誤。我收到以下錯誤。 無法解析。線路:36? 「Fn :: Base64」 –

+0

@vanithavani你升級瞭解析器嗎?你用哪一個來驗證你的東西?你能否將YAML預處理成與你的YAML解析器所接受的語義相同的格式? – Anthon

0

感謝您的時間幫助我的傢伙..我在我的代碼中修改了以下更改。

UserData: 
     ? "Fn::Base64": 
     ? "Fn::Join": 
     - "" 
     -