如何从ECS容器中获取任务ID?

时间:2018-02-16 03:52:59

标签: docker containers aws-sdk aws-ecs

您好我感兴趣的是从位于EC2主机内部的正在运行的容器内检索Task ID

AWS ECS documentation表示存在一个环境变量ECS_CONTAINER_METADATA_FILE,其中包含此数据的位置,但只有在创建集群/ EC2实例时ECS_ENABLE_CONTAINER_METADATA变量设置为true时才会设置/可用。我没有看到在aws控制台中可以做到这一点。

此外,文档声明可以通过在主机内部将其设置为true来完成此操作,但需要重新启动docker代理。

有没有其他方法可以做到这一点,而无需进入EC2来设置它并重新启动docker代理?

5 个答案:

答案 0 :(得分:2)

From the AWS ECS cli Documentation

命令:

aws ecs list-tasks --cluster default

输出:

{
    "taskArns": [
        "arn:aws:ecs:us-east-1:<aws_account_id>:task/0cc43cdb-3bee-4407-9c26-c0e6ea5bee84",
        "arn:aws:ecs:us-east-1:<aws_account_id>:task/6b809ef6-c67e-4467-921f-ee261c15a0a1"
    ]
}

列出特定容器实例上的任务

此示例命令使用容器实例UUID作为过滤器列出指定容器实例的任务。

命令:

aws ecs list-tasks --cluster default --container-instance f6bbb147-5370-4ace-8c73-c7181ded911f

输出:

{
    "taskArns": [
        "arn:aws:ecs:us-east-1:<aws_account_id>:task/0cc43cdb-3bee-4407-9c26-c0e6ea5bee84"
    ]
}

答案 1 :(得分:2)

以前的答案是正确的,这是另一种方法:

在运行容器的ec2实例中,运行此命令

curl http://localhost:51678/v1/tasks | python -mjson.tool |less

enter image description here

enter image description here

答案 2 :(得分:2)

这不再适用于新的Amazon ECS容器版本,实际上,它现在更加简单,并且默认情况下也已启用。请参阅this docu,但这是 TL; DR

如果您使用的是Amazon ECS容器代理版本 1.39.0 及更高版本,则可以在docker容器内执行此操作:

curl -s "$ECS_CONTAINER_METADATA_URI_V4/task" \
  | jq -r ".TaskARN" \
  | cut -d "/" -f 3

这是container agent releases的列表,但是如果您使用的是:latest –您肯定可以。

答案 3 :(得分:1)

我使用的技术是在容器定义中设置环境变量。

如果您正在管理任务via Cloudformation,相关的yaml就是这样:

  Taskdef:
    Type: AWS::ECS::TaskDefinition
    Properties:
      ...
      ContainerDefinitions:
        - Name: some-name
          ...
          Environment:
            - Name: AWS_DEFAULT_REGION
              Value: !Ref AWS::Region
            - Name: ECS_ENABLE_CONTAINER_METADATA
              Value: 'true'

这项技术可以帮助您保持一切简单和可重复。

如果您需要以编程方式获取元数据且无权访问元数据文件,则可以查询the agent's metadata endpoint

curl http://localhost:51678/v1/metadata

请注意,如果您将此信息作为正在运行的任务获取,则可能无法连接到环回设备,但您可以连接到EC2实例自己的IP地址。

答案 4 :(得分:1)

我们使用所谓的用户数据进行设置,这些数据在机器启动时执行。有多种设置方法,例如:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html#user-data-console

它看起来像这样:

#!/bin/bash

cat <<'EOF' >> /etc/ecs/ecs.config
ECS_CLUSTER=ecs-staging
ECS_ENABLE_CONTAINER_METADATA=true
EOF

重要:调整上方的ECS_CLUSTER以匹配您的集群名称,否则实例将不会连接到该集群。