aws lambda - 找不到 libmagic

Jey*_*eyJ 2 python amazon-web-services aws-lambda

我在我的 lambda 函数中使用魔法库来确定文件的类型。我首先将它部署到本地容器以检查一切是否正常。

我的 DockerFile :

FROM lambci/lambda:build-python3.8
WORKDIR /app
RUN mkdir -p .aws
COPY requirements.txt ./
COPY credentials /app/.aws/
RUN mv /app/.aws/ ~/.aws/
RUN pip install --no-cache-dir  -r requirements.txt
RUN pip install --no-cache-dir  -r requirements.txt -t "/app/dependencies/"
WORKDIR /app/dependencies
RUN zip -r  lambda.zip *
Run Code Online (Sandbox Code Playgroud)

要求.txt:

python-magic
libmagic
Run Code Online (Sandbox Code Playgroud)

在我的本地容器中,当我对 lambda 逻辑运行测试时,一切正常并通过(包括使用魔术代码的部分..)。

我创建了一个包含 lambda.py 代码和 python 依赖项(docker 文件中的最后 3 行)的 zip。当我将 zip 上传到 aws 并测试 lambda 时,出现以下错误:

{
  "errorMessage": "Unable to import module 'lambda': failed to find libmagic.  Check your installation",
  "errorType": "Runtime.ImportModuleError"
}
Run Code Online (Sandbox Code Playgroud)

如您所见,在我的本地容器上,我使用的基线图像lambci/lambda:build-python3.8应该与 lambda 启动时 aws 使用的相同。

我还尝试将 python-magic-bin==0.4.14 添加到 requirements.txt 而不是 magic 和 libmagic ,但它也没有帮助,因为这个模块似乎适用于 Windows。

在 lambda.zip 中,我还放入了 lambda.py,它是包含我的 lambda 函数的文件:

import boto3
import urllib.parse
from io import BytesIO
import magic

def lambda_handler(event, context):
    s3 = boto3.client("s3")
    if event:
        print("Event : ", event)
        event_data = event["Records"][0]
        file_name = urllib.parse.unquote_plus(event_data['s3']['object']['key'])
        print("getting file: {}".format(file_name))
        bucket_name = event_data['s3']['bucket']['name']
        file_from_s3 = s3.get_object(Bucket=bucket_name, Key=file_name)
        file_obj = BytesIO(file_from_s3['Body'].read())
        print(magic.from_buffer(file_obj.read(2048)))
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么 ?

man*_*ony 6

虽然filetype按照其他答案的建议使用要简单得多,但该库检测的文件类型magic没有那么多。

您可以通过执行以下操作来python-magic处理 aws lambda python3.8

  • 添加libmagic.so.1liblambda 包根目录下的文件夹。此lib文件夹将自动添加到LD_LIBRARY_PATHaws lambda。/usr/lib64/libmagic.so.1例如,可以在amazon linux ec2 实例中找到该库。
  • 创建一个魔法文件或将亚马逊 linux ec2 实例上可用的文件/usr/share/misc/magic添加到您的 lambda 包中。
  • 魔术构造函数 frompython-magic接受一个magic_file参数。将此指向您的魔法文件。然后,您可以创建魔术对象,magic.Magic(magic_file='path_to_your_magic_file')然后python-magic在该对象上调用您喜欢的任何函数。

这些步骤在python3.7运行时不是必需的,因为这些库已经存在于 aws lambda 中。