python - Python Boto3 在 us-east-1 和 us-east-2 中的存储桶的 AWS S3 预签名 URL 响应存在差异
问题描述
使用 Python Boto3 我创建 post presign Url,下面是示例代码。
client = boto3.client('s3', region_name="us-east-1")
response = client.generate_presigned_post(Bucket="tes_bucket", Key=filename, ExpiresIn=300)
us-east-1 和 us-east-2 中存储桶的响应字段存在差异
使用相同的代码,如果我尝试使用 us-east-1 存储桶,我会得到响应字段。
AWSAccessKeyId, key, policy, signature, and x-amz-security-token
在 us-east-2 区域中使用存储桶创建时,我得到响应字段
key, policy, x-amz-algorithm, x-amz-credential, x-amz-date, x-amz-security-token, x-amz-signature
除了区域之外,bucket configuraion 没有什么不同,但为什么响应字段会有这样的差异。我们所做的改变是为了在所有地区获得相同的响应
解决方案
当我检查这两种情况时。
拉姆达代码:
import boto3
def lambda_handler(event, context):
filename = "example.pdf"
client = boto3.client('s3', region_name="us-east-1")
response = client.generate_presigned_post(Bucket="bucket1", Key=filename, ExpiresIn=300)
print(response)
client1 = boto3.client('s3', region_name="ap-south-1")
response1 = client1.generate_presigned_post(Bucket="bucket2", Key=filename, ExpiresIn=300)
print(response1)
仅响应ap-south-1
区域存储桶获得了额外的参数:
'x-amz-algorithm': 'AWS4-HMAC-SHA256',
'x-amz-credential': 'xxxxxxxxxxxxxxx/xxxxxxx/ap-south-1/s3/aws4_request',
'x-amz-date': '20200928T183454Z',
这背后的原因是您正在使用generate_presigned_post
boto3 S3 函数,该函数用于 API 调用或表单操作或 CURL 请求。当您在同一区域内部使用相同区域和握手资源时,不需要此额外检查来验证资源访问策略。好像两个 AWS 资源正在相互握手,它们具有不同的区域或不同的 AWS 账户,然后需要额外的参数来访问资源。
这所有参数都是 AWS 签名的一部分,用于验证具有适当的握手访问控制的资源。
为了获得相同的参数,这里是方法:
import boto3
import datetime
def lambda_handler(event, context):
filename = "example.pdf"
date_short = datetime.datetime.utcnow().strftime('%Y%m%d')
date_long = datetime.datetime.utcnow().strftime('%Y%m%dT000000Z')
client = boto3.client('s3', region_name="us-east-1")
fields = {
'acl': 'private',
'date': date_short,
'region': "us-east-1",
'x-amz-algorithm': 'AWS4-HMAC-SHA256',
'x-amz-date': date_long
}
response = client.generate_presigned_post(Bucket="bucket1",Fields = fields, Key=filename, ExpiresIn=300)
print(response)
client1 = boto3.client('s3', region_name="ap-south-1")
fields = {
'acl': 'private',
'date': date_short,
'region': "ap-south-1",
'x-amz-algorithm': 'AWS4-HMAC-SHA256',
'x-amz-date': date_long
}
response1 = client1.generate_presigned_post(Bucket="bucket2", Fields = fields,Key=filename, ExpiresIn=300)
print(response1)
Botocore 在为 us-east-1 区域生成预签名后使用 s3v2 并为其他区域使用 s3v4。这就是为什么您没有在字段中获得某些参数的原因。
因此,如果您将签名版本明确指定为 s3v4,那么您可以获得相同的字段。像这样的东西: https ://github.com/boto/boto3/issues/2606#issuecomment-701587119
from botocore.client import Config
s3 = boto3.client('s3', 'us-east-1', config=Config(signature_version='s3v4'))
response = s3.generate_presigned_post(Bucket="bucket2", Key=filename, ExpiresIn=300)
我试过这在两个请求中都有相同的字段。
参考:https ://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.generate_presigned_post Amazon AWS S3 基于浏览器的上传使用 POST -
推荐阅读
- c - 如何使 php 扩展名(.so)文件与依赖库一起移植?
- php - 我想知道 Wordpress 是否使用从主站点到嵌套站点的任何类型的配置继承
- python - “请将您的损失计算包装在零参数`lambda`中”是什么意思?方法?
- r - 在 Spark 中运行列操作的最快方法
- html - JavaScript 脚本加载顺序
- java - 我收到此错误无法处理来自 jar 的 Jar 条目 [module-info.class]
- groovy - 在 MarkupTemplateEngine 中使用模数运算符时编译错误
- spring - 在 Spring Webflux 中使用 Gson 而不是 Jackson
- java - 使用最新版本的 phantom(2.42.0) 和 scala(2.12.0-RC2) 查询数据库时未找到参数 ev:Nothing 的隐式
- arrays - 为什么我的 bash 脚本不能正常工作?