ファンクションの呼出し

OCI Functionsにデプロイされたファンクションを呼び出す様々な方法をご覧ください。

OCIファンクションにデプロイしたファンクションは、様々な方法で呼び出すことができます:

  • Fn ProjectのCLIを使用する。
  • Oracle Cloud InfrastructureのCLIを使用する。
  • Oracle Cloud Infrastructure SDKを使用する。
  • ファンクションの呼出しエンドポイントに対して署名付きHTTPリクエストを発行する。すべてのファンクションに呼出しエンドポイントがあります。

前述の各ファンクションは、APIへのリクエストを介してファンクションを呼び出します。APIへのリクエストは、ファンクションが属しているコンパートメントの署名およびOCIDをリクエスト・ヘッダーに含めることによって認証される必要があります。このようなリクエストは、「署名済」リクエストと呼ばれます。署名には、暗号化された形式のOracle Cloud Infrastructure資格証明が含まれます。

Fn ProjectのCLIまたはOracle Cloud InfrastructureのCLIを使用してファンクションを呼び出す場合は、認証が自動的に処理されます。Fn ProjectのCLIを使用したファンクションの呼出しおよびOracle Cloud InfrastructureのCLIを使用したファンクションの呼出しを参照してください。

Oracle Cloud Infrastructure SDKを使用してファンクションを呼び出す場合、SDKを使用して認証を処理できます。SDKを使用したファンクションの呼び出しを参照してください。

ファンクションの呼出しエンドポイントに対して署名付きHTTPリクエストを行う場合は、ファンクションが属するコンパートメントの署名およびOCIDをリクエスト・ヘッダーに含めて、自分で認証を処理する必要があります。これは、様々な方法で実行できます:

ファンクションの起動方法と、指定した起動タイプによって、ファンクションを実行できる最大時間およびその他の実行動作が決まります。

ヒント

このトピックのいずれかのステップを正常に完了できない場合は、一般的な問題の解決策を確認してください(OCI関数のトラブルシューティングを参照)。

同期およびデタッチされた起動タイプ

ファンクションを呼び出すときに、ファンクション呼出しのタイプを指定できます。関数呼び出しタイプは、次のように、結果処理の責任、制御が呼び出し元に返された場合、および返されるHTTPステータスコードを決定します。

  • 同期:関数起動タイプ(デフォルト)としてSyncを指定した場合、OCI関数はリクエストを同期して実行します。正常に完了すると、OCI FunctionsはHTTP 200ステータス・コードを発行し、制御とともにコール元に結果を返します。
  • デタッチ済:関数起動タイプとして「デタッチ済」を指定した場合、OCI関数はリクエストを非同期で実行します。処理が開始されるとすぐに、OCI FunctionsはHTTP 202ステータス・コードを発行し、コール元に制御を返します。関数自体が結果の処理を担当します。

関数呼び出しタイプとしてSyncを指定することは、同期モードでの関数の呼び出し、または同期呼び出しとも呼ばれます。関数の起動タイプとして「デタッチ」を指定することは、デタッチ・モードでの関数の起動、またはデタッチされた起動とも呼ばれます。

デタッチされた呼出しは、実行に長い時間がかかるファンクションの同期呼出しよりも優れている場合があります。デタッチされた呼出しは、より長い実行タイムアウトをサポートし、実行後の配信先の追加の構成オプションもサポートするためです(デタッチされたモードでのファンクションの起動を参照)。デタッチされた起動の利点は、通常、繰返しスケジュールで実行するようにスケジュールする関数に非常に役立ちます。したがって、スケジュールする関数は、常に起動タイプとして「連結解除」を使用して起動されます(「スケジューリング関数」を参照)。

