我有多个 Java Spring Boot 服务(大约 20 个)使用 Amazon SDKs for S3、SQS、DynamoDB 等。
目前,要使用 Amazon Web Service,我只需要指定我的 AWS key 和 secret 。
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 环境变量,但不是我可以在所有服务中轻松使用的端点环境变量。
我也不想在我的服务中进行代码更改以适应新的非默认端点。
我想要一个通用的解决方案来转发这样的请求:
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。
我想过在每台机器上运行一个脚本,以某种方式设置一个虚拟主机,或者将所有来自所有容器的传出连接转发到一个集中的请求转发器服务,但不知道从哪里开始。
这将仅用作离线开发环境,不会收到任何实际流量。
最佳答案
好的,我终于能够为此找到解决方案。我必须实际通过 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/ 是 localstacks 运行 SQS 的地方。不要错过尾部斜线。
在 Camel route 使用它与使用 AWS 资源相同。希望这会有所帮助!