You need to enable JavaScript to run this app. Rasterio与boto3访问usgs-landsat requester pays桶报错如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Rasterio与boto3访问usgs-landsat requester pays桶报错如何解决

问题原因
  • usgs-landsat桶是**请求者付费(Requester Pays)**类型的存储桶,和你之前访问的landsat-pds这类完全公开的存储桶不同,所有访问请求必须明确声明由请求方承担数据传输产生的费用,否则S3会直接返回AccessDenied错误。
  • 你之前的代码中,boto3调用时没有显式传递请求者付费标识,rasterio调用底层GDAL的/vsis3虚拟文件系统时也没有读取到对应的配置,同时你给AWSSession传入的是无参初始化的boto3.Session(),没有继承你之前设置的密钥信息,多重问题叠加触发了访问报错。
解决方法

1. 修复boto3原生访问问题

所有针对usgs-landsat桶的操作都要显式传入RequestPayer='requester'参数,示例如下:

# 列存储桶对象正确写法
all_objects = s3.list_objects(Bucket = 'usgs-landsat', RequestPayer='requester')
# 下载文件正确写法
s3.download_file(
    'usgs-landsat', 
    '对象存储KEY', 
    '本地保存路径', 
    ExtraArgs={'RequestPayer': 'requester'}
)

2. 修复rasterio读取COG问题

在rasterio的Env配置里显式传入请求者付费参数,同时修正Session初始化逻辑,修改后的完整代码如下:

import boto3
import rasterio as rio
from matplotlib.pyplot import imshow
from rasterio.session import AWSSession

# 初始化boto3 Session时传入你的密钥,后续AWS操作都复用这个Session
boto3_sess = boto3.Session(
    aws_access_key_id=AWS_KEY_ID,
    aws_secret_access_key=AWS_SECRET
)
aws_session = AWSSession(boto3_sess)

cog = 's3://usgs-landsat/collection02/level-2/standard/oli-tirs/2020/026/027/LC08_L2SP_026027_20200827_20200906_02_T1/LC08_L2SP_026027_20200827_20200906_02_T1_SR_B2.TIF'

# 显式指定AWS_REQUEST_PAYER参数到rasterio的环境配置中
with rio.Env(aws_session, AWS_REQUEST_PAYER='requester'):
    with rio.open(cog) as src:
        profile = src.profile
        arr = src.read(1)
imshow(arr)

内容的提问来源于stack exchange,提问作者isaacm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 17:36:10