Rust AWS STS客户端库rusoto_sts的使用,rusoto_sts提供安全的AWS安全令牌服务(STS)API集成

Rusoto Sts

Rust SDK for AWS Security Token Service

您可能正在寻找:

  • Rusoto概述
  • Rusoto支持的AWS服务
  • API文档
  • 获取Rusoto帮助

要求

使用Rusoto需要Rust稳定版或测试版。夜间版经过测试,但不保证支持。可能支持旧版本。当前支持的Rust版本可以在Rusoto项目的travis.yml中找到。

在Linux上,如果使用native-tls功能,则需要OpenSSL。

安装

要在您的应用程序中使用rusoto_sts,请在Cargo.toml中添加它作为依赖项:

[dependencies]
rusoto_sts = "0.48.0"

Crate功能

  • native-tls - 使用平台特定的TLS实现。
  • rustls - 使用rustls TLS实现。
  • serialize_structs - 大多数操作输出结构体获得derive(Serialize)。
  • deserialize_structs - 大多数操作输入结构体获得derive(Deserialize)。

注意:默认情况下,crate将使用native-tls TLS实现。

贡献

参见CONTRIBUTING。

许可证

Rusoto根据MIT许可证条款分发。

有关详细信息,请参见LICENSE。

完整示例代码:

use rusoto_core::Region;
use rusoto_sts::{Sts, StsClient, GetCallerIdentityRequest};

#[tokio::main]
async fn main() {
    // 创建STS客户端
    let client = StsClient::new(Region::UsEast1);
    
    // 创建获取调用者身份请求
    let request = GetCallerIdentityRequest {};
    
    // 发送请求并获取响应
    match client.get_caller_identity(request).await {
        Ok(output) => {
            println!("用户ID: {:?}", output.user_id);
            println!("账户: {:?}", output.account);
            println!("ARN: {:?}", output.arn);
        }
        Err(error) => {
            println!("错误: {}", error);
        }
    }
}

Cargo.toml配置:

[dependencies]
rusoto_sts = "0.48.0"
rusoto_core = "0.48.0"
tokio = { version = "1", features = ["full"] }

基于上述内容,以下是一个完整的Rusoto STS使用示例:

// 导入必要的模块和结构体
use rusoto_core::Region;
use rusoto_sts::{Sts, StsClient, GetCallerIdentityRequest};

// 使用tokio异步运行时
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建STS客户端实例,指定AWS区域
    let sts_client = StsClient::new(Region::UsEast1);
    
    // 创建获取调用者身份请求对象
    let request = GetCallerIdentityRequest {};
    
    // 发送请求并处理响应
    match sts_client.get_caller_identity(request).await {
        Ok(response) => {
            // 成功获取响应,输出用户信息
            println!("用户ID: {:?}", response.user_id.unwrap_or_default());
            println!("账户: {:?}", response.account.unwrap_or_default());
            println!("ARN: {:?}", response.arn.unwrap_or_default());
        }
        Err(e) => {
            // 处理错误情况
            eprintln!("获取调用者身份时发生错误: {}", e);
            return Err(Box::new(e));
        }
    }
    
    Ok(())
}

对应的Cargo.toml配置:

[package]
name = "rusoto_sts_example"
version = "0.1.0"
edition = "2021"

[dependencies]
rusoto_sts = "0.48.0"    # AWS STS服务客户端
rusoto_core = "0.48.0"   # Rusoto核心库
tokio = { version = "1", features = ["full"] }  # 异步运行时

1 回复

Rust AWS STS客户端库rusoto_sts使用指南

概述

rusoto_sts是Rusoto项目提供的AWS安全令牌服务(STS)客户端库,用于与AWS STS API进行安全集成。该库允许Rust开发者通过类型安全的方式调用STS服务,管理临时安全凭证和跨账户访问。

安装方法

在Cargo.toml中添加依赖:

[dependencies]
rusoto_sts = "0.48.0"
rusoto_core = "0.48.0"

基本使用方法

1. 创建STS客户端

use rusoto_core::Region;
use rusoto_sts::{Sts, StsClient};

let sts_client = StsClient::new(Region::UsEast1);

2. 获取临时凭证

use rusoto_sts::{GetSessionTokenRequest, Sts};

async fn get_session_token() {
    let request = GetSessionTokenRequest {
        duration_seconds: Some(3600),
        ..Default::default()
    };
    
    match sts_client.get_session_token(request).await {
        Ok(response) => {
            if let Some(credentials) = response.credentials {
                println!("Access Key: {}", credentials.access_key_id);
                println!("Secret Key: {}", credentials.secret_access_key);
                println!("Session Token: {}", credentials.session_token);
            }
        }
        Err(e) => eprintln!("Error getting session token: {}", e),
    }
}

3. 假设角色

use rusoto_sts::{AssumeRoleRequest, Sts};

async fn assume_role() {
    let request = AssumeRoleRequest {
        role_arn: "arn:aws:iam::123456789012:role/ExampleRole".to_string(),
        role_session_name: "example-session".to_string(),
        duration_seconds: Some(3600),
        ..Default::default()
    };
    
    match sts_client.assume_role(request).await {
        Ok(response) => {
            if let Some(credentials) = response.credentials {
                println!("Assumed role credentials obtained");
            }
        }
        Err(e) => eprintln!("Error assuming role: {}", e),
    }
}

4. 获取调用者身份信息

use rusoto_sts::{GetCallerIdentityRequest, Sts};

