Pythonコード専用関数の作成

OCI FunctionsでPythonコード専用関数をパッケージ化および作成する方法をご覧ください。

コンテナ・イメージを作成せずにPythonソース・コードおよび依存関係をデプロイする場合は、Pythonコード専用関数を使用します。

Pythonソース・コードは、ルート・レベルのfunction/ディレクトリにパッケージ化する必要があります。

Pythonコード専用ファンクションを作成する前に、Pythonコード専用ファンクションに必要なアーカイブ・レイアウトを使用して、ファンクション・コードおよび依存関係をパッケージ化します。一般的なコード専用ファンクションの前提条件は、コード専用ファンクションの作成を参照してください。サポートされているPythonランタイム・バージョンおよびランタイム名については、コード専用関数でサポートされている言語を参照してください。

さらに、Pythonコードのみの関数をパッケージ化および作成するには、次のものが必要です:

  • Python開発環境。
  • Python関数モジュールおよびハンドラ関数。
  • パッケージディレクトリにインストールされる必要な Python依存関係。
  • 有効なPythonハンドラ値。

Pythonアーカイブの要件

Pythonコード専用関数の場合:

  • アーカイブには、ルート・レベルのfunction/ディレクトリが含まれている必要があります。
  • function/ディレクトリには、ハンドラ・モジュールとアプリケーション・ソース・コードが含まれます。
  • ルート・レベルのpython/ディレクトリはオプションで、Pythonの依存関係が含まれています。
  • ルート・レベルのresources/ディレクトリはオプションで、ランタイム・リソースが含まれます。
  • ルート・レベルのnative/ディレクトリは、マルチアーキテクチャのネイティブ依存性ユースケースでのみオプションです。
  • 単一アーキテクチャPython関数の場合、ルート・レベルのnative/は許可されません。
  • マルチアーキテクチャPython関数の場合、native/が存在する場合は、アーキテクチャ固有のネイティブ依存性ファイルをnative/fn-arch-x86/およびnative/fn-arch-arm/の下にのみ配置します。
  • ハンドラは必須です。
  • ハンドラは、<file>.<function>の形式を使用する必要があります。
  • ハンドラは、function/ディレクトリのPython関数を参照する必要があります。

Pythonハンドラ

ハンドラは、呼び出す Python関数を識別します。ハンドラは、function/ディレクトリのPythonファイルのPython関数を参照する必要があります。

次の書式を使用します:

<file>.<function>

たとえば、アーカイブにfunction/func.pyが含まれ、ハンドラ・ファンクションの名前がhandlerである場合、次を使用します。

func.handler

単一アーキテクチャのPythonアーカイブ

archive-root/
├── function/
    └── func.py
├── python/     # optional
└── resources/  # optional

ルール:

  • function/は必須です。
  • python/はオプションです。
  • resources/はオプションです。
  • native/は、単一アーキテクチャのPython関数では許可されません。
  • ハンドラは、function/ディレクトリのPython関数を参照する必要があります。

依存関係のないPythonソースをパッケージ化

mkdir -p build/archive/function
cp func.py build/archive/function/
cd build/archive
zip -r ../function.zip function/

ハンドラ:

func.handler

依存関係を持つPythonソースをパッケージ化

ZIPを作成する前に、依存関係をpython/ディレクトリにインストールします。

mkdir -p build/archive/function
mkdir -p build/archive/python
cp func.py build/archive/function/
python3 -m pip install -r requirements.txt -t build/archive/python
cd build/archive
zip -r ../function.zip function/ python/

リソースを使用する場合は、アーカイブ・ルートにresources/を含めます。

依存性のパッケージ化

OCI Functionsは、ファンクションの作成中にPython依存関係をダウンロードしません。関数を作成または更新する前に、必要な依存関係をアーカイブにパッケージ化します。

ノート

Python FDKは、コード専用関数の管理対象Pythonランタイムに含まれています。FDKをアーカイブにパッケージ化する必要はありません。別のFDKバージョンをpython/にパッケージ化すると、パッケージ化されたバージョンによって、ランタイムに含まれるFDKがオーバーライドされます。本番にデプロイする前に互換性を検証してください。

ネイティブ依存関係を持つPythonアーカイブ

Python関数は、.soファイルや特定のLinuxアーキテクチャ用に構築されたPythonホイールなどのコンパイル済ネイティブ・コードを含むパッケージに依存できます。

