2
votes

As a test developer, I am trying to use localstack to mock SQS for Integration Test.

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"

After spinning up the localstack SQS: Able to connect and create queue and able to retrieve it via AWS CLI. Localstack Dashboard also displays the queue created.

$ 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"
}

The application is using com.amazon.sqs.javamessaging.SQSConnectionFactory to connect to SQS. It also uses com.amazonaws.auth.DefaultAWSCredentialsProviderChain for the AWS credentials

1) If I give "-e AWS_REGION=us-east-1 -e AWS_ACCESS_KEY_ID=foobar -e AWS_SECRET_ACCESS_KEY=foobar" while bringing up the application, I am getting HTTPStatusCode: 403 AmazonErrorCode: InvalidClientTokenId com.amazonaws.services.sqs.model.AmazonSQSException: The security token included in the request is invalid

2) If I give the ACCESS_KEY and SECRET_KEY of the AWS SQS, I am getting HTTPStatusCode: 400 AmazonErrorCode: AWS.SimpleQueueService.NonExistentQueue com.amazonaws.services.sqs.model.QueueDoesNotExistException: The specified queue does not exist for this wsdl version.

Below is the application code. The first 2 log messages are printing the connection and session it obtained. The error is coming from "Queue 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);

I tried both "http://localstack:4576/queue/myqueue" "http://192.168.99.101:4576/queue/myqueue". The results are same. Can you please help me to resolve the issue?

1

1 Answers

0
votes

I ran into a similar issue couple of weeks back . Looking at your config, I think you should be just able to use localhost. In my case, we had services calling localstack also running in docker and we ended up creating a docker network to communicate between containers. I was able figure out a solution by looking at the Localstack tests. The important thing to note here is that you need to set Endpoint configuration correctly.

     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());
        }

Hopefully this helps you to resolve the issues.