最近更新时间:2022-12-13 10:49:28
如果您的云函数(KCF)拥有较多的依赖库或公共代码文件,您可以使用 KCF 中的层进行管理。使用层管理,您可以将依赖放在层中而不是部署包中,可确保部署或更新函数时保持较小的体积。对于 Java、Python和Node.js函数,只要将部署程序包保持在50MB
以下,就可以在 KCF 控制台中在线编辑函数代码。
各运行时使用层说明
层中的文件均在/opt/
目录下,可以在函数代码中通过绝对路径进行访问。除此之外,云函数内置的环境变量添加了运行时语言的依赖包搜索路径,如果在层ZIP包中定义了与其相同的文件夹结构,则函数代码无需指定路径即可访问层。
Python、Node.js 环境变量见下表:
相关环境变量 | 特定目录 |
---|---|
PYTHONPATH | /opt/python |
NODE_PATH | /opt/nodejs/node_modules |
使用flask依赖打包后的文件结构
python-layer-code.zip
└── python
└── flask
ZIP包解压部署后的路径
/opt
└── python
└── flask
使用express依赖打包后的文件结构
nodejs-layer-code.zip
└── nodejs
├── node_modules
│ └── express
└── function-bind
├── package-lock.json
└── package.json
ZIP包解压部署后的路径
/opt
└── nodejs
├── node_modules
│ └── express
└── function-bind
├── package-lock.json
└── package.json
使用cloudevents-core依赖打包后的文件结构
java-layer-code.zip
└── java
└── lib
└── cloudevents-core-2.3.0.jar
ZIP包解压部署后的路径
/opt
└── java
└── lib
└── cloudevents-core-2.3.0.jar
创建层时,需要将所有内容打包到ZIP文件中。云函数运行时会将层的内容解压并部署在/opt目录下。
构建层的ZIP包的方式和构建代码包的方式类似,为使函数在运行时能正确加载以层发布的库,库的代码目录结构需遵从各个语言标准的目录规范,具体信息,请参见各运行时使用层说明。对于部署于层的函数依赖库,如果按照规范的方式打包,云函数运行时会为您自动添加各语言的依赖库搜索路径,您无需指定全路径。如您想自定义层的目录结构,需要在代码中显式添加依赖库搜索地址。具体操作,请参见函数中引用层的依赖。
各运行时构建层ZIP包的操作步骤如下所示:
说明:下面创建的工作目录仅为示例,在实际操作过程中您可以按照自身需求创建目录名称。
1、执行mkdir命令创建工作目录
mkdir python-layer-code
2、进入已创建的工作目录
cd python-layer-code
3、执行pip命令安装依赖库到python-layer-code/python。
pip3 install --target ./python flask
其中flask是您要安装的依赖包的名称,具体以实际项目需要为准。
安装完成后,目录结构如下:
python-layer-code
└── python
├── flask
├── Flask-2.2.2.dist-info
├── itsdangerous
└── itsdangerous-2.1.2.dist-info
4、在python-layer-code目录,执行zip命令打包依赖
zip -r python-layer-code.zip python
1、执行mkdir命令创建工作目录
mkdir nodejs-layer-code
2、进入已创建的工作目录
cd nodejs-layer-code
3、执行npm命令安装依赖库到nodejs-layer-code/nodejs。
npm install --prefix ./nodejs --save express
其中express是您要安装的依赖报的名称,具体以实际安装为准。
安装完成后,目录结构如下:
nodejs-layer-code
└── nodejs
├── node_modules
│ └── express
└── function-bind
├── package-lock.json
└── package.json
4、在nodejs-layer-code目录,执行zip命令打包依赖
zip -r nodejs-layer-code.zip nodejs
1、执行mkdir命令创建工作目录
mkdir java-layer-code
2、进入已创建的工作目录
cd java-layer-code
3、使用maven工具安装依赖
在java-layer-code目录创建一个pom文件
pom文件配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.kcf.demo</groupId>
<version>1.0</version>
<artifactId>layer-dependency</artifactId>
<dependencies>
<dependency>
<dependency>
<groupId>io.cloudevents</groupId>
<artifactId>cloudevents-core</artifactId>
<version>2.3.0</version>
</dependency>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<!-- 项目文件打包 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<!-- 生成的jar中,不要包含pom.xml和pom.properties这两个文件 -->
<addMavenDescriptor>false</addMavenDescriptor>
<manifest>
<!-- 是否要把第三方jar加入到类构建路径 -->
<addClasspath>false</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
<!-- maven依赖打包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 是否排除间接依赖。默认false,不排除 -->
<excludeTransitive>false</excludeTransitive>
<!-- 是否消除依赖jar包后缀的版本信息。默认是false,不取消版本信息 -->
<stripVersion>false</stripVersion>
<!-- 输出文件路径 -->
<outputDirectory>target/java/lib</outputDirectory>
<stripVersion>false</stripVersion>
<includeScope>runtime</includeScope>
</configuration>
</plugin>
</plugins>
</build>
</project>
pom文件示例解析如下:
要安装的依赖包为cloudevents-core。
使用maven-jar-plugin将项目文件打包成一个轻量级的jar包。
使用maven-dependency-plugin将需要安装的依赖包拷贝到target/java/lib目录下。
在java-layer-code目录下执行以下命令安装依赖。
mvn dependency:copy-dependencies
安装完成后,目录结构如下:
java-layer-code
└── target
└── java
└── lib
└── cloudevents-core-2.3.0.jar
4、在java-layer-code/target目录,执行zip命令打包依赖
zip -r java-layer-code.zip java
函数中引用层的依赖
对于部署于层的函数依赖库,如果按照规范的方式打包,函数计算运行时会为您自动添加各语言的依赖库搜索路径,您无需指定全路径。如您想使用自定义层的目录结构,需要在代码中显式添加依赖库搜索地址。
按照文档构建的层,其依赖库在/opt/python目录下;需要将该目录添加到模块搜索路径中。
方式1:在函数配置中设置PYTHONPATH环境变量,添加层所在的目录。
示例如下。
PYTHONPATH=/opt/python
方式2:在您项目的入口文件里添加以下语句,需要在导入层的依赖库前执行。
#server.py
import json
import os
import logging
import sys
sys.path.append('/opt/python')
# 必须在 import numpy 前执行
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/health")
def health_check():
print("python path= ", os.sys.path)
return "<p>Hello, World Flask!</p>", 200
if __name__ == "__main__":
app.run(host='0.0.0.0', port=8080)
注意:必须在引用层中的模块(如flask)前执行 sys.path.append()
按照文档构建的层,其依赖库在/opt/nodejs/node_modules目录下,需要将该目录添加到模块搜索路径中。
NODE_PATH=/opt/nodejs/node_modules
在函数配置中设置NODE_PATH环境变量,添加层所在的目录。
在启动命令中设置-cp参数,添加层所在/opt/java/lib/*目录。
java -cp java-slim.jar:/opt/java/lib/* com.example.demo.Application
说明:
在您准备好层和函数后,可通过KCF控制台完成层的创建和函数中配置。
创建层的压缩文件将按照层的版本进行存储。层创建成功后,将自动生成层的版本,版本号从1开始递增。如需新增版本,可在层的详情页,创建新的版本。
说明:
已创建的层或层版本不支持修改,您可以通过创建新的层或新版本来替代老版本。注意需同步在函数的层配置中进行绑定。
您可在创建函数时,或函数详情中,为函数配置层。
层在与函数进行绑定时,将按照具体的层版本与函数版本进行绑定。一个函数目前最多支持绑定5个层的具体版本,并在绑定时有一定顺序。
说明:
- 层中的文件将会添加到
/opt
目录中,此目录在函数执行期间可访问。- 如果您的函数已绑定了多个层,这些层将按顺序合并到
/opt
目录中。如果同一个文件出现在多个层中,KCF 平台将会保留高优先级层里的文件。其中新添加的层优先级数值小,优先级高。
纯净模式