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

原理

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

构建层

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

        系统部署层时,会将/opt/python/opt/python/lib/python{}.{}/site-packages添加到Python的sys.path内。

    3. /tmp/target目录中执行以下命令将该目录打包输出,即层的代码包。
      zip -r ${PACKAGE_NAME} ./*
  • Node.js语言
    1. /tmp目录中执行以下命令构建层的目标目录。
      mkdir -p target/nodejs
    2. 您可以通过以下方式安装依赖。
      • 在目标目录中执行以下命令安装依赖。
        1. /tmp/target/nodejs目录中执行以下命令初始化应用。
          npm init
        2. 执行以下命令安装依赖。
          npm install --save ${PACKAGE_NAME}
          说明 ${PACKAGE_NAME}是您将要安装的Node.js库的名称,需自定义。
      • 将您的库拷贝至/tmp/target/nodejs/node_modules目录中。当您需要指定特定的版本时,您可以将库拷贝到/tmp/target/nodejs/node{version}/node_modules目录中。

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

    3. /tmp/target目录中执行以下命令将该目录打包输出,即层的代码包。
      zip -r ${PACKAGE_NAME} ./*

在函数中使用层

函数层的配置

在创建函数与更新函数时,您可以指定一组层的Arn地址通过API配置层。详细信息,请参见 PublishLayerVersionDeleteLayerVersionGetLayerVersionListLayerVersionsListLayers
注意 您选择的层必须与函数的Runtime兼容。

函数层的应用

部署于层的库,如果以规范的方式构建,即层代码的目录结构符合规范路径,您可以在函数代码中直接引用。下文以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}));
};

管理层

您可以通过以下三种方式管理层:

限制说明

  • 一个函数最多创建5个层。
  • 层解压后须小于50 MB。