AWS-Lambda 使用ECR部署libreoffice
gathin发表于:2023-08-24 17:47:39浏览:225次
部署背景
有python3.10 代码应用实现文档转换功能,部署过程参考AWS官方文档访问量不确定直接使用lambda跑,但是它需要依赖 libreoffice 类库,可是通过普通方式上传代码包是不行的,因此搜索过网上其他大牛方案,参看了如下项目 https://github.com/shelfio/libreoffice-lambda-base-image ,引用的他的 dockerfile进行修改,我直接贴出:
FROM public.ecr.aws/lambda/python:3.10-x86_64
# binutils is needed for "strip" command
RUN yum install \
tar \
gzip \
libdbusmenu.x86_64 \
libdbusmenu-gtk2.x86_64 \
libSM.x86_64 \
xorg-x11-fonts-* \
google-noto-sans-cjk-fonts.noarch \
binutils.x86_64 \
-y && \
yum clean all
RUN set -xo pipefail && \
curl "https://ftp.halifax.rwth-aachen.de/tdf/libreoffice/stable/7.4.7/rpm/x86_64/LibreOffice_7.4.7_Linux_x86-64_rpm.tar.gz" | tar -xz
RUN cd LibreOffice_7.4.7.2_Linux_x86-64_rpm/RPMS && \
yum install *.rpm -y && \
rm -rf /var/task/LibreOffice_7.4.0* && \
cd /opt/libreoffice7.4/ && \
strip ./**/* || true
ENV HOME=/tmp
# Trigger dummy run to generate bootstrap files to improve cold start performance
RUN touch /tmp/test.txt \
&& cd /tmp \
&& libreoffice7.4 --headless --invisible --nodefault --view \
--nolockcheck --nologo --norestore --convert-to pdf \
--outdir /tmp /tmp/test.txt \
&& rm /tmp/test.*
# Copy requirements.txt
COPY requirements.txt ${LAMBDA_TASK_ROOT}
# Copy function code
COPY lambda_function.py ${LAMBDA_TASK_ROOT}
# Install the specified packages
RUN pip install -r requirements.txt
# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "lambda_function.handler" ]
部署准备
启动一个EC2 我使用的 aws linux 最新系统, 因为lambda 中 python3.10 只能运行在 aws linux 2 中,AWS 有 运行对应的系统说明,SSH进入EC2后新建个文件夹 base
#安装docker,有了就过
[ec2-user@ip-172-31-47-213 ~] sudo yum install -y docker
[ec2-user@ip-172-31-47-213 ~] mkdir base
[ec2-user@ip-172-31-47-213 ~] cd base
#使用上面贴出的 dockerfile 内容 - 保存到此文件
[ec2-user@ip-172-31-47-213 base] vim dockerfile
#新建代码文件 lambda_function.py 和 requirements.txt
[ec2-user@ip-172-31-47-213 base] vim lambda_function.py
[ec2-user@ip-172-31-47-213 base] vim requirements.txt
lambda_function.py 文件内容
import sys
from fabric.api import abort, env, local, run, settings, task
import os
#固定格式,dockerfile 中的CMD 那行就是 对应的 这个文件 及这个函数名称
def handler(event, context):
#调用 shell 获取 libreoffice 版本
a = os.popen('libreoffice7.4 --version')
#print(a.read())
return 'Hello from AWS Lambda using Python' + sys.version + '! libreoffice version: ' + a.read()
requirements.txt 文件内容(结合dockerfile的加载逻辑,这里放置python的类库)
boto3
fabric3
开始构建
[ec2-user@ip-172-31-47-213 base] docker build -t lambda-libreoffice-base:7.4-python310-x86_64 .
#构建完成后,建议运行起来测试一下
[ec2-user@ip-172-31-47-213 base] sudo docker run -p 9000:8080 lambda-libreoffice-base:7.4-python310-x86_64
#可以后台运行,我这直接启动新的会话窗口,执行访问测试返回值
[ec2-user@ip-172-31-47-213 base] curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
正常返回值如下:
"Hello from AWS Lambda using Python3.10.12 (main, Aug 15 2023, 15:43:05) [GCC 7.3.1 20180712 (Red Hat 7.3.1-15)]! libreoffice version: LibreOffice 7.4.7.2 723314e595e8007d3cf785c16538505a1c878ca5\n\n"
成功后关闭这个docker,很重要影响后续打包push
[ec2-user@ip-172-31-47-213 base] docker ps
#拿到他docker_id 直接关闭,其他方式都行
[ec2-user@ip-172-31-47-213 base] sudo docker kill 3766c4ab331c
#部署映像push 到ECR ,再创建Lambda 函数 直接参考官方文档操作https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/python-image.html
测试成功就OK了!