Python Boto3在us-east-1和us-east-2中,AWS S3为bucket预签名url响应存在差异



使用Python Boto3,我创建预签名后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 中bucket的响应字段存在差异

使用相同的代码,如果我使用us-east-1尝试bucket,我会得到ressponse字段。

AWSAccessKeyId, key, policy, signature, and x-amz-security-token

当在us-east-2区域中使用bucket创建时,我会得到响应字段

key, policy, x-amz-algorithm, x-amz-credential, x-amz-date, x-amz-security-token, x-amz-signature

除了区域之外,bucket配置没有什么不同,但为什么响应字段会有这样的差异。我们改变了什么以在所有区域获得相同的响应

当我检查这两个场景时。

lambda代码:

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区域的响应bucket获得了额外的参数:

'x-amz-algorithm': 'AWS4-HMAC-SHA256',
'x-amz-credential': 'xxxxxxxxxxxxxxx/xxxxxxx/ap-south-1/s3/aws4_request',
'x-amz-date': '20200928T183454Z',

这背后的原因是您正在使用generate_presigned_postboto3 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区域生成预签名post时使用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使用POST-进行基于浏览器的亚马逊AWS S3上传

相关内容

  • 没有找到相关文章

最新更新