如何从 ECS 容器中获取任务 ID?
How to get Task ID from within ECS container?
您好,我有兴趣从位于 EC2 主机内部的 运行 容器中检索 Task ID
。
AWS ECS documentation 声明有一个环境变量 ECS_CONTAINER_METADATA_FILE
包含此数据的位置,但只有 set/available 如果 ECS_ENABLE_CONTAINER_METADATA
变量在 cluster/EC2 实例创建。我看不到在 aws 控制台中可以在哪里完成此操作。
此外,文档指出这可以通过在主机内部将其设置为 true 来完成,但需要重新启动 docker 代理。
有没有其他方法可以做到这一点,而不必进入 EC2 内部进行设置并重新启动 docker 代理?
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"
]
}
我要使用的技术是在容器定义中设置环境变量。
如果您正在管理任务 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 地址。
我们用所谓的用户数据来设置它,这些数据在机器启动时执行。有多种设置方式,例如: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
以匹配您的集群名称,否则实例将无法连接到该集群。
以前的答案是正确的,这是另一种方法:
从容器为 运行ning 的 ec2 实例,运行 此命令
curl http://localhost:51678/v1/tasks | python -mjson.tool |less
这不再适用于较新的 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
– 您绝对没问题。
您好,我有兴趣从位于 EC2 主机内部的 运行 容器中检索 Task ID
。
AWS ECS documentation 声明有一个环境变量 ECS_CONTAINER_METADATA_FILE
包含此数据的位置,但只有 set/available 如果 ECS_ENABLE_CONTAINER_METADATA
变量在 cluster/EC2 实例创建。我看不到在 aws 控制台中可以在哪里完成此操作。
此外,文档指出这可以通过在主机内部将其设置为 true 来完成,但需要重新启动 docker 代理。
有没有其他方法可以做到这一点,而不必进入 EC2 内部进行设置并重新启动 docker 代理?
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"
]
}
我要使用的技术是在容器定义中设置环境变量。
如果您正在管理任务 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 地址。
我们用所谓的用户数据来设置它,这些数据在机器启动时执行。有多种设置方式,例如: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
以匹配您的集群名称,否则实例将无法连接到该集群。
以前的答案是正确的,这是另一种方法:
从容器为 运行ning 的 ec2 实例,运行 此命令
curl http://localhost:51678/v1/tasks | python -mjson.tool |less
这不再适用于较新的 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
– 您绝对没问题。