Boto3 生成 presinged url 不起作用
Boto3 generate presinged url does not work
这是我用来创建 s3 客户端并生成预签名 url 的代码,这是一些非常标准的代码。他们已经在服务器 运行 上运行了很长一段时间。我提取了代码并 运行 在本地的 jupyter notebook 中
def get_s3_client():
return get_s3(create_session=False)
def get_s3(create_session=False):
session = boto3.session.Session() if create_session else boto3
S3_ENDPOINT = os.environ.get('AWS_S3_ENDPOINT')
if S3_ENDPOINT:
AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
AWS_DEFAULT_REGION = os.environ["AWS_DEFAULT_REGION"]
s3 = session.client('s3',
endpoint_url=S3_ENDPOINT,
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
region_name=AWS_DEFAULT_REGION)
else:
s3 = session.client('s3', region_name='us-east-2')
return s3
s3 = get_s3_client()
BUCKET=[my-bucket-name]
OBJECT_KEY=[my-object-name]
signed_url = s3.generate_presigned_url(
'get_object',
ExpiresIn=3600,
Params={
"Bucket": BUCKET,
"Key": OBJECT_KEY,
}
)
print(signed_url)
当我尝试在浏览器中使用 url 下载文件时,我收到一条错误消息,显示“指定的密钥不存在”。我在错误消息中注意到我的对象键变成了“[my-bucket-name]/[my-object-name]”,而不仅仅是“[my-object-name]”。
然后我使用相同的 bucket/key 组合使用 aws cli 生成预签名的 url,这按预期工作。我发现与 aws cli 方法相比,s3 客户端方法 (boto3) 在 [my-object-name] 前面插入了 [my-object-name]。这是结果
来自 s3.generate_presigned_url()
https://[my-bucket-name].s3.us-east-2.amazonaws.com/[my-bucket-name]/[my-object-name]?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAV17K253JHUDLKKHB%2F20210520%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-Date=20210520T175014Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=5cdcc38e5933e92b5xed07b58e421e5418c16942cb9ac6ac6429ac65c9f87d64
来自 aws cli s3 presign
https://[my-bucket-name].s3.us-east-2.amazonaws.com/[my-object-name]?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAYA7K15LJHUDAVKHB%2F20210520%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-Date=20210520T155926Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=58208f91985bf3ce72ccf884ba804af30151d158d6ba410dd8fe9d2457369894
我已经为此工作了一天半,并一直在寻找解决方案,但我找不到我的实施有什么问题。我想可能是我忽略了一些基本但重要的设置来使用 boto3 或其他东西创建 s3 客户端。感谢您的帮助!
好的,神话已经解决了,我不应该在创建 s3 客户端时提供 endpoint_url=S3_ENDPOINT 参数,boto3 会解决这个问题。删除后,一切正常。
这是我用来创建 s3 客户端并生成预签名 url 的代码,这是一些非常标准的代码。他们已经在服务器 运行 上运行了很长一段时间。我提取了代码并 运行 在本地的 jupyter notebook 中
def get_s3_client():
return get_s3(create_session=False)
def get_s3(create_session=False):
session = boto3.session.Session() if create_session else boto3
S3_ENDPOINT = os.environ.get('AWS_S3_ENDPOINT')
if S3_ENDPOINT:
AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
AWS_DEFAULT_REGION = os.environ["AWS_DEFAULT_REGION"]
s3 = session.client('s3',
endpoint_url=S3_ENDPOINT,
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
region_name=AWS_DEFAULT_REGION)
else:
s3 = session.client('s3', region_name='us-east-2')
return s3
s3 = get_s3_client()
BUCKET=[my-bucket-name]
OBJECT_KEY=[my-object-name]
signed_url = s3.generate_presigned_url(
'get_object',
ExpiresIn=3600,
Params={
"Bucket": BUCKET,
"Key": OBJECT_KEY,
}
)
print(signed_url)
当我尝试在浏览器中使用 url 下载文件时,我收到一条错误消息,显示“指定的密钥不存在”。我在错误消息中注意到我的对象键变成了“[my-bucket-name]/[my-object-name]”,而不仅仅是“[my-object-name]”。
然后我使用相同的 bucket/key 组合使用 aws cli 生成预签名的 url,这按预期工作。我发现与 aws cli 方法相比,s3 客户端方法 (boto3) 在 [my-object-name] 前面插入了 [my-object-name]。这是结果
来自 s3.generate_presigned_url()
https://[my-bucket-name].s3.us-east-2.amazonaws.com/[my-bucket-name]/[my-object-name]?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAV17K253JHUDLKKHB%2F20210520%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-Date=20210520T175014Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=5cdcc38e5933e92b5xed07b58e421e5418c16942cb9ac6ac6429ac65c9f87d64
来自 aws cli s3 presign
https://[my-bucket-name].s3.us-east-2.amazonaws.com/[my-object-name]?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAYA7K15LJHUDAVKHB%2F20210520%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-Date=20210520T155926Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=58208f91985bf3ce72ccf884ba804af30151d158d6ba410dd8fe9d2457369894
我已经为此工作了一天半,并一直在寻找解决方案,但我找不到我的实施有什么问题。我想可能是我忽略了一些基本但重要的设置来使用 boto3 或其他东西创建 s3 客户端。感谢您的帮助!
好的,神话已经解决了,我不应该在创建 s3 客户端时提供 endpoint_url=S3_ENDPOINT 参数,boto3 会解决这个问题。删除后,一切正常。