boto3 как получить эластичный IP-адрес из экземпляра

Мне нужно сделать следующее:

У меня есть несколько экземпляров, содержащих определенный тег, мне нужно пройтись по этим экземплярам и для каждого экземпляра, содержащего этот определенный тег, если к этому экземпляру прикреплен эластичный IP-адрес, мне нужно пометить этот эластичный IP-адрес тем же тегом. Мой код следующий:

import boto3
import json

region_list = ['us-east-1']
session = boto3.Session(profile_name='default')

for region in region_list:
    ec2 = session.resource('ec2',region)
    client = boto3.client('ec2',region)
    # Retrieve instances that contain this specific tag
    instances = ec2.instances.filter(Filters=[{'Name':'tag:MyTargetTag', 'Values':['*']}])

    for instance in instances:
        for tag in instance.tags:
            if tag['Key'] == "MyTargetTag":
                MyTargetTag = tag['Value']
        ## check if this instance has an elasticip
        ## if it has, assign the value of MyTargetTag to it
        response = client.add_tags(
            ResourceArns=[
                #elasticip ip identifier of some sort,
            ],
            Tags=[
                {
                    'Key': 'MyTargetTag',
                    'Value': MyTargetTag
                },
            ]
        )

Я прочитал документы и видео, а что нет, но, честно говоря, я не совсем понимаю это, и я просто делаю пробы и ошибки без каких-либо успехов.


person Garo San    schedule 08.11.2018    source источник


Ответы (2)


Вы можете получить доступ к VPC или классическим эластичным IP-адресам на boto3.resource('ec2') ресурсах vpc_addresses и classic_addresses соответственно.

Если адреса связаны, они будут иметь атрибут instance_id. Вы сможете получить теги с ec2.Instance(address.instance_id).tags

Если вы хотите просмотреть все адреса, у клиента boto3.client('ec2') есть describe_addresses, который предоставит вам ту же информацию.

person Vince    schedule 09.11.2018

Адреса ElasticIP «связаны» с сетевым интерфейсом. У одного экземпляра может быть несколько сетевых интерфейсов, каждому из которых может быть назначен эластичный IP-адрес, а может и не быть.

В нем перечислены все ElasticIP, подключенные к любому из ваших экземпляров, например:

import boto3 
from pprint import pprint

ec2 = boto3.resource('ec2')

instances = ec2.instances.filter()
for instance in instances:
    for interface in instance.network_interfaces:
        if interface.association_attribute is not None:
            pprint (interface.association_attribute)

Однако я не вижу в boto3 какой-либо функциональности, которая позволяла бы вам возвращать ElasticIP как объект или применять к нему какие-либо теги. Это вполне возможно, так как вы можете сделать это через консоль, я просто не вижу функциональности в boto3.

person weegolo    schedule 09.11.2018