Mik*_* N. 8 amazon-web-services aws-fargate
我有一个运行服务的集群,也能够从命令行启动Fargate任务。我可以获取taskArn作为启动任务的响应,并且可以使用“ aws ecs wait”来等待任务处于运行状态。我一直在努力弄清楚如何获取任务的公共IP。我可以很容易地通过网页找到它,并且可以通过其公共IP访问机器。
如何使用CLI界面获取Fargate任务的公共IP?
我正在使用以下命令来启动任务,等待它运行并检索任务描述:
$ 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
Run Code Online (Sandbox Code Playgroud)
最后一条命令只给了我私有IP ...
"privateIpv4Address": "10.0.1.252",
"name": "privateIPv4Address"
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用:
$ ecs-cli ps --cluster xxxx
Run Code Online (Sandbox Code Playgroud)
但是“端口”列为空白。
Name State Ports TaskDefinition
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxxx RUNNING xxxx:1
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxxx RUNNING xxxx:1
Run Code Online (Sandbox Code Playgroud)
Ste*_*hen 10
您可以使用这样的脚本。
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"
Run Code Online (Sandbox Code Playgroud)
一旦我意识到描述任务为我提供了ENI ID以及私有IP,我便可以通过以下方式获得公共IP:
$ aws ec2 describe-network-interfaces --network-interface-ids eni-xxxxxxxx
Run Code Online (Sandbox Code Playgroud)
小智 5
这是特定于我的用例,但也许对其他人有用(旨在在您运行 ecs.createService() 之后在 Lambda 中作为 javascript 运行)
是的,我知道这个主题是针对 CLI 的,但这是在寻找“Fargate 公共 IP”时出现的第一个结果,我正在寻找基于 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);
});
}
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4119 次 |
| 最近记录: |