使用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
相关产品推荐
相关产品推荐

