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

使用方法

工作原理

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

层的构建

层的构建与代码包构建方式类似,为使函数计算运行时能正确加载以层发布的库,库的代码目录结构需要遵从各语言标准的目录规范,您也可以自由设计目录结构,但需要在函数里显式指名库的加载地址,即指定库的全路径。下面以Python和Node.js为例来说明层的构建方法。

  • 以Python为例
       #先创建待构建层目标目录。
       mkdir -p target/python
       #使用pip指定目录下载依赖库,或将您自己的库拷贝至如下地址:
       #target/python
       #或者target/python/lib/python{major-version}.{minior-version}/site-packages/
       pip install --target=target/python ${PACKAGE_NAME}
       #进入目标目录,对于该目录整体打包,输出名为${PACKAGE_NAME}压缩包,该压缩包即可作为层的代码包。
       cd target/ && zip -r ${PACKAGE_NAME} ./*
  • 以Node.js为例
     #先创建待构建层目标目录。
     mkdir -p target/nodejs
     #进入指定目录使用npm安装Node.js依赖库,或将您自己的库拷贝至如下地址:
     #target/nodejs/node_modules
     #或者target/nodejs/node{version}/node_modules
     cd target/nodejs
     npm init
     npm install --save ${PACKAGE_NAME}
     #进入目标目录,对于该目录整体打包,输出名为${PACKAGE_NAME}压缩包,该压缩包即可作为层的代码包。
     cd ../
     zip -r ${PACKAGE_NAME} ./*

层的管理

您可以通过控制台、SDK、HTTP Request等方式来管理层。控制台上管理层的具体操作,请参见层的相关操作

在函数中使用层

函数层的配置

在创建函数与更新函数时,可以指定一组层的Arn地址,配置方式可参照API文档,您选择的层必须与函数的Runtime兼容。

函数层的应用

部署于层的库,如果以规范的方式构建,可以在函数代码中直接引用,下文以Node.js为例,创建或更新函数时引用包含moment库的层后,可以在函数代码中直接require 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。