async fn get_caller_identity() {
    let request = GetCallerIdentityRequest::default();
    
    match sts_client.get_caller_identity(request).await {
        Ok(response) => {
            println!("Account ID: {}", response.account.unwrap_or_default());
            println!("User ID: {}", response.user_id.unwrap_or_default());
            println!("ARN: {}", response.arn.unwrap_or_default());
        }
        Err(e) => eprintln!("Error getting caller identity: {}", e),
    }
}

错误处理示例

use rusoto_core::RusotoError;

async fn handle_sts_errors() {
    let request = GetSessionTokenRequest::default();
    
    match sts_client.get_session_token(request).await {
        Ok(response) => {
            // 处理成功响应
        }
        Err(RusotoError::Service(e)) => {
            eprintln!("STS service error: {}", e);
        }
        Err(RusotoError::Credentials(e)) => {
            eprintln!("Credentials error: {}", e);
        }
        Err(e) => {
            eprintln!("Other error: {}", e);
        }
    }
}

配置选项

rusoto_sts支持多种配置方式:

  • 使用环境变量设置AWS凭证
  • 使用IAM角色(在EC2实例上)
  • 使用共享凭证文件
  • 通过代码直接提供凭证

注意事项

  1. 确保正确处理临时凭证的过期时间
  2. 在生产环境中使用适当的错误处理和重试机制
  3. 遵循AWS的安全最佳实践管理凭证
  4. 注意API调用的速率限制和配额

这个库提供了完整的STS功能集成,使得在Rust应用中安全地管理AWS访问凭证变得简单可靠。

完整示例代码

use rusoto_core::{Region, RusotoError};
use rusoto_sts::{
    AssumeRoleRequest, GetCallerIdentityRequest, GetSessionTokenRequest, Sts, StsClient,
};

#[tokio::main]
async fn main() {
    // 创建STS客户端
    let sts_client = StsClient::new(Region::UsEast1);
    
    // 示例1: 获取会话令牌
    println!("=== 获取会话令牌 ===");
    match get_session_token(&sts_client).await {
        Ok(_) => println!("成功获取会话令牌"),
        Err(e) => eprintln!("获取会话令牌失败: {}", e),
    }
    
    // 示例2: 假设角色
    println!("\n=== 假设角色 ===");
    match assume_role(&sts_client).await {
        Ok(_) => println!("成功假设角色"),
        Err(e) => eprintln!("假设角色失败: {}", e),
    }
    
    // 示例3: 获取调用者身份
    println!("\n=== 获取调用者身份 ===");
    match get_caller_identity(&sts_client).await {
        Ok(_) => println!("成功获取调用者身份"),
        Err(e) => eprintln!("获取调用者身份失败: {}", e),
    }
    
    // 示例4: 错误处理演示
    println!("\n=== 错误处理演示 ===");
    handle_sts_errors(&sts_client).await;
}

// 获取会话令牌函数
async fn get_session_token(sts_client: &StsClient) -> Result<(), RusotoError<()>> {
    let request = GetSessionTokenRequest {
        duration_seconds: Some(3600), // 设置令牌有效期为1小时
        ..Default::default()
    };
    
    let response = sts_client.get_session_token(request).await?;
    
    if let Some(credentials) = response.credentials {
        println!("访问密钥: {}", credentials.access_key_id);
        println!("秘密密钥: {}", credentials.secret_access_key);
        println!("会话令牌: {}", credentials.session_token);
        println!("过期时间: {:?}", credentials.expiration);
    }
    
    Ok(())
}

// 假设角色函数
async fn assume_role(sts_client: &StsClient) -> Result<(), RusotoError<()>> {
    let request = AssumeRoleRequest {
        role_arn: "arn:aws:iam::123456789012:role/ExampleRole".to_string(),
        role_session_name: "example-session".to_string(),
        duration_seconds: Some(3600), // 设置角色会话有效期为1小时
        ..Default::default()
    };
    
    let response = sts_client.assume_role(request).await?;
    
    if let Some(credentials) = response.credentials {
        println!("获取到假设角色凭证");
        println!("访问密钥: {}", credentials.access_key_id);
        println!("秘密密钥: {}", credentials.secret_access_key);
        println!("会话令牌: {}", credentials.session_token);
    }
    
    Ok(())
}

// 获取调用者身份函数
async fn get_caller_identity(sts_client: &StsClient) -> Result<(), RusotoError<()>> {
    let request = GetCallerIdentityRequest::default();
    
    let response = sts_client.get_caller_identity(request).await?;
    
    println!("账户ID: {}", response.account.unwrap_or_default());
    println!("用户ID: {}", response.user_id.unwrap_or_default());
    println!("ARN: {}", response.arn.unwrap_or_default());
    
    Ok(())
}

// 错误处理函数
async fn handle_sts_errors(sts_client: &StsClient) {
    let request = GetSessionTokenRequest::default();
    
    match sts_client.get_session_token(request).await {
        Ok(response) => {
            if let Some(credentials) = response.credentials {
                println!("成功获取临时凭证");
            }
        }
        Err(RusotoError::Service(e)) => {
            eprintln!("STS服务错误: {}", e);
        }
        Err(RusotoError::Credentials(e)) => {
            eprintln!("凭证错误: {}", e);
        }
        Err(RusotoError::HttpDispatch(e)) => {
            eprintln!("HTTP调度错误: {}", e);
        }
        Err(RusotoError::Unknown(e)) => {
            eprintln!("未知错误: {}", e);
        }
        Err(e) => {
            eprintln!("其他错误: {}", e);
        }
    }
}
回到顶部