[英]When terraform applies aws_spot_fleet_request, how can I retrieve the private ip addresses?
[英]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.