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)
我究竟做错了什么 ?
虽然filetype按照其他答案的建议使用要简单得多,但该库检测的文件类型magic没有那么多。
您可以通过执行以下操作来python-magic处理 aws lambda python3.8:
libmagic.so.1到liblambda 包根目录下的文件夹。此lib文件夹将自动添加到LD_LIBRARY_PATHaws lambda。/usr/lib64/libmagic.so.1例如,可以在amazon linux ec2 实例中找到该库。/usr/share/misc/magic添加到您的 lambda 包中。python-magic接受一个magic_file参数。将此指向您的魔法文件。然后,您可以创建魔术对象,magic.Magic(magic_file='path_to_your_magic_file')然后python-magic在该对象上调用您喜欢的任何函数。这些步骤在python3.7运行时不是必需的,因为这些库已经存在于 aws lambda 中。
| 归档时间: |
|
| 查看次数: |
744 次 |
| 最近记录: |