无法在AWS Lambda函数内导入sqlalchemy

时间:2019-06-08 19:21:31

标签: python amazon-web-services amazon-s3 sqlalchemy aws-lambda

我知道使用部署程序包的概念相对简单,但是最近几个小时我一直在努力解决这个问题。我正在关注documentation from AWS on packaging up Lambda dependencies。我想编写一个简单的Lambda函数,以在发生某些事件时更新PostgreSQL表中的条目。

我首先创建一个新目录以在其中工作:

mkdir lambdas-deployment && cd lambdas-deployment

然后创建一个新的虚拟环境并安装我的软件包:

virtualenv v-env
source v-env/bin/activate
pip3 install sqlalchemy boto3 psycopg2

我的 trigger-yaml-parse.py 函数(它实际上并未使用 sqlalchemy 库,但我只是想成功导入它):

import logging
import json
import boto3
import sqlalchemy

def lambda_handler(event, context):
    records = event['Records']
    s3_records = filter(lambda record: record['eventSource'] == 'aws:s3', records)
    object_created_records = filter(lambda record: record['eventName'].startswith('ObjectCreated'), s3_records)

    for record in object_created_records:
        key = record['s3']['object']['key']
        print(key)

我一直在遵循AWS文档中的说明。

zip -r trigger-yaml-parse.zip $VIRTUAL_ENV/lib/python3.6/site-packages/

然后我添加我的功能代码:

zip -g trigger-yaml-parse.zip trigger-yaml-parse.py

我得到updating: trigger-yaml-parse.py (deflated 48%)的输出。

然后,我将新的压缩部署上传到我的S3构建存储桶中:

aws s3 cp trigger-yaml-parse.zip s3://lambda-build-bucket

我在AWS Lambda控制台中选择从S3上传: enter image description here

但是,我的Lambda函数在执行时失败,并显示以下错误:

START RequestId: 396c6c3c-3f5b-4df9-b7f1-057842a87eb3 Version: $LATEST
Unable to import module 'trigger-yaml-parse': No module named 'sqlalchemy'

我在做什么错?我从字面上一步一步地遵循了AWS的文档。

2 个答案:

答案 0 :(得分:1)

来自AWS documentation

  

”使用错误权限上传的压缩包可能导致执行   失败。 AWS Lambda要求对代码文件和   构成您的部署软件包的所有依赖库”

因此您可以使用zip信息来检查权限:

zipinfo trigger-yaml-parse.zip
  

-r --------表示只有文件所有者具有权限。

答案 1 :(得分:1)

我认为您的问题可能在此行:

zip -r trigger-yaml-parse.zip $VIRTUAL_ENV/lib/python3.6/site-packages/

创建zip文件时,压缩文件将具有您磁盘中完整的路径。 lambda中的python运行时将无法找到这些库。

相反,您应该执行以下操作

cd $VIRTUAL_ENV/lib/python3.6/site-packages/
zip -r /full/path/to/trigger-yaml-parse.zip .

对这两个文件运行unzip -t,您将看到区别。