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

OCI Functionsでファンクションを実行するプロセッサ・アーキテクチャの指定についてご確認ください。

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

関数を実行するプロセッサアーキテクチャーを指定するには、次の3つの手順があります。

OCI Functionsを使用してファンクションを作成する方法に応じて、これらのステップを様々な方法で完了および結合できます。例:

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

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

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

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

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

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

アプリケーションでファンクションを作成する場合、ファンクションのベースとなるイメージには、アプリケーションのシェイプに必要な依存関係が含まれている必要があります:

  • アプリケーションに対して単一のアーキテクチャ・シェイプを選択した場合、ファンクションのイメージには、対応するアーキテクチャ(単一のアーキテクチャ・イメージまたは複数アーキテクチャ・イメージ)に必要な依存関係が含まれている必要があります。
  • アプリケーションのマルチアーキテクチャ・シェイプを選択した場合、ファンクションのイメージには両方のアーキテクチャ(マルチアーキテクチャ・イメージ)に必要な依存関係が含まれている必要があります。

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

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

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

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

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

マルチアーキテクチャ(マルチアーキテクチャー)イメージの構築

マルチアーキテクチャ・シェイプを持つアプリケーションの機能用のマルチアーキテクチャ・イメージを構築する方法をご覧ください。

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

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

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

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

  1. ファンクション開発者として開発環境にログインします。
  2. ファンクションを作成するマルチアーキテクチャ・シェイプの適切なアプリケーションがまだ存在しない場合は、ここでそのようなアプリケーションを作成します。アプリケーションの作成を参照してください。
  3. ファンクションをまだ初期化していない場合は、Fn ProjectのCLIコマンドの使用の手順に従って、ファンクションを今すぐ初期化します。
  4. ファンクションのディレクトリで、次のFn Projectコマンドを入力して、ファンクションとその依存関係を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. (オプション)新しい関数を作成し、関数の「イメージ」プロパティをマルチアーキテクチャ・イメージの名前に設定します。例:
    • コンソールを使用する場合は、「イメージ」フィールドに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プラグインを使用したマルチアーキテクチャ・イメージの構築を参照してください。