Function Compute の組み込みランタイムがビジネス要件を満たさない場合は、カスタムコンテナ関数を作成できます。このトピックでは、Function Compute コンソールまたは Serverless Devs ツールを使用して作成する方法について説明します。
注意事項
-
Function Compute でカスタムコンテナ関数を作成するには、同じリージョンおよび Alibaba Cloud アカウントの Alibaba Cloud Container Registry イメージを使用する必要があります。Apple Silicon またはその他の ARM ベースのアーキテクチャを搭載したコンピュータでイメージをビルドする場合は、ビルドプラットフォームを linux/amd64 として指定する必要があります。例:
docker build --platform linux/amd64 -t $IMAGE_NAME . -
Function Compute は、Alibaba Cloud Container Registry Enterprise Edition イメージのドメイン名を、設定された VPC のデフォルト解決、または Alibaba Cloud DNS PrivateZone によって自動的に解決されるアクセス IP アドレスのいずれかを使用して解決します。
-
シナリオ 1: インスタンスの [アクセス制御] ページで、いずれの IP アドレスにも [デフォルト解決] 識別子が表示されない場合、[アクセス IP] リスト内のすべての IP アドレスは Alibaba Cloud DNS PrivateZone によって自動的に解決されます。この場合、任意の VPC 設定を使用できます。

-
シナリオ 2: ACR Enterprise Edition インスタンスの [アクセス制御] ページで、[アクセス IP] リストに [デフォルト解決] とマークされた IP アドレスが含まれており、それが VPC のデフォルト解決 IP アドレスである場合、次の図に示すように、最初の VPC のみを選択できます。

