层可以为您提供公共依赖库、运行时环境及函数扩展等发布与部署能力。您可以将函数依赖的公共库提炼到层或者使用函数计算官方公共层,以减少部署或更新函数时的代码包体积。本文介绍层的功能原理、各运行时使用层说明、如何构建层的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包文件结构
使用requests依赖打包后的文件结构
my-layer-code.zip
└── python
└── requests
ZIP包解压部署后的路径
/
└── opt
└── python
└── requests
使用uuid依赖打包后的文件结构
my-layer-code.zip
└── nodejs
├── node_modules
│ └── uuid
├── package-lock.json
└── package.json
ZIP包解压部署后的路径
/
└── opt
└── nodejs
├── node_modules
│ └── uuid
├── package-lock.json
└── package.json
使用jackson-core依赖打包后的文件结构
my-layer-code.zip
└── java
└── lib
└── commons-lang3-3.12.0.jar
ZIP包解压部署后的路径
/
└── opt
└── java
└── lib
└── commons-lang3-3.12.0.jar
使用composer依赖打包后的文件结构
my-layer-code.zip
└── php
├──composer.json
├──composer.lock
└──vendor
ZIP包解压部署后的路径
/
└── opt
└── php
├──composer.json
├──composer.lock
└──vendor
构建层的ZIP包
创建层时,需要将所有内容打包到ZIP文件中。函数计算运行时会将层的内容解压并部署在/opt目录下。
构建层的ZIP包的方式和构建代码包的方式类似,为使函数在运行时能正确加载以层发布的库,库的代码目录结构需遵从各个语言标准的目录规范,具体信息,请参见各运行时使用层说明。对于部署于层的函数依赖库,如果按照规范的方式打包,函数计算运行时会为您自动添加各语言的依赖库搜索路径,您无需指定全路径。如您想自定义层的目录结构,需要在代码中显式添加依赖库搜索地址。具体操作,请参见如何在Custom Runtime中引用层中的依赖。
各运行时构建层ZIP包的操作步骤如下所示:
Python Runtime
- 执行以下命令创建工作目录。
mkdir my-layer-code
- 进入已创建的工作目录。
cd my-layer-code
- 执行以下命令安装依赖库到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
- 执行以下命令创建工作目录。
mkdir my-layer-code
- 进入已创建的工作目录。
cd my-layer-code
- 执行以下命令安装依赖库到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
- 执行以下命令创建工作目录。
mkdir my-layer-code/java
- 进入已创建的工作目录。
cd my-layer-code/java
- 通过Maven安装依赖。安装完成后,目录结构如下:
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
- 进入已创建的工作目录。
cd my-layer-code/php
- 通过Composer安装依赖。安装完成后,目录结构如下:
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
:用于指定创建层的名称。
- 重复执行以下命令为已创建的层创建新版本。
s cli fc layer publish --code ./my-layer-code --compatible-runtime java8,java11,custom --region cn-hangzhou --layer-name my-layer
说明 已创建的层或相关层版本暂不支持修改,如果您需要修改层的相关配置,可以创建新的层或创建新版本。需要注意的是,如果引用的层版本已删除,在更新层配置时,必须先删除该引用。
删除层与层版本
您可以根据提示删除不需要的层或者层版本。已删除的层不能再被查看或被函数配置引用,但已配置引用该层的函数执行不受影响。
- 登录函数计算控制台。
- 在左侧导航栏,选择 。
- 在顶部菜单栏,选择地域。
- 在层管理页面,按需选择删除层或层版本。
- 删除层
单击目标层操作列的删除,在弹出的对话框中选中确认删除层中的全部N个版本复选框,然后单击删除。
- 删除层版本
单击目标层名称,在层详情页面的版本管理区域,单击目标层版本操作列的删除,在弹出的确认对话框中单击删除。
- 删除层
更多信息
您可以通过OpenAPI Explorer调用API和SDK。