【问题标题】:Cannot import sqlalchemy within AWS Lambda function无法在 AWS Lambda 函数中导入 sqlalchemy
【发布时间】:2019-06-09 21:37:19
【问题描述】:

我知道使用部署包的概念相对简单,但过去几个小时我一直在努力解决这个问题。我正在关注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 上传:

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

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

我做错了什么?我一步一步地按照 AWS 的文档进行操作。

【问题讨论】:

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


    【解决方案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 ,你会看到区别。

    【讨论】:

      【解决方案2】:

      来自AWS documentation

      "使用错误权限上传的Zip包可能会导致执行 失败。 AWS Lambda 需要对代码文件具有全局读取权限,并且 任何构成您的部署包的依赖库”

      所以你可以使用 zip 信息来检查权限:

      zipinfo trigger-yaml-parse.zip
      

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

      【讨论】:

        猜你喜欢
        • 2023-03-30
        • 2021-09-25
        • 1970-01-01
        • 2019-12-23
        • 1970-01-01
        • 2019-12-11
        • 2021-01-09
        • 2020-12-04
        • 1970-01-01
        相关资源
        最近更新 更多