

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

# 從密碼型身分驗證 (AUTH) 遷移至 IAM 身分驗證
<a name="auth-to-iam-migration"></a>

本指南說明如何將 Amazon ElastiCache 節點型叢集或無伺服器快取從密碼型身分驗證 (AUTH) 遷移至 AWS Identity and Access Management (IAM) 身分驗證，而不會中斷服務。

**注意**  
建議您在非生產環境中測試此遷移，然後再將變更套用至生產環境。

## 概觀
<a name="auth-to-iam-overview"></a>

IAM 身分驗證透過消除對長期密碼的需求，提供增強的安全性。相反地，應用程式會使用 [AWS Signature 第 4 版簽署程序](https://docs.aws.amazon.com//general/latest/gr/signature-version-4.html)產生短期身分驗證字符 （有效期最長 15 分鐘）。

## 先決條件
<a name="auth-to-iam-prereqs"></a>

開始之前，確認下列事項：
+ 您的快取正在執行 Redis OSS 7.0 或更新版本，或 Valkey。舊版引擎不支援 IAM 身分驗證。
+ 您的快取上已啟用傳輸中加密 (TLS)。IAM 身分驗證需要 TLS。如需詳細資訊，請參閱[ElastiCache 傳輸中加密 (TLS)](in-transit-encryption.md)。
+ 您擁有建立使用者和修改使用者群組所需的 IAM 許可。如需詳細資訊，請參閱[如何搭配使用 Amazon ElastiCache 與 IAM](security_iam_service-with-iam.md)。
+ 應用程式使用的 IAM 角色或使用者具有 IAM 政策，允許目標快取和 IAM 使用者執行 `elasticache:Connect`動作。如需詳細資訊，請參閱[以 IAM 進行身分驗證](auth-iam.md)。
+ 您的應用程式沒有其他 IAM 身分驗證限制。如需限制的完整清單，請參閱 [以 IAM 進行身分驗證](auth-iam.md)。

## 遷移程序
<a name="auth-to-iam-process"></a>

遷移程序涉及建立密碼型使用者和 IAM 驗證使用者、驗證連線，然後將您的應用程式轉換為 IAM 身分驗證。

### 步驟 1：建立使用者
<a name="auth-to-iam-create-users"></a>

建立兩個 ElastiCache 使用者，讓您的快取在遷移期間支援密碼型和 IAM 身分驗證。

**建立密碼型身分驗證使用者**

**注意**  
如果您已設定密碼型使用者，您可以略過建立新的使用者，並使用現有的使用者。

使用下列 AWS CLI 命令來建立以密碼為基礎的使用者。

針對 Linux、macOS 或 Unix：

```
aws elasticache create-user \
  --user-id {{<user-id>}} \
  --user-name default \
  --engine {{<engine>}} \
  --passwords "{{<your-existing-auth-password>}}" \
  --access-string "on ~* +@all"
```

針對 Windows：

```
aws elasticache create-user ^
  --user-id {{<user-id>}} ^
  --user-name default ^
  --engine {{<engine>}} ^
  --passwords "{{<your-existing-auth-password>}}" ^
  --access-string "on ~* +@all"
```

取代：
+ {{<user-id>}} – 此使用者的唯一 ID。
+ {{<engine>}} – 快取使用的引擎： `valkey`或 `redis`。
+ {{<your-existing-auth-password>}} – 目前在快取上設定的 AUTH 字符。

**建立經 IAM 驗證的使用者**

使用下列 AWS CLI 命令來建立經 IAM 驗證的使用者。

針對 Linux、macOS 或 Unix：

```
aws elasticache create-user \
  --user-id {{<iam-user-id>}} \
  --user-name {{<iam-user-name>}} \
  --authentication-mode Type=iam \
  --engine {{<engine>}} \
  --access-string "on ~* +@all"
```

針對 Windows：

```
aws elasticache create-user ^
  --user-id {{<iam-user-id>}} ^
  --user-name {{<iam-user-name>}} ^
  --authentication-mode Type=iam ^
  --engine {{<engine>}} ^
  --access-string "on ~* +@all"
```

取代：
+ {{<iam-user-id>}} – IAM 使用者的唯一 ID。
+ {{<iam-user-name>}} – IAM 使用者的使用者名稱。
+ {{<engine>}} – 快取使用的引擎： `valkey`或 `redis`。

### 步驟 2：建立和連接使用者群組
<a name="auth-to-iam-user-group"></a>

如果您已有包含密碼型使用者的使用者群組，請將 IAM 驗證的使用者新增至該現有群組：

針對 Linux、macOS 或 Unix：

```
aws elasticache modify-user-group \
  --user-group-id {{<user-group-id>}} \
  --user-ids-to-add {{<iam-user-id>}}
```

針對 Windows：

```
aws elasticache modify-user-group ^
  --user-group-id {{<user-group-id>}} ^
  --user-ids-to-add {{<iam-user-id>}}
```

取代：
+ {{<user-group-id>}} – 現有使用者群組的 ID。
+ {{<iam-user-id>}} – 在步驟 1 中建立的 IAM 驗證使用者的使用者 ID。

然後跳至 [步驟 3：驗證兩種身分驗證方法](#auth-to-iam-verify-dual)。

否則，請建立新的使用者群組、新增兩個使用者，並將群組連接至快取。

使用下列 AWS CLI 命令來建立具有兩個使用者的使用者群組：

針對 Linux、macOS 或 Unix：

```
aws elasticache create-user-group \
  --user-group-id {{<user-group-id>}} \
  --engine {{<engine>}} \
  --user-ids {{<user-id>}} {{<iam-user-id>}}
```

針對 Windows：

```
aws elasticache create-user-group ^
  --user-group-id {{<user-group-id>}} ^
  --engine {{<engine>}} ^
  --user-ids {{<user-id>}} {{<iam-user-id>}}
```

取代：
+ {{<user-group-id>}} – 使用者群組的唯一 ID。
+ {{<engine>}} – 快取使用的引擎： `valkey`或 `redis`。
+ {{<user-id>}}、{{<iam-user-id>}} – 步驟 1 中建立的使用者 IDs。

然後修改快取以使用新的使用者群組。

對於節點型叢集：

針對 Linux、macOS 或 Unix：

```
aws elasticache modify-replication-group \
  --replication-group-id {{<replication-group-id>}} \
  --auth-token-update-strategy DELETE \
  --user-group-ids-to-add {{<user-group-id>}}
```

針對 Windows：

```
aws elasticache modify-replication-group ^
  --replication-group-id {{<replication-group-id>}} ^
  --auth-token-update-strategy DELETE ^
  --user-group-ids-to-add {{<user-group-id>}}
```

取代：
+ {{<replication-group-id>}} – 複寫群組的 ID。
+ {{<user-group-id>}} – 您在上面建立的使用者群組 ID。

對於無伺服器快取：

針對 Linux、macOS 或 Unix：

```
aws elasticache modify-serverless-cache \
  --serverless-cache-name {{<serverless-cache-name>}} \
  --user-group-id {{<user-group-id>}}
```

針對 Windows：

```
aws elasticache modify-serverless-cache ^
  --serverless-cache-name {{<serverless-cache-name>}} ^
  --user-group-id {{<user-group-id>}}
```

取代：
+ {{<serverless-cache-name>}} – 無伺服器快取的名稱。
+ {{<user-group-id>}} – 您在上面建立的使用者群組 ID。

### 步驟 3：驗證兩種身分驗證方法
<a name="auth-to-iam-verify-dual"></a>

完成步驟 2 後，您的快取支援兩種身分驗證方法。在繼續之前，請確認應用程式可以使用這兩種方法進行連線。
+ 使用密碼型身分驗證的應用程式可以繼續使用密碼繼續連線。
+ 針對 IAM 身分驗證設定的應用程式可以使用 IAM 字符進行連線。

### 步驟 4：與 IAM 連線
<a name="auth-to-iam-connect"></a>

**產生 IAM 身分驗證字符**

使用 [AWS SigV4 預先簽署的請求](https://docs.aws.amazon.com//general/latest/gr/sigv4-signed-request-examples.html)產生短期 IAM 身分驗證字符。下列 Python 範例示範權杖產生。

```
import boto3
from botocore.auth import SigV4QueryAuth
from botocore.awsrequest import AWSRequest

cache_name = "<cache-name>"
user = "<username>"
region = "<region>"
expires = 900

session = boto3.Session()
credentials = session.get_credentials().get_frozen_credentials()

req = AWSRequest(
    method="GET",
    url=f"http://{cache_name}/",
    params={"Action": "connect", "User": user}
)
SigV4QueryAuth(credentials, "elasticache", region, expires=expires).add_auth(req)

token = req.url.replace("http://", "")
print(token)
```

**注意**  
產生的字符在建立後最多 15 分鐘內有效。

**使用 valkey-cli 連線**

使用產生的權杖連線至 ElastiCache 快取。您可以使用 **valkey-cli**或 **redis-cli** 連線到 Valkey 叢集。對於 Redis OSS 叢集，請使用 **redis-cli**。

```
valkey-cli -h {{<host>}} -p 6379 --tls
```

對於啟用叢集模式的叢集，新增 `--cluster`旗標：

```
valkey-cli -h {{<host>}} -p 6379 --tls --cluster
```

然後使用下列命令進行驗證：

```
AUTH {{<username>}} {{<token>}}
```

取代：
+ {{<host>}} – 快取的端點。
+ {{<username>}} – IAM 驗證使用者的使用者名稱。
+ {{<token>}} – 您產生的 IAM 身分驗證字符。

預期的輸出結果：

```
OK
```

執行下列命令來驗證使用者名稱：

```
ACL WHOAMI
```

### 步驟 5：應用程式整合
<a name="auth-to-iam-app-integration"></a>

對於 Java 應用程式，請使用預設的 AWS 登入資料提供者鏈結來產生臨時安全登入資料。如需詳細資訊，請參閱[以 IAM 進行身分驗證](auth-iam.md)。對於其他語言，請使用 [AWS Signature 第 4 版簽署程序](https://docs.aws.amazon.com//general/latest/gr/signature-version-4.html)產生 IAM 身分驗證字符，並在用戶端`AUTH`命令中將其作為密碼傳遞。

## 完成遷移
<a name="auth-to-iam-completing"></a>

在您的應用程式可以使用 IAM 身分驗證進行連線後，請完成下列步驟以完成遷移。

### 步驟 1：使用備用設定 IAM 身分驗證
<a name="auth-to-iam-fallback"></a>

移除密碼型使用者之前，請更新您的應用程式碼以使用 IAM 身分驗證做為主要方法，同時將密碼型使用者保留為備用。

在您的應用程式程式碼中：
+ 將用戶端設定為使用 IAM 產生的字符做為主要方法進行身分驗證。
+ 新增備用機制，以便在 IAM 身分驗證失敗 （例如，由於權杖過期或產生錯誤） 時，用戶端會使用密碼型 AUTH 憑證重試。
+ 記錄所有身分驗證嘗試，包括備用和重試，以便您可以監控是否有任何連線落回以密碼為基礎的身分驗證。

### 步驟 2：監控和驗證
<a name="auth-to-iam-monitor"></a>

在至少 `IamAuthenticationThrottling` 24-48 小時內檢閱您的應用程式日誌和 `IamAuthenticationExpirations`和 Amazon CloudWatch 指標，以確認所有連線都是透過 IAM 進行。

任一指標的非零值都需進行調查：
+ `IamAuthenticationExpirations` – IAM 驗證連線會在 12 小時後自動中斷連線。使用新的 IAM 身分驗證字符傳送 `AUTH`或 `HELLO`命令，可以延長連線。
+ `IamAuthenticationThrottling` – 表示身分驗證請求太多，這可能表示您的應用程式產生字符過於積極或有連線集區問題。

對於節點型叢集，您可以執行其他引擎層級檢查：
+ `ACL LOG` – 檢查身分驗證嘗試是否失敗。尋找具有 的項目`reason=auth`。
+ `CLIENT LIST` – 驗證已連線的使用者。檢查 `user=` 欄位以確認用戶端正在使用 IAM 使用者。

`ACL LOG` 和 `CLIENT LIST` 僅適用於節點型叢集。對於 ElastiCache Serverless 部署，依賴應用程式端記錄和 Amazon CloudWatch 指標。

### 步驟 3：移除以密碼為基礎的使用者
<a name="auth-to-iam-remove-user"></a>

確認所有應用程式都使用 IAM 身分驗證後，請從使用者群組中移除密碼型使用者。

**Valkey 快取**

直接移除密碼型使用者：

針對 Linux、macOS 或 Unix：

```
aws elasticache modify-user-group \
   --user-group-id {{<user-group-id>}} \
   --user-ids-to-remove {{<password-user-id>}}
```

針對 Windows：

```
aws elasticache modify-user-group ^
   --user-group-id {{<user-group-id>}} ^
   --user-ids-to-remove {{<password-user-id>}}
```

**Redis OSS 快取**

對於 Redis OSS 快取，使用者群組必須一律包含使用者名稱為 的使用者`default`。如果您在步驟 1 中建立的密碼型使用者具有使用者名稱 `default`，您必須在移除之前建立已停用的預留位置使用者來取代它：

針對 Linux、macOS 或 Unix：

```
aws elasticache create-user \
   --user-id {{<disabled-default-id>}} \
   --user-name default \
   --engine redis \
   --no-password-required \
   --access-string "off ~* -@all"
```

針對 Windows：

```
aws elasticache create-user ^
   --user-id {{<disabled-default-id>}} ^
   --user-name default ^
   --engine redis ^
   --no-password-required ^
   --access-string "off ~* -@all"
```

然後將停用的使用者新增至群組，並移除以密碼為基礎的使用者：

針對 Linux、macOS 或 Unix：

```
aws elasticache modify-user-group \
   --user-group-id {{<user-group-id>}} \
   --user-ids-to-add {{<disabled-default-id>}} \
   --user-ids-to-remove {{<password-user-id>}}
```

針對 Windows：

```
aws elasticache modify-user-group ^
   --user-group-id {{<user-group-id>}} ^
   --user-ids-to-add {{<disabled-default-id>}} ^
   --user-ids-to-remove {{<password-user-id>}}
```

如果您在步驟 1 中建立的密碼型使用者沒有使用者名稱 `default`，您可以使用上述針對 Valkey 快取顯示的相同命令直接將其移除。

取代：
+ {{<disabled-default-id>}} – 已停用預留位置使用者的唯一 ID （僅限 Redis OSS)。
+ {{<user-group-id>}} – 與您的快取相關聯的使用者群組 ID。
+ {{<password-user-id>}} – 要移除的密碼型使用者的使用者 ID。

**注意**  
從使用者群組中移除密碼型使用者後，請勿將其刪除。如果您需要轉返以密碼為基礎的身分驗證，請將其保持可用狀態。

### 步驟 4：確認移除後
<a name="auth-to-iam-confirm"></a>

從使用者群組中移除密碼型使用者之後，請監控 `AuthenticationFailures` Amazon CloudWatch 指標。持續值為零可確認未發生身分驗證失敗，包括任何以密碼為基礎的剩餘嘗試。在此指標上設定 CloudWatch 警示，以偵測未預期的嘗試。

對於節點型叢集，您也可以使用 `ACL LOG`和 進行驗證`CLIENT LIST`。對於無伺服器快取，依賴應用程式端記錄和 CloudWatch 指標。

## 轉返程序
<a name="auth-to-iam-rollback"></a>

將密碼型使用者重新新增至使用者群組，然後在調查時還原應用程式中的密碼型身分驗證。

針對 Valkey 快取：

針對 Linux、macOS 或 Unix：

```
aws elasticache modify-user-group \
   --user-group-id {{<user-group-id>}} \
   --user-ids-to-add {{<password-user-id>}}
```

針對 Windows：

```
aws elasticache modify-user-group ^
   --user-group-id {{<user-group-id>}} ^
   --user-ids-to-add {{<password-user-id>}}
```

對於密碼型使用者沒有使用者名稱 的 Redis OSS 快取`default`，請使用上述相同命令。

對於您在 中建立已停用預留位置使用者的 Redis OSS 快取[步驟 3：移除以密碼為基礎的使用者](#auth-to-iam-remove-user)，請在單一操作中新增密碼型使用者，並移除已停用的預留位置使用者：

針對 Linux、macOS 或 Unix：

```
aws elasticache modify-user-group \
   --user-group-id {{<user-group-id>}} \
   --user-ids-to-add {{<password-user-id>}} \
   --user-ids-to-remove {{<disabled-default-id>}}
```

針對 Windows：

```
aws elasticache modify-user-group ^
   --user-group-id {{<user-group-id>}} ^
   --user-ids-to-add {{<password-user-id>}} ^
   --user-ids-to-remove {{<disabled-default-id>}}
```

取代：
+ {{<user-group-id>}} – 與快取相關聯的使用者群組 ID。
+ {{<password-user-id>}} – 要重新新增之密碼型使用者的使用者 ID。
+ {{<disabled-default-id>}} – 已停用預留位置使用者的使用者 ID （僅限 Redis OSS)。