Spring Cloud Data Flow S3源对接Minio子域名拼接问题
问题根因
这个行为是AWS S3 Java SDK的默认寻址逻辑导致的,和S3 Source组件本身无关:
- S3 SDK默认优先使用虚拟主机风格寻址访问存储桶,规则是将桶名作为子域名拼接在配置的服务端点域名前,最终访问地址格式为
http(s)://{bucket-name}.{endpoint-host}:{port}。你的场景中桶名为kafka-connect,配置的端点是http://minio:9000,SDK就自动拼接出了http://kafka-connect.minio:9000这个地址。 - 你的Docker内部网络没有配置
*.minio的泛域名解析规则,这个拼接出来的域名无法被DNS识别,自然抛出UnknownHostException异常。 - 同环境下Kafka Connect S3 Source能正常访问,是因为Kafka Connect的S3连接器对自定义S3兼容服务(比如MinIO)做了默认适配,会自动切换为路径风格寻址,也就是直接访问
http(s)://{endpoint-host}:{port}/{bucket-name}格式的地址,不会做子域名拼接。
修复方法
在S3 Source的配置项中新增一条参数,强制SDK使用路径风格寻址即可:
app.s3.cloud.aws.s3.path-style-access-enabled=true
添加该配置后重启流任务,SDK会直接访问http://minio:9000/kafka-connect/路径下的桶资源,不会再拼接子域名,即可正常连通MinIO服务。
补充说明:MinIO本身同时支持两种寻址模式,但本地Docker部署场景下没有配置泛域名解析,必须强制使用路径风格访问,这也是本地对接MinIO等自建S3兼容服务的通用配置项。
内容的提问来源于stack exchange,提问作者Francisco José Martínez Páez
相关产品推荐
相关产品推荐