ファンクション呼出しタイプを指定するには:

  • OCI CLIのfn function invokeコマンドを使用してファンクションを呼び出す場合は、--fn-invoke-typeパラメータを使用します。例:
    oci fn function invoke --function-id ocid1.fnfunc.oc1.phx.aaaa____uxoa --file "-" --body "" --fn-invoke-type "detached"
  • FDKのいずれかを使用して別のファンクションからファンクションを呼び出す場合は、ファンクション・コールで起動タイプを指定します。たとえば、Python FDKを使用する場合:
    resp = client.invoke_function(function_id=function_ocid, invoke_function_body=function_body, fn_invoke_type='detached')
  • OCI CLIのraw-requestコマンドを使用してファンクションを呼び出す場合は、--request- headersパラメータに"fn-invoke-type"を含めます。例:
    oci raw-request --http-method POST --target-uri https://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com/20181201/functions/ocid1.fnfunc.oc1.phx.aaaa____uxoa/actions/invoke --request-body ""  --request-headers '{"fn-invoke-type" : "detached"}'

ファンクション・タイムアウト、ファンクション起動タイムアウトおよびファンクション実行タイムアウト

関数のタイムアウトは、次のようにより正確に定義できます。

  • ファンクション呼出しタイムアウト: ファンクションを呼び出すクライアントがファンクションからのレスポンスを待機してから終了する時間の長さを示します。
  • ファンクション実行タイムアウト: 実行を終了する前に、OCIファンクションがファンクションを実行できる時間の長さを表します。

呼出しタイプとしてSyncを使用するファンクションを呼び出すと、ファンクション呼出しタイムアウトとファンクション実行タイムアウトは実質的に同じになります。ただし、起動タイプとして「デタッチ」を使用してファンクションを起動すると、「デタッチされた起動タイムアウト」(detachedModeTimeoutInSeconds)パラメータによってファンクション実行タイムアウトが制御され、ファンクション起動タイムアウトとは別になります。

関数を呼び出す方法と、指定した起動タイプによって、関数を実行できる最大時間が次のように決定されます。

  • Fn Project CLIを使用して(Syncを呼出しタイプとして使用して)ファンクションを起動する場合、ファンクション定義で指定する同期呼出しタイムアウト(timeoutInSeconds)パラメータが適用されます(デフォルトは30秒)。「デフォルトのメモリーおよびタイムアウト設定の変更」を参照してください。
  • Oracle Cloud Infrastructure CLIを使用してファンクションを起動する場合(起動タイプとしてSyncを使用)、OCI CLI --read-timeoutグローバル・パラメータの値が適用されます(デフォルトは60秒)。「oci fn function invoke」を参照してください。
  • Oracle Cloud Infrastructure SDKsを使用して(起動タイプとしてSyncを使用して)ファンクションを起動すると、クライアントに指定された読取りタイムアウトが適用されます。たとえば、Java SDKおよびPython SDKのドキュメントを参照してください。
  • PL/SQL SDKを使用してファンクションを起動すると、UTL_HTTP.set_transfer_timeoutの値が適用されます(デフォルトは60秒)。
  • DBMS_CLOUD.SEND_REQUESTを使用してDBMS_CLOUD REST APIからファンクションを呼び出すと、UTL_HTTP.set_transfer_timeoutの値が適用されます(デフォルトは60秒)。
  • 呼出しタイプとして「デタッチ」を使用して関数を呼び出すと、関数定義で指定するデタッチされた呼出しタイムアウト(detachedModeTimeoutInSeconds)パラメータが適用されます(5秒から3600秒、つまり1時間)。呼出しタイプとして「デタッチ」を使用してファンクションを起動し、「デタッチされた呼出しタイムアウト」(detachedModeTimeoutInSeconds)パラメータが設定されていない場合は、「同期呼出しタイムアウト」(timeoutInSeconds)パラメータの値が適用されます。「デタッチ・モードでのファンクションの呼出し」を参照してください。

Fn ProjectのCLIを使用したファンクションの呼出し

Fn ProjectのCLIを使用してOCI Functionsにデプロイされたファンクションを呼び出すには:

  1. ファンクション開発者として開発環境にログインします。

  2. ターミナル・ウィンドウで入力します:

    fn invoke <app-name> <function-name>

    ここでは:

    • <app-name>は、呼び出すファンクションを含むアプリケーションの名前です
    • <function-name>は呼び出す必要があるファンクションの名前です

    例:

    fn invoke helloworld-app helloworld-func

    出力:

    Hello World !
    ヒント

    引数と値をファンクションに渡す場合は、fn invokeコマンドにecho -n '<argument>=<value>'|を接頭辞として付加します

    ファンクションで引数と値がJSONと予想される場合は、有効なJSON形式を使用します。例:

    echo -n '{"name":"John"}' | fn invoke helloworld-app helloworld-func

    出力:

    Hello John !

