Azure Functions Node.js v4モデル移行の変更点|影響範囲・設定・料金・期限を解説

Azure Functions の「Migrate to v4 of the Node.js model for Azure Functions」は、Node.js で作った Function App を v3 の function.json 中心の書き方から、v4 のコード中心の書き方へ移行するための変更です。単に Azure ポータルで Node.js のバージョンを切り替える作業ではありません。影響するのは、JavaScript または TypeScript の Azure Functions で、@azure/functions v3 系、または function.json でトリガーやバインドを定義しているアプリです。

特に注意すべき点は、同じ Function App の中で v3 と v4 の Node.js プログラミングモデルを混在できないことです。v4 の関数を1つでも登録すると、function.json で登録された v3 関数が無視されるため、部分移行のつもりが一部の関数だけ動かない、という事故につながります。公式ドキュメントでも、v4 は @azure/functions npm パッケージのバージョンと結び付いており、Azure Functions ランタイム v4 とは別物として扱う必要があると説明されています。(Microsoft Learn)

目次

Azure の Migrate to v4 of the Node.js model for Azure Functions とは

「Migrate to v4 of the Node.js model for Azure Functions」は、Azure Functions の Node.js プログラミングモデルを v3 から v4 に移行するための公式ガイドです。

ここでいう v4 は、Azure Functions ランタイム v4 ではなく、Node.js 向けのプログラミングモデル v4 を指します。名前が似ているため混同しやすいですが、意味は異なります。

項目意味確認する場所
Azure Functions ランタイム v4Functions ホスト全体の実行基盤Azure ポータル、FUNCTIONS_EXTENSION_VERSION
Node.js プログラミングモデル v4JavaScript / TypeScript で関数を書くためのモデルpackage.json@azure/functions
Node.js バージョン実行する Node.js の言語ランタイムWindows は WEBSITE_NODE_DEFAULT_VERSION、Linux は linuxFxVersion

v4 の大きな狙いは、Node.js 開発者にとって自然な書き方に近づけることです。具体的には、ファイル構成を柔軟にし、トリガーやバインドの設定を function.json ではなくコード内で定義できるようにします。(Microsoft Learn)

誰に影響するのか

影響を受けるのは、Azure Functions で Node.js、JavaScript、TypeScript を使っている開発者・管理者です。すべての Azure 利用者に影響する変更ではありません。

利用状況影響対応の優先度
Node.js の Azure Functions を新規作成するv4 モデルで始めるのが自然
既存アプリが function.json を使っているコードの移行が必要
@azure/functions が v3 系または未記載依存関係とコードの確認が必要
TypeScript で ContextAzureFunction 型を使っている型エラーや書き換えが発生しやすい
C#、Java、Python、PowerShell の Functionsこの Node.js v4 モデル移行の直接対象外
Azure Functions ランタイムだけを v4 にしているNode.js モデル v4 移行とは別問題要確認

管理者目線では、「Node.js のサポート期限が近いから Azure ポータルで Node.js バージョンだけ上げる」という対応だけでは不十分な場合があります。Node.js プログラミングモデルのバージョンは @azure/functions パッケージと結び付いており、v4 ではコード構造そのものが変わるためです。(Microsoft Learn)

v3 から v4 で変わる主なポイント

Azure Functions Node.js v4 モデルの変更は、見た目以上に実装へ影響します。特に、function.json、ハンドラー引数、context、HTTP リクエスト・レスポンスの扱いは必ず確認してください。

変更点v3 の考え方v4 の考え方
関数定義function.json でトリガーやバインドを定義app.http()app.timer() などでコード内に定義
ファイル構成関数ごとの固定的な構成になりやすいpackage.jsonmain で柔軟に指定
npm パッケージ@azure/functions は主に型定義用途実行時にも必要な主要パッケージ
ハンドラー引数(context, req) の順序が一般的(request, context) の順序
入力の取得context.reqcontext.bindings も使えたトリガー入力は第1引数で受け取る
出力の設定context.rescontext.bindings に設定戻り値として返す
HTTP 型Azure Functions 独自色が強いfetch 標準に近い API
ログcontext.log.error() などcontext.error()context.warn() など

公式ドキュメントでは、v4 では function.json を維持する必要がなくなり、TypeScript または JavaScript ファイル内で関数を直接定義できると説明されています。HTTP トリガーなら app.http()、タイマートリガーなら app.timer() のように、トリガー種別に応じたメソッドで登録します。(Microsoft Learn)

移行前に確認すべきバージョン要件

v4 へ移行する前に、アプリ、ローカル環境、Azure 側のバージョンをそろえる必要があります。コードだけを書き換えても、Node.js や Functions Runtime が古いと正常に動作しない可能性があります。

