AWS Cloudformation:使用参数设置ECS集群

时间:2018-08-29 18:39:28

标签: amazon-web-services amazon-cloudformation amazon-ecs

根据official CF/ECS documentation,ECS群集资源完全不使用任何参数(!)。

但是,当通过AWS控制台设置集群时,有一个定义的几个(而且很关键!)参数(例如,实例数,实例类型等)

如何通过CloudFormation正确定义集群?

为什么此资源上的CF和控制台之间存在如此巨大的差异?

4 个答案:

答案 0 :(得分:1)

ECS集群只是ECS服务内部的逻辑命名空间。将要在其上运行任务的实际EC2实例并不由ECS本身管理,这些实例必须单独创建。

ECS控制台向导的作用是启动一个Cloudformation模板,该模板包含ECS集群定义和EC2实例。该模板包含您在控制台向导中看到的参数。

您也许可以重用此模板,否则可以使用如下所示的Cloudformation模板。这将使用Amazon ECS-optimized AMI,其中包含您需要的所有应用程序。

  AppServerLaunchConfig:
   Type: AWS::AutoScaling::LaunchConfiguration
   Properties:
     ImageId: "ami-c91624b0"
     # instance role must have permissions to join ECS cluster
     IamInstanceProfile: !Ref InstanceProfile
     KeyName: !Ref KeyName
     InstanceType: t2.micro
     SecurityGroups: [ !Ref InstanceSecurityGroup ]
     UserData:
       Fn::Base64: !Sub |
         #!/bin/bash
         # join cluster with this name
         echo ECS_CLUSTER=myclustername >> /etc/ecs/ecs.config           

   AppServerGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      MaxSize: 2
      MinSize: 0
      DesiredCapacity: 1
      LaunchConfigurationName: !Ref AppServerLaunchConfig
      VPCZoneIdentifier:
        - !Ref SomeSubnetId

   ECSCluster:
     Type: AWS::ECS::Cluster
     DependsOn: AppServerGroup
     Properties:
       ClusterName: myclustername

答案 1 :(得分:0)

在CF中,您有AWS::ECS::TaskDefinitionAWS::ECS::Service来照顾集群配置。请记住,AWS控制台是一种交互式工具,CF用于IaC

更新以解决OP引起的一些担忧

有些集群参数无法通过CF模板配置。 AWS::ECS::CLUSTER上的CF文档指出:

  

AWS :: ECS :: Cluster资源创建一个Amazon Elastic Container Service(Amazon ECS)集群。该资源没有属性。使用Amazon ECS容器代理连接到集群。有关更多信息,请参阅Amazon Elastic Container Service开发人员指南中的Amazon ECS容器代理。

答案 2 :(得分:0)

由此看来,考虑到AWS本身提供的一些reference templates,当通过AWS控制台完成时,集群引导过程是非常手动的,乏味的,基于一系列cfg-init / user-data脚本的易错,易维护且费力的过程。

答案 3 :(得分:0)

我同意,建立一个不是Amazon-Linux“魔术”发行版之一的ami是一件痛苦的事情。尽管我想出了以下片段,但可以在Ubuntu上使用(缩进可能不是100%准确)。

当然,省略号意味着模板的某些部分丢失了,但是无论如何您都应该得到图片。祝你好运!

Resources: MyCluster: Type: AWS::ECS::Cluster Properties: ClusterName: myCluster MyInstance: Type: AWS::EC2::Instance Metadata: AWS::CloudFormation::Init: config: files: # refer to # docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-config.html /etc/ecs/ecs.config: content: !Sub ... ECS_ENGINE_AUTH_TYPE=dockercfg ECS_ENGINE_AUTH_DATA=... ... ECS_CLUSTER=${MyCluster} commands: 01_ecs_agent_run: command: !Sub | docker run --name ecs-agent \ --detach=true \ --restart=on-failure:10 \ --volume=/var/run:/var/run \ --volume=/var/log/ecs/:/log \ --volume=/var/lib/ecs/data:/data \ --volume=/etc/ecs:/etc/ecs \ --net=host \ --env-file=/etc/ecs/ecs.config \ amazon/amazon-ecs-agent:latest Properties: ... UserData: Fn::Base64: !Sub | #!/bin/bash ... # install docker here # https://docs.docker.com/install/linux/docker-ce/ubuntu/ ... # follow the steps 1-7 from aws docs # https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-install.html; ... # install aws helpers apt-get install python-pip -y pip install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz ln -s /usr/local/init/ubuntu/cfn-hup /etc/init.d/cfn-hup systemctl enable cfn-hup /usr/local/bin/cfn-init --stack ${AWS::StackName} --resource MyInstance --region ${AWS::Region}

答案更新:

以上操作可以通过控制台在启动实例时添加UserData来实现。