

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Rust 和客户端缓存获取 Secrets Manager 密钥值
<a name="retrieving-secrets_cache-rust"></a>

在检索密钥时，您可以使用 Secrets Manager 基于 Rust 的缓存组件来缓存密钥，以备将来使用。检索已缓存密钥比从 Secrets Manager 中检索密钥的速度要快。由于调用 Secrets Manager 需要付费 APIs，因此使用缓存可以降低成本。有关检索密钥的所有方法，请参阅 [获取密钥](retrieving-secrets.md)。

缓存策略是先进先出（FIFO），因此当缓存必须丢弃一个密钥时，它会丢弃最旧的密钥。原定设置下，缓存会每小时刷新一次秘密。您可以配置以下内容：
+ `max_size` – 在驱逐最近未访问的密钥之前要维护的最大缓存密钥数。
+ `ttl` – 在需要刷新密钥状态之前缓存的项目被视为有效的持续时间。

缓存实施不包括缓存失效。缓存实现侧重于缓存本身，而不是侧重加强安全性或以安全性为重点。如果需要额外安全性（例如加密缓存中的项目），请使用提供的特性来修改缓存。

要使用该组件，您必须拥有一个带有 `tokio` 的 Rust 2021 开发环境。有关更多信息，请参阅 Rust 编程语言网站上的[入门](https://www.rust-lang.org/learn/get-started)。

要下载源代码，请参阅上的 S [ecrets Manager 基于 Rust 的缓存客户端组件](https://github.com/aws/aws-secretsmanager-agent/tree/main/aws_secretsmanager_caching)。 GitHub

要安装缓存组件，请使用以下命令。

```
cargo add aws_secretsmanager_caching
```

**所需权限：**
+ `secretsmanager:DescribeSecret`
+ `secretsmanager:GetSecretValue`

有关更多信息，请参阅 [权限参考](auth-and-access.md#reference_iam-permissions)。

**Example 检索密钥**  
以下示例说明如何获取名为的密钥的机密值*MyTest*。  

```
use aws_secretsmanager_caching::SecretsManagerCachingClient;
use std::num::NonZeroUsize;
use std::time::Duration;

let client = match SecretsManagerCachingClient::default(
    NonZeroUsize::new(10).unwrap(),
    Duration::from_secs(60),
)
.await
{
    Ok(c) => c,
    Err(_) => panic!("Handle this error"),
};

let secret_string = match client.get_secret_value("MyTest", None, None).await {
    Ok(s) => s.secret_string.unwrap(),
    Err(_) => panic!("Handle this error"),
};

// Your code here
```

**Example 使用自定义配置和自定义客户端实例化缓存**  
以下示例说明如何配置缓存，然后获取名为的密钥的密钥值*MyTest*。  

```
let config = aws_config::load_defaults(BehaviorVersion::latest())
    .await
    .into_builder()
    .region(Region::from_static("us-west-2"))
    .build();

let asm_builder = aws_sdk_secretsmanager::config::Builder::from(&config);

let client = match SecretsManagerCachingClient::from_builder(
    asm_builder,
    NonZeroUsize::new(10).unwrap(),
    Duration::from_secs(60),
)
.await
{
    Ok(c) => c,
    Err(_) => panic!("Handle this error"),
};

let secret_string = client
    .get_secret_value("MyTest", None, None)
    .await 
    {
        Ok(c) => c.secret_string.unwrap(),
        Err(_) => panic!("Handle this error"),
    };

// Your code here
```
```