確認項目v4 の主な要件確認方法の例
@azure/functionsv4.0.0 以上package.jsonnpm list @azure/functions
Node.jsv18 以上node -v、Azure の構成
Azure Functions Runtimev4.25 以上Azure ポータルの Function runtime settings
Azure Functions Core Toolsv4.0.5382 以上func --version
TypeScriptv4 以上package.jsonnpx tsc -v

公式ドキュメントでは、Node.js プログラミングモデル v4 の最小要件として、@azure/functions v4.0.0、Node.js v18 以上、Azure Functions Runtime v4.25 以上、ローカル実行時は Azure Functions Core Tools v4.0.5382 以上が示されています。TypeScript を使う場合は TypeScript v4 以上も確認対象です。(Microsoft Learn)

まず確認すべきファイル

移行対象かどうかを判断するには、最初に次のファイルを見ます。

package.json
host.json
local.settings.json
各関数フォルダーの function.json
各関数の index.js / index.ts
tsconfig.json

特に package.json@azure/functionsmain、各関数フォルダーの function.json の有無が重要です。

v3 でよくある構成

MyFunctionApp
├─ HttpTrigger1
│  ├─ function.json
│  └─ index.ts
├─ TimerTrigger1
│  ├─ function.json
│  └─ index.ts
├─ host.json
├─ package.json
└─ tsconfig.json

v4 で考えやすい構成

MyFunctionApp
├─ src
│  └─ functions
│     ├─ httpTrigger1.ts
│     └─ timerTrigger1.ts
├─ host.json
├─ package.json
└─ tsconfig.json

v4 では、アプリのルートに必要なファイルは基本的に host.jsonpackage.json です。どのファイルを読み込むかは package.jsonmain フィールドで指定します。(Microsoft Learn)

package.json で見るべき変更点

v4 では、@azure/functionsdependencies に含める必要があります。devDependencies に入っているだけでは、本番実行時に不足する可能性があります。

{
  "main": "dist/src/functions/*.js",
  "dependencies": {
    "@azure/functions": "^4.0.0"
  },
  "devDependencies": {
    "typescript": "^5.0.0"
  }
}

JavaScript の場合は、出力先に合わせて次のように指定できます。

{
  "main": "src/functions/*.js",
  "dependencies": {
    "@azure/functions": "^4.0.0"
  }
}

TypeScript の場合は、実行されるのはコンパイル後の JavaScript です。そのため、main には src/**/*.ts ではなく、dist/**/*.js のようにビルド後のパスを指定します。

よくある失敗は、main を追加し忘れて「ローカルではファイルがあるのに関数が検出されない」状態になることです。v4 移行では、@azure/functions の更新と main の設定をセットで確認してください。

function.json はコード定義へ移す

v3 では、HTTP トリガーの設定は function.json に書くのが一般的でした。

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": ["get", "post"]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    }
  ]
}

v4 では、これをコードに移します。

import { app, HttpRequest, HttpResponseInit, InvocationContext } from '@azure/functions';

export async function httpTrigger1(
  request: HttpRequest,
  context: InvocationContext
): Promise<HttpResponseInit> {
  context.log(`Request URL: ${request.url}`);

  const name = request.query.get('name') || (await request.text()) || 'world';

  return {
    status: 200,
    body: `Hello, ${name}`
  };
}

app.http('httpTrigger1', {
  methods: ['GET', 'POST'],
  authLevel: 'anonymous',
  handler: httpTrigger1
});

ポイントは、トリガーや認証レベル、HTTP メソッドを app.http() のオプションで定義することです。function.json を残したままにすると、チーム内で「どちらが正なのか」が分かりにくくなります。移行後は、不要になった function.json を削除する方が保守しやすくなります。

ハンドラー引数は順序が変わる

v3 では、次のような書き方が多く使われていました。

const httpTrigger = async function (context, req): Promise<void> {
  const name = req.query.name || req.body || 'world';

  context.res = {
    body: `Hello, ${name}`
  };
};

v4 では、トリガー入力が第1引数、context が第2引数になります。

export async function httpTrigger1(request, context) {
  const name = request.query.get('name') || (await request.text()) || 'world';

  return {
    body: `Hello, ${name}`
  };
}

context を使わない処理なら、次のように省略することもできます。

export async function httpTrigger1(request) {
  return {
    body: 'Hello'
  };
}

この変更は単なる見た目の違いではありません。(context, req) のまま v4 に移すと、リクエストを context として扱ってしまい、実行時エラーや型エラーの原因になります。

context.res ではなく return で返す

