1、依賴與安裝
步驟 命令 說明 安裝(或升級) go-redis v9.9+ go get github.com/redis/go-redis/v9@latest
entraid 必須 ≥ 9.9.0 安裝 go-redis-entraid go get github.com/redis/go-redis-entraid
自動拉取 transit 依賴
2、認證方式一覽
方式 說明 創建 StreamingCredentialsProvider
工廠函數 服務主體 (Service Principal) 適合 CI/CD、后臺任務 entraid.NewConfidentialCredentialsProvider
系統分配托管身份 (System-Assigned MI) VM / App Service 自動生成 entraid.NewManagedIdentityCredentialsProvider
用戶分配托管身份 (User-Assigned MI) 可跨資源共享,同一 client ID 同上,ManagedIdentityType: identity.UserAssignedObjectID
?? 重要字段對照表
字段 在 Azure 門戶/CLI 對應 ClientID
應用(服務主體) / 托管身份的客戶端 ID ClientSecret
應用機密 (僅服務主體) TenantID
Entra ID 租戶 ID,common
=多租戶 UserAssignedObjectID
用戶分配身份的對象 ID
3、最小可運行示例(系統分配托管身份)
package mainimport ( "context" "log" "os" "github.com/redis-developer/go-redis-entraid/entraid" "github.com/redis-developer/go-redis-entraid/identity" "github.com/redis/go-redis/v9"
) func main ( ) { endpoint := os. Getenv ( "REDIS_ENDPOINT" ) if endpoint == "" { log. Fatal ( "請設置 REDIS_ENDPOINT 環境變量" ) } provider, err := entraid. NewManagedIdentityCredentialsProvider ( entraid. ManagedIdentityCredentialsProviderOptions{ ManagedIdentityProviderOptions: identity. ManagedIdentityProviderOptions{ ManagedIdentityType: identity. SystemAssignedIdentity, } , } ) if err != nil { log. Fatalf ( "創建憑據提供器失敗: %v" , err) } rdb := redis. NewClient ( & redis. Options{ Addr: endpoint, StreamingCredentialsProvider: provider, } ) defer rdb. Close ( ) if err := rdb. Ping ( context. Background ( ) ) . Err ( ) ; err != nil { log. Fatalf ( "連接 Redis 失敗: %v" , err) } log. Println ( "Azure Managed Redis 連接成功!" )
}
4、自定義刷新與重試策略
options := entraid. CredentialsProviderOptions{ TokenManagerOptions: manager. TokenManagerOptions{ ExpirationRefreshRatio: 0.7 , LowerRefreshBounds: 10 _000, RetryOptions: manager. RetryOptions{ MaxAttempts: 3 , InitialDelay: 1 * time. Second, BackoffMultiplier: 2.0 , IsRetryable: func ( err error ) bool { return strings. Contains ( err. Error ( ) , "network" ) || strings. Contains ( err. Error ( ) , "timeout" ) } , } , } ,
}
provider, _ := entraid. NewManagedIdentityCredentialsProvider ( entraid. ManagedIdentityCredentialsProviderOptions{ CredentialsProviderOptions: options, ManagedIdentityProviderOptions: identity. ManagedIdentityProviderOptions{ ManagedIdentityType: identity. UserAssignedObjectID, UserAssignedObjectID: "<client-id>" , } , } ,
)
5、常見坑與調試
癥狀 排查步驟 ERR invalid username or password 確認 AMR 實例已啟用 Entra ID 認證,且 AAD 角色已賦值 (Cache Contributor/Access
等)。 證書握手失敗 連接端口 6380 需 TLS;如本地測試可開啟 DisableTLS
(不建議生產)。 token 過期,自動刷新失敗 檢查托管身份有無 Azure Redis Cache Contributor
角色;或自定義 RetryOptions
。 使用服務主體 but 權限不足 記得把 SP 用 az redis identity assign
綁定,并授予 RBAC
角色。 User-Assigned MI 無法獲取 token ManagedIdentityType
與傳入字段需匹配 (UserAssignedObjectID
/ UserAssignedClientID
)。
6、參考鏈接
GitHub ? https://github.com/redis-developer/go-redis-entraid 官方文檔 ? Azure Cache for Redis – Microsoft Entra ID authentication 示例 CLI ? az redis identity assign
、az ad sp create-for-rbac
小結
選身份 :服務主體適合腳本 & CI;托管身份零密鑰更安全。三步走 :創建 CredentialsProvider → NewClient 注入 → Ping
驗證。生產必配 :RetryOptions
& ExpirationRefreshRatio
,及時刷新 token。
按照以上說明即可安全、優雅地在 Go 項目中連接 Azure Managed Redis,享受 Entra ID 帶來的統一身份與密鑰免維護體驗。祝編碼順利 🚀