层可以为您提供自定义的公共依赖库、运行时环境及函数扩展等发布与部署能力。您可以将函数依赖的公共库提炼到层,以减少部署、更新时的代码包体积。本文介绍层的功能原理、各运行时使用层说明以及如何构建层的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包的操作步骤如下所示:

说明 下面创建的工作目录my-layer-code仅为示例,您在实际操作过程中可以按需替换目录名称。

Python Runtime

  1. 执行以下命令创建工作目录。
    mkdir my-layer-code
  2. 进入已创建的工作目录。
    cd my-layer-code
  3. 执行以下命令安装依赖库到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
  4. my-layer-code中执行以下命令打包依赖。
    zip -r my-layer-code.zip python

Node.js Runtime

  1. 执行以下命令创建工作目录。
    mkdir my-layer-code
  2. 进入已创建的工作目录。
    cd my-layer-code
  3. 执行以下命令安装依赖库到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
  4. my-layer-code中执行以下命令打包依赖。
    zip -r my-layer-code.zip nodejs

Java Runtime

  1. 执行以下命令创建工作目录。
    mkdir my-layer-code/java
  2. 进入已创建的工作目录。
    cd my-layer-code/java
  3. 通过Maven安装依赖。
    1. my-layer-code/java目录下创建一个pom.xml文件。
      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目录下。
    2. my-layer-code/java目录下执行以下命令安装依赖。
      mvn dependency:copy-dependencies
    安装完成后目录结构如下:
    my-layer-code
    └── java
        └── lib
            └── commons-lang3-3.12.0.jar
  4. my-layer-code目录执行以下命令打包依赖。
    zip -r my-layer-code.zip java

PHP Runtime

  1. 执行以下命令创建工作目录。
    mkdir -p my-layer-code/php
  2. 进入已创建的工作目录。
    cd my-layer-code/php
  3. 通过Composer安装依赖。
    1. my-layer-code/java目录下创建一个composer.json文件。
      示例如下:
      {
        "require": {
          "aliyunfc/fc-php-sdk": "~1.2",
          "alibabacloud/fnf": "^1.7"
        }
      }
    2. 执行以下命令安装依赖。
      composer install
    安装成功后目录结构如下:
    layer-code
     └─php
       ├──composer.json
       ├──composer.lock
       └──vendor
  4. my-layer-code中执行以下命令打包依赖。
    zip -r my-layer-code.zip php