【问题标题】:Having problems accessing bucket that is not using US region with the .Net SDK使用 .Net SDK 访问未使用美国区域的存储桶时遇到问题
【发布时间】:2014-11-28 11:09:35
【问题描述】:

我最近一直在尝试编写代码来添加和删除 Amazon S3 存储桶中的内容。我对 Amazon S3 和 AmazonWS .Net SDK 完全陌生。

存储桶区域端点是http://sqs.eu-west-1.amazonaws.com,所以我这样构建了我的客户端:

_s3Client = AWSClientFactory.CreateAmazonS3Client(accessKey, awsSecretKey, new AmazonS3Config().WithServiceURL("http://sqs.eu-west-1.amazonaws.com"));

如果我遗漏了 AmazonS3Config 位,我会收到此错误:

在没有新位置的情况下返回了重定向。这可能是由于 尝试以不同的方式访问名称中带有句点的存储桶 区域然后配置客户端。

当我输入 AmazonS3Config 位时,我不再收到该错误,但我似乎根本无法访问此存储桶或我通常可以访问的任何其他存储桶。我发送的任何请求都返回 null。

我已经使用其他配置为美国标准区域的存储桶测试了我的代码,并且一切正常。唯一的区别在于 CreateAmazonS3Client 方法,我在其中使用欧盟端点设置配置。

谁能给我一些指导,告诉我应该如何设置我的客户在欧盟(爱尔兰)地区使用存储桶。我已经搜索了几个小时,到目前为止我遵循的每个教程或文档都没有工作。

【问题讨论】:

    标签: c# asp.net amazon-s3


    【解决方案1】:

    只需使用标准端点 - s3.amazonaws.com

    AmazonS3Config S3Config = new AmazonS3Config {
        ServiceURL = "s3.amazonaws.com",
        CommunicationProtocol = Amazon.S3.Model.Protocol.HTTP
    };
    
    AmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client(AWS_Key, AWS_SecretKey, S3Config);
    
    PutObjectRequest UploadToS3Request = new PutObjectRequest();
    UploadToS3Request.WithFilePath(localPath)
                     .WithBucketName(bucket)
                     .WithKey(key);
    
    client.PutObject(UploadToS3Request);
    

    【讨论】:

    • 我之前尝试过该端点,但没有在配置中添加“CommunicationProtocol = Amazon.S3.Model.Protocol.HTTP”。添加它就可以了。非常感谢您的回答。
    • 如果你想使用 HTTPS,我认为你需要使用欧盟特定的端点 s3-eu-west-1.amazonaws.com。您使用的是简单队列服务端点。见docs.amazonwebservices.com/general/latest/gr/rande.html
    • 天哪,我什至从来没有发现sqs在那里而不是s3。我想我只是从某处的某个帖子中复制了它,而不是正确处理亚马逊文档。我不知道出了什么问题,但现在很明显。看来我有一些阅读要做。再次感谢。
    • 在最新的 SDK 中,您需要在该 ServiceURL 前面添加一个 http:// 才能使其正常工作。这似乎是构造一个客户端对象的唯一方法,该对象可以读取美国和欧盟桶而不抛出。
    • 我们可以动态获取区域(服务网址)吗?
    【解决方案2】:

    它可能仍然与谁有关..

    使用旧的 AWS 开发工具包(版本 1),您可以简单地创建没有区域或 AmazonS3Config 的 S3 客户端。无需指定服务 URL,它为您使用上面提到的默认值。您真正需要该区域来使用 S3 的唯一一次是创建存储桶时,这可能很少是应用程序的要求。 这对我有用,我与 S3 执行的所有通信都是通过 https 进行的。

    使用适用于 .Net 的新 AWS 开发工具包(版本 2 及更高版本),似乎需要 region 参数,实际上如果没有给出,AmazonS3Client 会抛出异常。我尝试通过指定通用的https://s3.amazonaws.com URL 来解决此限制,但失败了,因为新 SDK 不遵循来自默认(我认为是 US-EAST-1)端点的 301 重定向。

    因此,总而言之,最好指定区域,即使在旧 API 上也是如此,以避免将来中断。如果您的应用程序正在进行跨区域调用,并且速度较慢(可能)且成本更高,那么您的代码最好能证明这一点。

    【讨论】:

      猜你喜欢
      • 2020-02-16
      • 2014-02-16
      • 1970-01-01
      • 2018-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      • 2019-05-15
      相关资源
      最近更新 更多