Используйте Python и BOTO3 для вывода списка IP-адресов AWS и устройств

Я пытаюсь использовать Python и BOTO3 для перечисления IP-адресов всех устройств в AWS (ELB, EC2 и т. д.)

Мне удалось получить весь инвентарь, но как я могу взять на себя роль и указать только IP-адрес и устройство во всех моих связанных учетных записях AWS?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
2 481
2

Ответы 2

Для EC2 легко собрать частные / общедоступные IP-адреса, например:

EC2 - документация Boto 3 Docs 1.7.30

import boto3

ec2 = boto3.resource(service_name='ec2',
                     region_name='xxx',
                     aws_access_key_id='xxx',
                     aws_secret_access_key='xxx')

for i in ec2.instances.all():
    print(i.private_ip_address)
    print(i.public_ip_address)

Но вам нужно использовать ключ iam для EC2.

Есть ли способ взять на себя роль и сделать это в разных учетных записях?

user9877726 01.06.2018 16:50

@ user9877726 Вы имеете в виду, что есть еще две учетные записи AWS, и учетная запись A собирает информацию об IP-адресах, связанных с учетной записью B?

hiropon 01.06.2018 17:00

Да, несколько учетных записей связаны вместе. Я бы хотел взять на себя роль, чтобы он мог сканировать все учетные записи.

user9877726 04.06.2018 20:17

Поздний ответ, но надеюсь, что это поможет. Фактически вы должны использовать network_interfaces для получения IP-адресов для всех служб. Я запускаю аналогичный отчет, используя набор именованных профилей. Что-то вроде этого:

for profile in self.profiles:
    print(f'Analyzing {profile}...')
    session = boto3.Session(profile_name=profile)
    ec2 = session.resource('ec2')
    for eni in ec2.network_interfaces.all():
        attachment_info = 'No attachment'
        if eni.attachment:
            if 'InstanceId' in eni.attachment:
                attachment_info = eni.attachment['InstanceId']
            else:
                attachment_info = eni.attachment['InstanceOwnerId']

        row = (
            profile,
            eni.private_ip_address,
            eni.subnet_id,
            eni.subnet.cidr_block,
            attachment_info,
        )
        print(row)

Что касается роли между учетными записями, как вы можете видеть в коде, boto3 будет учитывать именованные профили в ~/.aws/config. См. https://docs.aws.amazon.com/cli/latest/userguide/cli-multiple-profiles.html

Однако вы также можете взять на себя роли непосредственно в своем коде с помощью такого кода:

sts = boto3.client('sts')
creds = sts.assume_role(
    RoleArn=f'arn:aws:iam::{acct_id}:role/{role_name}',
    RoleSessionName='...'
)
auth = {
    'aws_access_key_id': creds['Credentials']['AccessKeyId'],
    'aws_secret_access_key': creds['Credentials']['SecretAccessKey'],
    'aws_session_token': creds['Credentials']['SessionToken'],
}
session = boto3.Session(**auth)
ec2 = session.resource('ec2')

Это может быть предпочтительнее, если, например, вам также нужно перебрать несколько регионов.

Другие вопросы по теме