アプリケーションおよびファンクションのデプロイの問題

OCI Functionsでアプリケーションと機能をデプロイする際の問題をトラブルシューティングする方法をご覧ください。

OCI Functionsでアプリケーションおよびファンクションをデプロイするときに、これらの問題が発生することがあります。

アプリケーションをデプロイすると、「unauthorized: incorrect username or password」メッセージが返される

アプリケーションをデプロイすると、次のようなメッセージが表示される場合があります:

$ fn -v deploy --app acme-app

Deploying go-app to app: acme-app
Bumped to version 0.0.2
Building image phx.ocir.io/ansh81vru1zp/acme-repo/go-app:0.0.2
FN_REGISTRY: phx.ocir.io/ansh81vru1zp/acme-repo
Current Context: acme-functions-compartment
Sending build context to Docker daemon 5.12kB
Step 1/10 : FROM fnproject/go:dev as build-stage
Get https://registry-1.docker.io/v2/fnproject/go/manifests/dev: unauthorized: incorrect username or password

このメッセージは、Docker Hubへのログインの試行が不要で、失敗したことを示します。この状況を解決するには、次のコマンドを使用してDockerからログアウトします:

docker logout

Dockerからログアウトしたら、コマンドを再実行してアプリケーションをデプロイします。

ファンクションをデプロイすると、「docker pushの実行中にエラーが発生しました。dockerにログインしましたか。」というメッセージが返されます

ファンクションのデプロイ時に次のようなメッセージが表示された場合、開発環境でDockerユーザー名に設定されているFN_REGISTRY環境変数がないことを再確認してください:

