Поздний ответ, но надеюсь, что это полезно.На самом деле вы должны использовать 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')
Это может быть предпочтительным, если, например, вам также необходимоцикл по нескольким регионам.