繁体   English   中英

如何从 AWS ECS 上的容器中检索私有 IP?

[英]How can I retrieve private IP from a container on AWS ECS?

我正在尝试从 AWS ECS 上的容器中检索私有 IP,我正在使用 python 和 boto3 来完成这项工作。

那是我的代码:

import json
import boto3

def lambda_handler(event, context):
  client = boto3.client("ecs", region_name="sa-east-1")

  clusterArn='ANY ARN'

  tasks = client.list_tasks(cluster=clusterArn)

  containers = []
  for each in tasks['taskArns']:
      containers.append(each)
     
    
  resp = client.describe_tasks(cluster=clusterArn,tasks=containers)
  print(json.dumps(resp, indent=4, default=str, sort_keys=True))

描述任务为我返回来自容器的以下 IP:

{
"bindIP": "0.0.0.0",
"containerPort": 8080,
"hostPort": 8080,
"protocol": "tcp"
}

我已经尝试在 aws cli 上使用 ecs describe task,但它的响应相同。 是否有另一种方法可以使用 boto3 检索私有 ip?

谢谢,

在 EC2 上使用 ECS,您的任务将拥有您的 EC2 实例的 IP,然后将绑定一个可用端口。

您可以使用 ECS API 获取端口,但如果您的容器没有附加networkInterfaces接口,则需要 EC2 API 来获取 IP。

这是一个使用 cli 获取 IP 和任务端口的示例:

CLUSTER=your-cluster-name                                                                        
TASK_NAME=your-task-name

TASK_ARN=$(aws ecs list-tasks --service-name ${TASK_NAME} --query 'taskArns[0]' --output text --cluster ${CLUSTER})
CONTAINERS_DATA=$(aws ecs describe-tasks --task ${TASK_ARN} --cluster ${CLUSTER})

CONTAINER_ARN=$(echo $CONTAINERS_DATA | jq -r '.tasks[0].containerInstanceArn')
CONTAINER_PORTS=$(echo $CONTAINERS_DATA | jq '.tasks[0].containers[].networkBindings[].hostPort')

EC2_IID=$(aws ecs describe-container-instances --cluster ${CLUSTER} --container-instances ${CONTAINER_ARN} --output text --query 'containerInstances[0].ec2InstanceId')
TASK_IP=$(aws ec2 describe-instances --instance-id ${EC2_IID} --output text --query 'Reservations[0].Instances[0].PrivateIpAddress')

echo "Task IP: ${TASK_IP} | Task Ports: ${CONTAINER_PORTS}"
# Task IP: 10.24.35.188 | Task Ports: 49165

在 AWS IP 中,为网络接口提供了地址,这些地址将附加到正在运行的容器中。 所以你会想要获取容器的网络接口部分。

例子:

import boto3


def lambda_handler(event, context):
    client = boto3.client("ecs", region_name="sa-east-1")

    cluster_arn = '...'

    tasks = client.list_tasks(cluster=cluster_arn)
    task_arns = [arn for arn in tasks['taskArns']]
    
    resp = client.describe_tasks(cluster=cluster_arn, tasks=task_arns)
    for task in resp['tasks']:
        for container in task['containers']:
            private_ips = [interface['privateIpv4Address'] for interface in container['networkInterfaces']]
            print(f'{container["name"]}: {private_ips}')

它应该 output 是这样的:

nginx: ['10.0.0.49']
node: ['10.0.0.55']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM