4

我有多个 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 的几十个端口。

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

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

4

1 回答 1

2

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

  • Localstack 未与 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 资源相同。希望这会有所帮助!

于 2018-08-03T18:08:04.450 回答