ファンクションを実行するコンピュート・アーキテクチャの指定

OCI Functionsでファンクションを実行するプロセッサ・アーキテクチャの指定についてご確認ください。これには、イメージベースのファンクションおよびコード専用ファンクションのアーキテクチャ要件が含まれます。

ファンクションをOCIファンクションにデプロイする場合は、ファンクションを実行するコンピュート・インスタンスのプロセッサ・アーキテクチャを指定できます。ファンクションを1つのアーキテクチャ(Armなど)で実行するように制限したり、ファンクションを複数のアーキテクチャ(Armとx86の両方など)で実行できるようにしたりできます。

プロセッサ・アーキテクチャを指定するステップは、ファンクション・ソース・タイプによって異なります。

イメージベースの関数の場合、アプリケーション・シェイプ、イメージ・ビルドおよびファンクション作成ステップを様々な方法で完了および結合できます。例:

  • コンソールを使用して適切なシェイプでアプリケーションを作成してから、Fn ProjectのCLIのfn deployコマンドを使用してファンクションを作成およびデプロイできます(これにより、必要な依存関係を含む適切なイメージが自動的に構築されます)。
  • Dockerコマンドを使用すると、まず必要な依存関係を含むイメージを構築し、OCI CLIを使用して適切なシェイプでアプリケーションを作成してから、コンソールを使用してイメージに基づいてアプリケーションにファンクションを作成できます。

ファンクションを実行する単一のアーキテクチャまたはマルチアーキテクチャ・アプリケーション・シェイプの選択

アプリケーションのシェイプの選択が、OCI Functionsで実行されるファンクションのコンピュート・インスタンスのプロセッサ・アーキテクチャにどのように影響するかをご覧ください。

OCI Functionsでアプリケーションを定義するときは、アプリケーションでファンクションをデプロイおよび実行するコンピュート・インスタンスのプロセッサ・アーキテクチャを選択します。アプリケーション内のすべてのファンクションは、同じアーキテクチャのコンピュート・インスタンスにデプロイされ、実行されます。

アプリケーションのシェイプを選択することで、アプリケーションでファンクションを実行するコンピュート・インスタンス・アーキテクチャを次のように指定します:

  • Armベースのアーキテクチャを使用するコンピュート・インスタンスでアプリケーションの関数を常に実行する場合は、Generic_ARMシェイプを選択します。 アプリケーションに対してこの単一アーキテクチャ・シェイプを選択する場合、各ファンクションはArmアーキテクチャと互換性がある必要があります。イメージベース関数の場合、ファンクションのイメージには、単一アーキテクチャ・イメージまたは複数アーキテクチャ・イメージのいずれかのArmアーキテクチャに必要な依存関係が含まれている必要があります。
  • アプリケーションの関数を常にx86ベースのアーキテクチャのコンピュート・インスタンスで実行する場合は、Generic_X86シェイプを選択します。 この単一アーキテクチャ・シェイプをアプリケーション用に選択する場合、すべての関数がx86アーキテクチャと互換性がある必要があります。イメージベース関数の場合、関数のイメージには、単一アーキテクチャーイメージまたは複数アーキテクチャーイメージのx86アーキテクチャーに必要な依存関係が含まれている必要があります。
  • アーキテクチャに十分な容量があるコンピュート・インスタンスでファンクションを実行する場合は、Generic_X86_ARMシェイプを選択します。 この場合、OCI Functionsは、使用可能な容量に基づいてファンクションを実行するアーキテクチャを選択します。アプリケーションに対してこのマルチアーキテクチャ・シェイプを選択する場合、各ファンクションはArmアーキテクチャとx86アーキテクチャの両方と互換性がある必要があります。イメージベース関数の場合、関数のイメージには、マルチアーキテクチャイメージ内の両方のアーキテクチャーに必要な依存関係が含まれている必要があります。

アプリケーションでファンクションを作成する場合、そのファンクションはアプリケーションのシェイプと互換性がある必要があります。

  • アプリケーションに単一のアーキテクチャ・シェイプを選択する場合、ファンクションは対応するアーキテクチャをサポートする必要があります。
  • アプリケーションのマルチアーキテクチャ・シェイプを選択した場合、このファンクションはArmアーキテクチャとx86アーキテクチャの両方をサポートする必要があります。

イメージベースのファンクションの場合、ファンクションのイメージには、アプリケーションのシェイプに必要な依存性が含まれている必要があります。単一アーキテクチャ・アプリケーションのファンクションでは、単一アーキテクチャ・イメージまたは複数アーキテクチャ・イメージを使用できます。マルチアーキテクチャ・アプリケーションのファンクションでは、マルチアーキテクチャ・イメージを使用する必要があります。

