我们需要获取运行Fargate任务的服务名称,以便我们可以针对每个服务配置执行一些操作(我们为每个客户提供一项服务,并使用服务名称进行标识)。我们正在使用ECS服务发现,该任务可以通过调用http://169.254.170.2/v2/metadata端点来获取其私有IP地址。
通过了解集群的服务发现名称空间和任务IP地址,我们可以通过执行以下操作找到服务。
With the cluster namespace we call AWS.ServiceDiscovery.listNamespaces
From there we extract the nameSpace id.
We pass that to AWS.ServiceDiscovery.listServices
We pass the id of each service to AWS.ServiceDiscovery.listInstances
We flat map the results of that and look for an instance that matches our IP address above.
Voilà!该记录为我们提供了服务名称。
做得很好,这似乎是一条超级circuit回的道路!我只是想知道获取这些信息是否有更短的途径。
答案 0 :(得分:1)
您可以从任务定义的startedBy属性获取服务名称。使用boto sdk,您可以调用describe_tasks(或aws-cli中的等效命令:aws ecs describe-tasks),它将提供
'startedBy':'字符串'
启动任务时指定的标签。如果该任务是由Amazon ECS服务启动的,则startsBy参数包含启动该任务的服务的部署ID。
发件人:
希望有帮助。
答案 1 :(得分:1)
这是一个分两步运行的 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();
}
答案 2 :(得分:0)
以上答案要求阅读在任务中设置ECS_ENABLE_CONTAINER_METADATA环境变量时显示的容器元数据。工作流程如下:
如果不计入读取元数据文件的时间,则由两个步骤而不是三个步骤组成。可以肯定,这是更好的选择,但是我现在可能不会改变我们的做事方式。