Spring Cloud AWS SQS 3.0.2集成Testcontainers LocalStack遇403错误求助
问题原因
Spring Cloud AWS 3.x版本中,自动配置的SqsClient并未自动关联你自定义的AwsCredentialsProvider和AwsRegionProvider bean,导致客户端没有使用LocalStack的凭证和endpoint,请求无效从而抛出403安全令牌错误。
解决方案
显式创建SqsClient bean并配置LocalStack相关参数,确保SQS客户端使用正确的endpoint、凭证和区域:
修改测试配置类如下:
@TestConfiguration class TestConfig { @Bean @Primary fun sqsClient(): SqsClient { localStack.start() return SqsClient.builder() .endpointOverride(localStack.getEndpointOverride(SQS)) .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(localStack.accessKey, localStack.secretKey))) .region(Region.of(Region.EU_CENTRAL_1.id())) .build() } companion object { @JvmStatic val localStack: LocalStackContainer = LocalStackContainer(DockerImageName.parse("localstack/localstack:latest")) .withServices(SQS) } class SqsUrlInitializer : ApplicationContextInitializer<ConfigurableApplicationContext> { override fun initialize(applicationContext: ConfigurableApplicationContext) { localStack.start() // 创建测试队列 localStack.execInContainer("awslocal", "sqs", "create-queue", "--queue-name", "single-queue") localStack.execInContainer("awslocal", "sqs", "create-queue", "--queue-name", "list-queue") // 无需再设置endpoint属性,已通过SqsClient配置 } } }
关键修改点
- 移除原来的
awsCredentialsProvider和awsRegionProviderbean,直接在SqsClient中配置凭证和区域 - 标记
sqsClient为@Primary,覆盖Spring Cloud AWS自动配置的客户端实例 - 确保
SqsClient使用LocalStack的endpoint,所有SQS操作都会指向LocalStack容器
额外建议
- 可以指定LocalStack的具体版本(如
localstack/localstack:2.3.2),避免latest版本带来的兼容性问题 - 保留
spring.main.allow-bean-definition-overriding=true,确保自定义SqsClient能覆盖自动配置的bean
内容的提问来源于stack exchange,提问作者Ruth
相关产品推荐
相关产品推荐