コード専用関数の場合、アーカイブには、選択したランタイムおよびアプリケーション・アーキテクチャに必要なレイアウトおよびコンパイル済アーティファクトが必要です。Packaging Archives for Code-only Functionsを参照してください。

イメージベースのファンクションの場合、同じイメージを使用して複数の異なるアーキテクチャでファンクションをデプロイおよび実行するには、マニフェスト・リストまたはマルチアーカイブ・イメージとも呼ばれるマルチアーキテクチャ・イメージを使用します。マルチアーキテクチャ・イメージは、x86アーキテクチャとArmアーキテクチャの両方のイメージを含む1つのイメージ・タグを使用して、単一のソース・ツリーから構築します。

Fn ProjectのCLIコマンドfn -v deploy --app <app-name>を使用して、イメージベースのファンクションとその依存関係をDockerイメージとして構築する場合、イメージはアプリケーションのシェイプに必要な依存関係を使用して構築されます。アプリケーションにマルチアーキテクチャ・シェイプがある場合、ファンクションのイメージはマルチアーキテクチャ・イメージとして構築されます。Docker BuildxおよびPodmanを使用して、マルチアーキテクチャ・イメージを構築することもできます。Fn Project CLI以外のツールを使用してマルチアーキテクチャ・イメージを構築する場合は、そのイメージがアプリケーションのシェイプと互換性があることを確認する必要があります。

アプリケーションのマルチアーキテクチャ・シェイプを選択すると、OCI Functionsは使用可能な容量を評価し、ファンクションをデプロイおよび実行するアーキテクチャを決定します。ファンクションは異なるアーキテクチャにデプロイされる可能性があるため、このファンクションがArmアーキテクチャとx86アーキテクチャの両方をサポートしていることを確認してください。

イメージベースの関数の場合、この関数はマルチアーキテクチャーのイメージに基づいている必要があります。マルチアーキテクチャ・イメージに基づく関数をx86アーキテクチャとArmアーキテクチャの両方で正常に起動できることを確認するのは、ユーザーの責任です。これを可能にするために、マルチアーキテクチャ・シェイプを使用するアプリケーションでこのようなファンクションを作成するだけでなく、単一のアーキテクチャ・シェイプを使用するアプリケーションのマルチアーキテクチャ・イメージに基づくファンクションも作成することをお薦めします。デバッグを支援するために、Oracleでは、ファンクションのログに、ファンクションが実行されているコンピュート・インスタンスのアーキテクチャの詳細を含めることをお薦めします。

アプリケーションを作成した後は、アプリケーションのシェイプを変更できないことに注意してください。特定のファンクションを別のアーキテクチャで実行する場合は、そのファンクションを別のアプリケーションに作成します(必要に応じて新しいアプリケーションを作成します)。イメージベースの関数の場合は、適切な単一アーキテクチャーまたは複数アーキテクチャーイメージを提供します。例:

  • アプリケーションに対して1つのアーキテクチャ・シェイプ(Armまたはx86)を選択しても、特定のファンクションを別のアーキテクチャで実行する場合は、適切なアーキテクチャ・シェイプを持つ別のアプリケーションでファンクションを作成します。
  • アプリケーションのマルチアーキテクチャ・シェイプを選択しても、特定のファンクションを常に特定のアーキテクチャで実行する場合は、適切な単一アーキテクチャ・シェイプを持つ別のアプリケーションでファンクションを作成します。
  • アプリケーションに対して1つのアーキテクチャ・シェイプ(Armまたはx86)を選択するが、アーキテクチャに関係なく特定の関数を任意のコンピュート・インスタンスで実行する場合は、マルチアーキテクチャ・シェイプを持つ別のアプリケーションでファンクションを作成します。

イメージベースの機能のためのマルチアーキテクチャ(マルチアーキテクチャ)イメージの構築

マルチアーキテクチャ・シェイプを持つアプリケーションで、イメージベース・ファンクションのマルチアーキテクチャ・イメージを構築する方法をご紹介します。

イメージベースの関数では、次のような様々な方法でマルチアーキテクチャ・イメージを構築できます。

マルチアーキテクチャ・イメージに基づくファンクションは、マルチアーキテクチャ・シェイプを持つアプリケーションと、アプリケーションのシェイプに必要な依存関係(子イメージ)がマルチアーキテクチャ・イメージに含まれている場合、単一のアーキテクチャ・シェイプを持つアプリケーションの両方で作成できます。

ノート

