ファンクション開発キット(FDK)

OCI Functionsで様々な言語をサポートするファンクション開発キット(FDK)について説明します。

OCI Functionsは、Fn Project Function Development Kits (FDK)を使用して、一般的な言語(Java、Node.js、Python、Go、RubyおよびC#)をサポートしています。FDKは、システム内部(プロトコル、入出力の解析、関数コンテナのロジックなど)を処理する一連のヘルパー・ライブラリです。各言語FDKは、次の3つのコンポーネントで構成されます。

  • 実行可能関数を構築するための言語固有のライブラリおよびツールを含むビルド時ベースイメージ。
  • 実行可能関数を実行する言語固有の実行時環境を提供するランタイム・ベース・イメージ。
  • FDKライブラリ(Javaの場合、FDKライブラリはビルドタイム・ベース・イメージおよびランタイム・ベース・イメージに含まれます)。

FDKは、特定の言語の特定のバージョンに固有です。Oracleは、サポートされている言語の新しいFDKビルドタイム・ベース・イメージおよびランタイム・ベース・イメージを定期的に公開します(たとえば、パッチの発行や、新しくリリースされたバージョンの言語のサポートなど)。Javaの場合、FDK更新には常に3つのコンポーネント(請求時ベース・イメージとランタイム・ベース・イメージ、およびFDKライブラリ)がすべて含まれます。他の言語の場合、FDK更新に1つ以上のコンポーネントが含まれる場合があります。

Fn ProjectのCLI fn initコマンドを使用してファンクションを初めて作成する場合は、--runtimeコマンド・オプションを使用して、ファンクションのソース・コードを記述する言語を指定します。言語の指定に加えて、オプションで言語のバージョンを指定できます。言語バージョンを指定しない場合、Fn Project CLIでは、使用可能な言語FDKの最新バージョンの使用が想定されます。Fn ProjectのCLIでは、--runtimeコマンド・オプションの値が、ファンクションのfunc.yamlのruntime:パラメータの値として記録されます。Fn ProjectのCLIでは、次のように、指定した--runtimeコマンド・オプションに従って、func.yamlファイルのbuild_image:およびrun_image:パラメータの値も追加されます。

  • --runtimeコマンド・オプションの値として単に言語を指定した場合、Fn ProjectのCLIでは、その言語のFDKビルドタイム・イメージおよびランタイム・ベース・イメージの最新バージョンがbuild_image:およびrun_image:パラメータの値として追加されます。たとえば、fn init --runtime python helloworld-funcと入力し、Python 3.11が使用可能な最新バージョンである場合、Fn ProjectのCLIによって次のものが追加されます。
    runtime: python
    build_image: fnproject/python:3.11-dev
    run_image: fnproject/python:3.11
  • --runtimeコマンド・オプションの値として言語とバージョンの両方を指定した場合、Fn Project CLIでは、言語のFDKビルドタイム・イメージとランタイム・ベース・イメージの対応するバージョンがbuild_image:およびrun_image:パラメータの値として追加されます。たとえば、fn init --runtime python3.9 helloworld-funcと入力すると、Fn ProjectのCLIによって次のものが追加されます。
    runtime: python3.9
    build_image: fnproject/python:3.9-dev
    run_image: fnproject/python:3.9

fn buildまたはfn deployを使用してファンクションを構築すると、Fn Project CLIによってDockerイメージが作成されます(fn deployの場合は、イメージがDockerレジストリにプッシュされます)。Dockerイメージには、ファンクションのランタイム依存関係が含まれます。FDKが使用可能な言語で関数が記述されている場合、Fn ProjectのCLIは次のようになります。

  • build_image:パラメータで指定されたビルド時ベース・イメージを使用して、ファンクションの実行可能バージョンを構築し、Dockerイメージに実行可能ファンクションを含めます。
  • 実行可能ファンクションを実行するランタイム環境を提供するために、run_image:パラメータで指定されたランタイム・ベース・イメージをDockerイメージに含めます。

Fn Project CLIでは、キャッシュされたバージョンのFDKのビルドタイム・ベース・イメージおよびランタイム・ベース・イメージ(使用可能な場合)が使用されます。キャッシュされたバージョンのベース・イメージが使用できない場合、Fn ProjectのCLIは、言語FDKのビルドタイム・ベース・イメージおよびランタイム・ベース・イメージをDocker Hubからプルします。

新しいバージョンの言語FDKがリリースされた場合、既存のファンクションのfunc.yamlファイルのbuild_image:およびrun_image:パラメータの値は自動的に更新されないことに注意してください。ファンクションの作成時にbuild_image:およびrun_image:パラメータの値として以前に指定された言語FDKのビルドタイム・ベース・イメージおよびランタイム・ベース・イメージの初期バージョンは、引き続きファンクション実行可能ファイルのビルドおよびランタイム環境の指定に使用されます。build_image:およびrun_image:パラメータの初期値を使用すると、関数コードと言語FDKのビルドタイム・ベース・イメージおよびランタイム・ベース・イメージとの互換性を維持できます。

異なる言語バージョンで既存のファンクションを再構築し、ファンクションのDockerイメージに別のランタイムを含める場合は、ファンクションのfunc.yamlファイルのbuild_image:およびrun_image:パラメータの値を変更して、異なるバージョンの言語FDKを参照します。一貫性を保ち、混乱を避けるために、言語FDKのバージョンの--runtimeコマンド・オプションに対応するようにruntime:パラメータの値を更新します。Java関数の場合は、ファンクションのpom.xmlファイルのFDKバージョンも変更する必要があります。

サンプル

この項の例では、Fn Project CLIバージョン0.6.7 (またはそれ以降)を使用していて、Python 3.11がPython FDKでサポートされているPythonの最新バージョンであると想定しています。

例1: Python 3.11を使用した新しい関数の作成

Python 3.11で新しい関数を作成する場合は、次のいずれかのコマンドを実行します。

fn init --runtime python helloworld-func
fn init --runtime python3.11 helloworld-func

fn init --runtime python helloworld-funcの場合、Fn ProjectのCLIは、--runtimeコマンド・オプションの値をファンクションのfunc.yamlのruntime:パラメータの値として記録し、Python FDKのビルドタイム・ベース・イメージとランタイム・ベース・イメージの最新バージョン番号をbuild_image:およびrun_image:パラメータの値として追加します。

runtime: python
build_image: fnproject/python:3.11-dev
run_image: fnproject/python:3.11

fn init --runtime python3.11 helloworld-funcの場合、Fn ProjectのCLIは、--runtimeコマンド・オプションの値をファンクションのfunc.yamlのruntime:パラメータの値として記録し、Python 3.11 FDKのビルドタイム・ベース・イメージおよびランタイム・ベース・イメージをbuild_image:およびrun_image:パラメータの値として追加します。

runtime: python3.11
build_image: fnproject/python:3.11-dev
run_image: fnproject/python:3.11

これ以降は、ファンクションの構築時に、Fn ProjectのCLIでは、ビルドタイム・ベース・イメージとランタイム・ベース・イメージの初期バージョンを使用して、ファンクション実行可能ファイルを構築し、ランタイム環境を提供します。

例2: Python 3.9を使用した新しい関数の作成

Python 3.9で新しい関数を作成する場合は、次のコマンドを実行します:

fn init --runtime python3.9 helloworld-func

Fn Project CLIでは、--runtimeコマンド・オプションの値がファンクションのfunc.yamlのruntime:パラメータの値として記録され、次に示すように、Python 3.9に適したPython FDKのビルドタイム・ベース・イメージおよびランタイム・ベース・イメージのバージョンがbuild_image:およびrun_image:パラメータの値として追加されます。

runtime: python3.9
build_image: fnproject/python:3.9-dev
run_image: fnproject/python:3.9

これ以降、ファンクションをビルドすると、Fn Project CLIでは、ビルドタイム・ベース・イメージおよびランタイム・ベース・イメージの初期Python 3.9バージョンを使用してファンクション実行可能ファイルをビルドし、ランタイム環境を提供します。

例3: Python 3.8で既存の関数を再構築する

Python 3.8で最初に構築された既存の関数を再構築し、Python 3.8で引き続きビルドする場合は、次のコマンドを実行します:

fn build helloworld-func

func.yamlファイルのbuild_image:およびrun_image:パラメータは、もともとPython 3.8に適したPython FDKのビルドタイム・ベース・イメージおよびランタイム・ベース・イメージのバージョンに設定されていました。ファンクションをビルドすると、Fn Project CLIは引き続き同じPython 3.8ビルドタイム・ベース・イメージとランタイム・ベース・イメージを使用してファンクション実行可能ファイルをビルドし、ランタイム環境を提供します。

例4: Python 3.11を使用した既存のPython 3.8関数の再構築

Python 3.8で最初に構築された既存の関数を再構築し、Python 3.11でビルドする場合:

Fn Project CLIでは、func.yamlファイルのbuild_image:およびrun_image:パラメータで指定されたPython FDKのビルドタイム・ベース・イメージおよびランタイム・ベース・イメージのバージョンを使用して、ファンクション実行可能ファイルをビルドし、ランタイム環境を提供します。これ以降、ファンクションの構築時に、Fn ProjectのCLIは、ビルドタイム・ベース・イメージおよびランタイム・ベース・イメージのこれらのバージョンを使用します。

Fn Projectの以前のバージョンのCLIでの動作(バージョン0.6.7より前)

バージョン0.6.7より前のバージョンのFn Project CLIを使用して、FDKでサポートされている言語で記述されたファンクションを構築または再構築するたびに(Javaを除く)、Fn Project CLIでは、FDKのビルドタイム・ベース・イメージおよびランタイム・ベース・イメージが使用可能な場合は、キャッシュされたバージョンの言語FDKが使用されていました。キャッシュされたバージョンのベース・イメージを使用できない場合、Fn ProjectのCLIは、Docker Hubからベース・イメージの最新バージョンをプルしました。その結果、ファンクション・コードが、ファンクション実行可能ファイルのビルドに使用される言語FDKのビルドタイム・ベース・イメージ、またはランタイム環境を提供するために使用されるランタイム・ベース・イメージと互換性があることは確認できませんでした。

関数のビルド時に言語FDKのバージョンを明示的に指定しないことで、既存の関数を以前とまったく同様に構築できます。Fn Project CLIでは、FDKのビルドタイム・ベース・イメージとランタイム・ベース・イメージのキャッシュ・バージョンを引き続き使用するか(使用可能な場合)、Docker Hubからベース・イメージの最新バージョンをプルします(キャッシュされたイメージが使用できない場合)。

Fn ProjectのCLIバージョン0.6.7以降:

  • ファンクションの作成時に言語FDKのバージョンを明示的に指定すると、Fn ProjectのCLIによって、ファンクションのfunc.yamlファイルのbuild_image:およびrun_image:パラメータの値としてそのバージョンが追加されます。
  • ファンクションをビルドまたはデプロイする場合、ファンクションのfunc.yamlファイルにbuild_image:およびrun_image:パラメータが含まれていないのは、以前のFn ProjectのCLIバージョンで作成されたためです。Fn ProjectのCLIは、パラメータをfunc.yamlファイルに追加します。build_image:およびrun_image:パラメータの値は、Fn Project CLIが現在使用しているFDKビルドタイム・ベース・イメージおよびランタイム・ベース・イメージのバージョンを記録します。

後でファンクションを再構築するときに別のバージョンを明示的に指定しないかぎり、Fn ProjectのCLIでは、build_image:およびrun_image:パラメータで指定されたFDKバージョンが引き続き使用されます。

Java関数の場合、以前のバージョンのFn Project CLIでは、ファンクション・コードがJava FDKのビルドタイム・ベース・イメージおよびランタイム・ベース・イメージとの互換性を維持できるように、runtime:build_image:およびrun_image:パラメータをfunc.yamlファイルに追加しました。

異なる言語バージョンで既存のファンクションを再構築し、ファンクションのDockerイメージに別のランタイムを含める場合は、ファンクションのfunc.yamlファイルのbuild_image:およびrun_image:パラメータの値を変更して、異なるバージョンの言語FDKを参照します。一貫性を保ち、混乱を避けるために、言語FDKのバージョンの--runtimeコマンド・オプションに対応するようにruntime:パラメータの値を更新します。Java関数の場合は、ファンクションのpom.xmlファイルのFDKバージョンも変更する必要があります。

FDKでサポートされている言語バージョンを確認する方法

FDKでサポートされている言語のバージョン(Java、Node.js、Python、Go、RubyおよびC#)を確認するには:

  1. まだアップグレードされていない場合は、Fn ProjectのCLIを最新バージョンにアップグレードします。「Fn ProjectのCLIのアップグレード」を参照してください。
  2. ターミナル・ウィンドウで入力します:
    fn init --help | grep runtime

    例:

    fn init --help | grep runtime
    
    --runtime value Choose an existing runtime - dotnet, dotnet3.1, dotnet6.0, dotnet8.0, go, go1.18, go1.19, java, java11, java17, java8, kotlin, node, node14, node16, node18, python, python3.11, python3.8, python3.9, ruby, ruby2.7, ruby3.1

    前述の例では、異なるFDKがサポートされることがわかります。

    • 3つのバージョンのドットネット(C#用)、Java、PythonおよびNode.js
    • GoとRubyの2つのバージョン
    • Kotlinのバージョン

    サポートされているバージョンの詳細は、OCI関数でサポートされている言語を参照してください。

既存のファンクションに使用されるFDKビルドタイム・ベース・イメージおよびランタイム・ベース・イメージのバージョンを確認する方法

Fn Project CLIがファンクション実行可能ファイルのビルドおよびランタイム環境を提供するために現在使用しているFDKビルドタイム・ベース・イメージおよびランタイム・ベース・イメージのバージョンを確認するには:

  1. まだアップグレードされていない場合は、Fn ProjectのCLIを最新バージョンにアップグレードします。「Fn ProjectのCLIのアップグレード」を参照してください。
  2. ターミナル・ウィンドウで、そのディレクトリに関数コードを含めます。
  3. fn buildまたはfn deployコマンドを使用して、ファンクションを構築またはデプロイします。

    build_image:およびrun_image:パラメータは、ファンクションのfunc.yamlファイル(まだ存在しない場合)に追加されます。パラメータ値は、Fn Project CLIがファンクション実行可能ファイルのビルドおよびランタイム環境を提供するために現在使用しているFDKビルド時およびランタイム・ベース・イメージのバージョンを示します。

特定の言語のデフォルトのFDKビルドタイムおよびランタイム・ベース・イメージ・バージョンを調べる方法

Fn Project CLIが現在使用しているデフォルトのFDKビルドタイム・ベース・イメージ・バージョンおよびランタイム・ベース・イメージ・バージョンを調べ、特定の言語で記述された関数の実行時環境を提供するには:

  1. まだアップグレードされていない場合は、Fn ProjectのCLIを最新バージョンにアップグレードします。「Fn ProjectのCLIのアップグレード」を参照してください。
  2. ターミナル・ウィンドウで次のように入力して新しいhelloworldファンクションを作成します:
    fn init --runtime <language> hello-func

    <language>は、関心のある特定の言語です(javapythonnoderubygokotlinまたはdotnetのいずれか(C#の場合)。

    例:

    fn init --runtime java hello-func
  3. 新しいファンクション用に作成された/hello-funcディレクトリに移動し、テキスト・エディタでfunc.yamlファイルを開きます。

    指定した言語のデフォルトのFDKビルドタイムおよびランタイム・ベース・イメージ・バージョンは、build_image:およびrun_image:パラメータの値として表示されます。

サポートされている特定の言語バージョンの最新のFDKビルドタイムおよびランタイム・ベース・イメージ・バージョンを確認する方法

Fn Project CLIが現在実行可能ファイルの構築に使用している最新のFDKビルドタイム・ベース・イメージおよびランタイム・ベース・イメージ・バージョンを調べ、特定の言語の特定のバージョンの関数に対してランタイム環境を提供します。

  1. まだアップグレードされていない場合は、Fn ProjectのCLIを最新バージョンにアップグレードします。「Fn ProjectのCLIのアップグレード」を参照してください。
  2. 使用可能なサポートされている言語バージョンを確認するには、次を実行します:

    fn init --help | grep runtime

    例:

    fn init --help | grep runtime
    
    --runtime value Choose an existing runtime - dotnet, dotnet3.1, dotnet6.0, dotnet8.0, go, go1.18, go1.19, java, java11, java17, java8, kotlin, node, node14, node16, node18, python, python3.11, python3.8, python3.9, ruby, ruby2.7, ruby3.1

    サポートされているバージョンの数を含む、対象となる特定の言語の--runtimeコマンド・オプションの有効な値に注意してください。例:

    • java17, java11, java8
    • python3.11, python3.9, python3.8
    • node18, node16, node14
    • ruby2.7, ruby3.1
    • go1.19, go1.18
    • dotnet3.1dotnet6.0dotnet8.0 (C#の場合)
  3. ターミナル・ウィンドウで次のように入力して新しいhelloworldファンクションを作成します:
    fn init --runtime <language-version> hello-func

    <language-version>は、関心のある特定の言語およびバージョンです。

    例:

    fn init --runtime java17 hello-func
  4. 新しいファンクション用に作成された/hello-funcディレクトリに移動し、テキスト・エディタでfunc.yamlファイルを開きます。

    指定した言語バージョンでサポートされている最新のFDKビルドタイムおよびランタイム・ベース・イメージ・バージョンは、build_image:およびrun_image:パラメータの値として表示されます。

サポートされている言語の最新のFDKビルドタイムおよびランタイム・ベース・イメージ・バージョンを使用するように既存のファンクションをアップグレードする方法

Fn ProjectのCLIが、サポートされている言語の最新のFDKビルドタイム・ベース・イメージ・バージョンおよびランタイム・ベース・イメージ・バージョンを使用してファンクション実行可能ファイルをビルドし、ランタイム環境を提供するように、既存のファンクションをアップグレードするには:

  1. まだアップグレードされていない場合は、Fn ProjectのCLIを最新バージョンにアップグレードします。「Fn ProjectのCLIのアップグレード」を参照してください。
  2. ターミナル・ウィンドウで、関数コードを含むディレクトリに移動し、func.yamlファイルをテキスト・エディタで開きます。
    build_image:およびrun_image:パラメータは、Fn ProjectのCLIでファンクション実行可能ファイルのビルドおよびランタイム環境を提供するために現在使用されているFDKビルド時およびランタイム・ベース・イメージのバージョンを示します。例:
    build_image: fnproject/fn-java-fdk-build:jdk11-1.0.105
    run_image: fnproject/fn-java-fdk:jre11-1.0.105

    func.yamlファイルにbuild_image:およびrun_image:パラメータが存在しない場合は、fn buildまたはfn deployコマンドを使用してファンクションを構築します。これにより、build_image:およびrun_image:パラメータがfunc.yamlファイルに追加され、Fn ProjectのCLIで現在使用されているFDKビルド・イメージおよびランタイム・イメージのバージョンに設定されます。

  3. Fn ProjectのCLIで使用する言語のバージョンのFDKビルドタイム・イメージおよびランタイム・ベース・イメージのバージョンを確認します(サポートされている特定の言語バージョンの最新のFDKビルドタイムおよびランタイム・ベース・イメージのバージョンを確認する方法を参照)。

  4. func.yamlファイルをテキスト・エディタで開き(まだ開いていない場合)、次のように更新します。
    1. build_image:およびrun_image:パラメータの値を、前のステップで特定したFDKビルドタイムおよびランタイム・ベース・イメージのバージョンに変更します。

      たとえば、次のように変更できます。

      build_image: fnproject/fn-java-fdk-build:jdk11-1.0.105
      run_image: fnproject/fn-java-fdk:jre11-1.0.105

      宛先

      build_image: fnproject/fn-java-fdk-build:jdk11-1.0.130
      run_image: fnproject/fn-java-fdk:jre11-1.0.130
    2. 一貫性を保ち、混乱を避けるために、言語のバージョンの--runtimeコマンド・オプションに対応するようにruntime:パラメータの値を変更します。例:
      runtime: java11
  5. Java関数の場合のみ、テキスト・エディタでpom.xmlファイルを開き、func.yamlで指定されたバージョンに対応するように<fdk.version>要素を更新します。

    たとえば、<fdk.version>1.0.105</fdk.version><fdk.version>1.0.130</fdk.version>に変更できます。

  6. ファンクションを再度デプロイしてテストし、ファンクション・コードが、ファンクション実行可能ファイルのビルドおよびランタイム環境を提供するためにFn Project CLIが使用している新しいFDKビルド時およびランタイム・ベース・イメージ・バージョンと互換性があることを確認します。