我运行以下shell命令以在重新启动之前耗尽我的ECS实例:
INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id)
aws ecs update-container-instances-state \
--region eu-central-1 \
--cluster mycluster \
--status DRAINING \
--container-instances $INSTANCE_ID
它给了我以下错误:
调用UpdateContainerInstancesState操作时发生错误(InvalidParameterException):instanceId短于36。
显然这是因为它想要与ec2InstanceId不同的ECS containerInstanceId。找出本地机器的containerInstanceId的最佳方法是什么?
到目前为止我想出的方式是
aws ecs list-container-instances
获取群集中的所有容器实例ID aws ecs describe-container-instances
获取相应的EC2实例ID http://169.254.169.254/latest/meta-data/instance-id
)查找本地EC2实例ID jq
结合grep
或其他工具过滤这看起来有点复杂。有更简单的方法吗?
答案 0 :(得分:2)
另一个选择是在包含实例ID的实例上填充自定义属性。例如,在您的 /etc/ecs/ecs.config 中,您可能具有以下内容:
ECS_INSTANCE_ATTRIBUTES={\"ec2_instance\":\"i-0000000000000000000\"}
然后可以将其与 list-container-instances 的-filter 参数一起使用,以找到关联的容器实例。
aws ecs list-container-instances --cluster <MY Cluster> --filter attribute:ec2_instance==i-0000000000000000000
如果您使用 cfn-init 脚本和CloudFormation,则在创建EC2实例时可以自动执行此操作。
....
MyLaunchConfiguration:
Type: AWS::AutoScaling::LaunchConfiguration
Metadata:
AWS::CloudFormation::Init:
config:
commands:
00_configure_ecs_agent:
command: |
#!/bin/bash
echo ECS_INSTANCE_ATTRIBUTES={\"ec2_instance\":\"$(wget -q -O - http://169.254.169.254/latest/meta-data/instance-id)\"} >> /etc/ecs/ecs.config
...
参考文献:
答案 1 :(得分:1)
如果您在实例上运行脚本,则可以从ECS代理introspection API中找到容器实例ID。
如果您在ECS任务中运行脚本,则可以使用container metadata file。
答案 2 :(得分:0)
在安装jq的情况下,这很简单。
使用ECS Container Introspection端点,您将获得这些值并将其传递给aws ecs update-container-instances-state
命令。
在user data中执行此操作并将结果添加到/etc/environment
中,这样始终可以随时使用它们。
#!/usr/bin/env bash
set -euo pipefail
CONTAINER_INSTANCE_ARN="$(curl -s --fail http://localhost:51678/v1/metadata | jq -er '.ContainerInstanceArn')"
CLUSTER="$(curl -s --fail http://localhost:51678/v1/metadata | jq -er '.Cluster')"
aws ecs update-container-instances-state --cluster "$CLUSTER" \
--container-instances "$CONTAINER_INSTANCE_ARN" --status "DRAINING"
通过用户数据将其添加到/etc/environment
:
cat<<-EOF>>/etc/environment
CONTAINER_INSTANCE_ARN="$(curl -s --fail http://localhost:51678/v1/metadata | jq -er '.ContainerInstanceArn')"
CLUSTER="$(curl -s --fail http://localhost:51678/v1/metadata | jq -er '.Cluster')"
EOF
source /etc/environment
注意:
-e
标志的意思是如果找不到密钥,则设置退出代码。-r
标志意味着将输出转储为原始文本而不是json。