#aws-sdk #aws #cache #lru-cache #lru #aws-secrets-manager

aws-secretsmanager-cache

AWS Secrets Manager 的秘密的进程内缓存客户端

4 个版本 (破坏性更新)

0.5.0 2023 年 4 月 29 日
0.3.0 2022 年 1 月 29 日
0.2.0 2021 年 12 月 12 日
0.1.0 2021 年 11 月 20 日

177缓存 中排名

每月下载量 21

MIT/Apache

22KB
224 代码行

AWS Secrets Manager Rust 缓存客户端

CI

该 crate 为 Rust 应用程序提供 AWS Secrets Manager 的秘密的进程内缓存客户端。它受到 AWS Secrets Manager Go 缓存客户端AWS SDK for Rust 的大力启发。

客户端内部使用 LRU(最近最少使用)缓存方案,为缓存的值提供 O(1) 插入和 O(1) 查找。

入门

要使用此客户端,您必须拥有

  • Rust 开发环境
  • 一个 Amazon Web Services (AWS) 账户,以访问 AWS Secrets Manager 中存储的秘密并使用 AWS SDK for Rust。

用法

以下示例演示了如何开始使用此客户端

use aws_sdk_secretsmanager::Client;
use aws_secretsmanager_cache::SecretCache;

#[tokio::main]
async fn main() {
    // instantiate an AWS SecretsManager client using the AWS Rust SDK
    let aws_config = aws_config::from_env().load().await;
    let client = Client::new(&aws_config);
    
    let mut cache = SecretCache::new(client);

    match cache.get_secret_string("YOUR_SECRET_ID".to_string()).send().await {
        Ok(secret_value) => {
            // use secret value
        }
        // e.g. ResourceNotFoundException: Secrets Manager can't find the specified secret.
        Err(e) => println!("ERROR: {}", e),
    }
}

强制缓存刷新

如果自上次检索和缓存秘密以来秘密已被轮换,并且尚未在缓存中过期,则必须通过调用 AWS 并更新值来强制刷新缓存中的值。

这可以通过调用 force_refresh() 来完成,例如

    match cache
        .get_secret_string("YOUR_SECRET_ID".to_string())
        .force_refresh()
        .send()
        .await

缓存配置

  • max_cache_size usize 在驱逐最不常访问的秘密之前,在缓存中保持的秘密的最大数量
  • cache_item_ttl u128 缓存的秘密在秘密值需要刷新之前被视为有效的时间(纳秒)。刷新是同步发生的。
use aws_sdk_secretsmanager::Client;
use aws_secretsmanager_cache::{CacheConfig, SecretCache};
use std::time;

#[tokio::main]
async fn main() {
    let aws_config = aws_config::from_env().load().await;
    let client = Client::new(&aws_config);

    // cache configuration with 30 second expiry time and maximum 1000 secrets
    let cache_config = CacheConfig::new()
        .cache_item_ttl(time::Duration::from_secs(30).as_nanos())
        .max_cache_size(1000);

    let mut cache = SecretCache::new_with_config(client, cache_config);
}

全局缓存

某些云环境(如 AWS Lambda)鼓励在全局范围内初始化客户端,以避免每次函数调用都要初始化。这可以通过使用 lazy_static crate 来实现,例如

use async_once::AsyncOnce;
use aws_sdk_secretsmanager::Client;
use aws_secretsmanager_cache::SecretCache;
use lazy_static::lazy_static;
use std::sync::Mutex;

// store the cache in the global scope - useful for runtime environments like AWS Lambda
lazy_static! {
    static ref CACHE: AsyncOnce<Mutex<SecretCache>> = AsyncOnce::new(async {
        Mutex::new(SecretCache::new(Client::new(
            &aws_config::from_env().load().await,
        )))
    });
}

#[tokio::main]
async fn main() {
    // use cache
}

开发

代码格式化

该项目使用 rustfmtclippy 进行格式化和代码检查。按照说明安装 rustfmtclippy 并运行

cargo fix

测试

使用以下命令在本地运行单元测试

cargo test

许可证

根据您的选择,在Apache License,版本2.0或MIT许可证下授权。项目中的文件除非符合这些条款,否则不得复制、修改或分发。

依赖项

约24–33MB
约442K SLoC