単一アーキテクチャPython関数の場合:

  • ルート・レベルのnative/は含めないでください。
  • 依存関係をpython/のすぐ下にパッケージ化します。
  • 依存関係が正しいLinuxプラットフォームおよびアーキテクチャ用に構築されていることを確認します。

単一アーキテクチャ・アプリケーションの場合、ネイティブ・コードとの依存関係を含むPythonの依存関係をpython/の下にパッケージ化します。

archive-root/
├── function/
    └── func.py
├── python/
    └── <python dependencies, including native dependencies for the application architecture>
└── resources/ # optional

マルチアーキテクチャPython関数の場合:

  • function/の下に共有ソースをパッケージ化します。
  • 必要に応じて、Pure-Pythonの依存関係をpython/の下にパッケージ化します。
  • アーキテクチャ固有のネイティブ依存関係のパッケージ化:
    • native/fn-arch-x86/
    • native/fn-arch-arm/
archive-root/
├── function/
    └──  func.py
├── python/      # optional pure-Python dependencies
├── resources/   # optional
└── native/
    ├── fn-arch-x86/
    └── fn-arch-arm/

ルール:

  • native/は、ファンクションがアーキテクチャ固有のネイティブ依存性を使用する場合にのみ必要です。
  • マルチアーキテクチャ・アプリケーションにnative/が存在する場合は、fn-arch-x86/とfn-arch-arm/の両方が含まれている必要があります。
  • ネイティブ依存性ファイルは、一致するアーキテクチャ・ディレクトリの下にのみ配置します。
  • function/は常に必須です。

Pythonランタイムの動作

Python FDKは、コード専用関数の管理対象Pythonランタイムに含まれています。ハンドラ・モジュール、アプリケーション・コードおよび必要な依存関係をアーカイブにパッケージ化します。

Pythonコード専用関数の作成

Pythonコード専用関数を作成するには、コード専用関数の作成の手順に従います。たとえば、コンソールを使用してPythonコード専用ファンクションを作成するには:

  1. 「アプリケーション」リスト・ページで、Pythonコード専用ファンクションを作成するアプリケーションを選択します。リストページまたはアプリケーションの検索に関するヘルプが必要な場合は、Listing Applicationsを参照してください。
  2. 「Functions」タブを選択します。

    「関数」リスト・ページが開きます。選択したアプリケーションのすべての関数が表に表示されます。

  3. 「アーカイブから作成」を選択し、ファイル・ソース、Pythonアーカイブ、サポートされているPythonランタイム、Pythonハンドラなど、Pythonコード専用関数の詳細を指定します。

    Pythonコード専用関数の場合、関数の作成時にハンドラを指定する必要があります。

  4. 必要に応じて、ファンクションの他の詳細を指定します(コードのみのファンクションの作成を参照)。
  5. 「作成」を選択してファンクションを作成します。

    Pythonコード専用関数が作成され、他の関数と同様に起動できます。

トラブルシューティング

エラー・コード 問題 おそらく原因 推奨される修正
400 function/がないため、アーカイブの検証に失敗する ソースファイルはZIPルートまたは間違ったフォルダにあります ハンドラおよびアプリケーション・コードをfunction/の下に配置します。
400 ハンドラの検証に失敗しました ハンドラが<file>.<function>形式ではありません func.handlerなどのハンドラを使用します。
400 ハンドラが見つかりません ハンドラ・ファイルまたは関数名がアーカイブと一致しません function/の下にモジュールと関数が存在することを確認します。
400 依存関係がないため、関数が失敗します 依存性はpython/の下にパッケージ化されませんでした ZIPを作成する前に、依存関係をpython/にインストールします。
400 ネイティブ依存関係に互換性がないため、関数は失敗します 依存関係はmacOS、Windows、または間違ったLinuxアーキテクチャ用に構築されました 正しいLinuxアーキテクチャの依存関係を構築またはダウンロードします。
400 単一アーキテクチャ・アーカイブが検証に失敗する ルート・レベルのnative/ディレクトリが存在します native/を削除します。python/の下に単一アーキテクチャの依存関係をパッケージ化します。
400 マルチアーキテクチャのネイティブ・アーカイブが検証に失敗する 1つのアーキテクチャ・ディレクトリがありません native/fn-arch-x86/とnative/fn-arch-arm/の両方を含めます。
400 ネイティブ・アーカイブの検証に失敗しました ファイルはnative/の直下に配置されました。 native/fn-arch-x86/またはnative/fn-arch-arm/の下にファイルを移動します。