【问题标题】:Redirect AWS sdks' default endpoint to mocked localstack endpoints将 AWS sdks 的默认端点重定向到模拟的 localstack 端点
【发布时间】:2018-08-04 02:08:04
【问题描述】:

我有多个 Java spring boot 服务(其中大约 20 个)使用 Amazon SDKs for S3、SQS、DynamoDB 等。

目前,要使用 Amazon Web Service,我只需要指定我的 AWS 密钥和密码。

ACCESS_AWS_KEY=<MY_KEY>
ACCESS_AWS_SECRET=<MY_SECRET>

但是,我想设置离线开发环境,所以我开始对我的服务进行 docker 化,并设置一个单一的多 docker 容器,其中我的所有服务都已 docker 化,并且应该使用 localstack 而不是远程 AWS 服务以允许完整的离线开发.

docker-compose.yml 看起来像这样

version: '3'
services:
  service_1:
    build: ./repos/service_1
    links:
    - service_2:
    - localstack
  service_2:
    build: ./repos/service_2
    links:
    - localstack
  service_3:
    build: ./repos/service_3
    links:
    - localstack
  localstack:
    image: localstack/localstack

Amazon SDK 提供 AWS_REGION 环境变量,但不是我可以在所有服务中轻松使用的端点环境变量。

我也不想在我的服务中更改代码以适应新的非默认端点。

我想要一个通用的解决方案来转发这样的请求:

dynamodb.eu-west-1.amazonaws.com => localstack_1:4569
s3-eu-west-1.amazonaws.com => localstack_1:4572

其中 localstack_1 是 localstack 的链接 docker 容器,其他容器可以访问。

我在 docker-compose 中遇到了extra_hosts:,但它只重定向到 IP,没有主机名解析。

另外,请注意我在 localstack 中暴露了从 4569 到 4582 的几十个端口。

我想过在每台机器上运行一个脚本,以某种方式设置一个虚拟主机,或者将所有容器的所有传出连接转发到一个集中的请求转发器服务,但不知道从哪里开始。

这将仅用作离线开发环境,不会接收任何实际流量。

【问题讨论】:

  • 我也有同样的问题。我有几个使用 moto 的服务的 docker 容器(localstack 基于),我必须为每个服务指定端点 URL。我最终使用direnv 并将环境变量设置为mock_*:5000 的URL,例如sqs 将是mock_sqs:5000。由于我在其他容器上进行测试并且端口是公开的,因此我实际上不需要将端口映射到我的本地主机,尽管我还是这样做了。
  • 您是否找到了解决方案,因为看起来我陷入了同一个陷阱? :)
  • 您找到解决方案了吗?
  • 在下面查看我的解决方案 :)

标签: docker docker-compose hosts dnsmasq localstack


【解决方案1】:

好的,我终于找到了解决方案。我实际上必须通过 localstack 代码库才能找到解决方案。 几件快速的事情:

  • Lo​​calstack 未与 IAM 集成。所以它只是简单地忽略密钥或密码。
  • 如果您使用 IAM,您现在需要有一个标志来覆盖端点。您可能有一个标志来指示本地堆栈模式。

如果您正在调试问题,我发现这些类对您很有帮助:
https://github.com/atlassian/localstack/blob/master/localstack/ext/java/src/test/java/com/atlassian/localstack/SQSMessagingTest.java https://github.com/atlassian/localstack/blob/master/localstack/ext/java/src/test/java/com/atlassian/localstack/TestUtils.java

现在解决方法:

AwsClientBuilder.EndpointConfiguration endpoint = new AwsClientBuilder.EndpointConfiguration("http://localhost:4576/", awsRegion.getName());
    AmazonSQSClient client =  (AmazonSQSClient) AmazonSQSClientBuilder.standard()
        .withCredentials(configuration.getSqsConfiguration().getCredentialsProvider())
        .withEndpointConfiguration(endpoint)
        .build();

这里 http://localhost:4576/ 是 localstacks 运行 SQS 的地方。不要错过尾部的斜线。 在骆驼路线中使用它与使用 AWS 资源相同。希望这会有所帮助!

【讨论】:

  • 但是,你还是修改了代码,假设代码是Golang,python,你需要到处修改。在乞讨时,我们计划使用 localstack 进行 CI 测试。但事实证明我们需要修改我们的代码......
  • 其他选项是将 aws 调用重定向到 localstack 的代理。
猜你喜欢
  • 2018-10-18
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 2022-06-15
  • 2023-02-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
相关资源
最近更新 更多