重定向AWS sdks'模拟localstack端点的默认端点

时间:2017-08-07 16:19:26

标签: docker docker-compose hosts dnsmasq atlassian-localstack

我使用适用于S3,SQS,DynamoDB等的Amazon SDK,有多个Java Spring启动服务(大约20个)。

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

ACCESS_AWS_KEY=<MY_KEY>
ACCESS_AWS_SECRET=<MY_SECRET>

但是,我想设置离线开发环境,所以我开始对我的服务进行dockerize并设置一个多Docker容器,我的所有服务都是dockerized,并且应该使用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 env变量,但不提供我可以在所有服务中轻松使用的端点环境变量。

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

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

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暴露了数十个端口。

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

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

1 个答案:

答案 0 :(得分:1)

好的,我终于能够找到解决方案。我实际上必须经过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/是localstack运行SQS的地方。不要错过结尾的斜线。 在骆驼路线中使用此功能与使用AWS资源相同。希望这会有所帮助!