验证的cloudformation yaml模板

时间:2017-03-28 02:45:16

标签: yaml amazon-cloudformation

我有一个Cloudformation模板,当我验证它时看起来似乎是有效的我使用Atom中的linter工具没有错误我也使用在线yaml验证工具确认它是正确的但是当我去在CFN中部署模板失败,错误

Template validation error: Template format error: Unresolved resource dependencies [AgentserviceSNSTopic] in the Resources block of the template 

我无法看到任何错误(我不确定格式如何,但模板如下)

AWSTemplateFormatVersion: '2010-09-09'
Description: AgentService Web infra
Outputs:
  AgentServiceFQDN:
    Value:
      'Fn::GetAtt':
        - AgentServiceELB
        - DNSName
Parameters:
  AZ:
    Default: 'ap-southeast-2a, ap-southeast-2b'
    Description: >-
      Comma delimited list of AvailabilityZones where the instances will be
      created
    Type: CommaDelimitedList
  InstanceProfile:
    Default: >-
      arn:aws:iam::112888586165:instance-profile/AdvanceCodeDeployInstanceProfile
    Description: >-
      Use the full ARN for SimpleCodeDeployInstanceProfile or
      AdvancedCodeDeployInstanceProfile
    Type: String
  InstanceType:
    ConstraintDescription: 'Must be a valid EC2 instance type, such as t2.medium'
    Default: t2.medium
    Description: Provide InstanceType to be used
    Type: String
  KeyName:
    ConstraintDescription: The name of an existing EC2 KeyPair.
    Default: LMBRtraining
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instances
    Type: 'AWS::EC2::KeyPair::KeyName'
  PublicSubnets:
    Default: 'subnet-bb0a3ade,subnet-fedd8389'
    Description: Comma delimited list of public subnets
    Type: CommaDelimitedList
  VPCID:
    Default: vpc-a18eccc4
    Description: VPC ID
    Type: String
  WindowsAMIID:
    Default: ami-5a989d39
    Description: Windows AMI ID with IIS
    Type: String
  myIP:
    Default: 0.0.0.0/0
    Description: 'Enter your IP address in CIDR notation, e.g. 100.150.200.225/32'
    Type: String
