运维开发网
广告位招商联系QQ:123077622
 
广告位招商联系QQ:123077622

docker – 将AWS sdks的默认端点重定向到模拟的localstack端点

运维开发网 https://www.qedev.com 2020-07-11 14:34 出处:网络 作者:运维开发网整理
我有多个 Java Spring启动服务(大约20个)使用Amazon SDKs for S3,SQS,DynamoDB等. 目前,要使用Amazon Web Service,我只需要指定我的AWS密钥&秘密. ACCESS_AWS_KEY=<MY_KEY> ACCESS_AWS_SECRET=<MY_SECRET> 但是,我想设置离线开发环境,所以我开始对我的服务进行dockerize并设置一个
我有多个 Java Spring启动服务(大约20个)使用Amazon SDKs for S3,SQS,DynamoDB等.

目前,要使用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,或者将所有传出连接从所有容器转发到集中式请求转发器服务,但是不知道从哪里开始.

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

好的,我终于找到了解决方案.我必须通过localstack代码库才能找到解决方案.

几个快速的东西:

> Localstack未与IAM集成.所以它只是忽略了密钥或密码.

>如果您正在使用IAM,则现在需要有一个标志来覆盖端点.您可以使用一个标志来指示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路由中使用它与使用AWS资源相同.希望这有帮助!

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消