aws fargate下获取服务Name of Task

Get service Name of Task under aws fargate

我们需要获取运行 fargate 任务的服务名称,以便我们可以针对每个服务执行一些配置(我们为每个客户提供一项服务,并使用服务名称来识别它们)。

通过了解集群的服务发现命名空间和任务 IP 地址,我们可以通过执行以下操作找到服务。

  1. 获取任务 ip 地址,通过调用 http://169.254.170.2/v2/metadata 端点或使用我后续回答中的 ECS_ENABLE_CONTAINER_METADATA 方法。
  2. 我们调用集群命名空间 AWS.ServiceDiscovery.listNamespaces 从那里我们提取名称空间 ID。
  3. 我们将其传递给 AWS.ServiceDiscovery.listServices
  4. 我们将每个服务的id传递给AWS.ServiceDiscovery.listInstances
  5. 我们平面映射其结果并寻找与我们上面的 IP 地址匹配的实例。

瞧!该记录为我们提供了服务名称。

很好用,就是超级迂回啊!我只是想知道是否有一些更短的方法来获取这些信息。

您可以从任务定义的 startedBy 属性 中获取服务名称。使用 boto sdk,您可以调用 describe_tasks(或 aws-cli 中的等效项:aws ecs describe-tasks),这将提供

'startedBy': 'string'

The tag specified when a task is started. If the task is started by an Amazon ECS service, then the startedBy parameter contains the deployment ID of the service that starts it.

发件人:

希望对您有所帮助。

如果您在任务中设置了 ECS_ENABLE_CONTAINER_METADATA 环境变量,上述答案需要阅读出现的容器元数据。那么工作流程是:

  1. 读取容器元数据文件ecs-container-metadata.json获取taskArn
  2. 调用aws.ecs.describe-tasks函数获取startedBy属性
  3. 致电aws.servicediscover.get-service.

两步而不是三步,如果您不算读取元数据文件的话。更好,可以肯定的是,但我可能暂时不会改变我们做这件事的方式。

这是一个分两步运行的 C# 示例。它从元数据中获取 taskARN 以检索任务描述,然后读取其组 属性,其中包含服务名称。它使用 AWSSDK.ECS 获取任务描述并使用 Newtonsoft.Json 解析 JSON.

    private static string getServiceName()
    {
        // secret keys, should be encoded in license configuration object
        var ecsClient = new AmazonECSClient( ACCESS_KEY, SECRET_KEY );
        var request = new DescribeTasksRequest();
        // need cluster here if not default
        request.Cluster = NAME_OF_CLUSTER;
        request.Tasks.Add( getTaskArn() );
        var asyncResponse = ecsClient.DescribeTasksAsync( request );
        // probably need this synchronously for application to proceed
        asyncResponse.Wait();
        var response = asyncResponse.Result;
        string group = response.Tasks.Single().Group;
        // group returned in the form "service:[NAME_OF_SERVICE]"
        return group.Remove( 0, 8 );
    }

    private static string getTaskArn()
    {
        // special URL for fetching internal Amazon information for ECS instances
        string url = @"http://169.254.170.2/v2/metadata";
        string metadata = getWebRequest( url );
        // use JObject to read the JSON return
        return JObject.Parse( metadata )[ "TaskARN" ].ToString();
    }

    private static string getWebRequest( string url )
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create( url );
        request.AutomaticDecompression = DecompressionMethods.GZip;
        using HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        using Stream stream = response.GetResponseStream();
        using StreamReader reader = new StreamReader( stream );
        return reader.ReadToEnd();
    }