使用python3.6运行时在Lambda函数中运行Perl脚本

时间:2019-07-02 15:44:23

标签: python perl aws-lambda

我正在尝试运行exiftool来读取python脚本中的图像元数据,作为AWS上lambda函数的一部分。

在运行Amazon Linux which is what the python3.6 runtime uses的ec2实例上,我可以下载该工具,将其解压缩,然后轻松运行。但是,尝试通过我的lambda函数中的python脚本执行此操作无效。

我的lambda函数如下:

import imageio
import subprocess
import utils
import os
import stat
import boto3

s3_client = boto3.client('s3')

# get exif tool
s3_client.download_file(
    'zipped.code',
    'Image-ExifTool-11.53.tar.gz', 
    '/tmp/Image-ExifTool-11.53.tar.gz')
p = subprocess.run('tar -zxvf Image-ExifTool-11.53.tar.gz', cwd='/tmp', shell=True)

def get_meta_data(im):
    p = subprocess.Popen(
        '/tmp/Image-ExifTool-11.53/exiftool -',
        stdout=subprocess.PIPE,
        stdin=subprocess.PIPE,
        stderr=subprocess.PIPE,
        shell=True)
    out, err = p.communicate(input=imageio.imwrite('<bytes>', im, format='jpg'))
    print(out) # b''
    print(err) # b'/bin/sh: /tmp/Image-ExifTool-11.53/exiftool: /usr/bin/perl: bad interpreter: No such file or directory\n'


def lambda_handler(event, context):
    src_key = event['src_key']
    image = utils.download_image_to_memory(src_key)
    print(get_meta_data(image))

我已经在本地运行了此代码,并且可以正常工作。如果我通过/usr/bin在lambda函数中打印print(os.listdit('/usr/bin'))的内容,则其中没有perl可执行文件。但是,在具有Amazon Linux的ec2实例上的/usr/bin目录中,存在perl可执行文件。

我怀疑问题是我缺少perl(该工具是用perl编写的),但是考虑到lambda应该与Amazon linux映像一起运行,为什么没有perl解释器?

1 个答案:

答案 0 :(得分:3)

尝试将https://p3rl.org/AWS::Lambda中列出的ARN之一添加到参考层中(那里有说明)。

我自己还没有做这件事,但是从我看到的一切来看,它都应该起作用。