クラウド・シェルの開発環境では、OCI Functionsは、マルチアーキテクチャ・イメージに基づくイメージベースのファンクションの作成およびデプロイ、およびマルチアーキテクチャ・シェイプを使用したアプリケーションをサポートしていません。また、Cloud Shellセッションのアーキテクチャは、アプリケーションのアーキテクチャと同じである必要があります(Cloud Shellセッションのアーキテクチャの選択の詳細は、Cloud Shellのアーキテクチャを参照してください)。

Fn ProjectのCLIを使用したマルチアーキテクチャ・イメージの構築(推奨)

Fn Project CLIを使用して、マルチアーキテクチャ・シェイプを持つアプリケーションにイメージベースのファンクションをデプロイするときに、マルチアーキテクチャ・イメージを構築できます。

  1. ファンクション開発者として開発環境にログインします。
  2. 関数を作成するマルチアーキテクチャ・シェイプを持つ適切なアプリケーションがまだ存在しない場合は、ここでそのようなアプリケーションを作成します。アプリケーションの作成を参照してください。
  3. ファンクションをまだ初期化していない場合は、Fn ProjectのCLIコマンドの使用の手順に従って、ファンクションを今すぐ初期化します。
  4. ファンクションのディレクトリで、次のFn Project CLIコマンドを入力して、イメージベース・ファンクションとその依存関係を、Dockerマルチアーキテクチャ・イメージで構築し、指定したDockerレジストリにイメージをプッシュして、ファンクションをOCIファンクションにデプロイします:
    fn -v deploy --app <app-name>

    <app-name>は、ファンクションを作成するマルチアーキテクチャ・シェイプを持つアプリケーションの名前です。

    マルチアーキテクチャ・イメージが作成され、アプリケーションのマルチアーキテクチャ・シェイプで指定されたアーキテクチャに必要な依存関係が含まれます。

Docker buildxプラグインを使用したマルチアーキテクチャ・イメージの構築

前提条件: Docker buildxプラグインを使用する前に、プラグインをダウンロードしてインストールする必要があります。ダウンロードおよびインストールの手順については、githubのDocker buildxのドキュメントを参照してください。

Docker buildxプラグインをダウンロードしてインストールしたら、プラグインを使用してマルチアーキテクチャ・イメージを構築できます。マルチアーキテクチャ・イメージは、単一または複数アーキテクチャのシェイプを持つアプリケーションにデプロイするイメージベースのファンクションをベースにしています。Docker buildxプラグインの使用方法の詳細は、githubに関するDocker buildxのドキュメントを参照してください。

たとえば、次のようにPython hello-worldイメージのマルチアーキテクチャ・イメージを構築できます:

  1. ファンクション開発者として開発環境にログインします。
  2. 端末ウィンドウで、関数を格納するディレクトリを作成します。例:
    mkdir helloworld-python-dir
  3. ディレクトリを新たに作成されたディレクトリに変更します。例:
    cd helloworld-python-dir
  4. 次のように入力してhelloworld Python関数を作成します:
    fn init --runtime python helloworld-func

    helloworld-funcというディレクトリが作成され、次のものが含まれます:

    • func.yaml: ファンクション定義ファイル。ファンクションの構築と実行に最低限必要な情報が含まれています。func.yamlファイルに含めることのできる追加パラメータについては、Fn Projectのドキュメントを参照してください。
    • requirements.txt: 必要なPythonライブラリのリスト。
    • func.py: 実際のファンクション・ファイル。
  5. 同じディレクトリにDockerfileという名前の新しいファイルを作成します。

    ファイルにDockerfileという名前を付ける必要があります。

  6. Dockerfileという名前のファイルを任意のエディタで開き、次の行を追加します。
    FROM fnproject/python:3.6-dev as build-stage
    WORKDIR /function
    ADD requirements.txt /function/
     
    RUN pip3 install --target /python/  --no-cache --no-cache-dir -r requirements.txt &&\
      rm -fr ~/.cache/pip /tmp* requirements.txt func.yaml Dockerfile .venv &&\
      chmod -R o+r /python
    ADD . /function/
    RUN rm -fr /function/.pip_cache
     
    FROM fnproject/python:3.6
    WORKDIR /function
    COPY --from=build-stage /python /python
    COPY --from=build-stage /function /function
    RUN chmod -R o+r /function
    ENV PYTHONPATH=/function:/python
    ENTRYPOINT ["/python/bin/fdk", "/function/func.py", "handler"]
  7. Dockerfileという名前のファイルを保存します。DockerfileファイルをカスタムDockerfileとして使用できるようになりました。
  8. func.yamlファイルで、runtime:パラメータの値をruntime: dockerに変更します。

    たとえば:

    schema_version: 20180708
    name: helloworld-func
    version: 0.0.1
    runtime: python
    build_image: fnproject/python:3.9-dev
    run_image: fnproject/python:3.9
    entrypoint: /python/bin/fdk /function/func.py handler
    memory: 256

    先:

    schema_version: 20180708
    name: helloworld-func
    version: 0.0.1
    runtime: docker
    build_image: fnproject/python:3.9-dev
    run_image: fnproject/python:3.9
    entrypoint: /python/bin/fdk /function/func.py handler
    memory: 256
  9. docker buildxコマンドを使用して、次のように入力して、x86およびArmベースのイメージを構築し、そこからマルチアーキテクチャ・イメージを生成します。
    docker buildx build --push --platform <platform1,platform2,..> --tag <manifest_name> <dockerfile_path>

    例:

    docker buildx build --push --platform linux/arm64/v8,linux/amd64 --tag my-manifest-name:1.0.0-SNAPSHOT-X86-ARM .
  10. マルチアーキテクチャ・イメージをOracle Cloud Infrastructure Registryにプッシュします。たとえば、次のように入力します:
    docker manifest push my-manifest-name:1.0.0-SNAPSHOT-X86-ARM

    これで、マルチアーキテクチャ・イメージにイメージベースの関数をベースにできます。

  11. (オプション)新しいイメージベースの関数を作成し、関数のImageプロパティをマルチアーキテクチャ・イメージの名前に設定します。例:
    • コンソールを使用する場合は、「イメージ」フィールドにmy-manifest-name:1.0.0-SNAPSHOT-X86-ARMを指定します。
    • Fn ProjectのCLIを使用する場合は、image引数の値としてmy-manifest-name:1.0.0-SNAPSHOT-X86-ARMを指定します。例:
      fn create function acmeapp acme-func phx.ocir.io/ansh81vru1zp/acme-repo/my-manifest-name:1.0.0-SNAPSHOT-X86-ARM

