python - 从 Lambda 中的 s3 下载文件

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

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

有一个 Web 服务将 s3 元数据( key 、存储桶)推送到 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 start download .. 后超时。

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

执行上述所有操作均无济于事。请让我知道如何解决这个问题或者是否还有其他需要检查的事情。

最佳答案

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

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

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

关于python - 从 Lambda 中的 s3 下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55439041/

相关文章:

amazon-web-services - AWS API Gateway - Lambda - 内部服务器错误

multithreading - 在 S3 存储桶之间并行移动文件

python - 在 django 的模板上为我们获取当前使用的 url 面包屑?

python - numpy.dot 速度很慢,但安装了 blas 和 lapack,如何解决?

javascript - aws javascript sdk v3 - 签名不匹配错误

amazon-web-services - 如何从 Amazon API Gateway 将参数从 POST 传递到 AWS Lambda

java - AWS Lambda 和 S3 - 上传的 pdf 文件为空白

Python,Matplotlib,绘制不规则网格

python - 安装 Pygame 后 pygame.init() 显示为 undefined variable

amazon-web-services - 无法从Elasticsearch序列化AWSDate