Quarkus 2+使用QuarkusTestResourceLifecycleManager时S3Client测试加载凭证失败
问题解决:Quarkus 1.13升级2.x后集成测试AWS凭证加载失败
根因说明
Quarkus 2.0 版本对AWS服务扩展的配置规则做了不兼容调整:
- 废弃了1.x版本中
aws.开头的全局AWS配置前缀,统一替换为quarkus.aws.前缀 - 凭证相关配置被归类到
credentials子节点下,不再直接放在全局AWS配置下 - 服务级别的端点覆写配置规则同步调整为
quarkus.${服务名}.endpoint-override格式
你之前用的1.x版本的配置键在2.x版本中完全不生效,导致Quarkus AWS扩展默认按默认凭证链查找凭证,找不到就抛出「Unable to load credentials」错误。
至于原生集成测试可以正常运行,是因为
@QuarkusIntegrationTest执行的是你已经打包完成的应用(原生镜像或JVM包),加载的是src/main/resources下的运行时配置,你应该已经在运行时配置中适配了2.x的配置规则,只有测试资源类返回的测试阶段配置还在使用1.x的旧键名。
解决步骤
1. 修改ContainerResource返回的配置键名
把start方法返回的配置集合中的键全部替换为2.x兼容的格式:
@Override public Map<String, String> start() { LOCAL_STACK_CONTAINER.start(); innitS3(); return Map.ofEntries( entry("quarkus.aws.region", LOCAL_STACK_CONTAINER.getRegion()), entry("quarkus.s3.endpoint-override", LOCAL_STACK_CONTAINER.getEndpointOverride(S3).toString()), entry("quarkus.aws.credentials.type", "static"), entry("quarkus.aws.credentials.static-provider.access-key-id", LOCAL_STACK_CONTAINER.getAccessKey()), entry("quarkus.aws.credentials.static-provider.secret-access-key", LOCAL_STACK_CONTAINER.getSecretKey()) ); }
2. 同步调整application.properties中的配置(如果有)
如果你之前在application.properties中加的是旧格式的配置,也替换为上面的新格式即可生效。
3. 可选:兼容多测试类场景
如果你的项目中有多个测试类共用这个LocalStack测试资源,可以给@QuarkusTestResource注解加上restrictToAnnotatedClass = false参数,避免不同测试类启动重复的容器实例:
@QuarkusTestResource(value = ContainerRessource.class, restrictToAnnotatedClass = false)
内容的提问来源于stack exchange,提问作者Corentin
相关产品推荐
相关产品推荐

