Python脚本无法正确返回AWS各账户EC2实例ID求助
问题分析与解决
你遇到的核心问题是:生成了STS跨账户凭证,但没有将其用于创建EC2客户端,你始终在使用脚本开头初始化的client——这个客户端用的是你本地默认的AWS身份凭证,而非切换到目标账户后的STS凭证,所以调用describe_instances只会返回当前默认账户的实例(如果默认账户没有实例,就会返回空的Reservations)。
修正后的代码
下面是调整后的完整代码,我会加上关键注释说明改动点:
import boto3 import nwmaws def get_sts_token(**kwargs): role_arn = kwargs['RoleArn'] region_name = kwargs['RegionName'] sts = boto3.client( 'sts', region_name=region_name, ) token = sts.assume_role( RoleArn=role_arn, RoleSessionName='GetInstances', DurationSeconds=900, ) return token["Credentials"] def get_all_instances(): # 遍历每个目标账户 for account in nwmaws.Accounts().list(): account_id = account.account_id # 修正ARN里的空格问题(如果你的角色名确实带空格可以改回) role_arn = f"arn:aws:iam::{account_id}:role/ADFS-GlobalAdmins" # 获取目标账户的STS凭证 sts_creds = get_sts_token(RoleArn=role_arn, RegionName="us-east-1") # 关键:使用STS凭证创建新的EC2客户端,而非全局默认client ec2_client = boto3.client( 'ec2', region_name="us-east-1", aws_access_key_id=sts_creds['AccessKeyId'], aws_secret_access_key=sts_creds['SecretAccessKey'], aws_session_token=sts_creds['SessionToken'] ) # 调用接口获取实例数据 response = ec2_client.describe_instances() # 提取实例ID并按你想要的格式输出 for reservation in response['Reservations']: for instance in reservation['Instances']: print(instance['InstanceId']) get_all_instances()
关键改动说明
- 移除了全局的
client变量,改为在每个账户循环内基于STS凭证创建专属的EC2客户端,确保请求使用的是目标账户的权限 - 添加了从响应层级中提取
InstanceId的逻辑,直接输出你需要的格式 - 修正了ARN中的空格问题(原代码
ADFS- GlobalAdmins多了空格,若你的角色名确实包含空格可自行改回)
额外提示
如果你的EC2实例分布在多个AWS区域,可添加区域列表,循环调用不同区域的EC2客户端来覆盖所有实例。
内容的提问来源于stack exchange,提问作者dmn0972
相关产品推荐
相关产品推荐