v4 では、HTTP レスポンスなどのプライマリ出力は戻り値として返します。v3 のように context.res に代入する書き方を残すと、意図したレスポンスにならない可能性があります。

v3 の例

context.res = {
  status: 200,
  body: {
    message: 'ok'
  }
};

v4 の例

return {
  status: 200,
  jsonBody: {
    message: 'ok'
  }
};

JSON を返す場合は、body にオブジェクトを入れるよりも jsonBody を使う方が分かりやすく、Content-Type の扱いも整理しやすくなります。公式ドキュメントでも、v4 ではプライマリ出力を戻り値で設定する方法が示されています。(Microsoft Learn)

HTTP リクエストの扱いも変わる

v4 の HTTP 要求・応答型は fetch 標準に近い形になっています。v3 の感覚で req.query.namereq.body に直接アクセスしているコードは、移行時に見直しが必要です。

目的v3 でよくある書き方v4 の書き方
クエリ文字列を読むreq.query.namerequest.query.get('name')
ヘッダーを読むreq.headers['content-type']request.headers.get('content-type')
テキスト本文を読むreq.bodyawait request.text()
JSON 本文を読むreq.bodyawait request.json()
レスポンス本文を返すcontext.res = { body: ... }return { body: ... }
JSON を返すcontext.res = { body: object }return { jsonBody: object }

移行で見落としやすいのは、本文の読み取りです。request.text()request.json()request.formData() のどれで読むかを、API の仕様に合わせて明確に決めてください。v4 では HTTP 型の使い方が変わるため、TypeScript を使っている場合はビルドエラーを移行漏れの検出に活用できます。(Microsoft Learn)

ログ出力の書き方も確認する

v4 では context オブジェクトが整理されています。ログ出力では、次のような違いがあります。

// v3 で見かける書き方
context.log.error('error');
context.log.warn('warning');
// v4 の書き方
context.error('error');
context.warn('warning');
context.log('info');

ログは移行後のトラブルシューティングで最初に見る場所です。関数本体だけでなく、共通エラーハンドラーやユーティリティ関数に古いログ API が残っていないかも確認してください。

移行手順の実務フロー

本番環境の Function App をいきなり書き換えるのではなく、次の順序で進めると安全です。

手順作業確認ポイント
1対象アプリを棚卸しするNode.js、function.json@azure/functions の有無
2ブランチまたは検証環境を作る本番アプリを直接変更しない
3@azure/functions を v4 系へ更新dependencies に入っているか
4package.jsonmain を設定TypeScript は dist 側を見る
5function.json の内容をコードへ移すapp.http()app.timer() など
6ハンドラー引数と context の使い方を修正(request, context)、戻り値で出力
7HTTP リクエスト・レスポンス処理を修正query.get()jsonBody など
8ローカルでビルド・実行npm run buildfunc start
9ステージングへデプロイApp Settings、接続文字列、監視を確認
10本番切り替えスロットスワップやメンテナンス時間帯を使う

重要なのは、1つの Function App 内では全関数をまとめて v4 モデルにそろえることです。関数単位で少しずつ移行したい場合は、Function App 自体を分ける、ステージングスロットでまとめて検証する、などの方法を検討してください。

短時間で移行漏れを探すチェック方法

コードベースが大きい場合は、まず古い書き方を検索します。

macOS / Linux / WSL の例

grep -R "context.req\|context.res\|context.bindings\|context.done\|function.json" .

PowerShell の例

Get-ChildItem -Recurse -Include *.js,*.ts,function.json |
  Select-String "context\.req|context\.res|context\.bindings|context\.done"

次の文字列が見つかった場合は、v4 移行時に優先して確認してください。

context.req
context.res
context.bindings
context.done
req.query
req.body
context.log.error
context.log.warn
function.json
AzureFunction
Context

TypeScript プロジェクトでは、型エラーを「壊れた」のサインではなく「移行漏れを見つける仕組み」として使うのが効果的です。ContextAzureFunction など v3 前提の型を使っている場所を、InvocationContextHttpRequestHttpResponseInit などへ置き換えていきます。

Azure ポータルや CLI で確認すべき設定

Node.js v4 モデルへの移行では、コードと Azure 側の設定を分けて確認します。

確認項目Windows の主な確認先Linux の主な確認先
Node.js バージョンWEBSITE_NODE_DEFAULT_VERSIONlinuxFxVersion
Functions RuntimeFUNCTIONS_EXTENSION_VERSIONFUNCTIONS_EXTENSION_VERSION
Worker runtimeFUNCTIONS_WORKER_RUNTIME=nodeFUNCTIONS_WORKER_RUNTIME=node
App SettingsAzure ポータルの構成Azure ポータルまたは CLI
デプロイスロットProduction / StagingProduction / Staging

