1

我已经使用 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") 属性值,但它不起作用。

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

为了调试它,我运行了 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 请求。代码只是返回错误。

有没有人遇到过这种情况,知道如何调试它,或者知道让 soto 与非 AWS 服务通信的秘密?

4

1 回答 1

1

事实证明,“问题”只是我的大脑、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
}
于 2021-05-13T15:37:53.420 回答