Flask、Express、Spring Bootなどの一般的なフレームワークに基づいてプログラムを作成する場合、または既存のフレームワークアプリケーションを移行する場合は、web関数を作成することを選択できます。 インスタンスの同時実行機能を使用して、トラフィックピーク時のリソース使用量を効果的に管理し、コールドスタートの影響を軽減できます。 これにより、パフォーマンスと制御コストが向上します。
関数の作成
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、[関数の作成] をクリックします。
[関数の作成] ページで、[Web関数] を選択し、次のパラメーターを設定し、[作成] をクリックします。
基本設定: 関数名を設定します。
コード: 関数のランタイムとコード関連の情報を設定します。 下表に、各パラメーターを説明します。
パラメーター
説明
例
ランタイム
Python、Java、PHP、Node.js、Custom Container Imageなどのランタイムを選択します。
Node.js 16
コードのアップロード方法
Function Computeにコードをアップロードする方法を指定します。
サンプルコードの使用: Function Computeが提供するサンプルコードを選択して、ビジネス要件に基づいて関数を作成できます。 これはデフォルトの方法です。
アップロードZIP: を選択してアップロードします。関数コードを含むzipファイル。
フォルダのアップロード: 関数コードを含むフォルダを選択してアップロードします。
OSS: 関数コードのバケット名とオブジェクト名パラメーターを指定します。
サンプルイメージの使用: Function Computeに付属のサンプルイメージを選択します。
Container Registryイメージの使用: Container Registryからイメージを選択します。 [コンテナーイメージの選択] パネルで、[コンテナーイメージインスタンス] および [コンテナーレジストリリポジトリ] パラメーターを指定し、目的のイメージを見つけて、[操作] 列の [選択] をクリックします。
説明別のアカウントに属するContainer Registryのパブリックイメージを使用して関数を作成することはできません。
サンプルコードの使用
Startupコマンド
プログラムの起動コマンドを設定します。 スタートアップコマンドを設定しない場合は、コードのルートディレクトリにbootstrapという名前のスタートアップスクリプトを手動で作成する必要があります。 ブートストラップスクリプトを使用してプログラムを起動できます。
npm実行開始
リスニングポート
コード内のHTTPサーバーがリッスンするポートを指定します。
9000
[詳細設定] セクションで、インスタンス設定と、関数実行タイムアウト時間などのその他の項目を設定します。
パラメーター
説明
例
仕様
ビジネス要件に基づいて、vCPU容量およびメモリ容量パラメーターを設定します。 リソースの課金の詳細については、「課金の概要」をご参照ください。
説明vCPU容量とメモリ容量 (GB) の比率は、1:1から1:4の範囲で設定する必要があります。
0.35 vCPU、512 MB
一時ディスクのサイズ
業務要件に基づいて、ファイルを一時的に格納するために使用するディスクのサイズを指定します。
有効な値:
512 MB: デフォルト値。 このサイズの一時ディスクの使用に対しては課金されません。 Function Computeは、512 MBの空きディスク容量を提供します。
10 GB: 9.5 GBのディスクサイズに基づいて課金されます。
説明データは一時ディスクのスペースを共有し、ディスク内のすべてのディレクトリに書き込むことができます。
一時ディスクのサイズは、基盤となるインスタンスのライフサイクルと一致しています。 インスタンスがシステムによって再利用されると、ディスク上の対応するデータが消去されます。 ファイルを永続化するには、Apsara File Storage NAS (NAS) またはObject Storage Service (OSS) を使用できます。 詳細については、「NASファイルシステムの設定」および「OSSファイルシステムの設定」をご参照ください。
512 MB
実行タイムアウト期間
関数の実行タイムアウト時間を指定します。 デフォルトのタイムアウト時間は60秒で、最大値は86,400秒です。
60
インスタンスの同時実行
説明このパラメーターは、[Web関数] または [コンテナーイメージ] を選択して関数を作成する場合に必要です。
Function Computeは、インスタンスの同時実行機能をサポートしています。これにより、インスタンスは複数のリクエストを同時に処理できます。 Instance Concurrencyパラメーターは、関数インスタンスが同時に処理できるリクエストの最大数を指定します。 詳細については、「インスタンス同時実行の設定」をご参照ください。
20
タイムゾーン
関数のタイムゾーンを指定します。 関数のタイムゾーンを設定すると、環境変数TZが関数に自動的に追加されます。 値は、設定したタイムゾーンです。
UTC
関数の役割
関数のRAMロールを指定します。 Function Computeはこのロールを使用して、Alibaba Cloudリソースにアクセスするための一時的なAccessKeyペアを生成し、AccessKeyペアをコードに渡します。 詳細については、「他のAlibaba Cloudサービスへのアクセス権限付与」をご参照ください。
mytestrole
VPCへのアクセス
仮想プライベートクラウド (VPC) リソースへのアクセスを許可するかどうかを指定します。 詳細については、「ネットワーク設定の構成」をご参照ください。
課金されます
[VPC]
このパラメーターは、[VPCへのアクセス] パラメーターを [はい] に設定した場合に必要です。 VPCを作成するか、ドロップダウンリストからアクセスする既存のVPCのIDを選択します。
fc.auto.create.vpc.1632317 ****
vSwitch
vSwitchを指定します。 このパラメーターは、[VPCへのアクセス] を [はい] に設定した場合に必要です。 vSwitchを作成するか、ドロップダウンリストから既存のvSwitchのIDを選択します。
fc.auto.create.vswitch.vpc-bp1p8248 ****
[セキュリティグループ]
セキュリティグループを指定します。 このパラメーターは、[VPCへのアクセス] を [はい] に設定した場合に必要です。 セキュリティグループを作成するか、ドロップダウンリストから既存のセキュリティグループを選択します。
fc.auto.create.SecurityGroup.vsw-bp15ftbbbbd ****
デフォルトNICによるインターネットへのアクセス許可
デフォルトのネットワークインターフェースコントローラ (NIC) からインターネットへのアクセスを許可するかどうかを指定します。 [いいえ] を選択した場合、関数はfunction ComputeのデフォルトNICを介してインターネットにアクセスできません。
重要静的パブリックIPアドレスを使用する場合は、[デフォルトNICからインターネットへのアクセスを許可] を [いいえ] に設定する必要があります。 それ以外の場合、設定された静的パブリックIPアドレスは有効になりません。 詳細については、「静的パブリックIPアドレスの設定」をご参照ください。
課金されます
ロギング
ロギング機能を有効にするかどうかを指定します。 値の説明:
有効化: 関数実行ログは、コードデバッグ、障害分析、およびデータ分析のためにSimple Log Serviceに永続的に保存されます。
無効化: Simple Log Serviceを使用して機能実行ログを保存またはクエリすることはできません。
有効にする
[環境変数] セクションで、関数のランタイムの環境変数を設定します。 詳細については、「環境変数の設定」をご参照ください。
関数の作成後、[関数の詳細] ページに移動します。 [コード] タブでは、関数を変更、デプロイ、およびテストできます。
関数の更新: 関数の作成後、ビジネス要件に基づいて [設定] タブで設定を変更できます。
関数の削除: 関数が不要になった場合は、関数リストまたは関数の詳細ページで関数を削除することもできます。
インスタンスの同時実行性の設定
インスタンスの同時実行は、各関数インスタンスが同時に処理できる同時リクエストの最大数を指定します。 Function Computeのインスタンス同時実行機能を使用して、トラフィックピーク時のリソース使用量を効率的に管理し、コールドスタートの影響を軽減できます。 これにより、パフォーマンスの向上とコストの削減に役立ちます。
背景
Function Computeは、インスタンスの実行期間に基づいて課金されます。 例えば、3つの要求を同時に処理する必要がある。 各リクエストの処理は10秒続きます。 次の項目は、さまざまな同時実行値の実行期間を示します。
インスタンスの同時実行性が1に設定されている場合、各インスタンスは同時に1つのリクエストしか処理できません。 Function Computeは、3つのリクエストを処理する3つのインスタンスを作成します。 合計実行時間は30秒です。
インスタンスの同時実行性が10に設定されている場合、各インスタンスは10個のリクエストを同時に処理できます。 Function Computeは、3つのリクエストを処理するインスタンスを1つだけ作成します。 合計実行時間は10秒です。
デフォルトでは、関数のインスタンスの同時実行性は1です。これは、各インスタンスが同時に1つのリクエストのみを処理できることを示します。 インスタンスの同時実行性を1より大きい値に設定した場合、既存のインスタンスによって同時に処理されるリクエストの数が指定された値を超えた場合にのみ、Function Computeは新しいインスタンスを作成します。
次の図は、インスタンスの同時実行性が異なる値に設定されている場合のリクエスト実行の違いを示しています。
シナリオ
関数がダウンストリームサービスからの応答を待つのに時間がかかる場合は、インスタンスの同時実行機能を使用して、1つのインスタンスで複数のリクエストを同時に処理できるようにすることをお勧めします。 ほとんどの場合、応答を待ってもリソースは消費されません。 複数のリクエストを1つのインスタンスで同時に処理すると、コストが節約され、アプリケーションの応答性とスループットが向上します。
メリット
実行期間の短縮とコストの削減
たとえば、多数の入出力 (I/O) 操作を伴う関数の場合、1つのインスタンスを使用して複数のリクエストを同時に処理できます。 これにより、リクエストの処理に使用されるインスタンスの数が減り、リクエストの合計実行時間が短縮されます。
リクエスト間で共有可能なステータス
複数のリクエストで1つのインスタンス内のデータベースの接続プールを共有し、リクエストとデータベース間の接続を最小限に抑えることができます。
コールドスタートの頻度が低い
1つのインスタンスで複数のリクエストを処理できるため、新しいインスタンスの数が減り、コールドスタートの頻度が減ります。
VPCで使用されるIPアドレスが少ない
処理されるリクエストの数が固定されている場合、各インスタンスが複数のリクエストを処理できる場合、必要なインスタンスの数が削減されます。 これにより、VPCで使用されるIPアドレスの数が減ります。
重要VPCに関連付けられているvSwitchに、少なくとも2つの使用可能なIPアドレスがあることを確認します。 そうしないと、サービスが利用できなくなり、要求が実行されなくなります。
制限事項
項目 | 制限事項 |
サポートされるランタイム |
|
インスタンスの同時実行値 | 1から200 |
X-Fc-Log-Resultレスポンスヘッダーのログ | インスタンスの同時実行性が1より大きい値に設定されている場合はサポートされません |
手順
関数を作成または更新するときに、関数のインスタンスの同時実行性を指定できます。
[Web関数] を選択して関数を作成する場合、関数の作成時にインスタンスの同時実行性を設定できます。
プロビジョニングされたインスタンスは、複数のリクエストを同時に処理できます。 詳細は、「プロビジョニング済みインスタンスの設定」をご参照ください。
影響
このセクションでは、値が1 (インスタンスの同時実行性=1) のインスタンスの同時実行性と、値が1より大きい (インスタンスの同時実行性> 1) のインスタンスの同時実行性を比較します。
課金
実行期間は、インスタンスの同時実行値によって異なります。 その結果、コストは異なります。 詳細については、「課金の概要」をご参照ください。
concurrency = 1の単一のインスタンス
インスタンスは一度に1つのリクエストしか処理できません。 課金期間は、最初のリクエストの処理が開始されたときに開始され、最後のリクエストが処理されたときに終了します。
同時実行性> 1の単一インスタンス
インスタンスは一度に複数のリクエストを処理できます。 インスタンスの実際の実行時間は、関数の実行時間を測定するために使用されます。 課金期間は、最初のリクエストの処理が開始されたときに開始され、最後のリクエストが処理されたときに終了します。
同時実行スロットル
デフォルトでは、リージョン内のFunction Computeのオンデマンドインスタンスの最大数は300です。 リージョン内で同時に処理できるリクエストの最大数は、300 × インスタンスの同時実行性です。 たとえば、インスタンスの同時実行性を10に設定した場合、リージョン内で同時に最大3,000件の同時リクエストを処理できます。 同時リクエストの数がFunction Computeが処理できるリクエストの最大数を超えた場合、スロットリング制御エラーResourceExhaustedが報告されます。
リージョンのオンデマンドインスタンスの上限を引き上げるには、お問い合わせください。
ロギング
インスタンスの同時実行性が1に設定されている場合、関数を呼び出すときにHTTPリクエストヘッダーに
X-Fc-Log-Type: Tail
を指定すると、Function ComputeはX-Fc-Log-Result
レスポンスヘッダーで関数ログを返します。 インスタンスの同時実行性が1より大きい値に設定されている場合、同時リクエストの中で特定のリクエストのログを取得できないため、レスポンスヘッダーには関数ログが含まれません。Node.jsランタイムでは、従来、リクエストIDを含むログを返すために
console.info()
が使用されていました。 インスタンスの同時実行性が1より大きい値に設定されている場合、console.info()
はリクエストIDを期待どおりに出力できません。 すべてのリクエストIDはreq 2
として印刷されます。 サンプルログの例を次に示します。2019-11-06T14:23:37.587Z req1 [info] logger begin 2019-11-06T14:23:37.587Z req1 [info] ctxlogger begin 2019-11-06T14:23:37.587Z req2 [info] logger begin 2019-11-06T14:23:37.587Z req2 [info] ctxlogger begin 2019-11-06T14:23:40.587Z req1 [info] ctxlogger end 2019-11-06T14:23:40.587Z req2 [info] ctxlogger end 2019-11-06T14:23:37.587Z req2 [info] logger end 2019-11-06T14:23:37.587Z req2 [info] logger end
この場合、
context.logger.info()
を使用してログを印刷することを推奨します。 この方法では、リクエストIDを期待どおりに印刷できます。 次のサンプルコードは例を示しています。exports.handler = (event, context, callback) => { console.info('logger begin'); context.logger.info('ctxlogger begin'); setTimeout(function() { context.logger.info('ctxlogger end'); console.info('logger end'); callback(null, 'hello world'); }, 3000); };
エラー処理
インスタンスが複数のリクエストを同時に処理する場合、失敗したリクエストによる予期しないプロセス終了は、他の同時リクエストに影響します。 したがって、他のリクエストへの影響を防ぐために、関数コード内のリクエストレベルの例外をキャプチャするロジックをコンパイルする必要があります。 Node.jsのサンプルコードの例を次に示します。
exports.handler = (event, context, callback) => {
try {
JSON.parse(event);
} catch (ex) {
callback(ex);
}
callback(null, 'hello world');
};
共有変数
インスタンスが複数のリクエストを同時に処理する場合、複数のリクエストが同時に変数を変更しようとするとエラーが発生する可能性があります。 コードで相互排除を使用して、変更時に非スレッドセーフ変数を保護する必要があります。 次の例は、Javaのサンプルコードを示しています。
public class App implements StreamRequestHandler
{
private static int counter = 0;
@Override
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
synchronized (this) {
counter = counter + 1;
}
outputStream.write(new String("hello world").getBytes());
}
}
モニタリングメトリクス
インスタンスの同時実行性を1より大きい値に設定すると、インスタンスモニタリングチャートで使用済みインスタンスの数が減少していることがわかります。
追加情報
Function Computeでは、Function Computeコンソールに加えて、API操作を使用して関数を管理することもできます。 詳細については、「Function」をご参照ください。
関数のタイムアウト期間が経過した場合は、「関数の実行がタイムアウトし、エラー "function time out after" が報告された場合はどうすればよいですか? 」をご参照ください。
頻繁に使用されない関数の呼び出しに時間がかかる場合は、「あまり使用されない関数の呼び出しに時間がかかるのはなぜですか? 」をご参照ください。コールドスタートの影響を軽減するために、プロビジョニング済みインスタンスを使用できます。 詳細については、「コールドスタートの影響を排除するためにインスタンスを存続させる方法は? 」をご参照ください。
関数のARN (Alibaba Cloud Resource Name) を取得する方法の詳細については、「関数のARNの取得」をご参照ください。