我使用适用于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,或者将所有传出连接从所有容器转发到集中式请求转发器服务,但不知道从哪里开始。
这只会用作离线开发环境,不会收到任何实际流量。
答案 0 :(得分:1)
好的,我终于能够找到解决方案。我实际上必须经过localstack代码库才能找到解决方案。 几个快速的事情:
如果您正在调试问题,我发现对夫妇有用:
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资源相同。希望这会有所帮助!