

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Rust 搭配用戶端快取取得 Secrets Manager 秘密值
<a name="retrieving-secrets_cache-rust"></a>

擷取秘密時，您可以使用 Secrets Manager Rust 型快取元件來快取秘密以供日後使用。擷取快取的秘密比從 Secrets Manager 中擷取要快。由於呼叫 Secrets Manager API 需要花費成本，因此使用快取可以降低成本。如需您可以擷取機密的所有方法，請參閱 [取得秘密](retrieving-secrets.md)。

快取政策是先進先出 (FIFO)，因此當快取必須捨棄秘密時，會捨棄最舊的秘密。預設情況下，快取每小時重新整理一次秘密。您可以設定下列項目：
+ `max_size` – 在移出最近未存取的秘密之前，要維護的快取秘密數目上限。
+ `ttl` – 在需要重新整理秘密狀態之前，快取項目視為有效的持續時間。

快取實作不包括快取失效。快取實作著重於快取本身，而不是強化或著重於安全性。如果您需要額外的安全性，例如加密快取中的項目，請使用提供的特徵來修改快取。

若要使用 元件，您必須具有具有 的 Rust 2021 開發環境`tokio`。如需詳細資訊，請參閱 Rust 程式設計語言網站上的[入門](https://www.rust-lang.org/learn/get-started)。

若要下載原始程式碼，請參閱 GitHub 上的 [Secrets Manager Rust 型快取用戶端元件](https://github.com/aws/aws-secretsmanager-agent/tree/main/aws_secretsmanager_caching)。

若要安裝快取元件，請使用下列命令。

```
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
```
```