amazon-web-services - 如何获取 Fargate ecs 容器的 TaskId

标签 amazon-web-services amazon-ecs aws-fargate

与此问题类似 How to get Task ID from within ECS container?但我想得到 TaskId我的 Fargate任务。你怎么能做到这一点?像其他人一样,我希望用它来记录信息。
我正在运行带有 ELK 堆栈的 Spring 应用程序进行日志记录,如果可能的话,我希望包含 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)

最佳答案

如果您尝试在 Fargate for ECS 中获取任务 ID,您可以使用 metadata endpoints .
假设您使用的是版本 1.4.0 Fargate 您可以通过 http 请求获取此信息 ${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 的最后一部分。
亚马逊确实在应注意的文档中指定了以下内容。

For tasks using the Fargate launch type and platform versions prior to 1.4.0, the task metadata version 3 and 2 endpoint are supported. For more information, see Task Metadata Endpoint version 3 or Task Metadata Endpoint version 2.

关于amazon-web-services - 如何获取 Fargate ecs 容器的 TaskId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62989929/

相关文章:

node.js - 进程在请求完成之前退出

amazon-web-services - 使用 terraform 中的数据源为 aws 实例添加用户数据

amazon-web-services - AWS : Changing host port in EC2 based ECS task definition using new ECS Console

aws-cloudformation - 使用 EC2 而不是 FARGATE 启动类型启动容器

amazon-web-services - terraform 将敏感数据存储在状态文件中

amazon-web-services - Cloudformation 错误 - 遇到不受支持的属性 EFSVolumeConfiguration

java - 将资源文件捆绑到 ecs 集群上使用的 java app jar 文件中

amazon-web-services - ECS EC2 环境中的 AWS Java SDK 异步客户端

aws-api-gateway - 如何连接到 Fargate 上运行的 ECS 服务?

Terraform - 使用 efs 文件系统创建弹性容器服务 : check that your file system ID is correct