The push refers to repository [docker.io. ...
.
.
.
denied: requested access to the resource is denied
Fn: error running docker push, are you logged into docker?: exit status 1
See fn <command> --help’ for more information.
			

オープン・ソースのFn Projectプラットフォームを使用している場合、Fn Projectのドキュメントの指示に従ってFN_REGISTRY環境変数をDockerユーザー名に設定し、公式なDockerレジストリ(docker.io)との対話を可能にできます。

FN_REGISTRY環境変数によって、Fn ProjectのCLIコンテキストにあるレジストリ・オプションの値が上書きされます。

Fn ProjectのCLIをOCIファンクションとともに使用するには、次のいずれかを行います:

  • FN_REGISTRY環境変数の設定を解除します。
  • Oracle Cloud Infrastructure Registryと相互作用するFn ProjectのCLIコマンドを入力するたびに、--registryグローバル・オプションを使用してFN_REGISTRY環境変数を上書きします。

ファンクションをデプロイすると、ListTriggersメッセージと500エラーが返される

以前のバージョンのFn ProjectのCLIを使用して前に作成したファンクションをデプロイすると、次のようなメッセージが表示される場合があります:

Fn: [GET /triggers][500] ListTriggers default  &{Fields: Message:Internal server error}

このメッセージは、ファンクションのfunc.yamlファイルに、1つ以上のHTTPトリガー定義が含まれていることを示しています。OCI Functionsは現在HTTPトリガーをサポートしていません。このファンクションをデプロイするには、func.yamlファイルからtriggers:セクションを削除します。

トリガー定義を含む新しいfunc.yamlファイルが作成されないようにするには、Fn ProjectのCLIのインストールに従い、Fn ProjectのCLIを最新バージョンにアップグレードします。

ファンクションをデプロイすると「イメージが存在しないか、それを使用するためのアクセス権がありません」というメッセージが返される

Oracle Cloud Infrastructureコンピュート・インスタンスをOCIファンクション開発環境として使用してファンクションをデプロイする場合、次のようなメッセージが表示されます:

Fn: Image phx.ocir.io/ansh81vru1zp/acme-repo/helloworld-func:0.0.2 does not exist or you do not have access to use it.

このメッセージは、コンピュート・インスタンスがOracle Cloud Infrastructure Registryにアクセスできないことを示します。

テナンシのルート・コンパートメントに(次のような)ポリシー・ステートメントが存在することを再度確認し、コンピュート・インスタンスのOCIDを含む動的グループがOracle Cloud Infrastructure Registryにアクセスできるようにします:

 Allow dynamic-group <dynamic-group-name> to read repos in tenancy

Oracle Cloud Infrastructureコンピュート・インスタンスの開発環境の使用の詳細は、ファンクション開発環境の様々なオプションを参照してください。

OCI Functionsにファンクションをデプロイすると、「Fn: Missing subnetsotations」メッセージが返されます

OCIファンクションにファンクションをデプロイすると、次のメッセージが表示される場合があります:

$ fn deploy --app joes-helloworld-app

Deploying helloworld-func to app: joes-helloworld-app
.
.
.
Fn: Missing subnets annotation

Fn: Missing subnets annotationメッセージが表示された場合、正しいアプリケーション名を入力したことを確認してください。例:

  • アプリケーションが、現在Fn ProjectのCLIコンテキストで指定されているコンパートメントにない可能性があります
  • アプリケーションは以前に存在していた可能性がありますが、その後で削除されています

ファンクションをOCIファンクションにデプロイすると、「ファンクションのイメージ・アーキテクチャ'x86'に互換性がありません...」というメッセージが返されます

OCI Functionsにファンクションをデプロイすると、次のようなメッセージが表示されます:

$ fn deploy --app joes-helloworld-app

Deploying helloworld-func to app: joes-helloworld-app
.
.
.
Fn: Service error:InvalidParameter. Invalid Invalid image - Function's image architecture 'x86' is incompatible with the application's shape type 'GENERIC_X86_ARM'. http status code: 400. Opc request id:...

このメッセージは、ファンクションのイメージにアプリケーションのシェイプに必要な依存関係(子イメージ)が含まれていないことを示します。メッセージの原因として考えられるのは、Fn ProjectのCLIバージョン0.6.24(またはそれ以前)を使用して、x86イメージを持つファンクションをデプロイし、次の操作を実行することです。

  • マルチアーキテクチャ・シェイプを持つアプリケーション(Generic_X86_ARMなど)
  • x86イメージと互換性がない単一のアーキテクチャ・シェイプを持つアプリケーション(Generic_ARMなど)

Fn Project CLIバージョン0.6.25以降では、コマンドfn deploy --app <app-name>を使用してファンクションを構築し、それをOCI Functionsにデプロイすると、Fn Project CLIによって、アプリケーションのシェイプに必要な依存関係を持つファンクションのDockerイメージが構築されます。アプリケーションにマルチアーキテクチャ・シェイプ(2023年9月以降のデフォルトのアプリケーション・シェイプであるGeneric_X86_ARMなど)がある場合、Fn Project CLIは、ファンクションのマルチアーキテクチャ・イメージを構築します。関数のイメージとアプリケーションのシェイプは常に互換性があります。

ただし、Fn Project CLIバージョン0.6.24(およびそれ以前)では、単一のアーキテクチャであるx86アーキテクチャに必要な依存関係を持つDockerイメージが常に構築されます。単一のアーキテクチャ・イメージとして、このようなx86イメージは、Generic_X86単一アーキテクチャ・シェイプを持つアプリケーションのみと互換性があります。x86イメージは、次のアプリケーションと互換性がありません:

  • マルチアーキテクチャ・シェイプ(Generic_X86_ARMなど、2023年9月以降のデフォルトのアプリケーション・シェイプ)
  • Generic_X86ではない単一のアーキテクチャ・シェイプ(Generic_ARMなど)

ファンクションを正常にデプロイするには、アプリケーションのシェイプと互換性のあるイメージを指定する必要があります。次のいずれかを行います。

  • Fn Project CLIバージョン0.6.25以降を使用します(推奨)。
  • ファンクションのイメージと互換性のあるシェイプを持つ別のアプリケーションにファンクションをデプロイします(必要に応じて新しいアプリケーションを作成します)。Fn Project CLIバージョン0.6.24以前を使用している場合は、常にGeneric_X86シェイプを持つアプリケーションにファンクションをデプロイします。
  • Dockerを使用して、アプリケーションのアーキテクチャ・シェイプと互換性のあるイメージを構築します。

詳細については、Specifying the Compute Architecture on Which to Run Functionsを参照してください。

ファンクションをクラウド・シェルにOCIファンクションにデプロイすると、「OL8 Cloud Shellは、クロスコンパイルおよびマルチアーカイブ・ファンクション・ビルドをサポートしていません...」というメッセージが返されます

クラウド・シェル開発環境でOCI Functionsにファンクションをデプロイすると、次のようなメッセージが表示される場合があります:

OL8 CloudShell does not support cross-compilation and multi-arch functions builds. Please ensure the architecture of your App matches the CloudShell architecture.

このメッセージは、ファンクションがマルチアーキテクチャ・イメージに基づいているか、アプリケーションにマルチアーキテクチャ・シェイプがあるか、クラウド・シェル・セッションとアプリケーションのアーキテクチャが異なることを示しています。

クラウド・シェル開発環境では、OCI Functionsは、マルチアーキテクチャ・イメージに基づく機能や、マルチアーキテクチャ・シェイプを持つアプリケーションの作成とデプロイメントをサポートしていません。また、クラウド・シェル・セッションのアーキテクチャは、アプリケーションのアーキテクチャと同じである必要があります。

詳細は次を参照してください。

ファンクションをデプロイすると、「Invalid or unsupported image manifest」が返されます。OCIRマニフェスト/ヘッダーからアーキテクチャを取得できません..."メッセージ

OCI Functionsにファンクションをデプロイすると、次のようなメッセージが表示されます:

$ fn -v deploy --app acme-app

Fn: Service error:InvalidParameter. Invalid or unsupported image manifest. Unable to get architecture from the OCIR Manifest/Headers. http status code: 400.

このセクションで説明するように、考えられる原因と解決策がいくつかあります。

考えられる原因: Dockerバージョンが正しくありません

使用しているDockerバージョンはサポートされていない可能性があります。

Dockerを使用してファンクション・イメージを構築する場合は、サポートされているバージョンのDocker (書込み時、バージョン17.10以降)を使用する必要があります。

使用しているDockerのバージョンを確認するには、次のように入力します:

docker version

Dockerのバージョンがサポートされていない場合は、より新しいバージョンをインストールします。詳細は、OCI Functionsで使用するためのDockerのインストールを参照してください。

考えられる原因: マニフェストの書式が正しくないか、必要な情報がありません

イメージマニフェストの形式が正しくないか、必要な情報がすべて含まれていない可能性があります。エラー・メッセージに詳細が表示されます。

具体的には、イメージマニフェスト:

  • 有効なJSON形式である必要があります。
  • イメージ・ダイジェストを含める必要があります。
  • 有効なイメージ・アーキテクチャ(amd64またはarm64、あるいはその両方)を指定する必要があります。

イメージ・マニフェストを検査するには、次のように入力します:

docker manifest inspect --verbose <image-path>

例:

docker manifest inspect --verbose phx.ocir.io/ansh81vru1zp/acme-repo/acme-func:0.0.3

イメージマニフェストが次のようになっていることを確認します。

  • 有効なJSON形式です。
  • digestフィールドが含まれます。
  • 有効なイメージ・アーキテクチャを指定するplatformフィールドが含まれます。単一のアーキテクチャ・イメージの場合、platformフィールドにはamd64またはarm64を指定する必要があります。マルチアーキテクチャ・イメージの場合、platformフィールドにはamd64arm64の両方を指定する必要があります。詳細については、Specifying the Compute Architecture on Which to Run Functionsを参照してください。

イメージマニフェストの形式が正しくない場合、または必要な情報が欠落している場合は、マニフェストを更新してイメージを再構築します。

考えられる原因: イメージが無効です

イメージマニフェストから作成されたイメージが無効である可能性があります(たとえば、イメージマニフェストに必要な情報が不足しているため)。

この場合、イメージを再構築する必要があります。イメージを再構築する方法は、単一のアーキテクチャ・イメージと複数アーキテクチャ・イメージのどちらを再構築するか、および使用するツールによって異なります。

単一のアーキテクチャ・イメージの再構築:

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

  • FnプロジェクトCLIの使用(推奨):

    ファンクションのディレクトリに次のFn Project CLIコマンドを入力して、ファンクションとその依存関係を単一のアーキテクチャ・イメージとして構築し、指定したDockerレジストリにイメージをプッシュしてそのファンクションをOCIファンクションにデプロイします:

    fn deploy --app <your-function-app>

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

    詳細は、「Fn ProjectのCLIを使用した単一のアーキテクチャ・イメージの構築」を参照してください。

  • Dockerビルド・コマンドまたはDockerビルド・プラグインの使用:

    現在のプラットフォームと同じアーキテクチャのイメージを構築するには、docker buildコマンドを使用します。たとえば、単一のアーキテクチャ・シェイプとしてamd64を使用してアプリケーションにデプロイするイメージを構築するには、次のように入力します。

    docker build --platform linux/amd64 -t <image-path> .

    現在のプラットフォームとは異なるアーキテクチャのイメージを構築するには、docker buildx buildコマンドを使用します。たとえば、単一のアーキテクチャ・シェイプとしてamd64を使用してアプリケーションにデプロイするイメージを構築するには、次のように入力します。

    docker buildx build --platform linux/amd64 -t <image-path> .

    amd64またはarm64のいずれかを指定し、両方を指定しないようにしてください。また、他のアーキテクチャは指定しないでください。

    イメージを構築したら、次のコマンドを入力して、イメージをDockerレジストリにプッシュします:

    docker push <image-path>

    詳細は、Dockerビルド・コマンドを使用した単一のアーキテクチャ・イメージの構築を参照してください。

マルチアーキテクチャ・イメージの再構築:

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

  • FnプロジェクトCLIの使用(推奨):

    ファンクションのディレクトリで、次のFn Project CLIコマンドを入力して、ファンクションとその依存関係をマルチアーキテクチャ・イメージとして構築し、指定したDockerレジストリにイメージを押してそのファンクションをOCIファンクションにデプロイします:

    fn deploy --app <your-function-app>

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

    詳細は、Fn ProjectのCLIを使用したマルチアーキテクチャ・イメージの構築(推奨)を参照してください。

  • Docker buildxプラグインの使用:

    マルチアーキテクチャ・シェイプでアプリケーションにデプロイするファンクションのベースとなるマルチアーキテクチャ・イメージを構築するには、次のdocker buildx buildコマンドを入力します。

    docker buildx build --platform linux/amd64,linux/arm64 -t <your-registry>/<your-image>:<tag> --push .

    amd64arm64の両方を指定し、他のアーキテクチャを指定しないようにしてください。

    イメージを構築したら、次のコマンドを入力して、イメージをDockerレジストリにプッシュします:

    docker push <image-path>

    詳細は、Docker buildxプラグインを使用したマルチアーキテクチャ・イメージの構築を参照してください。