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

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

Enterprise Edition インスタンスを使用する場合、高速化されていないイメージのみを選択できます。関数のイメージ設定を更新するたびに、システムは選択した最新のオリジナルイメージに基づいて新しい高速化イメージを生成し、既存の高速化イメージを上書きします。オリジナルイメージまたは高速化イメージを削除しないでください。削除すると、関数の呼び出しが失敗します。
設定されたイメージが変更された場合は、関数を速やかに更新してください。更新しないと、関数の呼び出しが失敗します。
オリジナルイメージが存在することを確認してください。存在しない場合、関数は Failed 状態になり、呼び出すことができません。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 イメージの選択] をクリックします。 [コンテナイメージの選択] パネルで、[コンテナレジストリインスタンス] と [イメージリポジトリ] を選択します。 次に、下のイメージ一覧で目的のイメージを探し、[操作] 列の [選択] をクリックします。
説明別のアカウントに属する ACR インスタンスのパブリックイメージを使用して関数を作成することはできません。
設定されたイメージが変更された場合は、関数を速やかに更新してください。更新しないと、関数の呼び出しが失敗します。
Enterprise Edition インスタンスを使用する場合、高速化されていないイメージのみを選択できます。オリジナルイメージまたは高速化イメージを削除しないでください。削除すると、関数の呼び出しが失敗します。
Enterprise Edition インスタンスは、カスタムドメイン名形式のイメージアドレスをサポートしていません。
Container Registry Enterprise Edition (Standard および Advanced) インスタンスで、**[インデックスのみモード]** でイメージ高速化が有効になっているリポジトリのイメージを使用して関数を作成することはできません。
Alibaba Cloud Container Registry が **[インデックスのみモード]** 機能を導入した後、イメージ高速化が有効になっている場合、Enterprise Edition (Basic) インスタンスで新しく作成されたリポジトリのイメージを使用して関数を作成することはできなくなりました。ただし、これらのインスタンスの既存の高速化されたリポジトリのイメージは引き続き使用できます。
[コンテナーイメージ]
ターゲットイメージを選択します。
SpringBoot Web App Sample Image
[起動コマンド]
プログラムの起動コマンド。指定されていない場合、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 を作成するか、ドロップダウンリストからアクセス先の VPC ID を選択します。
fc.auto.create.vpc.1632317****
[vSwitch]
[VPC アクセス]は、[VPC アクセス] が [はい] に設定されている場合に必須です。 新しい vSwitch を作成するか、ドロップダウンリストから vSwitch ID を選択します。
fc.auto.create.vswitch.vpc-bp1p8248****
[セキュリティグループ]
[VPC アクセス]は、[VPC アクセス] が [はい] に設定されている場合に必須です。新しいセキュリティグループを作成するか、ドロップダウンリストからセキュリティグループを選択します。
fc.auto.create.SecurityGroup.vsw-bp15ftbbbbd****
デフォルトNICによるインターネットアクセスを許可
関数がデフォルトのネットワークインターフェイスを介してインターネットにアクセスできるようにするかどうかを選択します。
重要固定パブリック IP アドレス機能を使用する場合は、[デフォルトNICによる関数のインターネットアクセスを許可] を無効にする必要があります。無効にしないと、設定された固定パブリック IP アドレスが有効になりません。
有効
[NAS のマウント]
NASファイルシステムの設定を関数にマウントして、複数の推論関数で共有されるモデルなど、関数間で共有されるデータを永続的に保存します。
自動設定を選択すると、システムはデフォルトでAlibaba-Fc-V3-Component-Generatedという名前の既存の汎用NASファイルシステムを使用します。現在のアカウントに適格なNASファイルシステムが存在しない場合、システムは自動的に作成します。
有効
[OSS のマウント]
OSSを関数にマウントして、ログやビジネスファイルなどを永続的に保存します。
有効
[ロギングとトレーシング]:
設定項目
説明
例
ログ機能
このオプションを設定して、関数実行ログを Log Service に永続化し、コードのデバッグ、トラブルシューティング、データ分析を容易にします。
[自動設定]:
serverless-<region_id>で始まるログプロジェクトを自動的に選択します。このようなログプロジェクトは、リージョンごとに 1 つだけ作成されます。システムが現在のリージョンに既存のログプロジェクトを検出した場合、それが直接使用されます。
カスタム設定: 対象の [ログプロジェクト] と [ログストア] を手動で指定します。
有効
[その他の設定]
設定項目
説明
例
[タイムゾーン]
関数のタイムゾーンを選択します。タイムゾーンを設定すると、環境変数 [TZ] が自動的に追加され、値がターゲットタイムゾーンに設定されます。
UTC
[タグ]
関数のタグの設定を行い、グループ管理を容易にします。タグキーとタグ値の両方を設定する必要があります。
key: value
[リソースグループ]
関数のリソースグループの設定を選択して、グループごとに関数を管理します。
デフォルトリソースグループ
[環境変数]
環境変数を使用して、コードを変更せずに関数の動作を柔軟に調整します。
{ "BUCKET_NAME": "MY_BUCKET", "TABLE_NAME": "MY_TABLE" }
関数を作成した後、**[関数リスト]** ページで関数を表示および更新できます。
関数を更新する際、設定されたリッスンポートを変更できますが、ポートを追加または削除することはできません。関数の作成時にリッスンポートを設定した場合、更新時にリッスンポートを指定しなければ、システムは元のポート設定を保持します。
Serverless Devsでの関数の作成
Serverless Devs を使用して、単一のコマンドフローでコンテナイメージをビルドおよびプッシュし、関数をデプロイできます。
次のコマンドを実行して、プロジェクトを初期化します。
sudo s initプロンプトに従って、Alibaba Cloud アカウント、カスタムイメージテンプレート、プログラミング言語 (このトピックでは例として Node.js を使用) を選択します。次に、プロジェクト名を設定し、デプロイリージョンを選択して、ACR イメージ情報を入力します。
次のコマンドを実行して、プロジェクトディレクトリに移動します。
cd start-fc3-custom-container-nodejss.yamlファイルを編集します。YAMLファイルのパラメーターの詳細については、「YAML仕様」をご参照ください。次のコードは例です。
この例では、
imageは ACR イメージを指します。<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: # デプロイ前に実行 - 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: 512 code: ./code customContainerConfig: image: 'registry.${vars.region}.aliyuncs.com/<your namespace>/<your image>:<your tag>' # ACR イメージ。<your namespace>、<your image>、および<your tag>を実際の名前空間名、イメージリポジトリ名、およびイメージタグに置き換えてください。 # 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: 512 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