Flink 无法将 http 请求发送到本地堆栈上的 S3 存储桶

Flink can not send http request to S3 bucket on localstack

我正在尝试调用 getObject api 以在我的 Flink 作业中获取 S3 bucket0 上的外部文件,但它不断从我的 localstack 设置中获取 SdkException:

 org.apache.flink.kinesis.shaded.com.amazonaws.SdkClientException:
 Unable to execute HTTP request: mybucketName.s3.localstack

这就是我使用 docker compose 和 localstack

创建资源的方式
container_name: localstack
image: localstack/localstack:0.12.15
ports:
  - "14566:4566"
expose:
  - "4566"
environment:
  - DEFAULT_REGION=us-east-1
  - AWS_ACCESS_KEY_ID=test
  - AWS_SECRET_ACCESS_KEY=test
  - EDGE_PORT=4566
  - SERVICES=s3
  - AWS_CBOR_DISABLE=1

我尝试用 http://localstack:4566 和 http://s3.localstack:4566 替换端点,但我仍然看到错误

import org.apache.flink.kinesis.shaded.com.amazonaws.services.s3.AmazonS3ClientBuilder;
    
AwsClientBuilder.EndpointConfiguration endpointConfiguration =
        new AwsClientBuilder.EndpointConfiguration(
            "http://s3.localstack:4566",   // also tried localstack:4566 and 127.0.0.1:4566 etc..
            region);

s3Client = AmazonS3ClientBuilder.standard()
        .withEndpointConfiguration(endpointConfiguration)
        .build()


S3Object s3Object = s3Client.getObject(bucketName, objectLocation);

有人知道我为什么会遇到这个问题吗?抱歉,SdkException 仅显示无法执行 HTTP,不会输出 context/info 的批次。谢谢。

我想我已经找到了解决方案,我应该在我的客户端中调用 .enablePathStyleAccess()

    AmazonS3ClientBuilder.standard()
        .withEndpointConfiguration(endpointConfiguration)
        .enablePathStyleAccess()
        .build()

请参考这个post