【问题标题】:AWS Lambda unable to GET a file from S3AWS Lambda 无法从 S3 获取文件
【发布时间】:2018-01-26 12:01:30
【问题描述】:

您好,我有一个无法从 S3 读取文件的 lambda (python3.6),即使 lambda 的角色对 S3 具有不受限制的权限(以下 IAM 政策)。

Lambda 只是尝试从 S3 检索文件并将其写入临时位置。但是它会阻止调用 s3.Bucket() 并超时(即使在几分钟内超时)。

真正奇怪的是它毫无例外地超时,并且没有拒绝对s3.Bucket()的调用并出现某种权限错误。

这是非常基本的,但我不知道如何解决这个问题。

import boto3
from botocore import exceptions

def lambda_handler(event, context):
  key = event['image']
  bucket = event['bucket']
  tempfile = '/tmp/%s-%s' % (bucket, key)
  print('(p) bucket: %s::%s' % (bucket, key))
  print('(p) tempfile: %s' % tempfile)
  s3 = boto3.resource('s3')
  print('(p) resource intiialized')
  try:
    b = s3.Bucket(bucket) 
    print('(p) bucket info: %s [%s]' % (b.name, b.creation_date))
    b.download_file(prefixed_key, tempfile)
    print('(p} file downloaded to %s' % tempfile)
  except exceptions.ParamValidationError as e:
    return {"statusCode": 400, "body": 'ParamValidationError: [%s]' % e}
  except exceptions.ClientError as e:
    message = '[%s]: [%s]' % (e.response['Error']['Code'], e.response['Error']['Message'])
    return {"statusCode": e.response['ResponseMetadata']['HTTPStatusCode'], "body": message}
  print('(p) image downloaded from s3 and stored at: %s' % tempfile)
  return None

角色拥有的 IAM 政策是:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::my_bucket",
                "arn:aws:s3:::my_bucket/*"
            ]
        }
    ]
}

示例日志:

22:42:43
START RequestId: 61c60167-839d-11e7-97b1-a772bbde2609 Version: $LATEST
START RequestId: 61c60167-839d-11e7-97b1-a772bbde2609 Version: $LATEST
22:42:43
(p) bucket: my_bucket::my_key
22:42:43
(p) tempfile: /tmp/my_bucket/my_key
22:42:43
(p) resource intiialized
22:43:13
END RequestId: 61c60167-839d-11e7-97b1-a772bbde2609
END RequestId: 61c60167-839d-11e7-97b1-a772bbde2609

【问题讨论】:

  • 您的意思是 Lambda 函数本身正在超时吗?您是否从默认的 3 秒增加了功能超时?它是否在没有出站网络连接的 VPC 中运行?
  • 我已将函数超时设置为 2 分钟,而 Lambda 本身会超时。我添加了一些日志输出来说明。
  • 异常信息的详细信息是什么?您没有收到“图像已下载”消息,因此您的函数必须在此之前返回 - 并且该序列中的唯一返回是在异常子句中。
  • 没有异常信息。即使超时设置是在分钟内,它既不返回也不完成执行。
  • 试过这个没有用:stackoverflow.com/a/39797802/87408

标签: python amazon-s3 lambda


【解决方案1】:

问题已缩小为 VPC 配置错误。我只是将它配置为在 VPC 之外运行,因为我现在不需要它,它可以工作。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,但我没有安装VPC gateway endpoint。尽管我自己在 VPC 中的子网中的实例可以访问 S3 URL,但 Lambda 实例不能。通过添加具有默认选项的 VPC 网关以允许我的子网使用它来解决此问题。现在我的 Lambda 实例可以访问 S3。
    与使用 NAT 网关相比,这是一个免费选项。

    PS 您需要对 S3 对象授予权限。我把它设为公开可读,这可能有点太宽了。

    【讨论】:

      猜你喜欢
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      • 2019-08-24
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多