

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

# 中的登入資料快取 AWS SDK for Java 2.x
<a name="credential-caching"></a>

 AWS SDK for Java 2.x 實作登入資料快取，以改善效能並減少對登入資料來源的呼叫。本節說明登入資料快取的運作方式，以及如何為您的應用程式設定登入資料快取。

## 了解登入資料提供者快取
<a name="understanding-credential-provider-caching"></a>

適用於 Java 的 SDK 2.x 中的登入資料提供者使用不同的快取策略：
+ **內部登入資料快取**：許多供應商會快取他們擷取的登入資料。
+ **自動重新整理**：具有快取登入資料的提供者會實作重新整理機制。

### 具有內部登入資料快取的提供者
<a name="providers-with-internal-caching"></a>

即使您建立新的執行個體，下列登入資料供應商也會在內部快取登入資料：
+ **執行個體描述檔登入資料提供者**：從 Amazon EC2 中繼資料服務快取登入資料。
+ **容器憑證提供者**：從容器中繼資料端點快取憑證。
+ **STS 型供應商**：從 AWS Security Token Service (STS) 快取臨時憑證。
+ **Web 身分字符提供者**：快取從 Web 身分字符取得的憑證。
+ **程序登入資料提供者**：從外部程序快取登入資料。

### 沒有內部快取的提供者
<a name="providers-without-caching"></a>

下列提供者不會實作內部快取：
+ **環境變數登入資料提供者**
+ **系統屬性登入資料提供者**
+ **靜態登入資料提供者**

## 設定登入資料快取
<a name="configuring-credential-caching"></a>

您可以在建置登入資料提供者時自訂快取行為：

### 過時時間
<a name="stale-time"></a>

控制何時將登入資料視為過時且需要重新整理：

```
.staleTime(Duration.ofMinutes(2))  // Consider stale 2 minutes before expiration.
```

### 預先擷取時間
<a name="prefetch-time"></a>

決定何時在憑證過期前開始重新整理憑證：

```
.prefetchTime(Duration.ofMinutes(10))  // Start refresh 10 minutes before expiration.
```

### 非同步更新
<a name="async-updates"></a>

啟用背景登入資料重新整理：

```
.asyncCredentialUpdateEnabled(true)  // Refresh credentials in background thread.
```

### 工作階段持續時間
<a name="session-duration"></a>

對於 STS 型供應商， 會控制暫時登入資料保持有效的時間長度：

```
.refreshRequest(r -> r.durationSeconds(3600))  // 1 hour session.
```

## 快取登入資料組態範例
<a name="example-optimized-sts-config"></a>

作為為登入資料提供者實作設定快取的範例，您可能希望 SDK 使用背景執行緒在登入資料過期之前預先擷取 （事先擷取）。如此一來，您就可以避免擷取新登入資料的封鎖呼叫。

以下範例會建立 `[StsAssumeRoleCredentialsProvider](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/auth/StsAssumeRoleCredentialsProvider.html)`，該 使用背景執行緒，透過將 `[asyncCredentialUpdateEnabled](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/auth/StsCredentialsProvider.BaseBuilder.html#asyncCredentialUpdateEnabled(java.lang.Boolean))` 屬性設定為建置器`true`上的 來預先擷取登入資料：

```
StsAssumeRoleCredentialsProvider provider = StsAssumeRoleCredentialsProvider.builder()
    .refreshRequest(r -> r
        .roleArn("arn:aws:iam::111122223333:role/example-role")
        .roleSessionName("example-session")
        .durationSeconds(3600))  // 1 hour session
    .staleTime(Duration.ofMinutes(5))  // Consider stale 5 minutes before expiration
    .prefetchTime(Duration.ofMinutes(10))  // Start refresh 10 minutes before expiration
    .asyncCredentialUpdateEnabled(true)  // Refresh in background
    .build();

S3Client s3 = S3Client.builder()
    .credentialsProvider(provider)
    .build();
```

當您`s3Client`第一次在 上叫用 操作時， `[AssumeRoleRequest](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/model/AssumeRoleRequest.html)` 會傳送到 AWS Security Token Service (STS)。STS 會傳回有效時間為 15 分鐘 (900 秒） 的臨時登入資料。`s3Client` 執行個體會使用快取的登入資料，直到 15 分鐘前需要重新整理為止。根據預設，軟體開發套件會嘗試擷取目前工作階段過期時間前 5 分鐘到 1 分鐘之間新工作階段的新登入資料。您可以使用 `[prefetchTime](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/auth/StsCredentialsProvider.BaseBuilder.html#prefetchTime(java.time.Duration))`和 `[staleTime](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/auth/StsCredentialsProvider.BaseBuilder.html#staleTime(java.time.Duration))` 屬性來設定預先擷取時段。

您可以類似地設定下列工作階段型登入資料提供者：
+ `StsWebIdentityTokenFileCredentialsProvider`
+ `StsGetSessionTokenCredentialsProvider`
+ `StsGetFederationTokenCredentialsProvider`
+ `StsAssumeRoleWithWebIdentityCredentialsProvider`
+ `StsAssumeRoleWithSamlCredentialsProvider`
+ `StsAssumeRoleCredentialsProvider`
+ `DefaultCredentialsProvider` （委派給使用工作階段的登入資料提供者時）
+ `ProcessCredentialsProvider`
+ `WebIdentityTokenFileCredentialsProvider`
+ `ContainerCredentialsProvider`
+ `InstanceProfileCredentialsProvider`

了解登入資料快取可協助您在使用 時最佳化應用程式的效能和可靠性 AWS 服務。