docker - AWS localstack 拒绝来自同一台机器上正在运行的服务的 HTTP 请求
问题描述
我有一些使用 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
当我运行应用程序的主服务时,它应该调用在 docker 中运行的伪 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)
看起来我的主应用程序无法连接到 localstack 中的 DynamoDB,尽管我在启动服务器之前已经启动了它。如果我必须打赌,我会说保存 localstack 的容器阻止它从容器外部获取 HTTP 请求。
你知道我为什么会收到这个错误吗?
解决方案
您如何尝试访问 DynamoDB 服务(哪个 URL)?从哪里来?
例如,当您尝试从 lambda 函数中访问 S3 或 DynamoDB 时,您需要 URL 符合http://${process.env.LOCALSTACK_HOSTNAME}:EDGE_PORT
文档;
此外,还提供以下只读环境变量:
LOCALSTACK_HOSTNAME:LocalStack 服务可用的主机名。将此主机名用作端点(例如,http://${LOCALSTACK_HOSTNAME}:4566),以便从您的 Lambda 函数中访问服务(例如,将项目从 Lambda 存储到 DynamoDB 或 S3)。