Resources:
  AgentServiceASG:
    Properties:
      AvailabilityZones:
        Ref: AZ
      DesiredCapacity: '2'
      HealthCheckGracePeriod: '600'
      HealthCheckType: ELB
      LaunchConfigurationName:
        Ref: AgentServiceLaunchConfig
      LoadBalancerNames:
        - Ref: AgentServiceELB
      MaxSize: '2'
      MinSize: '2'
      NotificationConfiguration:
        NotificationTypes:
          - 'autoscaling:EC2_INSTANCE_LAUNCH'
          - 'autoscaling:EC2_INSTANCE_LAUNCH_ERROR'
          - 'autoscaling:EC2_INSTANCE_TERMINATE'
          - 'autoscaling:EC2_INSTANCE_TERMINATE_ERROR'
      TopicARN:
          Ref: AgentServiceSNSTopic
      Tags:
        - Key: Name
          PropagateAtLaunch: 'true'
          Value: AgentServiceServer
      VPCZoneIdentifier:
        Ref: PublicSubnets
    Type: 'AWS::AutoScaling::AutoScalingGroup'
  AgentServiceAutoscaleDownPolicy:
    Properties:
      AdjustmentType: ChangeInCapacity
      AutoScalingGroupName:
        Ref: AgentServiceASG
      Cooldown: '300'
      ScalingAdjustment: '-1'
    Type: 'AWS::AutoScaling::ScalingPolicy'
  AgentServiceAutoscaleUpPolicy:
    Properties:
      AdjustmentType: ChangeInCapacity
      AutoScalingGroupName:
        Ref: AgentServiceASG
      Cooldown: '300'
      ScalingAdjustment: '1'
    Type: 'AWS::AutoScaling::ScalingPolicy'
  AgentServiceCloudWatchCPUAlarmHigh:
    Properties:
      AlarmActions:
        - Ref: AgentServiceAutoscaleUpPolicy
        - Ref: AgentServiceSNSTopic
      AlarmDescription: SNS Notification and scale up if CPU Util is Higher than 90% for 10 mins
      ComparisonOperator: GreaterThanThreshold
      Dimensions:
        - Name: AutoScalingGroupName
          Value:
            Ref: AgentServiceASG
      EvaluationPeriods: '2'
      MetricName: CPUUtilization
      Namespace: AWS/EC2
      Period: '300'
      Statistic: Average
      Threshold: '90'
    Type: 'AWS::CloudWatch::Alarm'
  AgentServiceCloudWatchCPUAlarmLow:
    Properties:
      AlarmActions:
        - Ref: AgentServiceAutoscaleDownPolicy
        - Ref: AgentserviceSNSTopic
      AlarmDescription: SNS Notification and scale down if CPU Util is less than 70% for 10 mins
      ComparisonOperator: LessThanThreshold
      Dimensions:
        - Name: AutoScalingGroupName
          Value:
            Ref: AgentServiceASG
      EvaluationPeriods: '2'
      MetricName: CPUUtilization
      Namespace: AWS/EC2
      Period: '300'
      Statistic: Average
      Threshold: '70'
    Type: 'AWS::CloudWatch::Alarm'
  AgentServiceELB:
    Properties:
      ConnectionDrainingPolicy:
        Enabled: 'true'
        Timeout: '60'
      CrossZone: true
      HealthCheck:
        HealthyThreshold: '3'
        Interval: '15'
        Target: 'HTTP:80/index.html'
        Timeout: '5'
        UnhealthyThreshold: '3'
      Listeners:
        - InstancePort: '80'
          InstanceProtocol: HTTP
          LoadBalancerPort: '80'
          Protocol: HTTP
      LoadBalancerName: AgentServiceELB
      Scheme: internet-facing
      SecurityGroups:
        - Ref: AgentServiceSecurityGroup
      Subnets:
        Ref: PublicSubnets
      Tags:
        - Key: Network
          Value: public
    Type: 'AWS::ElasticLoadBalancing::LoadBalancer'
  AgentServiceLaunchConfig:
    Properties:
      AssociatePublicIpAddress: 'true'
      IamInstanceProfile:
        Ref: InstanceProfile
      ImageId:
        Ref: WindowsAMIID
      InstanceType:
        Ref: InstanceType
      KeyName:
        Ref: KeyName
      SecurityGroups:
        - Ref: AgentServiceSecurityGroup
      UserData:
        'Fn::Base64':
          'Fn::Join':
            - ''
            - - |
                <script>
              - |
                echo hello world > c:\\inetpub\\wwwroot\\index.html
              - |
                hostname >> c:\\inetpub\\wwwroot\\index.html
              - "if not exist \\"c:\\temp\\" mkdir c:\\temp\\n"
              - >
                powershell.exe -Command Read-S3Object -BucketName
                aws-codedeploy-us-east-1/latest -Key codedeploy-agent.msi -File
                c:\\temp\\codedeploy-agent.msi
              - >
                c:\\temp\\codedeploy-agent.msi /quiet /l
                c:\\temp\\host-agent-install-log.txt
              - |
                powershell.exe -Command Get-Service -Name codedeployagent
              - |
                </script>
    Type: 'AWS::AutoScaling::LaunchConfiguration'
  AgentServiceSNSTopic:
    Type: 'AWS::SNS::Topic'
  AgentServiceSecurityGroup:
    Properties:
      GroupDescription: AgentServiceSecurityGroup
      InstanceAccessHTTPS:
        Properties:
          CidrIp: 0.0.0.0/0
          FromPort: '443'
          GroupId: AgentServiceSecurityGroup
          IpProtocol: tcp
          ToPort: '443'
        Type: 'AWS::EC2::SecurityGroupIngress'
      InstanceAccessPSremote:
        Properties:
          CidrIp: 198.18.0.0/24
          FromPort: '5985'
          GroupId: AgentServiceSecurityGroup
          IpProtocol: tcp
          ToPort: '5985'
        Type: 'AWS::EC2::SecurityGroupIngress'
      InstanceAccessRDP:
        Properties:
          CidrIp: 0.0.0.0/0
          FromPort: '3389'
          GroupId: AgentServiceSecurityGroup
          IpProtocol: tcp
          ToPort: '3389'
        Type: 'AWS::EC2::SecurityGroupIngress'
      InstanceAccessSMB:
        Properties:
          CidrIp: 198.18.0.0/24
          FromPort: '445'
          GroupId: AgentServiceSecurityGroup
          IpProtocol: tcp
          ToPort: '445'
        Type: 'AWS::EC2::SecurityGroupIngress'
      VpcId:
        Ref: VPCID
    Type: 'AWS::EC2::SecurityGroup'

1 个答案:

答案 0 :(得分:1)

知道哪个在线验证员接受了您的“有效YAML”会很有趣。

当您使用YAML作为输入时,Online YAML ParserYAML Lint都会抱怨。更改行后,这些YAML解析器表明存在问题:

- "if not exist \\"c:\\temp\\" mkdir c:\\temp\\n"

这是引用的标量"if not exist \\"c:\\temp\\",后跟更多mkdir ...

- "if not exist \"c:\\temp\" mkdir c:\\temp\n"

其中引号被转义,或者更易读:

- |
  if not exist "c:\temp" mkdir c:\temp

Code Beautify YAML Validator抱怨你的YAML有问题,但是像往常一样无法处理纠正的YAML,所以不要使用它。