You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:27:59