-
-
Enterprise Edition インスタンスを使用する場合は、非高速化イメージのみを選択できます。関数のイメージ設定を更新するたびに、システムは選択した最新のオリジナルイメージに基づいて新しい高速化イメージを生成し、既存の高速化イメージを上書きします。オリジナルイメージまたは高速化イメージを削除すると、関数呼び出しに影響が及びます。
-
関数に設定されているイメージが変更された場合は、速やかに関数を更新してください。そうしないと、関数呼び出しが失敗します。
-
オリジナルイメージが存在することを確認してください。存在しない場合、関数は失敗状態になり、呼び出すことができません。Function Compute はコールドスタート時間を短縮するために関数をキャッシュしますが、呼び出しには依然としてオリジナルイメージが必要です。
-
関数で使用されているイメージが別のダイジェストで上書きされないようにしてください。上書きされた場合は、最新のイメージ情報で関数を再デプロイする必要があります。Function Compute は、関数の作成および更新時に選択したイメージバージョンのタグとダイジェストの両方を記録します。イメージ タグが別の場所で更新されて新しいダイジェストを指すようになった場合、関数呼び出しは失敗します。
-
前提条件
-
Container Registry
-
説明
-
Alibaba Cloud Container Registry (ACR) の Personal Edition は、個人開発者向けです。パブリックベータ期間中は、クォータ付きの無料トライアルとして提供されます。このエディションには、サービスレベルアグリーメント (SLA) や損害賠償は含まれず、使用制限があります。使用制限については、「Personal Edition インスタンスの作成」に記載の情報をご参照ください。
-
-
-
Serverless Devs (Serverless Devs を使用して関数を作成する場合にのみ必要)
コンソールでの関数作成
-
Function Compute コンソール にログインします。ナビゲーションペインで、 を選択します。
-
トップナビゲーションバーでリージョンを選択します。[関数] ページで、[関数の作成] をクリックします。
-
表示されたダイアログボックスで、シナリオに基づいて [GPU 関数] タイプを選択し、[GPU 関数を作成] をクリックします。
-
[GPU 関数を作成] ページで、次のパラメータを設定し、[作成] をクリックします。
-
[基本設定]:[関数名] を入力します。名前は、同一の Alibaba Cloud アカウントおよびリージョン内で一意にし、命名規則に従う必要があります。
-
[スケーリングポリシー]:インスタンスタイプを選択します。プロビジョニング済みインスタンスとオンデマンドインスタンスを同時に使用することはできません。関数作成後にインスタンスタイプを変更することはできません。
-
オンデマンドインスタンス
設定項目
説明
例
[インスタンスタイプ]
[オンデマンドインスタンス] を選択します。インスタンスはリクエスト量に基づいて自動的にスケーリングされ、リクエストがない場合は解放されます。使用した分だけ課金されます。
オンデマンドインスタンス
[GPU カードタイプ]
GPU カードタイプを選択します。各カードタイプでサポートされている仕様の詳細については、「インスタンスタイプと仕様」をご参照ください。
Ada シリーズ
[仕様]
ビジネスニーズに基づいて、関数の [GPU メモリ]、[vCPU]、[メモリ]、および [ディスク] の仕様を設定します。仕様を設定すると、各リソースの使用量は、仕様に使用期間を乗じて計算されます。詳細については、「課金の概要」をご参照ください。
説明-
ディスク上のすべてのディレクトリは書き込み可能です。ディスク容量は共有されます。
-
ディスクは、基盤となる関数のインスタンスのライフサイクルに紐付けられています。システムがインスタンスを回収すると、ディスク上のデータは失われます。永続ストレージが必要な場合は、NAS ファイルシステムまたは OSS バケットをマウントできます。
-
GPU メモリ:48 GB
-
vCPU:8 vCPU
-
メモリ:64 GB
-
ディスク:512 MB (課金対象外、Function Compute は 10 GB の無料ディスク容量クォータを提供します)
[最小インスタンス数]
レイテンシーの影響を受けやすいビジネスでは、[Elastic Instance] を選択した後、最小インスタンス数を 1 以上に設定して事前にリソースを確保し、コールドスタートのレイテンシーを削減することを推奨します。
説明最小インスタンス数を 1 以上に設定した後、最小インスタンス数のエラスティックポリシーが設定されていない場合、または一定期間アクティブなエラスティックポリシーがない場合、現在の最小インスタンス数は、ここで設定した値になります。
複数のエラスティックポリシーが設定されている場合、システムは各ポリシーがトリガーされたときに必要な[最小インスタンス数]を計算します。その後、システムはアクティブなポリシーの中で最も高い値を現在の[最小インスタンス数]として使用します。
詳細については、「現在の最小インスタンス数はどのように計算されますか?」をご参照ください。
1
[インスタンスあたりの同時実行数]
単一の GPU 関数インスタンスに対して複数の同時リクエストを設定できます。これは、単一のインスタンスが複数のリクエストを同時に処理できることを意味します。詳細については、「インスタンスの同時実行数の設定」をご参照ください。
-
-
プロビジョニング済みインスタンス
設定項目
説明
例
[インスタンスタイプ]
[プロビジョニング済みインスタンス] を選択します。インスタンスは、事前に購入したプロビジョニング済みリソースプールから関数に割り当てられます。
プロビジョニング済みインスタンスは、予測可能なコスト、低レイテンシー、および高いリソース使用率がビジネスの安定性を確保するために重要であるシナリオで推奨します。
プロビジョニング済みインスタンス
[プロビジョニング済みリソースプール]
プロビジョニング済みリソースプールは、ターゲット関数に割り当てることができるプロビジョニング済みインスタンスのプールです。プロビジョニング済みリソースプールの容量が不足している場合は、[操作] 列の [スケールアウト] をクリックし、画面の指示に従って拡張します。詳細については、「常駐リソースプール (サブスクリプション)」をご参照ください。
-
[プロビジョニング済みリソースプール]:fc-pool-****
-
[GPU カードタイプ]:Ada
[仕様]
ビジネスニーズに基づいて、関数の [GPU メモリ]、[vCPU]、[メモリ]、および [ディスク] の仕様を設定します。仕様を設定すると、各リソースの使用量は、仕様に使用期間を乗じて計算されます。詳細については、「課金の概要」をご参照ください。
説明-
ディスク上のすべてのディレクトリは書き込み可能です。ディスク容量は共有されます。
-
ディスクは、基盤となる関数のインスタンスのライフサイクルに紐付けられています。システムがインスタンスを回収すると、ディスク上のデータは失われます。永続ストレージが必要な場合は、NAS ファイルシステムまたは OSS バケットをマウントできます。
GPU メモリ:48 GB
vCPU:8 vCPU
メモリ:64 GB
ディスク:512 MB (課金対象外、Function Compute は 10 GB の無料ディスク容量クォータを提供します)
[プロビジョニング済みインスタンス数]
プロビジョニング済みリソースプールで利用可能なリソースに基づいて、ターゲット関数にプロビジョニング済みインスタンス数を割り当てます。
1
[インスタンスあたりの同時実行数]
単一の GPU 関数インスタンスに対して複数の同時リクエストを設定できます。これは、単一のインスタンスが複数のリクエストを同時に処理できることを意味します。詳細については、「インスタンスの同時実行数の設定」をご参照ください。
20
-
-
-
[コード]:関数のランタイム環境とコード関連の設定を設定します。
設定項目
説明
例
[ランタイム]
-
[サンプルイメージの使用]:Function Compute が提供するサンプルイメージを選択して、カスタムコンテナ関数を迅速にデプロイします。[コンテナイメージ] パラメータの下のリストからターゲットイメージを選択する必要があります。
-
[コンテナレジストリイメージの使用]:[コンテナイメージ] パラメータの下にある [ACR イメージの選択] をクリックします。[コンテナイメージの選択] パネルで、[コンテナレジストリインスタンス] と [イメージリポジトリ] を選択します。次に、下のイメージリストでターゲットイメージを見つけ、[操作] 列の [選択] をクリックします。
説明-
別のアカウントに属する Alibaba Cloud Container Registry インスタンスのパブリックイメージを使用して関数を作成することはできません。
-
関数に設定されたイメージが変更された場合は、速やかに関数を更新してください。そうしないと、関数呼び出しは失敗します。詳細については、「注意事項」をご参照ください。
-
Enterprise Edition インスタンスを使用する場合、非高速化イメージのみを選択できます。オリジナルイメージまたは高速化イメージを削除しないでください。削除すると、関数呼び出しに影響が及びます。詳細については、「注意事項」をご参照ください。
-
Enterprise Edition インスタンスは、カスタムドメイン名形式のイメージアドレスをサポートしていません。
-
[インデックスのみモード] でイメージアクセラレーションが有効になっているリポジトリのイメージを使用して関数を作成することはできません。これは、Container Registry Enterprise Edition (Standard および Advanced) インスタンスに適用されます。
-
Alibaba Cloud Container Registry が [インデックスのみモード] 機能を導入した後、イメージアクセラレーションが有効になっている場合、Enterprise Edition (Basic) インスタンスで新しく作成されたリポジトリのイメージを使用して関数を作成することはできなくなりました。ただし、これらのインスタンスで既存の高速化リポジトリのイメージは引き続き使用できます。[インデックスのみモード] の詳細については、「コンテナイメージをオンデマンドでロードする」をご参照ください。
[コンテナイメージ]
ターゲットイメージを選択します。
SpringBoot Web アプリのサンプルイメージ
[起動コマンド]
プログラムの起動コマンド。指定しない場合、Function Compute はデフォルトでイメージの Entrypoint または CMD を使用します。
なし
[リッスンポート]
コード内の HTTP サーバーがリッスンするポート。
9000
[実行タイムアウト期間]
タイムアウト期間を設定します。[実行タイムアウト期間] のデフォルトは 60 秒で、最大 86,400 秒です。
60
-
-
[インスタンスプリフェッチ]:AI 推論シナリオでは、インスタンスプリフェッチを設定してモデルを事前にウォームアップできます。これにより、最初のリクエストのコールドスタートレイテンシーが解消されます。
設定項目
説明
例
インスタンスプリフェッチ
[インスタンスプリフェッチ]
初期化フックを設定してインスタンスを事前にウォームアップし、コールドスタートを最適化します。フックは、関数インスタンスが起動した後、リクエストを処理する前に、指定されたスクリプトを実行するか、インターフェースを呼び出してモデルをロードします。初期化フックの詳細については、「インスタンスのライフサイクルの設定」をご参照ください。
有効
[タイムアウト]
初期化フックのタイムアウト期間を設定します。
60
[プリフェッチプログラムタイプ]
モデルを事前にウォームアップするために、[命令の実行] と [コードの呼び出し] の 2 種類の初期化フックを設定できます。
命令の実行
[命令の内容]
実行する命令の内容を設定します。
/bin/bash、/bin/sh、/bin/csh、/bin/zshなどのカスタムシェル実装を使用できます。関数のランタイム環境が選択したシェルをサポートしていることを確認してください。「インスタンスライフサイクルフック」をご参照ください。
-
[権限、ネットワーク、およびストレージ]:関数の実行ロール、ネットワーク、およびストレージマウントを設定します。
設定項目
説明
例
[実行ロール]
Function Compute はこの RAM ロールを引き受けて、Alibaba Cloud リソースにアクセスするための一時的な認証情報を生成し、それをコードに渡します。詳細については、「関数ロールを使用して他のクラウドサービスにアクセスする」をご参照ください。
mytestrole
[VPC アクセス]
関数が VPC 内のリソースにアクセスできるようにします。詳細については、「ネットワークの設定」をご参照ください。
有効化
[VPC]
[VPC アクセス] が [はい] に設定されている場合に必要です。新しい VPC を作成するか、ドロップダウンリストからアクセス先の VPC ID を選択します。
fc.auto.create.vpc.1632317****
[vSwitch]
[VPC アクセス] が [はい] に設定されている場合に必要です。新しい vSwitch を作成するか、ドロップダウンリストから vSwitch ID を選択します。
fc.auto.create.vswitch.vpc-bp1p8248****
[セキュリティグループ]
[VPC アクセス] が [はい] に設定されている場合に必要です。新しいセキュリティグループを作成するか、ドロップダウンリストからセキュリティグループを選択します。
fc.auto.create.SecurityGroup.vsw-bp15ftbbbbd****
デフォルト NIC のインターネットアクセス許可
関数がデフォルトのネットワークインターフェイスを介してインターネットにアクセスできるようにするには、[はい] または [いいえ] を選択します。
重要固定パブリック IP アドレス機能を使用する場合、[デフォルト NIC のインターネットアクセス許可] を無効にする必要があります。そうしないと、設定された固定パブリック IP アドレスは有効になりません。詳細については、「静的パブリック IP アドレスの設定」をご参照ください。
有効化
[NAS マウント]
複数の推論関数で共有されるモデルなど、関数間で共有されるデータの永続ストレージとして、NAS ファイルシステムの設定を関数にマウントします。
[自動設定] を選択した場合、システムはデフォルトで Alibaba-Fc-V3-Component-Generated という名前の既存の汎用 NAS ファイルシステムを使用します。現在のアカウントに該当する NAS ファイルシステムが存在しない場合、システムは自動的に作成します。
有効化
[OSS マウント]
ログやビジネスファイルなどの永続ストレージとして、OSS を関数にマウントします。詳細については、「OSS マウントの設定」をご参照ください。
有効化
-
[ロギングとトレース]
設定項目
説明
例
ログ機能
このオプションを設定して、関数の実行ログを Log Service に永続化し、コードのデバッグ、トラブルシューティング、データ分析を容易にします。詳細については、「ロギング機能の設定」をご参照ください。
-
[自動設定]:
serverless-<region_id>で始まる Log Project を自動的に選択します。このような Log Project はリージョンごとに 1 つだけ作成されます。システムが現在のリージョンで既存の Log Project を検出した場合、それが直接使用されます。
-
[カスタム設定]:ターゲットの [Log Project] と [Logstore] を手動で指定する必要があります。
有効化
-
-
[その他の設定]
設定項目
説明
例
[タイムゾーン]
関数のタイムゾーンを選択します。タイムゾーンを設定すると、環境変数 TZ が自動的に追加され、その値がターゲットのタイムゾーンに設定されます。
UTC
[タグ]
グループ管理を容易にするために、関数のタグを設定します。タグキーとタグ値の両方を設定する必要があります。
key:value
[リソースグループ]
関数をグループ別に管理するために、関数のリソースグループを設定します。
デフォルトのリソースグループ
[環境変数]
環境変数を使用して、コードを変更することなく関数の動作を柔軟に調整します。詳細については、「環境変数の設定」をご参照ください。
{ "BUCKET_NAME": "MY_BUCKET", "TABLE_NAME": "MY_TABLE" }
関数を作成した後、[関数] ページでそれを表示および更新できます。
-
関数を更新する際、設定済みのリスナーポートは変更できますが、ポートの追加や削除はできません。関数の作成時にリスナーポートを設定した場合、更新時にリスナーポートを指定しないと、システムは元のポート設定を保持します。
Serverless Devs を使用した関数の作成
Serverless Devs を使用すると、単一のコマンドフローでコンテナイメージのビルドとプッシュ、および関数のデプロイができます。
-
次のコマンドを実行して、プロジェクトを初期化します。
sudo s init -
次のコマンドを実行して、プロジェクトディレクトリに移動します。
cd start-fc3-custom-container-nodejs -
s.yamlファイルを編集します。 YAML ファイルのパラメータの詳細については、「YAML 仕様」をご参照ください。次のコードに例を示します。
この例では、
imageは Alibaba Cloud Container Registry イメージを表します。<your namespace>、<your image>、<your tag> を実際の名前空間、イメージリポジトリ名、イメージタグに置き換えてください。ステップ 1 でプロジェクトを初期化した際に正しいイメージ情報を既に入力した場合は、ここで変更する必要はありません。edition: 3.0.0 name: hello-world-app # access は、現在のアプリケーションで必要なキー設定を指定します。 # キー設定については、https://www.serverless-devs.com/serverless-devs/command/config をご参照ください # キーの使用順序については、https://www.serverless-devs.com/serverless-devs/tool#key-usage-order-and-specifications をご参照ください access: "default" vars: # グローバル変数 region: "cn-hangzhou" resources: hello_world: # hello_world ビジネスモジュールに対してのみ操作を実行するには、コマンドラインに hello_world を追加します。例: # hello_world のみをビルドする場合: s hello_world build # hello_world を指定せずに s build を直接実行した場合、ツールは現在の YAML ファイル内で hello_world と同じレベルにあるすべてのビジネスモジュールを (以下のコメントアウトされた next_function のような他の兄弟モジュールがある場合) 特定の順序でビルドします component: fc3 # コンポーネント名 actions: # カスタム実行ロジック pre-deploy: # deploy の前に実行 - component: fc3 build --dockerfile ./code/Dockerfile # 実行するコンポーネント。「component: component_name command parameters」の形式で指定します props: region: ${vars.region} # 変数の使用方法については、https://docs.serverless-devs.com/serverless-devs/yaml#%E5%8F%98%E9%87%8F%E8%B5%8B%E5%80%BC をご参照ください functionName: "start-nodejs-ufrz" runtime: "custom-container" description: 'hello world by serverless devs' timeout: 30 memorySize: 512 cpu: 0.5 diskSize: 10240 code: ./code customContainerConfig: image: 'registry.${vars.region}.aliyuncs.com/<your namespace>/<your image>:<your tag>' # お客様の ACR イメージ # triggers: # - triggerName: httpTrigger # トリガー名 # triggerType: http # トリガータイプ # description: 'xxxx' # qualifier: LATEST # トリガーするサービスバージョン # triggerConfig: # authType: anonymous # 認証タイプ。有効値: anonymous, function # disableURLInternet: false # パブリックネットワークアクセス URL を無効にするかどうかを指定します # methods: # HTTP トリガーでサポートされる HTTP メソッド。有効値: GET, POST, PUT, DELETE, HEAD # - GET # - POST -
次のコマンドを実行して、プロジェクトをデプロイします。
sudo s deploy出力例は次のとおりです。
Steps for [deploy] of [hello-world-app] ==================== DEPRECATED: The legacy builder is deprecated and will be removed in a future release. BuildKit is currently disabled; enable it by removing the DOCKER_BUILDKIT=0 environment-variable. Sending build context to Docker daemon 5.12kB Step 1/7 : FROM node:14-buster 14-buster: Pulling from library/node 2ff1d7c41c74: Already exists b253aeafeaa7: Already exists 3d2201bd995c: Already exists 1de76e268b10: Already exists d9a8df589451: Already exists 6f51ee005dea: Already exists 5f32ed3c3f27: Already exists 0c8cc2f24a4d: Already exists 0d27a8e86132: Already exists Digest: sha256:a158d3b9b4e3fa813fa6c8c590b8f0a860e015ad4e59bbce5744d2f6fd8461aa Status: Downloaded newer image for node:14-buster ---> 1d12470fa662 Step 2/7 : WORKDIR /usr/src/ ---> Running in 70a8e2e4d1ea Removing intermediate container 70a8e2e4d1ea ---> 0d67b8fa2901 Step 3/7 : COPY package*.json ./ ---> 09eb15f8770a Step 4/7 : RUN npm install ---> Running in 8ae492be973b Step 5/7 : COPY . . ---> 7560c7b14431 Step 6/7 : EXPOSE 9000 ---> Running in 66b38e54ced0 Removing intermediate container 66b38e54ced0 ---> f73cce48d2ae Step 7/7 : ENTRYPOINT [ "node", "server.js" ] ---> Running in 2fb2f83fd6c0 Removing intermediate container 2fb2f83fd6c0 ---> fe51ae71448c Successfully built fe51ae71448c Successfully tagged registry.cn-hangzhou.aliyuncs.com/z****/z****:latest [2024-01-29 16:33:06][INFO][hello_world] get instanceName= and region=cn-hangzhou from registry.cn-hangzhou.aliyuncs.com/z****/z**** [2024-01-29 16:33:06][INFO][hello_world] try to docker push registry.cn-hangzhou.aliyuncs.com/z****/z**** ... WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded Using default tag: latest The push refers to repository [registry.cn-hangzhou.aliyuncs.com/z****/z****] 85c1ec915b45: Pushed 37c36543a431: Pushed e4afd7f70434: Pushed 0d5f5a015e5d: Layer already exists 3c777d951de2: Layer already exists f8a91dd5fc84: Layer already exists cb81227abde5: Layer already exists e01a454893a9: Layer already exists c45660adde37: Layer already exists fe0fb3ab4a0f: Layer already exists f1186e5061f2: Layer already exists b2dba7477754: Layer already exists latest: digest: sha256:6bf1ed4119d197a46c99082577632957056cb625f2ee0276d2af53f60d22837d size: 2841 [hello_world] completed (688.45s) Result for [deploy] of [hello-world-app] ==================== region: cn-hangzhou cpu: 0.5 customContainerConfig: image: registry.cn-hangzhou.aliyuncs.com/z****/z**** resolvedImageUri: registry.cn-hangzhou.aliyuncs.com/z****/z****@sha256:6bf1ed4119d197a46c99082577632957056cb625f2ee0276d2af53f60d22837d description: hello world by serverless devs diskSize: 10240 functionName: start-nodejs-ufrz handler: handler instanceConcurrency: 1 internetAccess: true lastUpdateStatus: Successful memorySize: 512 role: runtime: custom-container state: Active timeout: 30 A complete log of this run can be found in: /root/.s/logs/0129162246 -
次のコマンドを実行して、関数を呼び出します。
sudo s invoke -e "{\"key\":\"val\"}"出力例は次のとおりです。
Steps for [invoke] of [hello-world-app] ==================== ========= FC invoke Logs begin ========= FC Invoke Start RequestId: 1-65b764db-15eb737f-0c67ab5cd968 FC Invoke Start RequestId: 1-65b764db-15eb737f-0c67ab5cd968 hello world! FC Invoke End RequestId: 1-65b764db-15eb737f-0c67ab5cd968 Duration: 42.27 ms, Billed Duration: 43 ms, Memory Size: 512 MB, Max Memory Used: 47.77 MB ========= FC invoke Logs end ========= Invoke instanceId: c-65b764db-15fa2aa8-bc50f7839399 Code Checksum: undefined Qualifier: LATEST RequestId: 1-65b764db-15eb737f-0c67ab5cd968 Invoke Result: OK [hello_world] completed (4.96s) A complete log of this run can be found in: /root/.s/logs/0129164202
関連ドキュメント
-
カスタムコンテナ関数を使用する場合、コンテナイメージが依存するベース環境では、データのダウンロードと解凍に追加の時間がかかります。コールドスタート時間を短縮するには、「Function Compute のコールドスタートを最適化するためのベストプラクティス」をご参照ください。
-
API オペレーションを呼び出して関数を作成することもできます。詳細については、「CreateFunction」をご参照ください。
-
Function Compute が提供する組み込みランタイム、カスタムランタイム、カスタムコンテナランタイムの適用シナリオと違いについては、「テクノロジーの選択」をご参照ください。