イベント駆動タイプのファンクションから移行する
イベント駆動タイプのファンクションには、 エンドポイント トリガーがあります。このトリガーはHTTPタイプのファンクションと同様に、エンドポイントURLにHTTPリクエストを行うことでファンクションを実行できます。
HTTPタイプのファンクションはイベント駆動タイプのファンクションでエンドポイントトリガーを利用する場合に比べて、次の点で優れています。
- より高い安定性:HTTPタイプのファンクションはエンドポイントトリガーに比べて内部コンポーネントが少なくなっています。それによってファンクション実行基盤としての安定性が向上しています。
- レイテンシの改善:ファンクションを実行するまでの事前処理、実行後の処理を削減しているため、HTTPタイプのファンクションはエンドポイントトリガーに比べてレイテンシが低くなります。
HTTPリクエストでファンクションを実行する場合は、HTTPタイプのファンクションを利用することを推奨しています。以下では、既存のエンドポイントトリガーのファンクションをHTTPタイプのファンクションに移行する方法を説明します。
移行時の注意事項
イベント駆動タイプのファンクションをHTTPタイプに移行する際の作業内容を説明します。
入力 ( data ) を利用する処理を書き換える
イベント駆動タイプのファンクションは、以下ページに記載の情報を data として受け取ります。ファンクション内でこれらの値を利用している場合は、適宜書き換える必要があります。
kind を使う処理は不要
data.kind はトリガーの種類に相当する情報が入ります。イベント駆動タイプのファンクションでは、data.kind が特定の値の場合に後続の処理を行うような書き方をしていました。HTTPタイプのファンクションはHTTPリクエストでのみ実行できるため、data.kind を使った処理は不要となります。
重複排除のキーとしての id は不要
イベント駆動タイプのファンクションは「少なくとも1回」の実行となるため、重複実行を排除するためのキーとして data.id が利用できました。一方、HTTPタイプのファンクションは「1回のみ」の実行となるため、重複排除処理は不要です。
ただし、ログ等の目的でリクエストを一意に判別したい場合は、リクエスト情報をハッシュ化したりuuidを発行するなどして、一意なIDを生成してください。
timestamp は Date.now() に置き換える
HTTPタイプのファンクションには data.timestamp に相当する情報は含まれていません。ファンクションの実行タイミングを知りたい場合は、適宜 Date.now() でタイムスタンプを設定してください。
jsonPayload の値は req から取得する
data.jsonPayload の値は、次のように req オブジェクトから取得できます。
| data.jsonPayloadのフィールド | HTTPタイプのファンクションでのアクセス方法 | 
|---|---|
| jsonPayload.data.hook_data.body | req.body | 
| jsonPayload.data.hook_data.endpointSuffix | req.path.split('/').slice(-1)[0] | 
| jsonPayload.data.hook_data.ip | req.ip | 
| jsonPayload.data.hook_data.query | req.query | 
| jsonPayload.data.hook_data.headers | req.headers | 
レスポンス処理を書き換える
エンドポイントトリガーのファンクションでは、エントリポイントで return 文を使って値を返すことでレスポンスを実現していました。一方、HTTPタイプのファンクションでは res オブジェクトを使って明示的にレスポンスを行う必要があります。HTTPタイプのファンクションに移行するためには、return で返していた値を res のメソッドとして書き換える必要があります。書き換える際の具体的な例は 必ず res で明示的にレスポンスする を参照してください。
また、エンドポイントトリガーでは、次の 特別なレスポンス 用のフィールドを返り値に入れることで、ステータスコードやリダイレクトのlocationを設定していました。
- craft_status_code
- craft_redirect_url
HTTPタイプのファンクションでは res オブジェクトを使ってこれらのフィールドに相当するレスポンスが行えます。
- ステータスコードは res.status()で指定します。
- リダイレクトを行う場合は res.redirect()でリダイレクト先を指定します。
オリジン間リソース共有(CORS)に対応する
エンドポイントトリガーのファンクションでは、CORS設定として、送信元のオリジンを自動で許可する設定をしていました(オリジン間リソース共有 (CORS) への対応状況)。HTTPタイプのファンクションでは、コード上で柔軟にCORSが設定できます。詳細はCORSへの対応を参照してください。
非同期的な処理を行う際はイベント駆動タイプのファンクションを craftFunctions モジュール経由で起動する
HTTPタイプのファンクションでは、受け取ったリクエストごとに同期的にレスポンスを返却してください。レスポンス後にバックグラウンド処理を実行する場合は、イベント駆動タイプのファンクションを新たに作成し、HTTPタイプのファンクションから craftFunctions モジュール経由で起動します(Craft Functionsから実行する)。こうすることで、HTTPタイプのファンクションは同期的にレスポンスを行いつつ、バックグラウンド処理を非同期に実行できます。
移行 Copilot を使用する
旧エンドポイントを使用しているファンクションの移行作業を支援するため、Craftでは移行Copilot機能を提供しています。この機能を利用することで、上記で説明した移行プロセスをよりスムーズに進めることができます。
移行Copilotを使用するには、まずイベント駆動タイプのファンクションの設定タブを開きます。エンドポイントセクションにある「移行」ボタンをクリックすると、移行Copilotが起動します。Copilotは、コードの書き換えに関するアドバイスと、HTTPタイプに移行後のコード案を生成します。
Copilotとの対話中に表示される「HTTPタイプへ移行する」ボタンをクリックすると、生成されたコードが新規ファンクションの作成画面に自動的にコピーされます。
 
 