【问题标题】:Parse error in YAML code with "Fn::Base64" and "Fn::Join" while validating it在验证 YAML 代码时使用“Fn::Base64”和“Fn::Join”解析错误
【发布时间】:2016-09-05 09:11:11
【问题描述】:

我在验证以下 YAML 代码时遇到问题,因为我无法解析 Fn::Base64Fn::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"

【问题讨论】:

  • @LukaKerr 如果您编辑帖子,请不要在打开编辑后只进行代码格式化,清理整个帖子。
  • 你用什么来验证这个 YAML。您可以在将文件交给当前进行验证的进程之前对其进行预处理吗?

标签: parsing amazon-web-services yaml


【解决方案1】:

这部分不是有效的 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"
?

【讨论】:

  • 包含两个元素(空字符串和 nill)的序列是键 Fn::Join 的值,YAML 允许序列的非缩进值。
  • 这是规范中一个相当模糊的话题。它说映射 序列指示符被认为是缩进的一部分。虽然您在技术上是正确的,因为规范中的语法产生只处理序列指示符,因此,这可以解析,实现也可能尊重与其相矛盾的文本描述。所以我当然不会依赖它。
  • 我不同意规范是模糊的:“由于人们认为“-”指示符是缩进,嵌套的块序列可能会缩进一个更少的空间来补偿,当然,如果嵌套在另一个块序列内(块输出上下文与块输入上下文)。”并且该规范有多个此类非缩进块序列的示例,它们是映射值。
  • 嗨 Flyx 和 Anthon... 我仍然无法解决此错误。您能否建议我更多的选择,以便我可以尝试一下。
  • @vanithavani:你必须告诉使用你得到的错误。
【解决方案2】:

您的 YAML 文件有一个错误,那就是这一行:

      VpcId: Ref: VPC

应该是这样的:

      VpcId: "Ref: VPC"

因为您不能在非引号字符串中包含:,或者可能:

      VpcId: 
        Ref: VPC

如果在纠正上述问题后,您的解析器不接受Fn::Base64 字符串,那么您应该升级您的解析器。

【讨论】:

  • 您好 Anthon,我仍然无法解决此错误。我收到以下错误。无法解析。线路:36? "Fn::Base64"
  • @vanithavani 你升级你的解析器了吗?你用哪一个来验证你的东西?您能否将 YAML 预处理为与您的 YAML 解析器所接受的语义相同的格式?
【解决方案3】:

感谢大家抽出宝贵时间帮助我。我通过以下代码更改得到了修复。

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

【讨论】:

    猜你喜欢
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    相关资源
    最近更新 更多