根据official CF/ECS documentation,ECS群集资源完全不使用任何参数(!)。
但是,当通过AWS控制台设置集群时,有一个定义的几个(而且很关键!)参数(例如,实例数,实例类型等)
如何通过CloudFormation正确定义集群?
为什么此资源上的CF和控制台之间存在如此巨大的差异?
答案 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::TaskDefinition
和AWS::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来实现。