无法通过cloudformation yaml创建AWS :: ECS :: Service,模型验证失败

时间:2020-10-07 14:55:07

标签: amazon-cloudformation amazon-ecs

在通过Cloudformation创建AWS::ECS::Service的过程中,出现错误:Model validation failed

该错误与#HealthCheckGracePeriodSeconds和其他一些属性有关。错误详细信息为:expected type: Number, found: String

在yaml中,它已经是一个数字。我不清楚发生了什么问题。已经尝试将其声明为字符串或类型为Number的参数。

我需要一些提示,因为此时我陷入困境。

错误是:

Model validation failed 
    (
    #/HealthCheckGracePeriodSeconds: expected type: Number, found: String 
    #/DesiredCount: expected type: Number, found: String 
    #/DeploymentConfiguration/MaximumPercent: expected type: Number, found: String 
    #/DeploymentConfiguration/MinimumHealthyPercent: expected type: Number, found: String
    )

template.yaml中的定义是:

ServiceDefinition:
  Type: AWS::ECS::Service
  Properties:
    ServiceName: !Ref ServiceName
    Cluster: !Ref ClusterName
    TaskDefinition: !Ref TaskDefinition
    DeploymentConfiguration:
      MinimumHealthyPercent: 100
      MaximumPercent: 200
    DesiredCount: 1
    HealthCheckGracePeriodSeconds: 60
    LaunchType: FARGATE
    NetworkConfiguration:
      AwsVpcConfiguration:
        AssignPublicIP: ENABLED
        SecurityGroups: !FindInMap [Env2SecurityGroups, !Ref AWS::AccountId, securitygroup]
        Subnets: !FindInMap [Env2PublicSubnets, !Ref AWS::AccountId, subnets]

1 个答案:

答案 0 :(得分:2)

该错误是由于SecurityGroupsSubnets导致格式错误而引起的。

要提取subnetssecuritygroups,使用了FindInMap函数。此结果必须是列表。这可以使用Split函数来实现。

不幸的是,格式错误会导致完全错误的错误消息。

声明这样的映射:

Mappings
  Env2SecurityGroups:
    '111111111111':
      securitygroup: 'sg-1111111111111111'
    '222222222222':
      securitygroup: 'sg-2222222222222222'
    '333333333333':
      securitygroup: 'sg-3333333333333333'

  Env2PublicSubnets:
    '111111111111':
      subnets: subnet-1111111111111111,subnet-22222222222222222,subnet-33333333333333333
    '222222222222':
      subnets: subnet-1111111111111111,subnet-22222222222222222,subnet-33333333333333333
    '333333333333':
      subnets: subnet-1111111111111111,subnet-22222222222222222,subnet-33333333333333333

!Split!FindInMap结合使用以获得列表:

SecurityGroups: !Split [",", !FindInMap [ Env2SecurityGroups, !Ref AWS::AccountId, securitygroup] ]
Subnets: !Split [",", !FindInMap [ Env2PublicSubnets, !Ref AWS::AccountId, subnets] ]