访问 Amazon S3 公共存储桶

Posted

技术标签:

【中文标题】访问 Amazon S3 公共存储桶【英文标题】:Access Amazon S3 public bucket 【发布时间】: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 你熟悉我的任何解决方案吗? 【参考方案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);

        
    

【讨论】:

谢谢,我会努力的!!

以上是关于访问 Amazon S3 公共存储桶的主要内容,如果未能解决你的问题,请参考以下文章

允许搜寻器访问其他帐户中的Amazon S3存储桶

从 Azure 数据块读取 Amazon S3 特定文件夹,无需公开访问存储桶

访问 aws s3 公共存储桶

尽管存储桶是公共的,但 Amazon S3 base64 图像不适用于 og:image 标签

我应该如何在 Amazon S3 上配置“阻止公共访问”?

在 Amazon S3 中将在 aws3 存储桶中创建的文件夹设为公共或私有文件夹