前言
前面介绍的都没有进行额外的 package 安装的过程,所以本章就重点是 如何在 serverless 中安装第三方的 packag 和 如何去构建 layer 使得 package 可以复用。
下面是后续所有例子需求:
- 安装 emoji package,且运行
安装方式:package 安装在本地
s init start-fc3-python -d demo1
cd demo1
# 安装依赖
touch code/requirements.txt
echo "emoji==2.0.0" > code/requirements.txt
pip3 install -r code/requirements.txt -t ./code
emoji package 就会安装在 local 的 code 文件夹中
修改 code/index.py
# @code/index.py
from emoji import emojize
def handler(event, context):
return emojize(":thumbs_up:")
部署代码
# 本地测试
s local invoke
# 部署到远端
s deploy
当然部署也是可以上传代码的方式,如下图,其效果是一样的。
结果:
结果满足预期,但是他会把 emoji package 和 index.py 一起上传了。所以从代码大小中得知,整体会比较大。
安装方式:构建 layer
s init start-fc3-python -d demo2
cd demo2
# 安装依赖
touch code/requirements.txt
echo "emoji==2.0.0" > code/requirements.txt
修改 code/index.py
# @code/index.py
from emoji import emojize
def handler(event, context):
return emojize(":thumbs_up:")
关键代码来了,构建 layer,并且上传 layer。
s build --publish-layer
[2024-12-09 18:00:12][INFO][hello_world] You need to add a new configuration env configuration dependency in yaml to take effect. The configuration is as follows:
environmentVariables:
PYTHONPATH: /opt/python
layers:
- acs:fc:cn-shenzhen:1719759326012690:layers/demo2-layer/versions/1
构建成功后,提示说在 s.yaml 中添加上 environmentVariables 和 layers 节点。
💡 构建 layer 的意思就是把 requirements package 都构建一层 image layer 且上传到云端,后续的代码就是基于这层,不用另外的安装代码。如果有其他的项目想复用这些 package,直接改 s.yaml 的 layer 节点就可以了。
⚠️ 记得要把 requirements.txt 的文件要放在 和 index.py 的同级目录下。
所以往 s.yaml 里面写入上述的信息。
props:
...
environmentVariables:
PYTHONPATH: /opt/python
layers:
- acs:fc:cn-shenzhen:1719759326012690:layers/demo2-layer/versions/1
部署代码
# 本地测试
s local invoke
# 部署到远端
s deploy
****
结果:
因为不会上传 emoji package,代码明显是小了很多。
总结
- serverless 就是 业务 和 trigger 隔离开来,本文章例子中都是完成 业务,没有 trigger;只要后续补充上 trigger,这个业务就可以串通了。
- 部署方式,优先是构建 layer,后上传代码,因为 layer 可以复用,且减少项目的代码。
- 如果开发/本地测试/部署,可以遵循下面的方法:
# 初始化
s init start-fc3-python -d demo2
cd demo2
# 安装依赖
touch code/requirements.txt
echo "emoji==2.0.0" > code/requirements.txt
# 本地测试
s local invoke
# 构建 layer
s build --publish-layer
# 部署
s deploy