首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用命令行工具检索fargate任务的公网IP?

问如何使用命令行工具检索fargate任务的公网IP?
EN

Stack Overflow用户
提问于 2018-03-19 08:07:59
回答 4查看 14.7K关注 0票数 22

我有一个运行服务的集群,并且还能够从命令行启动fargate任务。我可以获得taskArn作为启动任务的响应,并且可以使用"aws ecs wait“等待任务处于运行状态。我被困在如何获取任务的公有IP上。我可以很容易地通过网页找到它,并可以通过它的公共IP访问机器…

如何通过CLI接口获取fargate任务的公网IP?

我正在使用以下命令启动任务,等待它运行并检索任务描述:

代码语言:javascript
复制
$ aws ecs run-task --launch-type FARGATE --cluster xxxx --task-definition xxxx --network-configuration xxxx
$ aws ecs wait <taskArn>
$ aws ecs describe-tasks --cluster xxxx --task <taskArn> | grep -i ipv4

最后一条命令只给了我内网IP...

代码语言:javascript
复制
"privateIpv4Address": "10.0.1.252",
"name": "privateIPv4Address"

我也尝试过使用:

代码语言:javascript
复制
$ ecs-cli ps --cluster xxxx

但是Ports列是空白的。

代码语言:javascript
复制
Name                                       State    Ports  TaskDefinition
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxxx  RUNNING         xxxx:1
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxxx  RUNNING         xxxx:1
EN

回答 4

Stack Overflow用户

发布于 2018-03-19 08:19:30

一旦我意识到describe-tasks给了我弹性网卡id和内网IP,我就可以通过以下方式获取公网IP:

代码语言:javascript
复制
$ aws ec2 describe-network-interfaces --network-interface-ids eni-xxxxxxxx
票数 23
EN

Stack Overflow用户

发布于 2020-05-12 16:31:41

这是特定于我的用例的,但可能对其他人有用(打算在运行ecs.createService()之后在Lambda中作为javascript运行)

是的,我知道这个主题是针对CLI的,但这是在查找"Fargate public IP“时弹出的第一个结果,而我正在寻找基于javascript的解决方案。

代码语言:javascript
复制
// get container IP
getContainerIP(myServiceName).then(ip=>{
    console.log("Container IP address is: ", ip);

}).catch(err=>{
    console.log(err);
});



function getContainerIP(servicename){
    // note: assumes that only 1 task with 1 container is in the provided service, and that a container only has 1 network interface

    return new Promise(function(resolve, reject){
      // get task arns (needs a delay because we just launched it)
      setTimeout(getTasks, 6000);

      // get task arns
      function getTasks(){
        ecs.listTasks({
          cluster: process.env.ecs_cluster,
          launchType: "FARGATE",
          serviceName: servicename
        },function(err, res){
          if(err){
            reject("Unable to get task list");
            return;
          }

          // loop until we have a result
          if(!res.taskArns.length){
            setTimeout(getTasks, 2000);
            return;
          }

          // get details
          getTaskDetails(res.taskArns);
        });
      }

      // get the details of the task (we assume only one task because that's how its configured)
      function getTaskDetails(taskArns){
        ecs.describeTasks({
          cluster: process.env.ecs_cluster,
          tasks: taskArns
        },function(err,res){
          if(err){
            reject("Unable to get task details");
            return;
          }

          // no results
          if(!res.tasks.length || !res.tasks[0].attachments.length){
            reject("No tasks available");
            return;
          }

          // network needs to be in status ATTACHING to see the eni, else wait
          if(res.tasks[0].attachments[0].status !== "ATTACHING"){
            setTimeout(function(){ getTaskDetails(taskArns); }, 2000);
            return;
          }

          // get network ID from result
          let eni = "";
          for(let i in res.tasks[0].attachments[0].details){
            if(!res.tasks[0].attachments[0].details.hasOwnProperty(i)) continue;
            if(res.tasks[0].attachments[0].details[i].name !== "networkInterfaceId") continue;

            // get the eni
            eni = res.tasks[0].attachments[0].details[i].value;
            break;
          }

          // no eni
          if(eni === ""){
            reject("Unable to retrieve container ENI");
            return;
          }

          // get network details
          getNetworkDetails(eni);
        });
      }

      // get network details
      function getNetworkDetails(eni){

        // get the ENI details
        ec2.describeNetworkInterfaces({
          NetworkInterfaceIds: [eni]
        }, function(err, res) {
          if(err){
            reject("Unable to retrieve ENI details");
            return;
          }

          // confirm available data
          if(!res.NetworkInterfaces.length || typeof res.NetworkInterfaces[0].Association === "undefined" || typeof res.NetworkInterfaces[0].Association.PublicIp === "undefined"){
            reject("Unable to retrieve IP from ENI details");
            return;
          }

          // resolve the public IP address
          resolve(res.NetworkInterfaces[0].Association.PublicIp);
        });
      }
    });
}
票数 5
EN

Stack Overflow用户

发布于 2021-08-01 03:20:00

您可以使用这样的脚本。

代码语言:javascript
复制
SERVICE_NAME="my-service"

TASK_ARN=$(aws ecs list-tasks --service-name "$SERVICE_NAME" --query 'taskArns[0]' --output text)
TASK_DETAILS=$(aws ecs describe-tasks --task "${TASK_ARN}" --query 'tasks[0].attachments[0].details')
ENI=$(echo $TASK_DETAILS | jq -r '.[] | select(.name=="networkInterfaceId").value')
IP=$(aws ec2 describe-network-interfaces --network-interface-ids "${ENI}" --query 'NetworkInterfaces[0].Association.PublicIp' --output text)

echo "$IP"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49354116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档