无法与非 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"
),.endpoint
是 nil
(告诉 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:443
和 https://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
}
我已经使用 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"
),.endpoint
是 nil
(告诉 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:443
和 https://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
}