レイヤーは、関数に共有の依存関係ライブラリ、ランタイム環境、および関数拡張機能を提供します。関数が依存する共通ライブラリをレイヤーに抽出したり、Function Compute (FC) のパブリックレイヤーを使用したりすることで、関数のデプロイまたは更新時にコードパッケージのサイズを削減できます。このトピックでは、レイヤーの仕組み、各ランタイムがサポートするディレクトリ、レイヤーの ZIP ファイルのビルド方法、およびカスタムレイヤーの作成と削除方法について説明します。
仕組み
レイヤーをビルドする際、そのすべてのコンテンツを 1 つの ZIP ファイルにパッケージ化します。実行時、FC はレイヤーのコンテンツを抽出し、/opt ディレクトリにデプロイします。関数に複数のレイヤーを設定すると、レイヤーのコンテンツは設定した順序とは逆に /opt にマージされます。あるレイヤーのファイルが別のレイヤーのファイルと同じ名前を持つ場合、先に設定したレイヤーのファイルが、後に設定したレイヤーのファイルを上書きします。
たとえば、関数にレイヤー 1 とレイヤー 2 を設定した場合、関数インスタンスは起動時にまずレイヤー 2 をロードし、次にレイヤー 1 をロードして、両方のレイヤーを /opt ディレクトリに抽出します。/opt 内では、レイヤー 2 のコンテンツが先に展開され、次にレイヤー 1 のコンテンツが展開されます。レイヤー 1 とレイヤー 2 に同じ名前のファイルが含まれている場合、レイヤー 1 のファイルがレイヤー 2 のファイルを上書きします。
ビルド要件:
-
レイヤーにバイナリライブラリや実行可能ファイルが含まれる場合、Linux (Debian 9 を推奨) 上でビルドしてください。
-
FC は x86_64 上で実行されます。依存関係が命令セットに依存する場合、互換性を確保するために x86_64 マシンを使用するか、クロスコンパイルしてください。
各ランタイムでサポートされるディレクトリ
ランタイムがレイヤーをサポートしている場合、FC はランタイム言語の依存関係の検索パスに以下のディレクトリを追加します。関数のコードが明示的なパスを指定せずにレイヤーのコンテンツにアクセスできるように、レイヤーの 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 ファイルの構造と、対応する展開先パスを示しています。
Python — requests 依存関係をパッケージ化する場合:
my-layer-code.zip
└── python
└── requests
抽出先:
/opt/python/requests
Node.js — uuid 依存関係をパッケージ化する場合:
my-layer-code.zip
└── nodejs
├── node_modules
│ └── uuid
├── package-lock.json
└── package.json
抽出先:
/opt/nodejs/node_modules/uuid
Java — commons-lang3 依存関係をパッケージ化する場合:
my-layer-code.zip
└── java
└── lib
└── commons-lang3-3.12.0.jar
抽出先:
/opt/java/lib/commons-lang3-3.12.0.jar
PHP — Composer 依存関係をパッケージ化する場合:
my-layer-code.zip
└── php
├── composer.json
├── composer.lock
└── vendor
抽出先:
/opt/php/vendor
レイヤー ZIP ファイルのビルド
レイヤー ZIP ファイルのビルドは、コードパッケージのビルドと似ています。FC が実行時にレイヤーに含まれるライブラリを正しくロードするためには、ライブラリコードのディレクトリ構造が各言語の標準的なディレクトリ規約に従っている必要があります。詳細については、「各ランタイムでサポートされるディレクトリ」をご参照ください。指定どおりにレイヤーの依存関係をパッケージ化すると、FC は各言語の依存関係の検索パスを自動的に追加するため、フルパスを指定する必要はありません。
各ランタイム用のレイヤー ZIP ファイルをビルドするには、次の手順に従います。
-
ローカルでレイヤーをビルドする際は、FC で選択したランタイムバージョンと同じプログラミング言語バージョンを使用してください。
-
my-layer-code作業ディレクトリは一例です。必要に応じてディレクトリ名を変更できます。
Python ランタイム
ローカルでレイヤーをビルドする際は、FC で選択した Python ランタイムバージョンと同じ Python バージョンを使用してください。
-
作業ディレクトリを作成します。
mkdir my-layer-code cd my-layer-code -
依存関係を
pythonサブディレクトリにインストールします。pip install --target ./python ${PackageName}pip installコマンドの詳細については、「pip install」をご参照ください。numpyを使用した例: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 ランタイム
ローカルでレイヤーをビルドする際は、FC で選択した Node.js ランタイムバージョンと同じ Node.js バージョンを使用してください。
-
作業ディレクトリを作成します。
mkdir my-layer-code cd my-layer-code -
依存関係を
nodejsサブディレクトリにインストールします。npm install --prefix ./nodejs --save ${PackageName}${PackageName}は、インストールする依存関係パッケージの名前です。npm installコマンドの詳細については、「npm-install」をご参照ください。uuidを使用した例: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 ランタイム
-
作業ディレクトリを作成します。
mkdir my-layer-code/java cd my-layer-code/java -
pom.xmlファイルを作成し、依存関係を宣言します。次の例では、commons-lang3をインストールし、maven-dependency-pluginを使用して./libにコピーします。<?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> <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> <plugin> <artifactId>maven-dependency-plugin</artifactId> <configuration> <!-- 推移的な依存関係を含める --> <excludeTransitive>false</excludeTransitive> <!-- JAR ファイル名にバージョンのサフィックスを保持する --> <stripVersion>false</stripVersion> <!-- ダウンロードした JAR の出力ディレクトリ --> <outputDirectory>./lib</outputDirectory> </configuration> </plugin> </plugins> </build> </project> -
依存関係をインストールします。
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 ランタイム
-
作業ディレクトリを作成します。
mkdir -p my-layer-code/php cd 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
カスタムレイヤーの作成
コンソールの使用
前提条件
開始する前に、以下を確認してください。
-
FC 関数が作成されていること。詳細については、「関数の作成」をご参照ください。
操作手順
-
Function Compute コンソールにログインします。左側のナビゲーションペインで、[高度な機能] > [レイヤー] をクリックします。
-
上部メニューで、リージョンを選択します。[レイヤー] ページで、[レイヤーの作成] をクリックします。
-
次のパラメーターを設定し、[作成] をクリックします。
パラメーター 説明 [名前] レイヤーの名前を入力します。 説明 レイヤーを区別しやすくするために、レイヤーの説明を入力します。 [互換ランタイム] このレイヤーと互換性のあるランタイムを選択します。 [レイヤーのアップロード方法] レイヤーの依存関係をアップロードする方法を選択します。[ZIP パッケージでレイヤーをアップロード] — .zip ファイル (最大 500 MB) をアップロードします。[フォルダーでレイヤーをアップロード] — FC が .zip ファイル (最大 500 MB) に圧縮するフォルダーを選択します。[OSS を使用してレイヤーをアップロード] — Object Storage Service (OSS) 内の .zip ファイル (最大 500 MB) の [バケット名] と [オブジェクト名] を指定します。[依存関係レイヤーをオンラインでビルド] — 関数が Python または Node.js で開発されている場合、または軽量のシステムライブラリをインストールする必要がある場合は、レイヤーをオンラインでビルドできます。依存関係ファイル (Python の場合は requirements.txt、Node.js の場合はpackage.json) の内容を下の入力ボックスに入力します。リクエストを送信すると、FC は言語レベルの依存関係パッケージとシステムライブラリを自動的にインストールし、レイヤーの依存関係管理を簡素化します。[ビルド環境] [依存関係レイヤーをオンラインでビルド] が選択されている場合に表示されます。レイヤーをビルドするためのランタイムを選択します。現在、Python と Node.js ランタイムのみがサポートされています。 [apt コマンド] [依存関係レイヤーをオンラインでビルド] が選択されている場合に表示されます。 apt installの後にパッケージ名を入力して、システムパッケージをレイヤーにインストールします。レイヤーが作成されると、レイヤーバージョンが自動的に生成されます。バージョン番号は 1 から始まり、新しいバージョンごとにインクリメントされます。
説明OSS バケットがキー管理サービス (KMS) によって暗号化されている場合、Function Compute のサービスにリンクされたロール (
AliyunServiceRoleForFC) には暗号化されたオブジェクトにアクセスする権限がないことがあり、AccessDeniedエラーが発生します。 これを解決するには、KMS コンソールでキーポリシーを更新して、AliyunServiceRoleForFCロールにアクセス権を付与します。 詳細については、「キーポリシーの変更」をご参照ください。 キーポリシーを更新した後、レイヤーのアップロードを再試行して、権限の変更が有効になったことを確認します。 -
既存のレイヤーに新しいバージョンを追加するには:
説明既存のレイヤーやそのバージョンを変更することはできません。レイヤーを更新するには、新しいレイヤーまたは新しいレイヤーバージョンを作成します。参照されているレイヤーバージョンが削除された場合は、レイヤー設定を更新する前に参照を削除してください。
-
[レイヤー] ページで、対象のレイヤーの名前をクリックします。
-
[バージョン管理] タブで、[バージョンの作成] をクリックします。
-
ランタイムを選択し、新しいレイヤーコードをアップロードして、[作成] をクリックします。
-
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 の識別子、レイヤー名、レイヤーバージョンの 3 つの部分で構成されています。 また、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 コンソールにログインします。左側のナビゲーションペインで、[高度な機能] > [レイヤー] をクリックします。
-
上部メニューで、リージョンを選択します。
-
[レイヤー] ページで、レイヤーまたはレイヤーバージョンを削除します。
-
レイヤーの削除:対象のレイヤーを見つけ、[操作] 列の [削除] をクリックし、確認用チェックボックスにチェックを入れ、[削除] をクリックします。
-
レイヤーバージョンの削除:対象のレイヤーの名前をクリックします。 レイヤー詳細ページの [バージョン管理] セクションで対象のバージョンを見つけ、[操作] 列の [削除] をクリックし、[確認] ダイアログボックスで [削除] をクリックします。
-
次のステップ
-
カスタムレイヤーを作成した後、Function Compute コンソールまたは Serverless Devs を使用して関数に設定し、関数がレイヤーによって提供されるリソースにアクセスできるようにします。詳細については、「カスタムレイヤーの設定」をご参照ください。
-
API の呼び出しや SDK を使用して関数を作成または更新する際に
layersパラメーターを設定することで、レイヤーを管理および設定することもできます。詳細については、「CreateFunction」および「UpdateFunction」をご参照ください。 -
レイヤーの依存関係に共有ライブラリが含まれている場合、またはローカル環境が FC ランタイムと互換性がない場合は、コンソールまたはローカルでレイヤーをビルドすることはできません。代わりに Dockerfile からレイヤーをビルドします。詳細については、「Dockerfile を使用したレイヤーのビルド」をご参照ください。