You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Java+TestContainers无法获取AWS SQS队列属性问题排查

LocalStack SQS: createQueue执行成功但getQueueAttributes抛出UnknownHostException

问题复现

执行以下流程时出现异常:启动LocalStack测试容器、创建SQS客户端、创建队列、查询队列ARN。其中createQueue()成功返回队列URL:http://sqs.us-east-1.localhost:4566/000000000000/my-queue,但调用getQueueAttributes()时抛出java.net.UnknownHostException: sqs.us-east-1.localhost。

复现代码

public class Main {

    private static final LocalStackContainer localStack =
            new LocalStackContainer(DockerImageName.parse(
                    "localstack/localstack:3.1")).withServices(SQS);

    public static void main(String[] args) {

        localStack.start();

        // 创建SQS客户端
        AmazonSQSAsync sqs = AmazonSQSAsyncClientBuilder
                .standard()
                .withEndpointConfiguration(new EndpointConfiguration(
                        localStack.getEndpointOverride(SQS).toString(),
                        localStack.getRegion()))
                .withCredentials(new AWSStaticCredentialsProvider(
                        new BasicAWSCredentials(
                                localStack.getAccessKey(),
                                localStack.getSecretKey())))
                .build();

        // 创建新队列
        String url = sqs.createQueue("my-queue").getQueueUrl();

        // 获取队列ARN
        String arn = sqs.getQueueAttributes(url, List.of("QueueArn"))
                .getAttributes().get("QueueArn");
    }
}

Maven依赖

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-sqs</artifactId>
    <version>1.12.646</version>
</dependency>
<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>localstack</artifactId>
    <version>1.19.4</version>
</dependency>

注:无法修改aws-java-sdk-sqs版本,但可以调整TestContainers和LocalStack版本。

原因分析

问题出在LocalStack默认的SQS端点策略上:默认的path模式下,创建队列后返回的URL使用了带区域的子域名格式(sqs.us-east-1.localhost),而本地DNS无法解析该子域名,导致调用getQueueAttributes()时触发主机无法识别的异常。

解决方案

使用最新版LocalStack,并设置环境变量SQS_ENDPOINT_STRATEGY为dynamic——该策略会让LocalStack返回与客户端配置一致的端点格式,规避子域名解析问题。

修复后的代码

LocalStackContainer localStack =
  new LocalStackContainer(DockerImageName.parse("localstack/localstack:latest"))
    .withEnv("SQS_ENDPOINT_STRATEGY", "dynamic")
    .withServices(SQS);

内容的提问来源于stack exchange,提问作者BillyBadBoy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 02:42:44