AWS Lambda /tmp python脚本导入模块错误



我正在尝试运行AWS Lambda/tmp目录中存在的python脚本。脚本需要一些额外的依赖,如boto3等来运行文件。当AWS Lambda运行该文件时,它给出以下错误:

ModuleNotFoundError: No module named 'boto3'

然而,当我直接将这个文件作为lambda函数运行时,它很容易运行,没有任何导入错误。

试图执行/tmp目录中存在的代码的Lambda代码:

import json
import os
import urllib.parse
import boto3
s3 = boto3.client('s3')

def lambda_handler(event, context):
records = [x for x in event.get('Records', []) if x.get('eventName') == 'ObjectCreated:Put']
sorted_events = sorted(records, key=lambda e: e.get('eventTime'))
latest_event = sorted_events[-1] if sorted_events else {}
info = latest_event.get('s3', {})
file_key = info.get('object', {}).get('key')
bucket_name = info.get('bucket', {}).get('name')
s3 = boto3.resource('s3')
BUCKET_NAME = bucket_name
keys = [file_key]
for KEY in keys:
local_file_name = '/tmp/'+KEY
s3.Bucket(BUCKET_NAME).download_file(KEY, local_file_name)
print("Running Incoming File !! ")
os.system('python ' + local_file_name)

试图使用boto3从S3获取数据的/tmp代码:

import sys
import boto3
import json

def main():
session = boto3.Session(
aws_access_key_id='##',
aws_secret_access_key='##',
region_name='##')

s3 = session.resource('s3')
# get a handle on the bucket that holds your file
bucket = s3.Bucket('##')
# get a handle on the object you want (i.e. your file)
obj = bucket.Object(key='8.json') 
# get the object
response = obj.get()
# read the contents of the file
lines = response['Body'].read().decode()
data = json.loads(lines)
transactions = data['dataset']['fields']
print(str(len(transactions)))
return str(len(transactions))
main()

所以在这两个代码中都导入了boto3。但它只有在lambda代码执行时才会成功。但是/tmp代码不能导入boto3。原因是什么?我该如何解决?

执行另一个python进程默认不会复制Lambda的PYTHONPATH:

os.system('python ' + local_file_name)

这样重写:

os.system('PYTHONPATH=/var/runtime python ' + local_file_name)

为了找出当前Lambda版本正在使用的完整PYTHONPATH,将以下内容添加到第一个脚本(Lambda执行的脚本):

import sys
print(sys.path)

相关内容

  • 没有找到相关文章

最新更新