从Lambda的s3下载文件

时间:2019-03-31 08:22:01

标签: python amazon-web-services amazon-s3 aws-lambda amazon-sqs

我正在尝试从AWS Lambda中的s3下载文件。

有一个Web服务将s3元数据(键,存储桶)推送到SQS。我有一个lambda,可以下载文件并将其内容推入elasticsearch。这是我的代码:

import config

def push_data(event, context):
    try:
        _push_data(event, context)
    except Exception as e:
        print("Exception raised %s" % e)


def _push_data(event, context):
    files_data = get_files_data(event)
    for file_data in files_data:
        is_success, data = push_file(
            index=file_data["index"], file_bucket=file_data["file_bucket"],
            file_key=file_data["file_key"]
        )
        if is_success:
            call_post_push(file_data[0], data)


def push_file(index, file_bucket, file_key):
    start_time = datetime.datetime.now()
    print("I have started downloading %s" % start_time)

    file_path = '/tmp/a.xlsx'
    # download file from s3
    client = boto3.client(
        's3',
        aws_access_key_id=config.AWS_ACCESS_KEY_ID,
        aws_secret_access_key=config.AWS_SECRET_ACCESS_KEY,
    )
    client.download_file(Bucket=file_bucket, Key=file_key, Filename=file_path)
    #

    # contains code to push file contents to s3
    print("Finished")

lambda执行时,在打印I have started downloading ..后超时。

  1. Lambda位于配置了NAT网关的vpc内。
  2. Lambda有权访问s3。
  3. 我从中下载文件的s3存储桶与lambda位于不同的区域。但是我认为这不会引起任何问题。
  4. 我将超时时间增加到5分钟。功能,以防文件很大,我不会遇到任何问题
  5. 我首先上传了一个小文件,以确保下载时间不多。
  6. 我在本地计算机上运行了相同的代码,以查看下载是否没有问题。事实证明,使用Lambda下载我正在测试的文件所花费的时间不超过1秒。

做以上所有事情都无济于事。请让我知道如何解决此问题,或者是否还有其他需要检查的内容。

1 个答案:

答案 0 :(得分:0)

问题是lambda函数无法访问公共互联网,并且无法访问S3 API端点。 Nat网关最有可能不在公共子网中,这意味着nat网关不在以Internet网关作为默认路由的子网中。

要解决此问题,请在公共子网中构建nat网关,并将其用作lambda函数的默认路由,或为S3添加VPC端点。将此VPCE用作包含lambda函数的子网的路由表中的下一个路由。

https://docs.aws.amazon.com/vpc/latest/userguide/vpce-gateway.html