嗨我下面有一个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
答案 0 :(得分:0)
问题被缩小到VPC的错误配置。我只是将它配置为在VPC之外运行,因为我现在不需要它,并且它有效。
答案 1 :(得分:0)
我遇到了类似的问题,但没有安装VPC gateway endpoint。尽管我自己在VPC子网中的实例可以访问S3 URL,但是Lambda实例不能。通过添加具有默认选项的VPC网关来解决此问题,该网关允许我的子网使用它。现在,我的Lambda实例可以访问S3。
与使用NAT网关相比,这是一个免费选项。
您需要授予权限的PS被授予S3对象。我将其公开可读,可能有点太宽了。