【问题标题】:Access Amazon S3 public bucket访问 Amazon S3 公共存储桶
【发布时间】:2021-10-12 12:58:53
【问题描述】:

您好,我正在尝试从 Amazon S3 公共存储桶之一下载数据。

例如https://registry.opendata.aws/noaa-gfs-bdp-pds/

存储桶有网络可访问文件夹,我想下载存储桶内的文件。 我知道我可以使用 AWS CLI 工具做到这一点 但我想知道是否可以使用 AWS SDK Api(s3 客户端)(c# visual studio)来做到这一点?

我认为问题在于创建与 s3 客户端的连接时的身份验证,它需要访问密钥等凭据,我没有 AWS 帐户,而且我尝试访问的存储桶是公开的,所以
有谁知道如何在没有任何凭据的情况下通过 API 访问这个公共存储桶?

谢谢。

【问题讨论】:

  • 即使存储桶是公共的,您也需要“知道”要下载到哪个对象,如果我没记错的话,您可以通过 api/sdk 执行函数 ListObjects 以获取它的列表,但是,如果您想将存储桶视为 opendata 之类的网站,您还需要将存储桶设置为“静态网站”。 docs.aws.amazon.com/AmazonS3/latest/userguide/…
  • 是的,我想使用函数 ListObject 但这需要创建 AmazonS3Client() 并传递我没有的凭证,因为它的公共存储桶..我没有 aws 帐户..我'我也这个异常无法从“ec2实例元数据服务”获取iam安全凭证不明白为什么我需要任何凭证以及如果我想访问公共aws存储桶我从哪里得到它们????‍♀️
  • @smac2020 从理论上讲,您应该能够发出未签名的请求。例如,awscli(使用--no-sign-request)和boto3(参见here)都支持这一点。其他 SDK 也可能支持此功能,但我无法立即在 .Net 文档中找到它。
  • @smac2020 如果这是对我的回应,那么您就错过了我评论的重点。您之前提到,如果没有 AWS 账户,您将无法使用 AWS 开发工具包。这是不正确的。我是说您可以在没有 AWS 账户的情况下使用 AWS 开发工具包(和 AWSCLI),特别是在允许未经身份验证/匿名访问的情况下,例如到 S3 存储桶。
  • 谢谢两位的回答。 @smac2020 你熟悉我的任何解决方案吗?

标签: amazon-web-services amazon-s3


【解决方案1】:

如果您将 AnonymousAWSCredentials 指定为凭证对象,则向 S3 发出的任何请求都将是未签名的。之后,与存储桶的交互就像任何其他调用一样完成:

using Amazon.Runtime;
using Amazon.S3;
using Amazon.S3.Model;
using System;

namespace S3TestApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var unsigned = new AnonymousAWSCredentials();
            var client = new AmazonS3Client(unsigned, Amazon.RegionEndpoint.USEast1);

            var listRequest = new ListObjectsRequest
            {
                BucketName = "noaa-gfs-bdp-pds",
                Delimiter = "/",
            };

            ListObjectsResponse listResponse;
            do
            {
                listResponse = client.ListObjects(listRequest);
                foreach (var obj in listResponse.CommonPrefixes)
                {
                    Console.WriteLine("PRE {0}", obj);
                }
                foreach (var obj in listResponse.S3Objects)
                {
                    Console.WriteLine("{0} {1}", obj.Size, obj.Key);
                }
                listRequest.Marker = listResponse.NextMarker;
            } while (listResponse.IsTruncated);

        }
    }
}

【讨论】:

  • 谢谢,我会努力的!!
猜你喜欢
  • 2019-04-20
  • 2016-11-16
  • 1970-01-01
  • 2014-12-23
  • 2012-06-22
  • 1970-01-01
  • 2020-02-23
  • 2017-03-07
  • 1970-01-01
相关资源
最近更新 更多