应用程序无法连接到本地堆栈 SQS



作为一名测试开发人员,我正在尝试使用localstack来模拟SQS进行集成测试。

Docker-compose:

  localstack:
    image: localstack/localstack:0.8.7
    ports:
      - "4567-4583:4567-4583"
      - "9898:${PORT_WEB_UI-8080}"
    environment:
      - SERVICES=sqs
      - DOCKER_HOST=unix:///var/run/docker.sock
      - HOSTNAME=localstack
      - HOSTNAME_EXTERNAL=192.168.99.101
      - DEFAULT_REGION=us-east-1     
    volumes:
      - "${TMPDIR:-/tmp/localstack}:/tmp/localstack"
      - "/var/run/docker.sock:/var/run/docker.sock"

启动本地堆栈 SQS 后:能够连接和创建队列,并能够通过 AWS CLI 检索它。本地堆栈仪表板还显示创建的队列。

$ aws --endpoint-url=http://192.168.99.101:4576 --region=us-west-1 sqs create-queue --queue-name myqueue
{
    "QueueUrl": "http://192.168.99.101:4576/queue/myqueue"
}

该应用程序正在使用com.amazon.sqs.javamessaging.SQSConnectionFactory连接到SQS。它还使用 com.amazonaws.auth.DefaultAWSCredentialsProviderChain 作为 AWS 凭证

1(如果我在启动应用程序时给出"-e AWS_REGION=us-east-1 -e AWS_ACCESS_KEY_ID=foobar -e AWS_SECRET_ACCESS_KEY=foobar",我会得到 HTTPStatusCode: 403 AmazonErrorCode: InvalidClientTokenId com.amazonaws.services.sqs.model.AmazonSQSException:请求中包含的安全令牌无效

2( 如果我提供 AWS SQS 的ACCESS_KEY和SECRET_KEY,我将得到 HTTPStatusCode: 400 AmazonErrorCode: AWS.SimpleQueueService.NonExistentQueue com.amazonaws.services.sqs.model.QueueDoesNotExistException:此 wsdl 版本不存在指定的队列。

下面是应用程序代码。前 2 条日志消息正在打印它获得的连接和会话。错误来自"队列发布者队列 = sqsSession.createQueue(sqsName(;">

sqsConnection = (Connection) context.getBean("outputSQSConnection");
LOGGER.info("SQS connection Obtained " + sqsConnection);
sqsSession = sqsConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
LOGGER.info("SQS Session Created " + sqsSession);
Queue publisherQueue = sqsSession.createQueue(sqsName);

我尝试了"http://localstack:4576/queue/myqueue"http://192.168.99.101:4576/queue/myqueue"。结果是一样的。 你能帮我解决这个问题吗?

几周前我遇到了类似的问题。查看您的配置,我认为您应该只能使用localhost.就我而言,我们有调用本地堆栈的服务也在 docker 中运行,我们最终创建了一个 docker 网络来在容器之间进行通信。 我能够通过查看本地堆栈测试找到解决方案。这里要注意的重要一点是,您需要正确设置终结点配置。

     private AmazonSQSClient getLocalStackConfiguredClient() {
            AmazonSQSClientBuilder clientBuilder = AmazonSQSClientBuilder.standard();

 clientBuilder.withEndpointConfiguration(getEndpointConfiguration(configuration.getLocalStackConfiguration()
                .getSqsEndpoint(), awsRegion));
            return (AmazonSQSClient)clientBuilder.build();
        }
        private AwsClientBuilder.EndpointConfiguration getEndpointConfiguration(String endpoint, Regions awsRegion) {
            return new AwsClientBuilder.EndpointConfiguration(endpoint, awsRegion.getName());
        }

希望这可以帮助您解决问题。

最新更新