AWS localstack отклоняет HTTP-запросы от запущенной службы на том же компьютере

#docker #localstack

Вопрос:

У меня есть приложение, которое запускается на моем локальном компьютере с помощью docker. В файле docker-compose.yml есть:

 services:
...
  localstack:
    image: localstack/localstack
    ports:
      - "4567-4583:4567-4583"
    environment:
      - DOCKER_HOST=unix:///var/run/docker.sock
      - SERVICES=sqs,dynamodb,s3
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "/private${TMPDIR}:/tmp/localstack"
    networks:
      - webhooks
 

и я запускаю приложение docker, выполнив команду

 docker-compose up
 

Когда я запускаю основную службу приложения, она должна вызывать псевдо-базу данных DynamoDB, которая работает в докере, а затем я получаю сообщение об ошибке:

 [info] 20:24:47.106 [undefined|…pool-9-thread-1] W c.r.webhooks.services.aws.Dynamo$    - Retrying AWS request; retry #0 []
[info] com.amazonaws.SdkClientException: Unable to execute HTTP request: The target server failed to respond
[info]  at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleRetryableException(AmazonHttpClient.java:1136)
[info]  at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1082)
[info]  at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:745)
[info]  at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:719)
[info]  at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:701)
[info]  at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:669)
[info]  at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:651)
[info]  at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:515)
[info]  at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.doInvoke(AmazonDynamoDBClient.java:2925)
[info]  at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:2901)
[info]  at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.executeDescribeTable(AmazonDynamoDBClient.java:1515)
[info]  at com.amazonaws.services.dynamodbv2.AmazonDynamoDBAsyncClient$13.call(AmazonDynamoDBAsyncClient.java:840)
[info]  at com.amazonaws.services.dynamodbv2.AmazonDynamoDBAsyncClient$13.call(AmazonDynamoDBAsyncClient.java:834)
[info]  at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
[info]  at com.riskified.webhooks.utils.monitoring.KamonAwsExecutorFactory$ContextRunnable.run(KamonAwsExecutorFactory.scala:17)
[info]  at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
[info]  at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
 

Похоже, что мое основное приложение не может подключиться к DynamoDB в localstack, хотя я запустил его до запуска своего сервера. Если мне придется сделать ставку, я скажу, что контейнер, содержащий localstack, блокирует получение HTTP-запроса извне контейнера.

У вас есть какие-нибудь идеи, почему я получаю эту ошибку?

Ответ №1:

Как вы пытаетесь получить доступ к службе DynamoDB (какой URL-адрес)? и откуда?

Например, когда вы пытаетесь связаться с S3 или DynamoDB из лямбда-функции, вам нужно, чтобы URL- http://${process.env.LOCALSTACK_HOSTNAME}:EDGE_PORT адрес соответствовал документам;

Кроме того, доступны следующие переменные среды, доступные только для чтения:

LOCALSTACK_HOSTNAME: Имя хоста, на котором доступны службы LocalStack. Используйте это имя хоста в качестве конечной точки (например, http://${LOCALSTACK_HOSTNAME}:4566) для доступа к службам из ваших функций Лямбда (например, для хранения элемента в DynamoDB или S3 из Лямбда).