はじめに
OCI FunctionsをCloud Shellからデプロイしようとしたところエラーが発生したので対処法をまとめてみました。
原因はFunctionsアプリケーション作成時に指定したコンピュート・アーキテクチャとCloud Shellのアーキテクチャが異なっていたためでした。
発生したエラー
# テンプレートから生成
$ fn init --runtime java hello-java
$ cd hello-java
# Functionをデプロイ、ここでエラー発生
$ fn deploy --app helloworld-app
Deploying helloworld-func to app: helloworld-app
Bumped to version 0.0.4
Using Container engine docker
Building image nrt.ocir.io/<namespace割愛>/functionsdemo/helloworld-func:0.0.4 TargetedPlatform: amd64HostPlatform: arm64
Error during build. Run with `--verbose` flag to see what went wrong. eg: `fn --verbose CMD`
Fn: error running docker build: Cannot create/use builder instance docker for oci_fn_builder : exit status 125
See 'fn <command> --help' for more information. Client version: 0.6.29
対処法
エラーメッセージで検索した結果、以下の記事を発見しました。
コンピュート・アーキテクチャが異なっているためエラーが発生していました。
Functionsアプリケーションは GENERIC_X86 で作成していたのですが、Cloud SHell側が ARM になっていたみたいです。
Cloud Shellの左上、[アクション] > [アーキテクチャ]からFunctionsアプリケーションで指定した X86-64 に設定を変更したところ、デプロイが正常に完了しました。
ドキュメントも確認してみる
Cloud Shellのデフォルト・アーキテクチャは以下の通り。どちらが選択されるかはリージョンのリソース次第ということですかね。
デフォルトでは、アーキテクチャ・プリファレンスは「プリファレンスなし」に設定されています。これを選択すると、クラウド・シェル・セッションは、リージョンで使用可能なハードウェアに応じて、x86_64またはARM (aarch64)アーキテクチャに基づきます。
OCI Functionsを実行するコンピュート・アーキテクチャの指定についてはこちらのドキュメントに記載がありました。
作成したイメージ基づいて適切なシェイプ(アーキテクチャ)でFunctionを作成するように記載されていました。
OCI Functionsにファンクションをデプロイする場合、ファンクションを実行するコンピュート・インスタンスのプロセッサ・アーキテクチャを指定できます。ファンクションを単一のアーキテクチャ(Armなど)で実行するように制限することも、ファンクションを複数のアーキテクチャ(Armとx86の両方など)で実行できるようにすることもできます。
関数を実行するプロセッサアーキテクチャーを指定するには、3つの手順があります。
- アプリケーションを作成し、ファンクションを実行するアーキテクチャをサポートするアプリケーションのシェイプを選択します。ファンクションを実行する単一のアーキテクチャまたは複数アーキテクチャのアプリケーション・シェイプの選択を参照してください。
- 関数を実行するアーキテクチャに必要な依存関係(子イメージ)を含むイメージを構築します。マルチアーキテクチャ(マルチアーカイブ)イメージの構築および単一アーキテクチャ・イメージの構築を参照してください。
- 作成したイメージに基づいて、適切なシェイプでアプリケーションにファンクションを作成します。ファンクションの作成を参照してください。
参考情報