首页 > 解决方案 > 如何获取 Fargate ecs 容器的 TaskId

问题描述

类似于这个问题如何从 ECS 容器中获取任务 ID?但我想得到TaskId我的Fargate任务。你怎么能做到这一点?像其他人一样,我想要这个来记录信息。

我正在运行一个带有 ELK 堆栈的 Spring App 进行日志记录,如果可能的话,我希望将其包含TaskId在日志中。

编辑 我实际上从来没有让这个工作顺便说一句,这是我的代码:

    private String getTaskIdInternal() {

        String url = System.getenv("ECS_CONTAINER_METADATA_URI_V4") + "/task";

        logger.info("Getting ecsMetaDataURL={}", url);

        if (url == null) {
            throw new RuntimeException("ECS_CONTAINER_METADATA_URI_V4 env variable not defined");
        }

        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<JsonNode> response = restTemplate.getForEntity(url, JsonNode.class);

        logger.info("ecsMetaData={}", response);

        JsonNode map = response.getBody();

        String taskArn = map.get("TaskARN").asText();
        String[] splitTaskArn = taskArn.split("/");
        String taskId =  splitTaskArn[splitTaskArn.length - 1];
        logger.info("ecsTaskId={}", taskId);
        return taskId;
    }

但我总是得到这个堆栈跟踪:

Could not get the taskId from ECS. exception=org.springframework.web.client.HttpClientErrorException: 403 Forbidden
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:118)
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:103)
    at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:732)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:690)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:646)
    at org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:325)

标签: amazon-web-servicesamazon-ecsaws-fargate

解决方案


如果您尝试在 Fargate for ECS 中获取任务 ID,您可以使用元数据端点

假设您使用1.4.0的是 Fargate 版本,您可以通过对${ECS_CONTAINER_METADATA_URI_V4}/task.

来自此端点的示例响应如下

{
    "Cluster": "arn:aws:ecs:us-west-2:&ExampleAWSAccountNo1;:cluster/default",
    "TaskARN": "arn:aws:ecs:us-west-2:&ExampleAWSAccountNo1;:task/default/febee046097849aba589d4435207c04a",
    "Family": "query-metadata",
    "Revision": "7",
    "DesiredStatus": "RUNNING",
    "KnownStatus": "RUNNING",
    "Limits": {
        "CPU": 0.25,
        "Memory": 512
    },
    "PullStartedAt": "2020-03-26T22:25:40.420726088Z",
    "PullStoppedAt": "2020-03-26T22:26:22.235177616Z",
    "AvailabilityZone": "us-west-2c",
    "Containers": [
        {
            "DockerId": "febee046097849aba589d4435207c04aquery-metadata",
            "Name": "query-metadata",
            "DockerName": "query-metadata",
            "Image": "mreferre/eksutils",
            "ImageID": "sha256:1b146e73f801617610dcb00441c6423e7c85a7583dd4a65ed1be03cb0e123311",
            "Labels": {
                "com.amazonaws.ecs.cluster": "arn:aws:ecs:us-west-2:&ExampleAWSAccountNo1;:cluster/default",
                "com.amazonaws.ecs.container-name": "query-metadata",
                "com.amazonaws.ecs.task-arn": "arn:aws:ecs:us-west-2:&ExampleAWSAccountNo1;:task/default/febee046097849aba589d4435207c04a",
                "com.amazonaws.ecs.task-definition-family": "query-metadata",
                "com.amazonaws.ecs.task-definition-version": "7"
            },
            "DesiredStatus": "RUNNING",
            "KnownStatus": "RUNNING",
            "Limits": {
                "CPU": 2
            },
            "CreatedAt": "2020-03-26T22:26:24.534553758Z",
            "StartedAt": "2020-03-26T22:26:24.534553758Z",
            "Type": "NORMAL",
            "Networks": [
                {
                    "NetworkMode": "awsvpc",
                    "IPv4Addresses": [
                        "10.0.0.108"
                    ],
                    "AttachmentIndex": 0,
                    "IPv4SubnetCIDRBlock": "10.0.0.0/24",
                    "MACAddress": "0a:62:17:7a:36:68",
                    "DomainNameServers": [
                        "10.0.0.2"
                    ],
                    "DomainNameSearchList": [
                        "us-west-2.compute.internal"
                    ],
                    "PrivateDNSName": "ip-10-0-0-108.us-west-2.compute.internal",
                    "SubnetGatewayIpv4Address": ""
                }
            ]
        }
    ]
}

如您所见,您需要解析TaskARN以获取 TaskID(如果您用“/”分割,它是 ARN 的最后一部分。

亚马逊确实在应注意的文档中指定了以下内容。

对于使用 Fargate 启动类型和 1.4.0 之前的平台版本的任务,支持任务元数据版本 3 和 2 端点。有关详细信息,请参阅任务元数据端点版本 3任务元数据端点版本 2


推荐阅读