Как получить публичный ip из сетевого интерфейса, подключенного к задаче ECS с помощью boto3
Мне нужно немного помощи здесь.
Я пытаюсь получить публичный IP-адрес из сетевого интерфейса с помощью boto3, по какой-то причине я получаю следующую ошибку:
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 ответа
Я мог бы решить это! Вот код:
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'
Я не думаю, что вы можете сделать это исключительно с помощью boto3 (Edit: OP доказал обратное!), Поэтому, если у вас нет необходимости использовать его, используйте сервис метаданных.
Документы AWS сообщат вам, что нужно вызвать службу метаданных из контейнера и проанализировать ответ json для общедоступного IP-адреса. Документация здесь. Примечание. Классическая версия ECS имеет другую конечную точку метаданных, когда версия ecs-agent < 1.17.0.
Примерно так должно работать внутри контейнера в 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