层可以为您提供公共依赖库、运行时环境及函数扩展等发布与部署能力。您可以将函数依赖的公共库提炼到层或者使用函数计算官方公共层,以减少部署或更新函数时的代码包体积。本文介绍层的功能原理、各运行时使用层说明、如何构建层的ZIP包以及如何创建、删除自定义层。
功能原理
- 构建层时,需要将所有内容打包到ZIP文件中。函数计算运行时会将层的内容解压并部署在/opt目录下。
- 当函数配置多个层时,这些层的内容将被合并至/opt目录,多个层按照层配置的逆序合并。
- 如果某一文件与其他层中的文件同名,则先配置层中的该文件会覆盖后配置层中的该同名文件。
- 如果层中的代码依赖二进制的库或可执行文件,则需要使用Linux系统编译构建层,推荐使用Debian 9。
- 如果层中的依赖库对指令集有依赖,则需要使用amd64架构的机器,或者通过交叉编译的方式确保依赖库与函数计算运行时兼容。
各运行时使用层说明
对于支持层功能的运行时,函数计算会将特定的目录添加到运行时语言的依赖包搜索路径中,如下表所示。如果在层ZIP包中定义了与其相同的文件夹结构,则函数代码无需指定路径即可访问层。
各运行时支持添加的特定目录
运行时 |
特定的目录 |
Python |
/opt/python |
Node.js |
/opt/nodejs/node_modules |
Java |
/opt/java/lib |
PHP |
/opt/php |
除Custom Runtime和Custom Container之外的运行时 |
/opt/bin (PATH) |
/opt/lib (LD_LIBRARY_PATH) |
各运行时的层ZIP包文件结构
构建层的ZIP包
创建层时,需要将所有内容打包到ZIP文件中。函数计算运行时会将层的内容解压并部署在/opt目录下。
构建层的ZIP包的方式和构建代码包的方式类似,为使函数在运行时能正确加载以层发布的库,库的代码目录结构需遵从各个语言标准的目录规范,具体信息,请参见各运行时使用层说明。对于部署于层的函数依赖库,如果按照规范的方式打包,函数计算运行时会为您自动添加各语言的依赖库搜索路径,您无需指定全路径。如您想自定义层的目录结构,需要在代码中显式添加依赖库搜索地址。具体操作,请参见如何在Custom Runtime中引用层中的依赖。
各运行时构建层ZIP包的操作步骤如下所示:
说明 下面创建的工作目录my-layer-code仅为示例,您在实际操作过程中可以按需替换目录名称。
Python Runtime
- 执行以下命令创建工作目录。
- 进入已创建的工作目录。
- 执行以下命令安装依赖库到my-layer-code/python。
pip install --target ./python ${PackageName}
${PackageName}是您要安装的依赖包的名称,pip install
命令的详细使用方法,请参见pip install。
代码示例如下:
pip install --target ./python numpy
安装完成后,目录结构如下:
my-layer-code
└── python
├── bin
├── numpy
├── numpy-1.22.4.dist-info
└── numpy.libs
- 在my-layer-code目录,执行以下命令打包依赖。
zip -r my-layer-code.zip python
Node.js Runtime
- 执行以下命令创建工作目录。
- 进入已创建的工作目录。
- 执行以下命令安装依赖库到my-layer-code/nodejs。
npm install --prefix ./nodejs --save ${PackageName}
${PackageName}
是您要安装的依赖包的名称,npm install
命令的详细使用方法,请参见npm-install。
代码示例如下:
npm install --prefix ./nodejs --save uuid
安装完成后,目录结构如下:
my-layer-code
└── nodejs
├── node_modules
│ └── uuid
├── package-lock.json
└── package.json
- 在my-layer-code中执行以下命令打包依赖。
zip -r my-layer-code.zip nodejs
Java Runtime
- 执行以下命令创建工作目录。
- 进入已创建的工作目录。
- 通过Maven安装依赖。
- 在my-layer-code/java目录下创建一个pom.xml文件。
示例如下:
<?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 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>maven.util</groupId>
<artifactId>install-layer</artifactId>
<version>1.0</version>
<!-- 要下载的maven依赖 -->
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- maven相关下载插件 -->
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<configuration>
<!-- 是否排除间接依赖。默认false,不排除 -->
<excludeTransitive>false</excludeTransitive>
<!-- 是否消除依赖jar包后缀的版本信息。默认是false,不取消版本信息 -->
<stripVersion>false</stripVersion>
<!-- 输出文件路径 -->
<outputDirectory>./lib</outputDirectory>
</configuration>
</plugin>
</plugins>
</build>
</project>
示例解析如下:
- 要安装的依赖包为
org.apache.commons.lang3
。
- 使用
maven-dependency-plugin
将需要安装的依赖包拷贝到/java/lib目录下。
- 在my-layer-code/java目录下执行以下命令安装依赖。
mvn dependency:copy-dependencies
安装完成后,目录结构如下:
my-layer-code
└── java
└── lib
└── commons-lang3-3.12.0.jar
- 在my-layer-code目录,执行以下命令打包依赖。
zip -r my-layer-code.zip java
PHP Runtime
- 执行以下命令创建工作目录。
mkdir -p my-layer-code/php
- 进入已创建的工作目录。
- 通过Composer安装依赖。
- 在my-layer-code/java目录下,创建一个composer.json文件。
示例如下:
{
"require": {
"aliyunfc/fc-php-sdk": "~1.2",
"alibabacloud/fnf": "^1.7"
}
}
- 执行以下命令安装依赖。
安装完成后,目录结构如下:
layer-code
└─php
├──composer.json
├──composer.lock
└──vendor
- 在my-layer-code目录,执行以下命令打包依赖。
zip -r my-layer-code.zip php
通过控制台创建自定义层
前提条件
操作步骤
- 登录函数计算控制台,在左侧导航栏,选择。
- 在顶部菜单栏,选择地域,然后在层管理页面,单击创建层。
- 在创建层页面,设置相关参数,然后单击创建。
参数 |
描述 |
名称 |
设置层的名称,支持自定义。 |
描述 |
设置层的描述信息,便于区分层。 |
兼容运行时 |
选择创建层兼容的运行时环境。 |
层上传方式 |
按需选择上传层依赖的方式。包含以下几种上传方式:
- 通过 ZIP 包上传层:选择构建层的ZIP文件。
- 通过文件夹上传层:选择构建层的ZIP文件所在的文件夹。
- 通过 OSS 上传层:选择上传构建层的ZIP文件的Bucket 名称和文件名称。
- 在线构建依赖层:选择构建环境并上传构建层的依赖文件
package.json 或requirements.txt 。
说明 目前仅Python和Node.js运行时支持在线构建依赖层。上传依赖包的时间限制为15分钟,大小限制为500 MB。
|
层创建成功后,将自动生成层的版本,版本号从1开始递增。
- 创建新版本。
说明 已创建的层或相关层版本暂不支持修改,如果您需要修改层的相关配置,可以创建新的层或创建新版本。需要注意的是,如果引用的层版本已删除,在更新层配置时,必须先删除该引用。
- 在层管理页面,单击目标层名称或操作列的版本管理。
- 在版本管理区域,单击创建版本。
- 在创建新的版本页面,选择运行环境并上传新的层代码,然后单击创建。
通过Serverless Devs创建自定义层
前提条件
操作步骤
- 执行以下命令创建层。
s cli fc layer publish --code ./my-layer-code --compatible-runtime java8,Java11,custom --region cn-hangzhou --layer-name my-layer
代码解析如下:
--code
:用于指定代码包路径。
--compatible-runtime
:用于指定创建层兼容的运行时环境。
--layer-name
:用于指定创建层的名称。
创建完成后提示成功并返回层的ARN,ARN通过
#
号分为三个部分,第一部分为账号ID的标识符,第二部分为层的名称,第三部分为层的版本,如下图所示。您也可以登录
函数计算控制台查看创建的层信息。

- 重复执行以下命令为已创建的层创建新版本。
s cli fc layer publish --code ./my-layer-code --compatible-runtime java8,Java11,custom --region cn-hangzhou --layer-name my-layer
说明 已创建的层或相关层版本暂不支持修改,如果您需要修改层的相关配置,可以创建新的层或创建新版本。需要注意的是,如果引用的层版本已删除,在更新层配置时,必须先删除该引用。
删除层与层版本
您可以根据提示删除不需要的层或者层版本。已删除的层不能再被查看或被函数配置引用,但已配置引用该层的函数执行不受影响。
- 登录函数计算控制台。
- 在左侧导航栏,选择。
- 在顶部菜单栏,选择地域。
- 在层管理页面,按需选择删除层或层版本。