レイヤーは、パブリックな依存関係ライブラリ、実行環境、および関数の拡張機能などのリソースに対して、公開およびデプロイメント機能を提供します。関数の共通の依存関係をレイヤーに抽出したり、Function Compute が提供する公式のパブリックレイヤーを利用したりすることで、関数のデプロイまたは更新時にコードパッケージのサイズを削減できます。本トピックでは、レイヤーの基本的な仕組み、各ランタイムにおけるレイヤーの使用方法、レイヤー用 ZIP パッケージの作成手順、およびカスタムレイヤーの作成・削除方法について説明します。
仕組み
レイヤーを作成する際は、すべてのコンテンツを ZIP ファイルにパッケージ化する必要があります。Function Compute のランタイムは、レイヤーのコンテンツを /opt ディレクトリに展開します。
関数に複数のレイヤーを追加すると、そのコンテンツはすべて
/optディレクトリにマージされます。同一のファイルが複数のレイヤーに存在する場合、先に追加されたレイヤーのバージョンが優先されます。たとえば、Layer 1 を追加した後に Layer 2 を追加した場合、Layer 2 の重複ファイルは Layer 1 のファイルで上書きされます。
レイヤーのコードがバイナリライブラリや実行可能ファイルに依存している場合は、Linux システム上でレイヤーをビルドする必要があります。Debian 9 の使用を推奨します。
Function Compute のランタイムは x86_64 アーキテクチャに基づいています。レイヤー内の依存関係が命令セットに依存している場合、x86_64 アーキテクチャを搭載したマシンを使用するか、クロスコンパイルを実行して、依存関係が Function Compute のランタイムと互換性を持つようにする必要があります。
各ランタイムにおけるレイヤーの使用方法
ランタイムがレイヤーをサポートしている場合、Function Compute は、ランタイム言語の依存関係検索パスに特定のディレクトリを追加します(下表参照)。レイヤーの ZIP パッケージには、下表に示す特定のディレクトリ構造に合わせたフォルダ構造を使用することを推奨します。これにより、関数コードからパスを明示的に指定せずにレイヤーにアクセスできます。レイヤーの ZIP パッケージの作成方法については、「レイヤーの ZIP パッケージの作成」をご参照ください。カスタムのディレクトリ構造を使用する場合は、コード内で明示的に依存関係ライブラリの検索パスを追加する必要があります。詳細については、「カスタムランタイムでレイヤーの依存関係を参照する方法」をご参照ください。
各ランタイムでサポートされるディレクトリ
ランタイム | ディレクトリパス |
Python | /opt/python |
Node.js | /opt/nodejs/node_modules |
Java | /opt/java/lib |
PHP | /opt/php |
カスタムランタイムおよびカスタムコンテナランタイム以外のランタイム | /opt/bin (PATH) |
/opt/lib (LD_LIBRARY_PATH) | |
カスタムランタイムおよびカスタムコンテナランタイム | なし |
レイヤーの .zip ファイル構造
以下の例は、各ランタイムに対応する必要となる .zip ファイル構造およびデプロイ後のパスを示しています。
requests 依存関係を含むパッケージ化後のファイル構造
my-layer-code.zip
└── python
└── requests
.zip ファイルを展開・デプロイした後のパス
/
└── opt
└── python
└── requestsuuid 依存関係を含むパッケージ化後のファイル構造
my-layer-code.zip
└── nodejs
├── node_modules
│ └── uuid
├── package-lock.json
└── package.json
.zip ファイルを展開・デプロイした後のパス
/
└── opt
└── nodejs
├── node_modules
│ └── uuid
├── package-lock.json
└── package.jsonjackson-core 依存関係を含むパッケージ化後のファイル構造
my-layer-code.zip
└── java
└── lib
└── commons-lang3-3.12.0.jar
.zip ファイルを展開・デプロイした後のパス
/
└── opt
└── java
└── lib
└── commons-lang3-3.12.0.jarcomposer 依存関係を含むパッケージ化後のファイル構造
my-layer-code.zip
└── php
├──composer.json
├──composer.lock
└──vendor
.zip ファイルを展開・デプロイした後のパス
/
└── opt
└── php
├──composer.json
├──composer.lock
└──vendorレイヤー用 .zip ファイルの作成
レイヤーを作成する際は、そのすべてのコンテンツを ZIP ファイルにパッケージ化する必要があります。Function Compute のランタイムは、レイヤーのコンテンツを解凍し、/opt ディレクトリにデプロイします。
レイヤー用 ZIP パッケージの作成は、コードパッケージの作成と同様です。関数のランタイムがレイヤーからライブラリを正しくロードできるようにするためには、ライブラリコードのディレクトリ構造が各言語の標準仕様に従っている必要があります。詳細については、「各ランタイムにおけるレイヤーの使用方法」をご参照ください。標準仕様に従って関数の依存関係ライブラリをレイヤーにパッケージ化した場合、Function Compute は、各言語の依存関係ライブラリ検索パスを自動的に追加します。この場合、完全なパスを指定する必要はありません。カスタムのディレクトリ構造を使用する場合は、コード内で明示的に依存関係ライブラリの検索パスを追加する必要があります。詳細については、「カスタムランタイムでレイヤーの依存関係を参照する方法」をご参照ください。
以下に、各ランタイム向けのレイヤー .zip ファイルの作成手順を示します。
ローカルでレイヤーをビルドする場合、使用するプログラミング言語のバージョンが、Function Compute で選択したランタイムバージョンと一致していることを確認してください。
以下の例で使用されている作業ディレクトリ my-layer-code は、説明用のサンプルです。必要に応じてディレクトリ名を置き換え可能です。
Python ランタイム
ローカルでレイヤーをビルドする場合、使用する Python のバージョンが、Function Compute で選択した 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.libsmy-layer-code ディレクトリで、以下のコマンドを実行して依存関係をパッケージ化します。
zip -r my-layer-code.zip python
Node.js ランタイム
ローカルでレイヤーをビルドする場合、使用する Node.js のバージョンが、Function Compute で選択した 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.jsonmy-layer-code ディレクトリで、以下のコマンドを実行して依存関係をパッケージ化します。
zip -r my-layer-code.zip nodejs
Java ランタイム
以下のコマンドを実行して、作業ディレクトリを作成します。
mkdir my-layer-code/java先ほど作成したディレクトリに移動します。
cd my-layer-code/javaMaven を使用して依存関係をインストールします。
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.jarmy-layer-code ディレクトリで、以下のコマンドを実行して依存関係をパッケージ化します。
zip -r my-layer-code.zip java
PHP ランタイム
以下のコマンドを実行して、作業ディレクトリを作成します。
mkdir -p my-layer-code/php先ほど作成したディレクトリに移動します。
cd my-layer-code/phpComposer を使用して依存関係をインストールします。
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 └──vendormy-layer-code ディレクトリで、以下のコマンドを実行して依存関係をパッケージ化します。
zip -r my-layer-code.zip php
カスタムレイヤーの作成
コンソール
前提条件
関数を作成しました。詳細については、「関数を作成する」をご参照ください。
操作手順
Function Compute コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
上部のナビゲーションバーでリージョンを選択します。レイヤー ページで、レイヤーの作成 をクリックします。
レイヤーの作成 ページでパラメーターを設定し、作成 をクリックします。
パラメーター
説明
名前
レイヤーの名前を入力します。
説明
レイヤーの説明を入力します。
互換性のあるランタイム
このレイヤーと互換性のあるランタイムを選択します。
レイヤーのアップロード方法
レイヤーの依存関係をアップロードする方法を選択します。
ZIP パッケージでレイヤーをアップロード
レイヤーの .zip ファイルをアップロードします。アップロード可能な .zip ファイルのサイズ上限は 500 MB です。
フォルダーでレイヤーをアップロード
レイヤーのコンテンツを含むフォルダーを選択します。Function Compute が自動的にフォルダーを .zip ファイルに圧縮します。圧縮後のファイルサイズ上限は 500 MB です。
OSS を使用してレイヤーをアップロード
Object Storage Service (OSS) 内のレイヤーの .zip ファイルの バケット名 および オブジェクト名 を指定します。選択した OSS オブジェクトのサイズ上限は 500 MB です。
依存関係レイヤーをオンラインでビルド
依存関係ファイルから直接レイヤーをビルドする場合に選択します。この方法は、Python (
requirements.txt) および Node.js (package.json) アプリケーション、および軽量のシステムライブラリのインストールに対応しています。依存関係ファイルの内容をエディターに貼り付け、システムが自動的に依存関係をインストールしてレイヤーを作成します。
ビルド環境
依存関係レイヤーをオンラインでビルド を選択した場合、依存関係レイヤーのビルドに使用するランタイムを選択する必要があります。
説明現在、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:レイヤーの名前。
成功すると、コマンドはレイヤーの Alibaba Cloud リソースネーム (ARN) を返します。ARN には、アカウント ID、レイヤー名、バージョン番号がハッシュ記号 (
#) で区切られています(図参照)。また、Function Compute コンソール にログインして、作成したレイヤーの情報を確認することもできます。
既存のレイヤーに対して新しいバージョンを作成するには、同じレイヤー名で再度コマンドを実行します。
s cli fc layer publish --code ./my-layer-code --compatible-runtime java8,java11,custom --region cn-hangzhou --layer-name my-layer説明作成済みのレイヤーおよびそのバージョンは変更できません。レイヤーの構成を更新するには、新しいレイヤーまたは新しいバージョンを作成する必要があります。参照中のレイヤーバージョンが削除された場合、レイヤーの構成を更新する前に、まずその参照を削除する必要があります。
レイヤーまたはレイヤーバージョンの削除
不要になったレイヤーやレイヤーバージョンを削除できます。レイヤーバージョンを削除すると、そのバージョンを表示したり、新しい関数の構成で参照したりできなくなります。ただし、すでにその削除済みのレイヤーバージョンを参照している関数には影響ありません。
Function Compute コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
上部のナビゲーションバーでリージョンを選択します。
レイヤー ページで、必要に応じてレイヤーまたはレイヤーバージョンを削除します。
レイヤーの削除
対象のレイヤーを見つけ、操作 列の 削除 をクリックし、ダイアログボックスで確認チェックボックスを選択して、削除 をクリックします。
レイヤーバージョンの削除
レイヤーの詳細ページで、バージョン管理 セクションに移動します。対象のバージョンを見つけ、操作 列の 削除 をクリックし、送信 ダイアログボックスで 削除 をクリックします。
参照
API または SDK を使用して関数を作成または更新する際に、
layersパラメーターを設定することで、レイヤーの管理および構成を行うこともできます。詳細については、「関数の作成」および「関数の更新」をご参照ください。インストールしようとするレイヤーの依存関係に動的リンクライブラリが含まれている場合、またはローカル環境が Function Compute のランタイム環境と互換性がない場合、コンソールまたはローカル環境からのレイヤーのビルドはできません。Dockerfile を使用したレイヤーのビルドのみが可能です。詳細については、「Dockerfile を使用したレイヤーのビルド方法」をご参照ください。
カスタムレイヤーを作成した後は、Function Compute コンソール または Serverless Devs を使用して関数にバインドすることで、関数がレイヤー内のリソースにアクセスできるようになります。詳細については、「カスタムレイヤーの構成」をご参照ください。