我已经使用Swift soto包成功实现了Amazon Web Service S3存储应用程序。
我像这样创建S3服务对象:
func s3Maker() -> S3
{
return S3(client: client, region: Region(rawValue: awsConfiguration.region), endpoint: awsConfiguration.endpoint, timeout: commandTimeout)
}在使用亚马逊网络服务时,awsConfiguration.region是亚马逊网络服务的标准区域名称之一(在本例中是"us-west-2"),.endpoint是nil (这告诉soto使用标准的"amazonaws.com“域名)。
一切都很好。
现在,我想重用此代码来与模拟亚马逊网络服务S3应用程序接口的非亚马逊网络服务提供商(从BackBlaze开始)进行通信。我的理解是,您只需在创建服务对象时更改端点和区域即可。
我有一个awsConfiguration对象的子类,它只是具有不同的region ("us-west-000")和endpoint ("backblazeb2.com")属性值,但它不起作用。
当代码运行时,它无法获取存储桶中的对象列表,并返回错误:"unable to read bucket content“
为了对此进行调试,我到处运行Fiddler来监视从我的机器发送的HTTP请求。当我运行亚马逊网络服务版本时,我看到两个HTTPS请求:http://qr3dev1.s3.us-west-2.amazonaws.com:443和https://qr3dev1.s3.us-west-2.amazonaws.com/?list-type=2,这两个请求都成功了。
但是,当我将区域和端点更改为BackBlaze时,代码什么也不做。Soto从不发送任何HTTP请求。代码只返回错误。
有没有人每次都遇到这种情况,知道如何调试它,或者知道让soto与非AWS服务对话的秘密?
发布于 2021-05-13 23:37:53
事实证明,“问题”只是我的大脑、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
}https://stackoverflow.com/questions/67423314
复制相似问题