如何获取本地ec2实例的container-instance-id

时间:2018-05-07 12:20:38

标签: amazon-web-services amazon-ec2 aws-cli amazon-ecs

我运行以下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的最佳方法是什么?

到目前为止我想出的方式是

  1. 使用aws ecs list-container-instances获取群集中的所有容器实例ID
  2. 使用aws ecs describe-container-instances获取相应的EC2实例ID
  3. 使用实例元数据(http://169.254.169.254/latest/meta-data/instance-id)查找本地EC2实例ID
  4. 使用jq结合grep或其他工具过滤
  5. 这看起来有点复杂。有更简单的方法吗?

3 个答案:

答案 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

注意:

  • jq -e标志的意思是如果找不到密钥,则设置退出代码。
  • jq -r标志意味着将输出转储为原始文本而不是json。
相关问题