17

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

AWS ECS 文档指出有一个包含此数据位置的环境变量,但只有在创建集群/EC2 实例时变量设置为 true 时ECS_CONTAINER_METADATA_FILE才会设置/可用。ECS_ENABLE_CONTAINER_METADATA我看不到可以在 aws 控制台中完成此操作的位置。

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

有没有其他方法可以做到这一点,而不必进入 EC2 内部进行设置并重新启动 docker 代理?

4

5 回答 5

11

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

如果您通过 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'

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

如果您以编程方式需要元数据并且无权访问元数据文件,则可以查询代理的元数据端点

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

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

于 2018-06-11T22:39:39.887 回答
9

这不再适用于较新的 Amazon ECS 容器版本,事实上它现在更简单并且默认启用。请参阅此文档,但这里有一个TL;DR

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

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

这是一个容器代理版本列表,但如果你正在使用:latest- 你肯定没问题。

于 2020-11-24T17:06:19.800 回答
5

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

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

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

在此处输入图像描述

在此处输入图像描述

于 2018-07-31T17:15:42.577 回答
3

来自 AWS ECS cli 文档

命令:

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"
    ]
}
于 2018-02-16T14:41:25.450 回答
3

我们用所谓的用户数据设置它,这些数据在机器启动时执行。有多种设置方法,例如: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以上内容以匹配您的集群名称,否则实例将无法连接到该集群。

于 2018-07-24T15:34:17.717 回答