ローカル・ソース・コードからの関数ワークロードの作成

IBM Cloud® Code Engine ( )CLI を使用すれば、ローカルワークステーション上のソースコードから直接、 Code Engine 関数を作成することができます。 function create (または fn create) コマンドを使用して、ローカル・ソースからコード・バンドルをビルドし、このビルドされたコード・バンドルを参照するように関数をデプロイします。

コード・バンドルは、関数コードを表すファイルの集合です。 このコード・バンドルは、ランタイム・コンテナーに注入されます。 コード・バンドルは Code Engine によって作成され、コンテナー・レジストリーに保管されるか、関数とともにインラインで保管されます。 コード・バンドルは、Open Container Initiative (OCI) 標準コンテナー・イメージではありません。

ローカルディレクトリからコードを取得するビルドを送信すると、ソースコードはアーカイブファイルにまとめられます。 Code Engine は、このコードアカウント IBM Cloud® Container Registry アカウント ネームスペースに自動的にアップロードし、このビルド済みコードバンドルを参照するように関数を作成してデプロイします。 ローカル・ビルドのIBM Cloud Container Registryのみをターゲットにすることができます。 このシナリオでは、関数の名前とローカルソースへのパスを指定するだけで済みます。 オプションの完全な一覧については、 ibmcloud ce fn create コマンドを参照してください。

イメージ・レジストリーにアクセスするために必要な許可については、イメージ・レジストリーの権限のセットアップを参照してください。

.gitignore ファイルと同様に動作する .ceignore ファイルを使用して、ソース・コード内の特定のファイル・パターンを無視することを選択できます。 たとえば、 Node.js 関数用の .ceignore ファイルの項目には、 node_modules.npm などが含まれる場合があります。 無視すべきファイルパターンのその他の例については、 GitHub の.gitignoreリポジトリを参照してください。

IBM Cloud® Container Registry このシナリオでは、これが必要です。

開始前に

ローカル・ソースを操作する前に、ソースがローカル・ワークステーション上のアクセス可能な場所にあることを確認してください。

CLI を使用してローカルのソースコードから関数を作成する

この例では、 main.js ファイルとして保存されている以下の Node.js コードを使用します。 独自のコードに置き換えることができます。

/**
 * The `main` function is the entry-point into the function.
 * It has one optional argument, which carries all the
 * parameters the function was invoked with.
*/
async function main(params) {
  // log environment variables available to the function
  console.log(process.env);
  // log Code Engine system headers available to the function
  console.log(params.__ce_headers);
  // log all parameters for debugging purposes
  console.log("params: "+params);
  // since functions are invoked through http(s), we return an HTTP response
  return {
      statusCode: 200,
      headers: { 'Content-Type': 'application/json' },
      body: params };
}
// this step is necessary, if you gave your main function a different name
// we include it here for documentation purposes only
module.exports.main = main;
  1. main.js ファイルが格納されているディレクトリーに移動するか、そのファイルへのパスを記録します。

  2. main.js ファイルをソースとして使用する myfun-local という関数を作成します。 このコマンドを実行すると、コードバンドルが自動的にビルドされ、 アカウント内の Container Registry ネームスペースにプッシュされます。 既存の Container Registry 名前空間がない場合は、Code Engine によって自動的に作成されます。

    ibmcloud ce fn create --name myfun-local --runtime nodejs --build-source main.js
    

    出力例

    Preparing function 'myfun-local' for build push...
    Creating function 'myfun-local'...
    Packaging files to upload from source path 'main.js'...
    Submitting build run 'myfun-local-run-230123-111011111'...
    Creating image 'icr.io/ce--abcde-glxo4kabcde/function-myfun-local:230123-1650-yrj86'...
    Waiting for build run to complete...
    Build run status: 'Running'
    Build run completed successfully.
    Run 'ibmcloud ce buildrun get -n myfun-local-run-230626-115011911' to check the build run status.
    Waiting for function 'myfun-local' to become ready...
    Function 'myfun-local' is ready.
    OK
    Run 'ibmcloud ce function get -n myfun-local' to see more details.
    https://myfun-local.glxo4kabcde.us-south.codeengine.test.appdomain.cloud
    

    function create コマンドの出力は、関数が作成される前のビルド実行の進行に関する情報を提供することに注意してください。

    この例では、ビルドされたコードバンドルが、 Container Registry にある「 ce--abcde-glxo4kabcde 」ネームスペースにアップロードされます。

    次の表は、この例で fn create コマンドで使用されるオプションをまとめたものです。 このコマンドとそのオプションの詳細については、 ibmcloud ce function create コマンドを参照してください。 これらのオプションは、ソースコードが存在する場所によって異なるため、ソースコードが例に一致する場所に存在することを確認してください。

    コマンドの説明
    オプション 説明
    --name 関数の名前。 プロジェクト内で固有の名前を使用します。 この値は必須です。
    -名前は小文字で始まる必要があります。
    -名前は小文字の英数字で終わる必要があります。
    -名前は 63 文字以下でなければならず、文字、数字、およびハイフン (-) を含めることができます。
    --build-source ローカル・ソースへのパス。 この値は必須です。
    --runtime この関数に使用するランタイム。 この値は必須です。
  3. **function get**コマンドを使用して、ビルドに関する情報など、アプリに関する情報を表示します。

    ibmcloud ce function get --name myfun-local
    

    出力例

    Getting function 'myfun-local'...
    OK
    Name:          myfun-local
    Project Name:  sample
    Project ID:    abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
    Age:           5m41s
    Created:       2023-06-26T16:50:14Z
    URL:           https://myfun-local.glxo4kabcde.us-south.codeengine.test.appdomain.cloud
    Status:        Ready
    Resources:
      CPU:                 0.25
      Memory:              500M
      Max Execution Time:  60 seconds
    Build Information:
      Build Run Name:     myfun-local-run-230123-111011111
      Build Type:         local
      Build Strategy:     codebundle-nodejs-22
      Timeout:            600
      Source:             main.js
      Build Run Summary:  Succeeded
      Build Run Status:   Succeeded
      Build Run Reason:   All Steps have completed executing
      Run 'ibmcloud ce buildrun get -n myfun-local-run-230123-111011111' for details.
    Function Code:
      Runtime:        nodejs-22 (managed)
      Bundle Secret:  ce-auto-icr-us-south
      Code Bundle:    cr://icr.io/ce--abcde-glxo4kabcde/function-myfun-local:230123-1650-yrj86
      Main:           main()
    

