Skip to main content

kopia接入火山云TOS报错Access Denied问题的排查及修复

· 2 min read
orange
programmer on jvm platform

kopia是一个备份工具, 支持多种存储后端, 包括对象存储, 文件系统等, 通过kopia可以将数据备份到不同的存储后端, 也可以从不同的存储后端恢复数据. 火山云TOS是火山云提供的对象存储服务, 支持通过S3协议访问. 最近在使用kopia接入火山云TOS时, 遇到了一个问题, 问题的现象是调用kopia提供的s3_storage接入火山云TOS时, 报错 Access Denied.

unable to determine if bucket "xxxxx" exists: Access Denied.

以下是该问题的原因及解决方案总结.

问题原因

火山云对S3协议只有部分实现. 以请求方式为例, 只支持Virtual Hosted-Style的请求方式, 不支持Path-Style的请求方式.

上述两种请求方式主要用于区分对不同的存储桶进行操作. Virtual Hosted-Style: 这种请求方式是通过在域名中指定存储桶名称来进行操作, 如https://{bucket-name}.s3.{region-code}.amazonaws.com. Path-Style: 这种请求方式是通过在域名后面指定存储桶名称来进行操作, 如`https://s3.{region-code}.amazonaws.com/{bucket-name}

kopia通过minio实现了对S3协议的支持, minio中默认情况下使用Path-Style的请求方式, 所以导致了Access Denied的问题.

解决方案

minio在创建client的时候提供了BucketLookup选项, 用于指定client使用的请求方式, 但是kopia没有暴露这个选项.
目前已在kopiarepo中开了一个issue, 需要等待后续的进展.

参考

TOS 仅支持使用虚拟主机(即 VirtualHostStyle)的请求方式,不支持路径样式(即 PathStyle)的请求方式。因此使用各种支持 S3 协议的 SDK 和工具访问 TOS 时,请务必确保配置了 VirtualHostStyle 的请求方式。例如,使用 AWS S3 Java SDK 时,需要在客户端初始化时确保设置了禁用 PathStyle 的配置参数:AmazonS3Builder.withPathStyleAccessEnabled(false)。