AWS Lambda无法从S3获取文件

问题描述 投票:2回答:2

嗨,我有一个lambda(python3.6),无法从S3读取文件,即使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
python amazon-s3 lambda
2个回答
0
投票

问题被缩小到VPC的错误配置。我只是将它配置为在VPC之外运行,因为我现在不需要它,并且它有效。


0
投票

我有类似的问题,我没有安装VPC gateway endpoint。虽然我自己在VPC中的子网中的实例可以访问S3 URL,但Lambda实例却无法访问。通过添加具有默认选项的VPC网关来修复此问题,以允许我的子网使用它。现在我的Lambda实例能够访问S3。 与使用NAT网关相比,这是一个免费选项。

PS你需要在S3对象上授予权限。我把它公之于众,可能有点太宽了。

© www.soinside.com 2019 - 2024. All rights reserved.