Azure Functions の Node.js バージョン更新は、Windows では WEBSITE_NODE_DEFAULT_VERSION、Linux では linuxFxVersion によって管理されます。Linux Consumption プランでは、Azure ポータルから Node.js バージョンを変更できないケースがあり、その場合は Azure CLI を使います。(Microsoft Learn)

Windows の例です。

az functionapp config appsettings set \
  --name "<FUNCTION_APP_NAME>" \
  --resource-group "<RESOURCE_GROUP_NAME>" \
  --settings WEBSITE_NODE_DEFAULT_VERSION=~22

Linux の例です。

az functionapp config set \
  --name "<FUNCTION_APP_NAME>" \
  --resource-group "<RESOURCE_GROUP_NAME>" \
  --linux-fx-version "node|22"

実際に指定できるバージョンは、リージョン、OS、プラン、提供時期によって変わる可能性があります。更新前に、次のコマンドでサポートされている値を確認してから変更してください。

az functionapp list-runtimes --os linux --query "[?runtime == 'node'].{Version:version, linuxFxVersion:linux_fx_version}" --output table

料金はどう変わるのか

Node.js プログラミングモデル v4 へ移行すること自体に、専用の追加料金が発生するわけではありません。ただし、移行と同時にホスティングプラン、Node.js バージョン、インスタンス設定、Always Ready、監視設定などを変更すると、結果として料金が変わることがあります。

Azure Functions の料金確認では、次の項目を見ます。

確認項目料金に影響する理由
ホスティングプランConsumption、Flex Consumption、Premium、Dedicated で課金モデルが異なる
実行回数サーバーレス系プランでは実行回数がコストに関係する
実行時間処理が長くなるほどコストが増えやすい
メモリ使用量Consumption 系ではメモリと実行時間の組み合わせが重要
Always Ready / 事前ウォーム待機インスタンス分のコストが発生する場合がある
Application Insightsログ・テレメトリ量が増えると監視コストが増える場合がある

Consumption プランでは、実行回数、実行時間、メモリ使用量をもとに課金が決まります。Flex Consumption では、実行中のインスタンスのメモリや Always Ready インスタンスなども確認対象です。(Microsoft Learn)

移行後にコストが増えた場合は、v4 そのものよりも、次の変化を疑ってください。

  • Node.js バージョン変更後に処理時間が伸びていないか
  • 依存パッケージが増えてコールドスタートが悪化していないか
  • ログ出力量が増えて Application Insights の取り込み量が増えていないか
  • Flex Consumption や Premium へ移行して Always Ready / 事前ウォームを有効にしていないか
  • リトライや失敗が増えて実行回数が増えていないか

期限・サポートで確認すべきこと

「v4 にいつまでに移行すべきか」は、単一の期限だけで判断しない方が安全です。Node.js のサポート期限、Azure Functions ランタイムのサポート、利用しているホスティングプランの方針を分けて確認します。

2026年6月時点の公式情報では、Azure Functions の Node.js 24 は GA で、想定サポート終了日は 2028年4月30日、Node.js 22 は GA で、想定サポート終了日は 2027年4月30日とされています。また、Linux Consumption プランでは Node.js 22 が最後の対応 Node.js バージョンであり、それより新しい Node.js バージョンは追加されないとされています。(Microsoft Learn)

見るべき期限何を意味するか実務上の対応
Node.js のサポート期限言語ランタイムの更新・セキュリティ対応に関係Node.js 22 / 24 などサポート中の版へ移行
Functions Runtime のサポートFunction App の実行基盤に関係FUNCTIONS_EXTENSION_VERSION を確認
Linux Consumption の方針新しい言語バージョンの利用可否に関係必要なら Flex Consumption などを検討
npm パッケージの互換性アプリのビルド・実行に関係package-lock.json も含めて検証
Azure SDK の対応 Node.jsSDK 更新時の警告やインストール失敗に関係SDK と Node.js の両方を確認

期限対応では、「Node.js だけを上げる」「Functions Runtime だけを上げる」「@azure/functions だけを上げる」を別々の作業として扱うと漏れが出やすくなります。実務では、Node.js バージョン、@azure/functions、Functions Runtime、ホスティングプランを1枚の棚卸し表にまとめてから、優先度を付けるのがおすすめです。

よくある失敗と対処法

