如何使用Boto3从连接到ECS任务的网络接口获取公共IP

时间:2018-07-11 02:45:06

标签: python boto3 aws-ecs aws-fargate

我需要一些帮助。

由于某种原因,我正在尝试使用boto3从网络接口获取公共IP,

ec2 = boto3.resource('ec2')
nia = ec2.NetworkInterfaceAssociation('eni-r2d2')
nia.id  # I can obtain the id without any issue
# 'eni-r2d2'
nia.public_ip
# /usr/local/lib/python3.6/site-packages/boto3/resources/factory.py in property_loader(self)
#     343                             self.__class__.__name__))
#     344
# --> 345             return self.meta.data.get(name)
#     346
#     347         property_loader.__name__ = str(snake_cased)
# 
# AttributeError: 'NoneType' object has no attribute 'get'

注意:网络接口属于 ECS任务,启动类型为 FARGATE ,网络模式为 awsvpc 。 有人可以帮我吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

我可以解决!这是代码:

import boto3

session = boto3.Session(
  aws_access_key_id='...',
  aws_secret_access_key='...',
  region_name='...',
)
ec2 = session.client('ec2')
response = ec2.describe_network_interfaces(
    NetworkInterfaceIds=['eni-r2d2'],
)
interface = response['NetworkInterfaces'][0]
interface['Association']['PublicIp']
# '1.2.3.4'

答案 1 :(得分:1)

我不认为您可以仅使用boto3来做到这一点(编辑:否则证明OP!),因此除非您有使用要求,否则请使用元数据服务。

AWS文档将告诉您从容器内调用元数据服务,并解析公共IP的json响应。 Documentation here。注意当ecs-agent版本<1.17.0时,ECS“经典”具有不同的元数据终结点。

类似的事情应该在Fargate的容器内部起作用:

import requests

try:
    response = requests.get('http://169.254.170.2/v2/metadata').json()  
    for container in response.get('Containers', []):
        if 'Networks' in container:
            for network in container.get('Networks', []):
                if 'IPv4Addresses' in network:
                    for ipv4address in network.get('IPv4Addresses', []):
                        print ipv4address # or do something else
except requests.exceptions.RequestException:
    # parse the smoldering remains of the response object