AWS Device Farm中安全传递第三方API凭证的最佳实践咨询
解决AWS Device Farm中Cucumber测试访问Secrets Manager的凭证问题
我来帮你搞定这个问题——我之前在Device Farm运行自动化测试时也碰到过一模一样的凭证加载失败情况,给你两个安全且符合AWS最佳实践的解决方案,完全不用明文存储敏感信息:
方案1:使用Device Farm内置的加密环境变量(快速上手)
Device Farm本身就支持存储加密的环境变量,这些变量会在测试运行时自动注入到测试环境中,不需要你在测试规范或代码里明文写任何敏感信息:
步骤:
- 登录AWS控制台,进入Device Farm服务,打开你的测试项目
- 创建新的测试运行(或编辑现有定时任务)
- 在环境变量部分,点击「添加环境变量」,输入你的凭证键名(比如
API_USERNAME、API_PASSWORD)和对应的值 - 勾选每个变量后面的「加密」选项,AWS会自动加密存储这些值
- 保存测试运行配置,之后定时任务或手动运行时,这些变量会作为环境变量存在测试容器里
代码里读取方式:
直接通过Java读取环境变量即可,比如:String username = System.getenv("API_USERNAME"); String password = System.getenv("API_PASSWORD");
这个方案最适合快速解决问题,不需要修改IAM权限或SDK配置。
方案2:给Device Farm的服务角色附加Secrets Manager访问权限(更符合AWS权限模型)
如果你的团队已经在使用Secrets Manager统一管理所有敏感凭证,那更推荐这个方案——让Device Farm的测试环境自动获取临时IAM凭证来访问Secrets Manager,完全不需要手动传递任何密钥:
配置步骤:
- 打开IAM控制台,搜索并找到Device Farm默认使用的服务角色:
AWSDeviceFarmServiceRole(如果你自定义了角色,就找对应的那个) - 给这个角色添加一个内联政策,允许访问你需要的Secrets Manager资源:
政策JSON示例(记得替换区域、账号ID和你的秘密ARN):{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws:secretsmanager:us-west-2:123456789012:secret:your-api-credentials-*" } ] } - 保存政策后,回到你的测试代码——不需要修改任何凭证加载逻辑,AWS SDK会自动通过Device Farm测试容器的EC2元数据服务获取临时凭证,之前报错里的
EC2ContainerCredentialsProvider就能正常工作了。
为什么之前失败?
之前的错误是因为默认的Device Farm服务角色没有Secrets Manager的访问权限,不是找不到元数据服务。给角色加权限后,SDK的默认凭证链会自动找到临时凭证,顺利读取秘密。
方案对比
- 方案1:适合快速实现,管理少量凭证,不需要改动IAM权限
- 方案2:适合统一管理多个AWS服务的凭证,符合最小权限原则,长期维护更规范
不管选哪个,都能避免明文存储敏感信息,完全符合你的需求。
内容的提问来源于stack exchange,提问作者simeona cruz
相关产品推荐
相关产品推荐