失敗しやすいポイント起きること対処法
v3 と v4 を同じ Function App で混在させるv3 の function.json 関数が無視されるFunction App 単位で移行計画を立てる
@azure/functionsdevDependencies に入れたままにする本番実行時にモジュール不足になるdependencies に移す
main を設定し忘れる関数が検出されないビルド後の JS パスを main に指定
TypeScript の mainsrc/*.ts を見ているAzure 上で読み込めないdist/**/*.js を指定
context.res を残すレスポンスが返らない、型エラーになるreturn { ... } に変更
req.query.name を残すクエリが取れないrequest.query.get('name') に変更
context.log.error() を残すログ出力でエラーになる可能性context.error() に変更
Node.js バージョンだけ上げるコードの v4 化が進まないpackage とコードも確認
本番で直接更新する再起動や失敗時の影響が大きいステージングスロットや検証環境を使う

特に本番 API として使っている HTTP トリガーでは、移行後にステータスコード、レスポンスヘッダー、JSON 形式が変わっていないかを確認してください。内部処理が動いていても、クライアント側から見るとレスポンス形式の微妙な違いが障害になることがあります。

管理者向けの確認チェックリスト

開発者ではなく Azure 管理者として確認する場合は、次の観点で棚卸しすると判断しやすくなります。

  • 対象サブスクリプション内に Node.js の Function App があるか
  • Runtime stack が Node.js の Function App を一覧化したか
  • Windows / Linux、Consumption / Flex Consumption / Premium / Dedicated を確認したか
  • Node.js 18、20 など古いバージョンが残っていないか
  • FUNCTIONS_EXTENSION_VERSION~4
  • Linux Consumption を使っているアプリがないか
  • package.json@azure/functions バージョンを開発チームに確認したか
  • ステージングスロットまたは検証環境があるか
  • Application Insights で移行前後のエラー率・実行時間・失敗回数を比較できるか
  • 移行後のロールバック手順が決まっているか

管理者だけでは package.json やソースコードの中身を判断できないことがあります。その場合は、開発チームへ「Node.js バージョン」ではなく、「Node.js プログラミングモデル v3 / v4 のどちらか」を確認するのが重要です。

開発者向けの移行チェックリスト

開発者は、次の順番で作業すると漏れを減らせます。

  • @azure/functions を v4 系に更新する
  • @azure/functionsdependencies にあることを確認する
  • package.jsonmain を追加する
  • function.json の定義を app.http() などへ移す
  • (context, req)(request, context) に変更する
  • context.reqcontext.rescontext.bindings を置き換える
  • HTTP の queryheadersbody の読み方を修正する
  • JSON レスポンスは jsonBody を検討する
  • TypeScript の型を InvocationContextHttpRequestHttpResponseInit へ見直す
  • npm run buildfunc start でローカル検証する
  • Azure 上のステージング環境で実際のトリガーを動かす
  • Application Insights で例外と失敗率を確認する

v4 移行は「npm パッケージを上げれば終わり」ではありません。トリガー定義、入出力、HTTP API、型、デプロイ設定まで含めた小さなリファクタリングとして扱う方が安全です。

移行の判断基準

すぐに v4 移行へ進めるべきケースは、次のようなアプリです。

状況判断
Node.js 22 / 24 への更新を予定しているv4 モデルへの移行も同時に計画する
function.json が多数ある早めに棚卸しして移行工数を見積もる
TypeScript の型エラーが多く出そう小さな Function App から検証する
API として外部公開しているステージングとリグレッションテストを必ず用意する
Linux Consumption を使っているNode.js バージョンとプラン方針を早めに確認する
Durable Functions を使っている一般の v4 移行に加えて Durable Functions 固有の移行も確認する

逆に、Node.js を使っていない Function App や、すでに @azure/functions v4 系でコード定義に移行済みのアプリは、今回の変更による直接的な修正は少ない可能性があります。ただし、Node.js のサポート期限や Azure Functions のホスティングプラン方針は別途確認してください。

まとめ:v4 移行は「設定変更」ではなく「コード移行」として扱う

Azure Functions の「Migrate to v4 of the Node.js model for Azure Functions」は、Node.js アプリの書き方を v4 モデルへ移すための重要な変更です。最大のポイントは、function.json からコード中心の定義へ移り、@azure/functionspackage.jsonmain、ハンドラー引数、context、HTTP 入出力の扱いを見直すことです。

最初にやるべきことは、対象の Function App が Node.js かどうか、function.json を使っているか、@azure/functions が何版かを確認することです。そのうえで、ステージング環境を用意し、1つの Function App 内の関数をまとめて v4 モデルにそろえてから本番へ反映してください。

Node.js のサポート期限や Linux Consumption の制約も絡むため、開発者だけでなく Azure 管理者も一緒に、コード・設定・料金・期限を同時に確認するのが安全です。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次