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

如何用AWS SDK for Rust跨账号扮角色并按地域筛选EC2实例

问题:使用AWS SDK for Rust实现STS扮演角色并跨地域获取EC2实例

曾多次使用Python实现该功能,但在Rust中,从扮演角色的凭证创建客户端并按地域筛选EC2实例时遇到诸多困难。以下是可用的Python实现代码:

assumed_role_object = sts.assume_role(
    RoleArn=f"arn:aws:iam::{account}:role/role",
    RoleSessionName="lambdaSession"
)

# get regions using global assumed role credentials
ec2_client = boto3.client('ec2',
    aws_access_key_id=assumed_role_object['Credentials']['AccessKeyId'],
    aws_secret_access_key=assumed_role_object['Credentials']['SecretAccessKey'],
    aws_session_token=assumed_role_object['Credentials']['SessionToken'])
regions = [region['RegionName'] for region in ec2_client.describe_regions()['Regions']]

# for each region get ec2 instances
for region in regions:
    try:
        # try global sts with region filter
        filters = [{'Name':'region-name', 'Values':[region]}]
        ec2_response = ec2_client.describe_instances(Filters=filters)
    # Catch ClientError exception
    except botocore.exceptions.ClientError as _error:
        try: #try regional sts
            # create regional sts session
            sts_regional_client = boto3.client('sts', region_name=region)
            regional_assumed_role_object = sts_regional_client.assume_role(
                RoleArn=f"arn:aws:iam::{account}:role/role",
                RoleSessionName="regionallambdasession"
                )
            ec2_client = boto3.client(
                "ec2",
                region_name=region,
                aws_access_key_id=regional_assumed_role_object["Credentials"]["AccessKeyId"],
                aws_secret_access_key=regional_assumed_role_object["Credentials"]["SecretAccessKey"],
                aws_session_token=regional_assumed_role_object["Credentials"]["SessionToken"],
                )
            ec2_response = ec2_client.describe_instances()
            
        except botocore.exceptions.ClientError as _error2:
            print(f"skipping {region} bc of error {_error2}\n")
            continue

在Rust中,STS扮演角色功能无法正常工作,按地域筛选也存在问题,不过能够列出地域并进行遍历。以下是目前的Rust代码:

use aws_sdk_ec2 as ec2;
use ec2::{Client as Ec2Client, Error as Ec2Error, config::Region};
use aws_config::meta::Region;
use aws_config::meta::region::RegionProviderChain;
use aws_config::Region;

fn main(){
    let config = aws_config::load_from_env().await;

    // This might work - I need to get these credentials and list ec2 instances in this account
    let sts_client = StsClient::new(&config);
    let assume_role_response = sts_client.assume_role()
        .role_arn(format!("arn:aws:iam::{}:role/role", account_id))
        .role_session_name("inventorySession".to_string())
        .send()
        .await;
    
    // I want to use the assumed_role_response when creating this client
    let ec2_client = ec2::Client::new(&config);
    // get regions
    let regions = ec2_client.describe_regions().send().await;

    for region in regions?.regions(){
        let region_name = region.region_name().unwrap();
        println!("loop Region: {:?}", region_name);

        let region_provider = RegionProviderChain::first_try(Region::new(region_name.to_string()))
            .or_default_provider()
            .or_else(Region::new(region_name.to_string()));
        
        // This works - I'm able to create the region_provider
        println!(
            "Region:                    {}",
            region_provider.region().await.unwrap().as_ref()
        );
        
        // I want to use credentials from assumed_role_response and new region to create ec2_regional_config ???
        let new_config = config.region(Region::new(region_name.to_string())).unwrap();
        let ec2_regional_client = Ec2Client::new(&new_config); // This isn't using the region or the assumed_role credentials.
        
        let ec2_instances = ec2_regional_client
        .describe_instances()
        .send()
        .await;
        println!("{:?}", ec2_instances);
    }
}

最初使用rusoto crate完成了这些操作,但在apse4这个较新的地域上遇到错误——rusoto已不再维护,不会添加该地域的支持,因此转向AWS SDK for Rust,恳请熟悉该SDK的人士提供帮助。

内容的提问来源于stack exchange,提问作者mandypea

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 17:04:59