获取AWS Fargate下任务的服务名称 [英] Get service Name of Task under aws fargate

查看:13
本文介绍了获取AWS Fargate下任务的服务名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

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

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

工作很好,只是看起来像是一条超级迂回的道路!我只是想知道有没有更简单的方法来获取这一信息。

推荐答案

下面是一个包含两个步骤的C#示例。它从元数据中获取taskARN以检索任务描述,然后读取其Group属性,该属性包含服务的名称。它使用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();
    }

这篇关于获取AWS Fargate下任务的服务名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