通过Earthdata的 AWS凭证,使用boto3访问MERRA-2数据时出现访问被拒绝和403错误
我正在尝试使用Python和 boto3以编程方式访问MERRA-2数据(M2T3NPUDT.5.12.4)。
我已成功完成以下操作:
- 使用我的Earthdata登录凭证完成认证。
- 从GES DISC的 S3凭证端点获取了临时AWS凭证。
- 解析返回的凭证(
accessKeyId,secretAccessKey,sessionToken)。 - 成功创建了boto3 S3客户端。
然而,当我尝试列出该bucket中的对象时:
response = client.list_objects_v2(
Bucket="gesdisc-cumulus-prod-protected",
Prefix="MERRA2/M2T3NPUDT.5.12.4/2025/03/"
)
我收到了:
AccessDenied: User is not authorized to perform s3:ListBucket
接着,我尝试直接通过以下方式下载一个特定文件:
client.download_file(
"gesdisc-cumulus-prod-protected",
"MERRA2/M2T3NPUDT.5.12.4/2025/03/MERRA2_400.tavg3_3d_udt_Np.20250331.nc4",
"test.nc4"
)
但收到了:
403 Forbidden
该文件可以通过Earthdata的网页界面访问,并且在登录的情况下通过我的浏览器下载也能成功。
我的问题是:
- 由GES DISC的 S3凭证服务返回的临时AWS准证,是否应该允许从本地机器直接访问MERRA-2文件?
- 是否有意禁用该数据集的桶列出功能?
任何指导或可工作的示例都将不胜感激。
解决方案
1.临时凭证是否允许从本地机器直接访问?
不可以。 直接对NASA Earthdata云存储桶的S3访问(s3://,如 gesdisc-cumulus-prod-protected)被严格限定为只能由在AWS us-west-2 区域内部署的计算资源使用。
当你从GES DISC端点请求临时S3凭证时,AWS会成功生成凭证。然而,该S3存储桶本身具有一个VPC(虚拟私有云)端点策略,阻止来自 us-west-2 区域之外的所有流量。由于你的本地机器位于该边界之外,AWS S3会强制拒绝连接,导致在 download_file 上出现 403 Forbidden 错误。
2.是否故意禁用桶列出?
是的。 出于安全、成本控制和性能原因,大多数Earthdata S3存储桶都故意禁用了广泛的桶列出功能(s3:ListBucket)。
NASA的体系结构要求用户通过 Common Metadata Repository (CMR) API来查找确切的文件路径(S3 URI或 HTTPS URL),而不是递归爬取或列出S3桶的内容。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。