S3Client 无法在 QuarkusTest 中加载凭据,在 quarkus 2+ 中使用 QuarkusTestResourceLifecycleManager

Posted

技术标签:

【中文标题】S3Client 无法在 QuarkusTest 中加载凭据,在 quarkus 2+ 中使用 QuarkusTestResourceLifecycleManager【英文标题】:S3Client Unable to load credentials in QuarkusTest, using QuarkusTestResourceLifecycleManager in quarkus 2+ 【发布时间】:2021-12-02 03:02:40 【问题描述】:

当我将 quarkus 从 1.13.2 升级到 2.X.X 时,我的集成测试中出现“无法加载凭据”错误。

LambdaIntegTest.class :

@Testcontainers
@QuarkusTest
@QuarkusTestResource(ContainerRessource.class)
class LambdaIntegTest 

    @Test
    void test() throws Exception 
        String s3Event = oneS3event();

        String out = LambdaClient.invokeJson(String.class, s3Event);

        assertThat(out).isEqualTo("Success");
    

ContainerRessource.class:

public class ContainerRessource implements QuarkusTestResourceLifecycleManager 
    private static final LocalStackContainer LOCAL_STACK_CONTAINER;

    static 
        DockerImageName localstackImage = DockerImageName.parse("localstack/localstack:0.11.3");
        LOCAL_STACK_CONTAINER = new LocalStackContainer(localstackImage)
            .withServices(S3);
    

    @Override
    public Map<String, String> start() 
        LOCAL_STACK_CONTAINER.start();
        innitS3();
        return Map.ofEntries(
            entry("aws.region", LOCAL_STACK_CONTAINER.getRegion()),
            entry("s3.url.override", LOCAL_STACK_CONTAINER.getEndpointOverride(S3).toString()),
            entry("aws.accessKeyId", LOCAL_STACK_CONTAINER.getAccessKey()),
            entry("aws.secretAccessKey", LOCAL_STACK_CONTAINER.getSecretKey()));
    

    @Override
    public void stop() 
        LOCAL_STACK_CONTAINER.stop();
    

我尝试将凭据放入 application.properties,但我遇到了同样的错误。 我在 Quarkus 1.13.2 上的测试工作

我还有一个原生测试:

@QuarkusIntegrationTest
public class LambdaNativeTest extends LambdaIntegTest 

它奏效了。

【问题讨论】:

【参考方案1】:

我找到了一种解决方法,如果我们在系统属性中手动设置凭据,它就可以工作。 修改后的方法 start() :

 @Override
    public Map<String, String> start() 
        LOCAL_STACK_CONTAINER.start();
        innitS3();
        System.setProperty("aws.accessKeyId", LOCAL_STACK_CONTAINER.getAccessKey());
        System.setProperty("aws.secretAccessKey", LOCAL_STACK_CONTAINER.getSecretKey());
        return Map.ofEntries(
            entry("aws.region", LOCAL_STACK_CONTAINER.getRegion()),
            entry("s3.url.override", LOCAL_STACK_CONTAINER.getEndpointOverride(S3).toString()),
            entry("aws.accessKeyId", LOCAL_STACK_CONTAINER.getAccessKey()),
            entry("aws.secretAccessKey", LOCAL_STACK_CONTAINER.getSecretKey()));
    

QuarkusTestResourceLifecycleManager.start() 的 Javadoc 说: '@return 应该为正在运行的测试设置的系统属性映射'

这似乎不适用于@QuarkusTest

【讨论】:

以上是关于S3Client 无法在 QuarkusTest 中加载凭据,在 quarkus 2+ 中使用 QuarkusTestResourceLifecycleManager的主要内容,如果未能解决你的问题,请参考以下文章

创建 S3Client 的 PHP AWS SDK 致命错误

节点 S3Client 错误 - input.useDualstackEndpoint 不是函数

无法在 JRE 8 中加载字体

在 s3 中使用加速模式时无法解决主机错误

无法使用 PHP 显示 S3 存储桶

如何在 put_object 中指定标记?