diff --git a/FAQ-CN.md b/FAQ-CN.md new file mode 100644 index 0000000..4d362e8 --- /dev/null +++ b/FAQ-CN.md @@ -0,0 +1,604 @@ +# 阿里云凭证 Go SDK 常见问题 FAQ + +本文档整理了阿里云凭证 Go SDK (credentials-go) 使用过程中的常见问题和解决方案。 + +## 目录 + +- [环境变量相关问题](#环境变量相关问题) +- [凭证类型配置问题](#凭证类型配置问题) +- [ECS RAM角色凭证问题](#ecs-ram角色凭证问题) +- [配置文件问题](#配置文件问题) +- [网络和超时问题](#网络和超时问题) +- [版本兼容性问题](#版本兼容性问题) +- [OIDC凭证问题](#oidc凭证问题) +- [凭证URI问题](#凭证uri问题) + +--- + +## 环境变量相关问题 + +### Q1: 设置了 ALIBABA_CLOUD_ACCESS_KEY_ID 环境变量但无法获取凭证 + +**问题描述:** 按照文档设置了 `ALIBABA_CLOUD_ACCESS_KEY_ID` 环境变量,但程序报错无法获取到 ACCESS_KEY_ID。 + +**原因分析:** 早期版本中环境变量名称使用了不一致的大小写 `ALIBABA_CLOUD_ACCESS_KEY_Id`(注意最后的 `Id` 大小写)。Linux 系统下环境变量大小写敏感,导致无法识别。 + +**解决方案:** +1. 优先使用标准的全大写环境变量名(推荐): + ```bash + export ALIBABA_CLOUD_ACCESS_KEY_ID="your-access-key-id" + export ALIBABA_CLOUD_ACCESS_KEY_SECRET="your-access-key-secret" + ``` + +2. 当前版本同时兼容两种写法,会优先读取 `ALIBABA_CLOUD_ACCESS_KEY_ID`,如果不存在则会尝试读取 `ALIBABA_CLOUD_ACCESS_KEY_Id`。 + +**相关 Issue:** [#37](https://github.com/aliyun/credentials-go/issues/37), [#57](https://github.com/aliyun/credentials-go/issues/57) + +--- + +### Q2: 环境变量为空时的错误提示 + +**问题描述:** 设置了环境变量但值为空字符串,程序报错 `ALIBABA_CLOUD_ACCESS_KEY_ID or ALIBABA_CLOUD_ACCESS_KEY_Id cannot be empty`。 + +**原因分析:** SDK 会检查环境变量是否为空,空字符串被认为是无效配置。 + +**解决方案:** +```bash +# 确保环境变量有实际值 +export ALIBABA_CLOUD_ACCESS_KEY_ID="your-actual-access-key-id" +export ALIBABA_CLOUD_ACCESS_KEY_SECRET="your-actual-access-key-secret" + +# 如果使用 STS Token +export ALIBABA_CLOUD_SECURITY_TOKEN="your-security-token" +``` + +--- + +## 凭证类型配置问题 + +### Q3: 无效的凭证类型错误 + +**问题描述:** 配置凭证时收到错误 `invalid type option, support: access_key, sts, bearer, ecs_ram_role, ram_role_arn, rsa_key_pair, oidc_role_arn, credentials_uri`。 + +**原因分析:** 使用了不支持的凭证类型或类型名称拼写错误。 + +**解决方案:** 确保使用以下支持的凭证类型之一: +- `access_key` - AccessKey 凭证 +- `sts` - STS Token 凭证 +- `bearer` - Bearer Token 凭证 +- `ecs_ram_role` - ECS 实例 RAM 角色 +- `ram_role_arn` - RAM 角色 ARN 扮演 +- `rsa_key_pair` - RSA 密钥对(已废弃) +- `oidc_role_arn` - OIDC 角色凭证 +- `credentials_uri` - 外部凭证 URI + +示例: +```go +config := new(credentials.Config). + SetType("access_key"). // 确保类型正确 + SetAccessKeyId("your-access-key-id"). + SetAccessKeySecret("your-access-key-secret") +``` + +--- + +### Q4: Bearer Token 不能为空错误 + +**问题描述:** 使用 Bearer Token 类型时报错 `BearerToken cannot be empty`。 + +**原因分析:** Bearer Token 类型必须提供非空的 BearerToken 值。 + +**解决方案:** +```go +config := new(credentials.Config). + SetType("bearer"). + SetBearerToken("your-bearer-token") // 必须提供有效的 token +``` + +--- + +## ECS RAM角色凭证问题 + +### Q5: 刷新 ECS STS Token 失败 + +**问题描述:** 使用 ECS RAM 角色时报错 `refresh Ecs sts token err`。 + +**常见原因:** +1. ECS 实例未绑定 RAM 角色 +2. 元数据服务不可访问(网络问题) +3. JSON 解析失败(响应格式错误) +4. Code 字段不是 "Success" + +**解决方案:** + +1. **确认 ECS 实例已绑定 RAM 角色:** + - 登录阿里云控制台 + - 进入 ECS 实例详情页 + - 查看是否已绑定实例 RAM 角色 + +2. **测试元数据服务连通性:** + ```bash + # 在 ECS 实例内执行 + curl http://100.100.100.200/latest/meta-data/ram/security-credentials/ + ``` + +3. **显式指定角色名称(推荐):** + ```go + config := new(credentials.Config). + SetType("ecs_ram_role"). + SetRoleName("your-role-name") // 指定角色名称减少请求次数 + ``` + +4. **使用 IMDS v2(安全加固):** + ```go + config := new(credentials.Config). + SetType("ecs_ram_role"). + SetRoleName("your-role-name"). + SetDisableIMDSv1(true) // 禁用 IMDS v1 + ``` + +--- + +### Q6: 获取元数据 Token 失败 + +**问题描述:** 启用 IMDSv2 后报错 `failed to get token from ECS Metadata Service`。 + +**原因分析:** IMDSv2 需要额外的 token 请求,网络或配置问题可能导致获取失败。 + +**解决方案:** +1. 确认 ECS 实例支持 IMDSv2 +2. 检查元数据服务是否可访问 +3. 如果不需要 IMDSv2 安全加固,可以不设置 `DisableIMDSv1` + +```go +// 标准配置(兼容 IMDSv1 和 IMDSv2) +config := new(credentials.Config). + SetType("ecs_ram_role"). + SetRoleName("your-role-name") +``` + +--- + +## 配置文件问题 + +### Q7: 配置文件路径无效 + +**问题描述:** 程序报错 `the default credential file path is invalid` 或 `ALIBABA_CLOUD_CREDENTIALS_FILE cannot be empty`。 + +**原因分析:** +1. 默认配置文件路径不存在(`~/.alibabacloud/credentials`) +2. 环境变量 `ALIBABA_CLOUD_CREDENTIALS_FILE` 设置为空字符串 +3. HOME 目录获取失败 + +**解决方案:** + +1. **创建默认配置文件:** + ```bash + mkdir -p ~/.alibabacloud + cat > ~/.alibabacloud/credentials <