ファンクションを実行するコンピュート・アーキテクチャの指定
OCI Functionsでファンクションを実行するプロセッサ・アーキテクチャの指定についてご確認ください。
ファンクションをOCIファンクションにデプロイする場合は、ファンクションを実行するコンピュート・インスタンスのプロセッサ・アーキテクチャを指定できます。ファンクションを1つのアーキテクチャ(Armなど)で実行するように制限したり、ファンクションを複数のアーキテクチャ(Armとx86の両方など)で実行できるようにしたりできます。
関数を実行するプロセッサアーキテクチャーを指定するには、次の3つの手順があります。
- アプリケーションを作成し、ファンクションを実行するアーキテクチャをサポートするアプリケーションのシェイプを選択します。関数を実行する単一アーキテクチャまたは複数アーキテクチャ・アプリケーション・シェイプの選択を参照してください。
- 関数を実行するアーキテクチャに必要な依存関係(子イメージ)を含むイメージを構築します。マルチアーキテクチャ(マルチアーキテクチャ)イメージの構築および単一アーキテクチャ・イメージの構築を参照してください。
- 作成したイメージに基づいて、適切なシェイプのアプリケーションでファンクションを作成します。Creating Functionsを参照してください。
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を使用したマルチアーキテクチャ・イメージの構築(推奨)」を参照)
- Docker Buildxの使用(詳細は、Docker buildxプラグインを使用したマルチアーキテクチャ・イメージの構築を参照)
- Podmanの使用
マルチアーキテクチャ・イメージに基づくファンクションは、マルチアーキテクチャ・シェイプを持つアプリケーションと、アプリケーションのシェイプに必要な依存関係(子イメージ)がマルチアーキテクチャ・イメージに含まれている場合、単一のアーキテクチャ・シェイプを持つアプリケーションの両方で作成できます。
Fn ProjectのCLIを使用したマルチアーキテクチャ・イメージの構築(推奨)
Fn ProjectのCLIを使用して、マルチアーキテクチャ・シェイプを持つアプリケーションにファンクションをデプロイするときに、マルチアーキテクチャ・イメージを構築できます:
- ファンクション開発者として開発環境にログインします。
- ファンクションを作成するマルチアーキテクチャ・シェイプの適切なアプリケーションがまだ存在しない場合は、ここでそのようなアプリケーションを作成します。アプリケーションの作成を参照してください。
- ファンクションをまだ初期化していない場合は、Fn ProjectのCLIコマンドの使用の手順に従って、ファンクションを今すぐ初期化します。
- ファンクションのディレクトリで、次の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イメージのマルチアーキテクチャ・イメージを構築できます:
- ファンクション開発者として開発環境にログインします。
- 端末ウィンドウで、関数を格納するディレクトリを作成します。例:
mkdir helloworld-python-dir
- ディレクトリを新たに作成されたディレクトリに変更します。例:
cd helloworld-python-dir
- 次のように入力してhelloworld Python関数を作成します:
fn init --runtime python helloworld-func
helloworld-func
というディレクトリが作成され、次のものが含まれます:func.yaml
: 関数定義ファイル。関数の構築と実行に最低限必要な情報が含まれています。func.yamlファイルに含めることのできる追加パラメータについては、Fn Projectのドキュメントを参照してください。requirements.txt
: 必要なPythonライブラリのリスト。func.py
: 実際のファンクション・ファイル。
- 同じディレクトリに
Dockerfile
という名前の新しいファイルを作成します。ファイルに
Dockerfile
という名前を付ける必要があります。 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"]
Dockerfile
という名前のファイルを保存します。Dockerfile
ファイルをカスタムDockerfileとして使用できるようになりました。- 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
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 .
- マルチアーキテクチャ・イメージをOracle Cloud Infrastructure Registryにプッシュします。たとえば、次のように入力します:
docker manifest push my-manifest-name:1.0.0-SNAPSHOT-X86-ARM
マルチアーキテクチャ・イメージに基づいて関数を作成できるようになりました。
- (オプション)新しい関数を作成し、関数の「イメージ」プロパティをマルチアーキテクチャ・イメージの名前に設定します。例:
- コンソールを使用する場合は、「イメージ」フィールドに
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を使用した単一のアーキテクチャ・イメージの構築を参照してください。
- Dockerビルド・コマンドを使用します。Dockerビルド・コマンドを使用した単一のアーキテクチャ・イメージの構築を参照してください。
単一のアーキテクチャ・イメージに基づいてファンクションを作成する場合は、互換性のある単一のアーキテクチャ・シェイプを持つアプリケーションでファンクションを作成する必要があります。
Fn ProjectのCLIを使用した単一のアーキテクチャ・イメージの構築
Fn ProjectのCLIを使用して、単一のアーキテクチャ・シェイプを持つアプリケーションにファンクションをデプロイするときに、単一のアーキテクチャ・イメージを構築できます。
- ファンクション開発者として開発環境にログインします。
- ファンクションを作成する単一のアーキテクチャ・シェイプを持つ適切なアプリケーションがまだ存在しない場合は、ここでそのようなアプリケーションを作成します。アプリケーションの作成を参照してください。
- ファンクションをまだ初期化していない場合は、Fn ProjectのCLIコマンドの使用の手順に従って、ファンクションを今すぐ初期化します。
- ファンクションのディレクトリで、次の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プラグインを使用したマルチアーキテクチャ・イメージの構築を参照してください。