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
相关产品推荐
相关产品推荐

