层可以为您提供自定义的公共依赖库、运行时环境及函数扩展等发布与部署能力。您可以将函数依赖的公共库提炼到层,以减少部署、更新时的代码包体积,也可以将自定义的运行时,以层部署在多个函数间共享。本文介绍层的原理、用法及限制条件等信息,以及函数层的配置与应用。

原理

层默认部署在函数执行环境的/opt目录下,作为函数可额外附加的代码目录。当函数配置多个层时,这些层的内容将被合并至/opt目录。如果层的内容重合,则按照函数配置中层的顺序从后往前依次挂载,以先配置的层的内容为准。对于部署于层的函数依赖库,如果按照规范的方式打包,函数计算运行时会为您自动附加上寻址地址,即您无需指定全路径。

构建层

构建层的方式和构建代码包的方式类似,为使函数计算在运行时能正确加载以层发布的库,库的代码目录结构需遵从各个语言标准的目录规范。您也可以自定义目录结构,但您需在函数代码中显式指明库的加载地址,即指定库的全路径。函数计算支持Python和Node.js,本文介绍如何在以上两种运行环境中构建层。
说明 示例target目录用于包含层的内容,您在实际操作过程中可以按需替换目录名称。通过函数计算部署时,target/xxx会映射为/opt/xxx
  • Python
    1. 执行以下命令构建层的目标目录。
      mkdir -p target/python
    2. 您可以选择以下任一方式安装依赖:
      • 方式一:在target/python中执行以下命令指定下载依赖库。
        pip install --target=target/python ${PACKAGE_NAME}
        说明 ${PACKAGE_NAME}是您将要安装的Python库的名称,需自定义。
      • 方式二:将您的库拷贝至target/python目录中。当您需要指定特定的版本时您可以将库拷贝到target/python/lib/python{major-version}.{minior-version}/site-packages/目录中。

      系统部署层时,会将target/python目录,映射到/opt/python目录,然后会将/opt/python/opt/python/lib/python{major-version}.{minior-version}/site-packages添加到Python的sys.path内。

      说明 python{major-version}.{minior-version}为Python版本,例如python3.6。具体信息,请参见Python运行环境
    3. target目录中执行以下命令将该目录打包输出,即层的代码包。
      zip -r ${PACKAGE_NAME} ./*
  • Node.js
    1. 执行以下命令构建层的目标目录。
      mkdir -p target/nodejs
    2. 您可以选择以下任一方式安装依赖:
      • 方式一:在目标目录中执行以下命令安装依赖。
        1. target/nodejs目录中执行以下命令初始化应用。
          npm init
        2. 执行以下命令安装依赖。
          npm install --save ${PACKAGE_NAME}
          说明 ${PACKAGE_NAME}是您将要安装的Node.js库的名称,需自定义。
      • 方式二:将您的库拷贝至target/nodejs/node_modules目录中。当您需要指定特定的版本时,您可以将库拷贝到target/nodejs/node{version}/node_modules目录中。

        系统在部署层时,会将/opt/nodejs/node{version}/node_modules:/opt/nodejs/node_modules添加至NODE_PATH内。

        说明 node{version}为Node.js版本,例如node12。具体信息,请参见Node.js运行环境
    3. target目录中执行以下命令将该目录打包输出,即层的代码包。
      zip -r ${PACKAGE_NAME} ./*

限制说明

  • 一个函数最多创建5个层。
  • 层解压后须小于50 MB。
  • 运行环境目前仅支持Python和Node.js。
  • 层的运行环境必须与函数的运行环境保持一致。

函数层的应用

部署于层的库,如果以规范的方式构建,即层代码的目录结构符合规范路径,您可以在函数代码中直接引用。下文以Node.js为例,在创建或更新函数时引用包含moment库的层后,可以在函数代码中直接引用该moment库。

const moment = require('moment');

module.exports.handler = function(event, context, callback) {
    console.log('Receive event:', event.toString());
    let momentNow = moment.now();
    callback(null, JSON.stringify({momentNow}));
};

创建和使用层

  1. 登录函数计算控制台
  2. 在左侧导航栏,单击层管理
  3. 在顶部菜单栏,选择地域。
  4. 层管理页面左上角,单击创建层
  5. 创建层页面,设置相关参数,然后单击创建。
    pg_create_layer

    参数说明如下。

    参数 描述
    名称 设置层的名称,支持自定义。
    描述 设置层的描述信息,便于区分层。
    运行环境 按需选择您需要的运行环境,运行环境目前仅支持Python、Node.js。
    代码上传方式 按需选择上传代码的方式。
    说明 当您使用ZIP文件文件夹的方式上传代码时,压缩后文件最大支持50 MB;当使用OSS对象的方式上传代码时,压缩后文件最大支持100 MB。
    层创建成功后,将自动生成层的版本,版本号从1开始递增。
  6. 创建新版本。
    说明 已创建的层或相关层版本暂不支持修改,如果您需要修改层的相关配置,可以创建层或创建新版本。但在更新层配置时,必须先删除对已删除版本的引用。
    1. 层管理页面,单击目标层名称或操作列的版本管理
    2. 版本管理区域,单击创建版本
    3. 在创建新的版本页面,选择运行环境并上传新的层代码,然后单击创建
  7. 为函数配置层和层版本。
    为函数配置层时,如果层有多个版本,将按照具体的层版本与函数进行绑定。
    1. 在左侧导航栏单击服务及函数
    2. 服务列表页面,单击目标服务。
    3. 函数管理页面,单击目标函数操作列的配置
    4. 区域单击+添加配置,在层名称层版本下拉列表选择所需的配置,然后单击保存
      说明 一个函数最多创建5个层。

删除层与层版本

注意 删除层前,请确保您的层没有被函数引用,否则可能会造成函数异常。
  1. 登录函数计算控制台
  2. 在左侧导航栏,单击层管理
  3. 在顶部菜单栏,选择地域。
  4. 层管理页面,按需选择删除层或层版本。
    • 删除层

      单击目标层操作列的删除,在弹出的对话框中选中确认删除层中的全部N个版本。复选框,然后单击删除

    • 删除层版本

      单击目标层名称,在层详情页面的版本管理区域,单击操作列的删除,在弹出的确认对话框中单击删除

更多信息