層可以為您提供公共依賴庫、運行時環境及函數擴展等發布與部署能力。您可以將函數依賴的公共庫提煉到層或者使用函數計算官方公共層,以減少部署或更新函數時的代碼包體積。本文介紹層的功能原理、各運行時使用層說明、如何構建層的ZIP包以及如何創建、刪除自定義層。
功能原理
構建層時,需要將所有內容打包到ZIP文件中。函數計算運行時會將層的內容解壓并部署在/opt目錄下。
當函數配置多個層時,這些層的內容將被合并至
/opt
目錄,多個層按照層配置的逆序合并。如果某一文件與其他層中的文件同名,則先配置層中的該文件會覆蓋后配置層中的該同名文件。例如,為某函數配置了第1層和第2層,函數實例啟動時,會先加載第2層,后加載第1層,并將其解壓至
/opt
目錄。在/opt
目錄中,第1層的內容在前,第2層的內容在后,如果第1層和第2層中存在同名文件,那么第1層中的該文件會覆蓋第2層中的該文件內容。如果層中的代碼依賴二進制的庫或可執行文件,則需要使用Linux系統編譯構建層,推薦使用Debian 9。
函數計算運行時基于x86_64架構,如果層中的依賴庫對指令集有依賴,則需要使用x86_64架構的機器,或者通過交叉編譯的方式確保依賴庫與函數計算運行時兼容。
各運行時使用層說明
如果運行時支持層功能,函數計算會將特定的目錄添加到運行時語言的依賴包搜索路徑中,如下表所示。建議您在層ZIP包中定義與下方列舉的特定目錄相同的文件夾結構,使得函數代碼無需指定路徑即可訪問層。具體構建層的ZIP包的方法,請參見構建層的ZIP包。如您想自定義層的目錄結構,需要在代碼中顯式添加依賴庫搜索地址。具體操作,請參見如何在Custom Runtime中引用層中的依賴。
各運行時支持添加的特定目錄
運行時 | 特定的目錄 |
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) | |
Custom Runtime和Custom Container | 無 |
各運行時的層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
在本地構建層時,使用的Python版本需要和在函數計算選擇的Python運行時版本保持一致。
執行以下命令創建工作目錄。
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
在本地構建層時,使用的Node.js版本需要和在函數計算選擇的Node.js運行時版本保持一致。
執行以下命令創建工作目錄。
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目錄下創建一個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目錄下。
在my-layer-code/java目錄下執行以下命令安裝依賴。
mvn dependency:copy-dependencies
安裝完成后,目錄結構如下:
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安裝依賴。
在my-layer-code/php目錄下,創建一個composer.json文件。
示例如下:
{ "require": { "aliyunfc/fc-php-sdk": "~1.2", "alibabacloud/fnf": "^1.7" } }
執行以下命令安裝依賴。
composer install
安裝完成后,目錄結構如下:
my-layer-code └─php ├──composer.json ├──composer.lock └──vendor
在my-layer-code目錄,執行以下命令打包依賴。
zip -r my-layer-code.zip php
創建自定義層
通過控制臺創建自定義層
前提條件
已完成函數的創建,具體操作請參見創建函數。
操作步驟
登錄函數計算控制臺,在左側導航欄,選擇 。
在頂部菜單欄,選擇地域,然后在層管理頁面,單擊創建層。
在創建層頁面,設置相關參數,然后單擊創建。
參數
描述
名稱
設置層的名稱,支持自定義。
描述
設置層的描述信息,便于區分各層。
兼容運行時
選擇與該層兼容的運行時環境。
層上傳方式
按需選擇上傳層依賴的方式。包含以下幾種上傳方式:
通過 ZIP 包上傳層
選擇或直接上傳已構建的層的ZIP文件。上傳的ZIP文件不能超過500 MB。
通過文件夾上傳層
選擇或上傳已構建層的ZIP文件所在的文件夾。上傳的文件夾壓縮后不能超過500 MB。
通過 OSS 上傳層
選擇上傳構建層的ZIP文件的Bucket 名稱和文件名稱。選擇的OSS中的文件不能超過500 MB。
在線構建依賴層
如果您的函數應用是基于Python和Node.js語言開發,或需要安裝部分輕量級系統庫,可以選擇在線構建依賴層,并在下方輸入框輸入構建層的依賴文件
package.json
或requirements.txt
的內容,提交創建層后系統會自動安裝這些語言級別的依賴包和系統庫,簡化層依賴管理過程。
構建環境
當您選擇在線構建依賴層時,需設置此參數選擇構建依賴層所使用的運行環境。
說明目前僅Python和Node.js運行時支持在線構建依賴層。
apt 命令
當您選擇在線構建依賴層,且需要安裝部分軟件包到層中,可以在
apt install
后面的輸入框直接輸入依賴的名稱在線安裝。層創建成功后,將自動生成層的版本,版本號從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
:用于指定創建層的名稱。
創建完成后提示成功并返回層的ARN,ARN通過
#
號分為三個部分,第一部分為賬號ID的標識符,第二部分為層的名稱,第三部分為層的版本,如下圖所示。您也可以登錄函數計算控制臺查看創建的層信息。重復執行以下命令為已創建的層創建新版本。
s cli fc layer publish --code ./my-layer-code --compatible-runtime java8,java11,custom --region cn-hangzhou --layer-name my-layer
說明已創建的層或相關層版本暫不支持修改,如果您需要修改層的相關配置,可以創建新的層或創建新版本。需要注意的是,如果引用的層版本已刪除,在更新層配置時,必須先刪除該引用。
刪除層與層版本
您可以根據提示刪除不需要的層或者層版本。已刪除的層不能再被查看或被函數配置引用,但已配置引用該層的函數執行不受影響。
登錄函數計算控制臺,在左側導航欄,選擇 。
在頂部菜單欄,選擇地域。
在層管理頁面,按需選擇刪除層或層版本。
刪除層
單擊目標層操作列的刪除,在彈出的對話框中選中確認刪除層中的復選框,然后單擊刪除。
刪除層版本
單擊目標層名稱,在層詳情頁面的版本管理區域,單擊目標層版本操作列的刪除,在彈出的確認對話框中單擊刪除。
相關文檔
您還可以在通過OpenAPI/SDK創建函數或更新函數時,配置參數
layers
來管理層和配置層。更多信息,請參見CreateFunction - 創建函數和UpdateFunction - 更新函數。如果要安裝的層依賴中包含動態鏈接庫,或者本地環境與函數計算的運行時環境不兼容時,不支持通過控制臺或本地構建的方式構建層,只能基于Dockerfile構建層。具體操作,請參見如何基于Dockerfile構建層。
自定義層創建完成后,您可以通過函數計算控制臺或Serverless Devs將其綁定到函數,以便函數訪問層中提供的資源。具體操作,請參見配置自定義層。