Python Boto3 us-east-1和us-east-2中存储桶的AWS S3预签名URL响应有所不同

时间:2020-09-28 16:16:33

标签: python amazon-web-services amazon-s3 boto3

使用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进行存储桶操作,则会得到ressponse字段。

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

除了区域之外,存储桶配置没有其他区别,但仍然是为什么响应字段存在这种区别。 我们所做的改变是为了在所有地区获得相同的响应

1 个答案:

答案 0 :(得分:0)

我检查了这两种情况。

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个区域存储区中得到响应:

'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 browser-based upload using POST -