当前位置: 首页 > 知识库问答 >
问题:

Boto3未生成正确的签名url

司寇祖鹤
2023-03-14

我有一个用例,我使用lambda函数生成有符号的网址上传到S3桶,我还在生成有符号的网址时设置了元数据值,我的boto3版本是boto3==1.18.35。以前,当我生成有符号的网址上传到桶时,网址看起来像这样:

https://bucket-name.s3.amazonaws.com/scanned-file-list/cf389880-09ff-4301-8fa7-b4054941685b/6919de95-b795-4cac-a2d3-f88ed87a0d08.zip?AWSAccessKeyId=ASIAVK6XU35LOIUAABGC

但现在URL看起来是这样的:

https://bucket-name.s3.amazonaws.com/scanned-file-list/f479e304-a2e4-47e7-b1c8-058e3012edac/3d349bab-c814-4aa7-b227-6ef86dd4b0a7.zip?X-Amz-Algorithm=AWS4-HMAC-SHA256

注意,它现在生成的URL没有元数据信息的正确值,即x-amz-meta-collector_id和x-amz-meta-scan_id。

我用来生成签名url的是:

bucket_name = os.environ['S3_UPLOADS_BUCKET_NAME']
metadata = {
    'scan_id': scan_id,
    'collector_id': collector_id
}

params = {
    'Bucket': bucket_name,
    'Key': path + file_obj['fileName'],
    'ContentType': file_obj.get('contentType') or '',
    'Metadata': metadata
}

logger.info('metadata used for generating URL: ' + str(metadata))

s3 = boto3.client('s3')
presigned_url = s3.generate_presigned_url('put_object', Params=params, ExpiresIn=36000)
logger.info(f'Presigned URL: {presigned_url}')

return presigned_url

由于URL的变化,我得到了SignatureddNotMatch错误,感谢您的帮助提前!

共有1个答案

魏风华
2023-03-14

问题是在AWS服务器上,从us-west-2生成的URL与在ap-south-1中生成的URL不同。

更多:已签名的url由部署在ap-south-1地区的lambda生成,X-Amz-Signature-Version自动添加到url中,但我在不同的地区部署了相同的lambda,即us-west-2,我得到了不同格式的已签名url,在我的情况下是当前的格式!

 类似资料:
  • 我正在寻找使用boto3和sse加密生成预签名url的示例。 这是我目前的代码 我正在努力寻找使用SSE加密的正确参数。我能够使用PUT调用上传文件。我还想知道客户端使用的标头以坚持sse加密。

  • 从我的终端运行时,它只生成以下APK。请告诉我如何从android Studio获得默认的未签名apk。我尝试为带有空密钥库的unsigned创建单独的buildType,但没有任何用处。

  • 有时,我的项目在这个时刻无法运行(它重建成功,但不能运行):不幸的是,我还不熟练的梯度材料,请帮助Q_Q :app:mergedebugjnilibfolders 4ms :app:TransformNativelibsWithMergeJNilibsForDebug 359ms :app:ProcessDebugJavares :app:TransformResourcesWithMergeJa

  • 我正在尝试构建我的第一个签名APK以供发布,但出现了一些错误。看起来效果很好,但现在我就是无法生成APK。我做了研究,但什么也没找到。 Gradle版本:4.8,Android插件版本3.1.4,这是我的应用程序Gradle屏幕截图:link 这来自assembleDebug: 我曾经有过布局和不赞成使用的功能的其他问题,但我解决了它。其中一个就这样消失了,但我什么也没做:-) 我已经尝试过的事情

  • 如果你想把自己的资源发放给第三方用户访问,但是又不想开放Bucket的读权限,可以通过生成预签名URL的形式提供给用户一个临时的访问URL。在生成URL时,你可以指定URL过期的时间,从而限制用户长时间访问。 生成一个预签名的URL 如下代码: String bucketName = "your-bucket-name"; String key = "your-object-key"; // 设

  • 如果你想把自己的资源发放给第三方用户访问,但是又不想开放Bucket的读权限,可以通过生成预签名URL的形式提供给用户一个临时的访问URL。在生成URL时,你可以指定URL过期的时间,从而限制用户长时间访问。 生成预签名URL来获取Object <?php $url = $client->generatePresignedUrl(array( 'Bucket' => 'your-buck