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






Для 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 Вы имеете в виду, что есть еще две учетные записи AWS, и учетная запись A собирает информацию об IP-адресах, связанных с учетной записью B?
Да, несколько учетных записей связаны вместе. Я бы хотел взять на себя роль, чтобы он мог сканировать все учетные записи.
Поздний ответ, но надеюсь, что это поможет. Фактически вы должны использовать 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')
Это может быть предпочтительнее, если, например, вам также нужно перебрать несколько регионов.
Есть ли способ взять на себя роль и сделать это в разных учетных записях?