作为测试开发人员,我正在尝试使用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"
启动localstack SQS之后:能够连接和创建队列,并能够通过AWS CLI检索它。 Localstack仪表板还显示创建的队列。
$ 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条日志消息将打印其获得的连接和会话。错误来自“队列PublisherQueue = 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”。结果是一样的。 您能帮我解决问题吗?
答案 0 :(得分:0)
几周前,我遇到了一个类似的问题。查看您的配置,我认为您应该只能使用localhost
。以我为例,我们在docker中也运行了调用localstack的服务,最终创建了一个docker网络以在容器之间进行通信。
通过查看Localstack测试,我能够找到解决方案。这里要注意的重要一点是,您需要正确设置端点配置。
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());
}
希望这可以帮助您解决问题。