Oracle Cloud InfrastructureのCLIを使用したファンクションの呼出し

Oracle Cloud Infrastructure CLIをインストールした場合、これを使用してファンクションを呼び出すAPIリクエストを送信できます。特に、Oracle Cloud InfrastructureのCLIを使用するとOracle Cloud Infrastructure認証が容易になります。Oracle Cloud Infrastructure CLIの使用方法の詳細は、コマンドライン・インタフェース(CLI)を参照してください。

これらの手順では、次のことを前提にしています:

  • Oracle Cloud Infrastructure CLIをすでにインストールおよび構成している
  • 開発環境用に構成されたファンクション開発者としてファンクションを呼び出す場合

Oracle Cloud Infrastructure CLIを使用してファンクションを呼び出すには:

  1. ファンクション開発者として開発環境にログインします。

  2. ターミナル・ウィンドウで入力します:

    oci fn function invoke --function-id <function-ocid> --file "<output-filepath>" --body "<request-parameters>"

    ここでは:

    • <function-ocid>は、呼び出すファンクションのOCIDです。ファンクションのOCIDを調べるには、fn inspectコマンドを使用してファンクションのidプロパティの値を参照します(ファンクションのリストを参照)。
    • <output-filepath>は、レスポンスを書き込むファイルのパスと名前です。レスポンスをstdoutに書き込むには、--file "-"を指定します
    • <request-parameters>は、オプションでファンクションに渡す引数と値を指定します。ファンクションで引数と値がJSONと予想される場合は、有効なJSON形式を使用します。たとえば、--body '{"name":"John"}'です。渡すリクエスト・パラメータがない場合でも、リクエストに--body ""を含める必要があります。

    例:

    • oci fn function invoke --function-id ocid1.fnfunc.oc1.phx.aaaa____uxoa --file "-" --body ""

      出力:

      Hello World !
    • oci fn function invoke --function-id ocid1.fnfunc.oc1.phx.aaaa____uxoa --file "-" --body '{"name":"John"}'

      出力:

      Hello John !

ファンクションを呼び出すためのSDKの使用

Oracle Cloud Infrastructure SDKが存在する言語でファンクションを呼び出すプログラムを作成する場合は、そのSDKを使用してファンクションを呼び出すAPIリクエストを送信することをお薦めします。特に、SDKを使用するとOracle Cloud Infrastructure認証が容易になります。

SDKを使用してファンクションを呼び出す場合、Oracle Cloud Infrastructure CLIのraw-requestコマンドの使用時に指定する呼出しエンドポイント全体は指定しません(ファンクションの呼出しエンドポイントの取得を参照)。かわりに、ファンクションの呼出しエンドポイントの最初の部分のみを指定します。たとえば、SDKを使用する場合は、ファンクションの呼出しエンドポイントをhttps://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com/20181201/functions/ocid1.fnfunc.oc1.phx.aaaa____uxoa/actions/invokeとして指定しないでください。かわりに、ファンクションの呼出しエンドポイントをhttps://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.comとして指定します。

APIの使用およびリクエストの署名の詳細は、REST APIのドキュメントおよびセキュリティ資格証明を参照してください。SDKの詳細は、SDKおよびCLIを参照してください。

InvokeFunction API操作を使用してファンクションを呼び出します。

ファンクションの呼出しエンドポイントの取得

Oracle Cloud Infrastructure CLIのraw-requestコマンドを使用してファンクションを呼び出す場合、ファンクションの呼出しエンドポイントを指定する必要があります。

