Spring Boot应用无法连接Localstack SQS队列求助
验证区域配置一致性
检查docker-compose.yml中Localstack的DEFAULT_REGION环境变量,比如是否设置为us-east-1;核对application.yml里AWS配置的region,必须和Localstack的区域完全匹配,不能有拼写错误(比如区分us-east-1和us-east-1a);同时确认Java代码中手动指定的区域也和前两者保持统一,比如AmazonSQSClientBuilder.standard().withRegion(Regions.US_EAST_1)。确认队列初始化脚本的有效性
先检查docker-compose.yml是否将初始化脚本挂载到Localstack的/docker-entrypoint-initaws.d/目录,这个目录下的脚本会在Localstack启动时自动执行;然后手动执行脚本(比如awslocal sqs create-queue --queue-name my-queue --region us-east-1),执行后用awslocal sqs list-queues查看队列是否成功创建;还要确保脚本中创建队列的区域和Localstack默认区域一致,或者显式指定--region参数。检查队列URL的配置/构造逻辑
尽量避免硬编码队列URL,建议用AmazonSQS.getQueueUrl("my-queue")动态获取;如果硬编码URL,必须保证格式正确:http://<localstack-host>:<sqs-port>/<account-id>/<queue-name>,其中account-id固定为000000000000,默认端口是4566;同时检查application.yml中的队列URL配置是否有多余空格或拼写错误。验证Localstack服务的可访问性
如果Spring Boot应用是docker部署的,在容器内ping Localstack的服务名(比如localstack)确认网络连通;用curl测试SQS端点:curl http://localstack:4566/000000000000/my-queue,返回404说明队列未创建,返回其他响应则网络正常;还要确保docker-compose中Spring Boot服务和Localstack服务在同一个网络下,没有隔离。检查AWS SDK的Localstack指向配置
在application.yml中必须配置SQS端点URL:aws.sqs.endpoint=http://localstack:4566(docker-compose内用服务名)或http://localhost:4566(本地运行Spring Boot);确保AWS SDK没有指向生产环境端点,Localstack可以用任意access-key和secret-key,比如test/test;如果是Spring Boot 3.x或AWS SDK v2,检查配置类是否正确设置端点,示例代码:@Bean public SqsClient sqsClient() { return SqsClient.builder() .endpointOverride(URI.create("http://localstack:4566")) .region(Region.US_EAST_1) .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create("test", "test"))) .build(); }
内容的提问来源于stack exchange,提问作者Diego Nieto