イメージベース・ファンクションの単一アーキテクチャ・イメージの構築

単一のアーキテクチャ・シェイプを持つアプリケーションで、イメージベース関数の単一アーキテクチャ・イメージを構築する方法をご紹介します。

イメージベースの関数の場合、次のような様々な方法で単一のアーキテクチャ・イメージを構築できます。

単一のアーキテクチャ・イメージに基づいてイメージベースのファンクションを作成する場合は、互換性のある単一アーキテクチャ・シェイプを持つアプリケーションでファンクションを作成する必要があります。

Fn ProjectのCLIを使用した単一のアーキテクチャ・イメージの構築

Fn Project CLIを使用すると、単一のアーキテクチャ・シェイプを持つアプリケーションにイメージベースのファンクションをデプロイするときに、単一のアーキテクチャ・イメージを構築できます。

  1. ファンクション開発者として開発環境にログインします。
  2. 関数を作成する単一のアーキテクチャ・シェイプを持つ適切なアプリケーションがまだ存在しない場合は、ここでそのようなアプリケーションを作成します。アプリケーションの作成を参照してください。
  3. ファンクションをまだ初期化していない場合は、Fn ProjectのCLIコマンドの使用の手順に従って、ファンクションを今すぐ初期化します。
  4. ファンクションのディレクトリで、次のFn Projectコマンドを入力して、イメージ・ベース・ファンクションとその依存関係を単一のアーキテクチャ・イメージで構築し、指定したDockerレジストリにイメージをプッシュして、ファンクションをOCIファンクションにデプロイします:
    fn -v deploy --app <app-name>

    <app-name>は、ファンクションを作成する単一のアーキテクチャ・シェイプを持つアプリケーションの名前です。

    単一のアーキテクチャ・イメージが作成され、アプリケーションの単一アーキテクチャ・シェイプで指定されたアーキテクチャに必要な依存関係が含まれます。

Dockerビルド・コマンドを使用した単一のアーキテクチャ・イメージの構築

Dockerビルド・コマンドを使用して、単一のアーキテクチャ・シェイプを持つアプリケーションにデプロイするイメージベースのファンクションをベースとする単一のアーキテクチャ・イメージを構築できます。詳細は、Dockerドキュメントのdocker buildコマンドに関する項を参照してください。

Dockerビルド・コマンドを使用してイメージを構築する場合、イメージには、コマンドを実行する現在のプラットフォームのアーキテクチャに必要な依存関係が含まれます。そのため、AMDプラットフォーム(x86アーキテクチャ)でDockerビルド・コマンドを実行すると、イメージにはx86アーキテクチャに必要な依存関係が含まれます。現在のプラットフォームとは異なるアーキテクチャの単一のアーキテクチャ・イメージを構築する場合は、Docker buildxプラグインを使用して、--platform引数の値として単一のターゲット・アーキテクチャを指定します。Docker buildxプラグインを使用したマルチアーキテクチャ・イメージの構築を参照してください。