访问 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 公共存储桶的主要内容,如果未能解决你的问题,请参考以下文章
从 Azure 数据块读取 Amazon S3 特定文件夹,无需公开访问存储桶