Python 使用API网关从S3下载大文件?

Python 使用API网关从S3下载大文件?,python,amazon-web-services,amazon-s3,aws-lambda,aws-api-gateway,Python,Amazon Web Services,Amazon S3,Aws Lambda,Aws Api Gateway,我正在创建一个网页,用户可以点击不同的链接,这将下载文件,从1兆字节到300兆字节不等。这些链接执行对API网关端点的GET请求,后者从S3下载相应的文件。我目前正在使用以下代码: def files_download(event, context): try: key = event['queryStringParameters']['key'] # name = event except Exception as e: return client_failure('K

我正在创建一个网页,用户可以点击不同的链接,这将下载文件,从1兆字节到300兆字节不等。这些链接执行对API网关端点的GET请求,后者从S3下载相应的文件。我目前正在使用以下代码:

def files_download(event, context):
try:
    key = event['queryStringParameters']['key']
    # name = event
except Exception as e:
    return client_failure('Key field required as query parameter', e)

try:
    file = s3.Object('XXXXX', key)

    return success_file('text/csv', key, file.get()['Body'].read())
except Exception as e:
    return server_failure('Failed to retrieve file', e)

def success_file(content_type, attachment_name, data):
    return {
        'isBase64Encoded': False,
        'statusCode': 200,
        'headers': {
            'Access-Control-Allow-Methods': '*',
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Credentials' : True,
            'Content-Disposition': 'attachment; filename=' + attachment_name
        },
        'body': data
    }

def success(data):
    return {
        'isBase64Encoded': False,
        'statusCode': 200,
        'headers': {
            'Content-Type': 'application/json',
            'Access-Control-Allow-Methods': '*',
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Credentials' : True
        },
        'body': json.dumps({
            'data': data
        }, cls=DecimalEncoder)
    }

def server_failure(message, details):
    return {
        'isBase64Encoded': False,
        'statusCode': 500,
        'headers': {
            'Content-Type': 'application/json',
            'Access-Control-Allow-Methods': '*',
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Credentials' : True
        },
        'body': json.dumps({
            'message': message,
            'details': str(details)
        }, cls=DecimalEncoder)
    }

def client_failure(message, details):
    return {
        'isBase64Encoded': False,
        'statusCode': 400,
        'headers': {
            'Content-Type': 'application/json',
            'Access-Control-Allow-Methods': '*',
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Credentials' : True
        },
        'body': json.dumps({
            'message': message,
            'details': str(details)
        }, cls=DecimalEncoder)
    }

但是,对于大型文件(>100MB),这似乎失败了。有没有办法让它工作,或者有没有更好的方法让用户下载文件?我曾考虑公开我的S3存储桶并提供直接链接,但显然出于身份验证的原因,这并不理想。

我相信有一种安全的方法可以让用户直接从S3下载(通过临时令牌或类似的方式)。你搜索过吗?是的,我会考虑生成一个预先签名的url-