関数の依存関係の組み込み

さまざまなプログラミング言語で関数を作成できます。 機能コードが複雑になると、機能の依存関係としてコード・モジュールを追加できます。 各言語には、機能コードで使用する独自のモジュールがあります。 例えば、 Node.js 依存関係は通常、既存の npm モジュールですが、 Python は Python パッケージを使用します。 これらの依存関係は、ソース・コードを使用してファイル内で宣言および作成する必要があります。

Node.js 関数のモジュールの組み込み

package.json ファイルを作成して、特定の Node.js モジュールの依存関係を含む関数を作成します。 この場合、ソース・コードとパッケージ・ファイルの両方が同じフォルダーに置かれます。

  1. コードを main.js ファイルに記述して、ソース・コードを作成します。 例えば、以下のコード例を main.js というファイルにコピーします。

    /**
    * The `main` function is the entry-point into the function.
    * It has one optional argument, which carries all the
    * parameters the function was invoked with.
    */
    function main(params /* optional */) {
      // use third-party 'lorem-ipsum' package to generate random words
      const LoremIpsum = require("lorem-ipsum").LoremIpsum;
      const lorem = new LoremIpsum();
      // since functions are invoked through http(s), we return an HTTP response
      return {
        headers: { "Content-Type": "text/plain;charset=utf-8" },
        body: lorem.generateWords(10),
      };
    }
    // this step is necessary, if you gave your main function a different name
    // we include it here for documentation purposes only
    module.exports.main = main;
    
  2. 関数に必要な依存関係を含む package.json ファイルを作成します。 上記のコード例では、 package.json ファイルに以下の内容を使用します。

    {
      "name": "function",
      "version": "1.0.0",
      "main": "main.js",
      "dependencies" : {
    		    "lorem-ipsum" : "2.0.8"
     	}
    }
    
  3. Code Engineで関数としてファイルを作成します。 この場合は、ローカル・ファイルが存在するディレクトリーにいるため、 . をビルド・ソースとして使用できます。

    ibmcloud ce fn create --name nodelorem --runtime nodejs --build-source .
    
  4. 提供されている fn get コマンドを実行して、機能に関する詳細を確認します。

  5. URL をウェブブラウザに貼り付けて、関数を呼び出します。 ブラウザーに lorem ipsum のパッセージが表示されます。

fn create コマンドとそのオプションについて詳しくは、 関数の作成 を参照してください。

Python 関数のモジュールの組み込み

requirements.txt ファイルを作成して、特定の Python モジュールの依存関係を含む関数を作成します。 この場合、ソース・コードと要件ファイルの両方が同じフォルダーに配置されます。

  1. コードを __main__.py ファイルに保存して関数を作成します。

    # use third-party 'lorem-ipsum' package to generate random words
    from lorem_text import lorem
    # The `main` function is the entry-point into the function.
    # It has one optional argument, which carries all the
    # parameters the function was invoked with.
    def main(params):
        words = 10
        # since functions are invoked through http(s), we return an HTTP response
        return {
          "headers": {
            "Content-Type": "text/plain;charset=utf-8",
        },
        "body": lorem.words(words),
    }
    def main(params):
         words = 10
         return {
              "headers": {
                  "Content-Type": "text/plain;charset=utf-8",
              },
              "body": lorem.words(words),
          }
    
  2. 関数に必要な依存関係を含む requirements.txt を作成します。

    lorem-text
    
  3. Code Engineで関数としてファイルを作成します。 この場合は、ローカル・ファイルが存在するディレクトリーにいるため、 . をビルド・ソースとして使用できます。

    ibmcloud ce fn create --name pylorem --runtime python --build-source .
    
  4. 提供されている fn get コマンドを実行して、機能に関する詳細を確認します。

  5. URL をウェブブラウザに貼り付けて、関数を呼び出します。 ブラウザーに lorem ipsum のパッセージが表示されます。

fn create コマンドとそのオプションについて詳しくは、 関数の作成 を参照してください。

次のステップ

これで関数が作成され、ローカル・ソース・コードからデプロイされたので、 ibmcloud ce function update コマンドを使用して、必要に応じて関数を更新できます。 --build-source この関数で使用するためにソースを更新したい場合は、 function update コマンドでxml-ph-0000@deepl.internalオプションを指定する必要があります。

関数がローカル・ソースから、または CLI の リポジトリー・ソース・コード からデプロイされる場合、結果のビルド実行はビルド構成に基づきません。 完了したビルド実行は、最終的に自動的に削除されます。 ビルド構成に基づいていないビルド実行は、ビルド実行が成功した場合、1 時間後に削除されます。 ビルド実行が成功しなかった場合、このビルド実行は 24 時間後に削除されます。 CLI で表示できるのは、このビルド実行に関する情報のみです。 このビルドの実行をコンソールで見ることはできない。

コード・サンプルがさらに必要ですか? 「 IBM Cloud Code Engine 」 GitHub リポジトリのサンプルをご覧ください。