ファンクションの呼出しエンドポイントを取得するには:

  1. ファンクション開発者として開発環境にログインします。

  2. ターミナル・ウィンドウで入力します:

    fn inspect function <app-name> <function-name>

    ここでは:

    • <app-name>は、呼出しエンドポイントを取得するファンクションが含まれているアプリケーションの名前です
    • <function-name>は、呼出しエンドポイントを取得するファンクションの名前です

    例:

    fn inspect function helloworld-app helloworld-func

    出力:

    {
       "annotations": {
    		"fnproject.io/fn/invokeEndpoint": "https://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com/20181201/functions/ocid1.fnfunc.oc1.phx.aaaa____uxoa/actions/invoke",
    
    ...
    }

    ファンクションの呼出しエンドポイントは"fnproject.io/fn/invokeEndpoint"の値です。たとえば、"https://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com/20181201/functions/ocid1.fnfunc.oc1.phx.aaaa____uxoa/actions/invoke"(読みやすくするために省略)と入力します。

ファンクションの呼出しエンドポイントへの署名付きリクエストの送信(Oracle Cloud Infrastructure CLIのraw-requestコマンドを使用)

Oracle Cloud Infrastructure CLIをインストールした場合、これを使用してファンクションを呼び出すAPIリクエストを送信できます。特に、CLIを使用するとOracle Cloud Infrastructure認証が容易になります。Oracle Cloud Infrastructure CLIの使用方法の詳細は、コマンドライン・インタフェース(CLI)を参照してください。

これらの手順では、次のことを前提にしています:

  • Oracle Cloud Infrastructure CLIをすでにインストールおよび構成している
  • 開発環境用に構成されたファンクション開発者としてファンクションを呼び出す場合

Oracle Cloud Infrastructure CLIのraw-requestコマンドを使用してファンクションの呼出しエンドポイントに署名付きリクエストを送信することにより、OCIファンクションにデプロイされたファンクションを呼び出すには:

  1. ファンクション開発者として開発環境にログインします。

  2. ファンクションの呼出しエンドポイントを取得します(ファンクションの呼出しエンドポイントの取得を参照)。

    たとえば、"fnproject.io/fn/invokeEndpoint": "https://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com/20181201/functions/ocid1.fnfunc.oc1.phx.aaaa____uxoa/actions/invoke"(読みやすくするために省略)と入力します。

  3. Oracle Cloud Infrastructure CLIのraw-requestコマンドを使用し、次のように入力して、署名付きPOSTリクエストをファンクションの呼出しエンドポイントに送信することによって、ファンクションを呼び出します:

    oci raw-request --http-method POST --target-uri <invoke-endpoint> --request-body "<request-parameters>"

    ここでは:

    • <invoke-endpoint>は、前のステップで取得したエンドポイントです。
    • <request-parameters>は、オプションでファンクションに渡す引数と値を指定します。ファンクションで引数と値がJSONと予想される場合は、有効なJSON形式を使用します。渡すリクエスト・パラメータがない場合でも、リクエストに--request-body ""を含める必要があります。

    例:

    • oci raw-request --http-method POST --target-uri https://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com/20181201/functions/ocid1.fnfunc.oc1.phx.aaaa____uxoa/actions/invoke --request-body ""

      出力:

      Hello World !
    • oci raw-request --http-method POST --target-uri https://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com/20181201/functions/ocid1.fnfunc.oc1.phx.aaaa____uxoa/actions/invoke --request-body '{"name":"John"}'

      出力:

      Hello John !
  4. API署名キーを暗号化するためにパスフレーズを指定した場合は、プロンプトが表示されたらパスフレーズを入力します。

デタッチ・モードでのファンクションの起動

次の場合に、起動タイプとして「デタッチ済」を使用してファンクションを起動します。

  • 実行に時間がかかるファンクションを起動する場合。
  • ファンクションを非同期に実行して、ファンクションが呼び出された直後に、呼出しの結果を待たずに制御がコール元に返されるようにします。
  • 成功した呼出しと失敗した呼出しの結果を送信する宛先を指定します。

デタッチされた起動により、長時間実行されるワークロード(大規模なETLタスク、AI/MLジョブ、統合など)は、同期起動タイムアウトによって制限されることなく終了できます。

関数の切り離された呼び出しのタイムアウトと宛先の指定

関数を作成または更新するときに、オプションで次のものを設定できます。

  • 「デタッチされた呼出しタイムアウト」(detachedModeTimeoutInSeconds)パラメータ。デタッチされた呼出しのファンクション実行タイムアウトを指定します。
  • 「成功宛先」および「失敗宛先」(それぞれsuccessDestinationおよびfailureDestination)で、デタッチされた呼出しの結果を送信する宛先を指定します。成功および失敗の宛先は、デタッチされた呼出しにのみ適用されます。成功または失敗(あるいはその両方)の宛先を指定すると、OCI Functionsは次のことを実現します。
    • デタッチされた呼出しが成功した場合の成功宛先への呼出しレコード。
    • デタッチされた起動が失敗した場合の失敗宛先への起動レコード。

    デタッチされた呼出しの結果でサポートされる宛先は、通知サービス、キュー・サービスおよびストリーミング・サービスです。宛先サービスに書き込むには、OCI FunctionsにはIAMポリシー権限が必要です(連結解除された起動の成功および失敗の宛先のためのIAMポリシーの作成を参照)。

コンソール、OCI CLIおよびAPIを使用して、デタッチされた呼出しのタイムアウトおよび宛先を指定できます。

たとえば、次のOCI CLIコマンドを入力して、起動タイプが「デタッチ済」で起動されたときに、タイムアウトまでに最大1800秒間実行され、成功した呼出しと失敗した呼出しの結果がそれぞれsuccess-dest.jsonおよびfailure-dest.jsonで指定された宛先に送信される関数を作成できます。

oci fn function create --application-id <ocid> --display-name "fn_longer_demo" --image <image> --memory-in-mbs 256 \
  --detached-mode-timeout-in-seconds 1800 \
  --success-destination file://success-dest.json \
  --failure-destination file://failure-dest.json

ここでは:

  • success-dest.jsonには、次のJSON文字列が含まれます。
    {"kind": "STREAM", "streamId": "ocid1.stream.oc1...."}
  • failure-dest.jsonには、次のJSON文字列が含まれます。
    {"kind": "QUEUE", "queueId": "ocid1.queue.oc1....", "channelId": "failure1234"}

異なる宛先サービスに指定する属性については、APIドキュメントのSuccessDestinationDetailsおよびFailureDestinationDetailsを参照してください。

デタッチされた起動成功および失敗宛先のIAMポリシーの作成

OCI Functionsでは、ファンクション定義で指定した成功宛先および失敗宛先にデタッチされた呼出しの結果を記述するために、IAM権限が必要です。Notificationsサービス、ストリーミング・サービスおよびキュー・サービスは、成功と失敗の宛先をサポートしています。権限がまだ存在しない場合は、必要なポリシー・ステートメントを含む適切なIAMポリシーを作成する必要があります。

例:

  • OCI Functionsが通知サービスの成功宛先および失敗宛先へのデタッチされた呼出しの結果を記述できるようにするには、次のようなポリシー・ステートメントをIAMポリシーに含めます:
    Allow any-user to use ons-topics in compartment <destination-topic-compartment-ocid> where all {request.principal.type= 'fnapp', request.principal.compartment.id='<compartment-ocid>'}
  • OCI Functionsがキュー・サービスの成功宛先および失敗宛先にデタッチされた呼出しの結果を記述できるようにするには、次のようなポリシー・ステートメントをIAMポリシーに含めます:
    Allow any-user to use queues in compartment <destination-queue-compartment-ocid> where all {request.principal.type= 'fnapp', target.queue.id='<queue-ocid>', request.principal.compartment.id='<compartment-ocid>'}
  • OCI Functionsがストリーミング・サービスの成功および失敗の宛先にデタッチされた呼出しの結果を記述できるようにするには、次のようなポリシー・ステートメントをIAMポリシーに含めます:
    Allow any-user to use streams in compartment <destination-stream-compartment-ocid> where all {request.principal.type= 'fnapp', target.stream.id='<stream-ocid>', request.principal.compartment.id='<compartment-ocid>'}

デタッチ・モードでのファンクションの起動

ファンクションの「デタッチされた呼出しタイムアウト」(detachedModeTimeoutInSeconds)プロパティを必要なファンクション実行タイムアウトに設定し、必要に応じて(OCIファンクションがそれらの宛先にアクセスできるようにするための適切なポリシー・ステートメントとともに)起動結果の成功および失敗の宛先を指定することで、ファンクションを起動し、起動タイプとしてデタッチを指定できるようになります。

例:

  • OCI CLI fn function invokeを使用してデタッチ・モードでファンクションを起動するには、次のようなコマンドを入力します:

    oci fn function invoke --function-id <function-ocid> --file "-" --body '{"name": "ABC"}' --fn-invoke-type detached
  • OCI CLIのraw-requestコマンドを使用してデタッチ・モードでファンクションを起動するには、次のようなコマンドを入力します:

    oci raw-request --http-method POST --target-uri <invoke-endpoint> --request-body '{"name": "ABC"}' --request-headers '{"fn-invoke-type" : "detached"}'

デタッチされた起動結果配信

ファンクションの連結解除された呼出しの結果に対して成功および失敗の宛先を指定した場合(およびOCIファンクションがそれらの宛先にアクセスできるようにするための適切なポリシー・ステートメントを作成した場合)、OCIファンクションは次のことを実現します。

  • デタッチされた呼出しが成功した場合の成功宛先への呼出しレコード。
  • デタッチされた起動が失敗した場合の失敗宛先への起動レコード。

正常に起動した呼出しレコードの例:

{
  "id": "01K1Q6K12C1BT01KRZJ000HKB9",
  "version": "1.0",
  "data": {
    "compartmentId": "ocid1.compartment.oc1..aaaaaaaa______jf4a",
    "functionId": "...",
    "applicationId": "...",
    "request": {
      "opcRequestId": "...",
      "fnCallId": "..."
    },
    "response": {
      "status": "200",
      "errorCode": null,
      "errorMessage": null,
      "timestamp": "2025-08-03T05:31:21.392988237Z"
    }
  }
}

失敗した呼出しの呼出しレコードの例:

{
    "id": "01J6BS40ZC000000000000H7Z0",
    "version": "1.0",
    "data":
    {
        "compartmentId": "ocid1.compartment.oc1..aaaaaaaa______jf4a",
        "functionId": "...",
        "applicationId": "...",
        "request": {
            "opcRequestId": "...",
            "fnCallId": "..."
        },
        "response": {
            "status": "502",
            "errorCode": "FunctionInvokeExecutionFailed",
            "errorMessage": "function failed",
            "timestamp": "2024-08-11T21:47:41.264Z"
        }
    }
}

OCI Functionsは、宛先で想定される形式で起動レコードを提供します。

OCI Functionsが呼出しレコードを宛先に配信できない場合(権限がないなど)、ログおよびメトリックを使用して配信の失敗を追跡できます。

モニターおよびメトリック

Sync呼出しタイプとDetached呼出しタイプを区別するために、FunctionExecutionDurationFunctionInvocationCountおよびFunctionResponseCountメトリックにはInvokeTypeディメンションが含まれます。

宛先への呼出しレコードの正常な配信および失敗の配信を追跡するには、FunctionDetachedDeliveriesメトリックを使用します。

OCI関数メトリックの詳細は、関数メトリックを参照してください。

連結解除された呼出しに関する問題のトラブルシューティングのヒント

デタッチされた呼出しで問題が発生した場合、または呼出しレコードが配信されない場合:

  • OCI Functionsにターゲット宛先へのアクセス権を付与するために必要なIAM権限があることを再確認します(「デタッチされた起動の成功および失敗の宛先のためのIAMポリシーの作成」を参照)。
  • OCIロギング・サービスを使用して、障害メッセージを確認します。OCI Functionsがターゲット宛先に呼出しレコードを配信できなかった場合、OCIロギングの呼出しログに理由が含まれます。ログ・エントリはInvocation record delivery to failure destination failed due to - ...を開始します(ファンクション・ログの格納および表示を参照)。
  • FunctionDetachedDeliveriesメトリックを使用して、配信の詳細およびエラーを確認します(ファンクション・メトリックを参照)。ターゲット宛先への配信に失敗した場合は、メトリックのresponseTypeディメンションにエラーが含まれ、errorMessageディメンションにエラーの原因が含まれます。