无法与非 AWS 服务通话

Can't get soto to talk to non-AWS service

我已经使用 Swift soto 包成功实现了 Amazon Web Service S3 存储应用程序。

我这样创建 S3 服务对象:

func s3Maker() -> S3
{
    return S3(client: client, region: Region(rawValue: awsConfiguration.region), endpoint: awsConfiguration.endpoint, timeout: commandTimeout)
}

使用 AWS 时,awsConfiguration.region 是 AWS 的标准区域名称之一(在本例中为 "us-west-2"),.endpointnil(告诉 soto 使用标准“amazonaws.com”域)。

一切正常。

我现在想重用此代码与模拟 AWS S3 API 的非 AWS 提供商(从 BackBlaze 开始)进行通信。我的理解是,您只需在服务对象创建期间更改端点和区域。

我有一个 awsConfiguration 对象的子类,它只是具有不同的 region ("us-west-000") 和 endpoint ("backblazeb2.com") 属性 值,但它不起作用。

当代码 运行s 获取存储桶中的对象列表失败时,返回错误:“无法读取存储桶内容”

为了调试它,我 运行 Fiddler Everywhere 监视从我的机器发送的 HTTP 请求。当我 运行 AWS 版本时,我看到两个 HTTPS 请求:http://qr3dev1.s3.us-west-2.amazonaws.com:443https://qr3dev1.s3.us-west-2.amazonaws.com/?list-type=2,都成功了。

但是当我将区域和端点更改为 BackBlaze 时,代码什么也不做。 Soto 从不发送任何 HTTP 请求。代码只是 returns 错误。

有没有人每 运行 都参与过这个,知道如何调试它,或者知道让 soto 与非 AWS 服务对话的秘诀?

事实证明,“问题”只是我的大脑、soto 文档和代码之间的阻抗不匹配。

感谢 Adam Fowler(soto 的作者之一),他慷慨地帮助我提供了一些说明 endpoint.

正确用法的示例代码

endpoint 属性 必须是一个 URL 片段,而不仅仅是服务的域名(这是我的假设):

func s3Maker() -> S3
{
    return S3(client: client,
              region: Region(rawValue: "us-region-1"),
            endpoint: "https://s3.us-region-1.non-aws-server.com") // <-- CORRECT
//          endpoint: "non-aws-server.com" ) <--- wrong
}