我们正在使用Amazon ECS提供服务。我们有一个名为application
的集群,在该集群中,我们有几个服务:
- dev_app
- dev_kafka
- dev_zookeeper
- qa_app
- qa_kafka
- qa_zookeeper
- etc.
服务从具有相关约束的任务定义中提取,即memberOf(attribute:env == qa), memberOf(attribute:role == zookeeper)
我们通过EC2启动配置+ Autoscaling Groups启动我们的实例。这意味着我们的服务现在无法实际自动扩展,因为实例在没有适当属性的情况下启动。我知道如何添加当前属性的唯一方法是等待将实例添加到application
群集,然后继续为每个实例手动添加自定义属性。
问题:我可以在启动时通过启动配置或其他方式以某种方式添加实例属性吗?
我找到了modify-instance-attribute
,但这似乎只适用于现有属性,而不是自定义属性。我也试过put-attributes
,但这似乎只对ECS资源有效(我的实例ARN显然无效)。
答案 0 :(得分:4)
使用"用户数据"在启动配置中。
echo ECS_INSTANCE_ATTRIBUTES={\"mycostomattr\":\"myvalue\"} >> /etc/ecs/ecs.config
请参阅http://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-config.html
答案 1 :(得分:0)
如果您希望在启动时传递值并执行在您的实例上安装软件包的特定功能,那么您可以通过用户数据执行此操作。当您定义自动缩放配置时,您可以在第三步指定输入它有用户数据文本输入框。
例如,下面的bash脚本作为用户数据输入,并在实例上安装Web服务器。
#!/bin/bash
yum update -y
yum install -y httpd24 php56 mysql55-server php56-mysqlnd
service httpd start
chkconfig httpd on
groupadd www
usermod -a -G www ec2-user
chown -R root:www /var/www
chmod 2775 /var/www
find /var/www -type d -exec chmod 2775 {} +
find /var/www -type f -exec chmod 0664 {} +
echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php
答案 2 :(得分:0)
如果我们正在使用集群名称之类的单个代理配置变量,那么我们在用户数据中使用以下语法。
var cb = this.byId('checkboxId');
if(cb.getProperty('selected')) {
// execute code
} else {
// do something else
}
但是,如果我们有多个变量要写入/etc/ecs/ecs.config,请使用以下格式。
#!/bin/bash
echo "ECS_CLUSTER=MyCluster" >> /etc/ecs/ecs.config
在cloudformation中,我们必须应用实例用户数据
#!/bin/bash
cat <<'EOF' >> /etc/ecs/ecs.config
ECS_CLUSTER=MyCluster
ECS_ENGINE_AUTH_TYPE=docker
ECS_LOGLEVEL=debug
EOF