【发布时间】:2021-04-29 05:49:28
【问题描述】:
我正在尝试基于this tutorial 运行无服务器 LibreOffice。这是完整的python lambda函数:
import boto3
import os
s3_bucket = boto3.resource("s3").Bucket("lambda-libreoffice-demo")
os.system("curl https://s3.amazonaws.com/lambda-libreoffice-demo/lo.tar.gz -o /tmp/lo.tar.gz && cd /tmp && tar -xf /tmp/lo.tar.gz")
convertCommand = "instdir/program/soffice --headless --invisible --nodefault --nofirststartwizard --nolockcheck --nologo --norestore --convert-to pdf --outdir /tmp"
def lambda_handler(event,context):
inputFileName = event['filename']
# Put object wants to be converted in s3
with open(f'/tmp/{inputFileName}', 'wb') as data:
s3_bucket.download_fileobj(inputFileName, data)
# Execute libreoffice to convert input file
os.system(f"cd /tmp && {convertCommand} {inputFileName}")
# Save converted object in S3
outputFileName, _ = os.path.splitext(inputFileName)
outputFileName = outputFileName + ".pdf"
f = open(f"/tmp/{outputFileName}","rb")
s3_bucket.put_object(Key=outputFileName,Body=f,ACL="public-read")
f.close()
运行完整脚本时的响应是:"errorMessage": "ENOENT: no such file or directory, open '/tmp/example.pdf'",
于是我开始逐行调试。
根据我的调试打印,当尝试在第二行提取二进制文件时,它似乎一开始就失败了:
os.path.exists('/tmp/lo.tar.gz') // => true
os.path.exists('/tmp/instdir/program/soffice.bin') // => false
所以看起来焦油是有问题的部分。
如果我从 S3 下载文件并在本地运行 tar 命令,它似乎可以很好地提取文件。
尝试使用节点、python 3.8、python 3.6。
还尝试使用和不使用层(以及/opt/lo.tar.br 路径)作为described here。
【问题讨论】:
标签: amazon-s3 aws-lambda tar libreoffice aws-lambda-layers