すべてのプロダクト
Search
ドキュメントセンター

Function Compute:カスタムコンテナ関数の作成

最終更新日:Dec 05, 2024

Function Computeの標準ランタイムがビジネス要件を満たさない場合は、カスタムコンテナ関数を作成できます。 このトピックでは、Function ComputeコンソールまたはServerless Devsを使用してカスタムコンテナ関数を作成する方法について説明します。

使用上の注意

  • function Computeでカスタムコンテナ関数を作成するには、関数と同じリージョンにあり、同じアカウントに属するAlibaba Cloud Container Registryイメージを使用する必要があります。 Appleチップで実行されるMacコンピュータなど、ARMベースのチップで実行されるコンピュータの場合、イメージをビルドするときに、イメージのコンパイルプラットフォームをlinux/amd64として指定する必要があります。 たとえば、docker build -- platform linux/amd64 -t $IMAGE_NAMEを実行します。 "docker inspect" コマンドで参照できます。

  • Function Computeは、イメージリポジトリのデフォルトの仮想プライベートクラウド (VPC) IPアドレス、またはAlibaba cloud DNS PrivateZoneによって解決されたIPアドレスを使用して、container Registry Enterprise Editionのコンテナイメージのドメイン名を解決します。 次の項目は、シナリオを説明します。

    • シナリオ1: Container Registry Enterprise Editionインスタンスのアクセス制御ページの [Visit IP] 列のIPアドレスに対してデフォルト解決が表示されない場合、リスト内のすべてのIPアドレスはAlibaba Cloud DNS PrivateZoneによって自動的に解決されます。 この場合、任意のVPCを使用できます。

      image

    • シナリオ2: Container Registry Enterprise Editionインスタンスの [Access Control] ページの [Visit IP] 列に [Default Resolution] が表示されている場合、そのIPアドレスはデフォルトの解決済みVPC IPアドレスです。 たとえば、次の図に示す例では、最初のVPCを使用する必要があります。

      image

  • Container Registry Enterprise Editionインスタンスを使用する場合、非アクセラレーションイメージのみを選択できます。 関数のイメージ設定を更新するたびに、新しく選択された元のイメージに基づいて、最新のアクセラレーションイメージが生成されます。 アクセラレーションイメージが存在する場合、既存のイメージは上書きされます。 元の画像や高速化された画像は削除しないでください。 そうでない場合、関数呼び出しが影響を受けます。

  • 関数で設定されたイメージに変更が発生した場合は、関数をタイムリーに更新するようにしてください。 それ以外の場合、関数の呼び出しに失敗します。

    • 元の画像が存在することを確認してください。 それ以外の場合、関数はFailed状態になり、呼び出すことはできません。 Function Computeは、関数を自動的にキャッシュしてコールドスタートを加速します。 ただし、関数の呼び出しは、関数の元のイメージに依存します。

    • 関数で使用されるイメージが上書きされないようにしてください。 イメージダイジェストが上書きされた場合は、最新のイメージ情報を使用して関数を再デプロイします。 Function Computeは、関数設定の作成および更新時に選択したイメージバージョンのタグとダイジェストを記録します。 イメージバージョンが別のエンティティによって別のダイジェストに更新された場合、関数は呼び出されません。

始める前に

function Computeコンソールで関数を作成する

  1. Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。

  2. 上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、[関数の作成] をクリックします。

  3. [関数の作成] ページで、関数を作成する方法を選択し、画面の指示に従ってパラメーターを設定します。 パラメーターを設定したら、[作成] をクリックします。 各セクションのパラメータは次のとおりです。

    • 基本設定: 関数名を指定します。

    • コード: 関数の作成に使用するイメージを設定します。

      パラメーター

      説明

      ランタイム

      イメージを指定します。

      • サンプルイメージの使用: Function Computeの組み込みサンプルイメージを選択して、イメージ関数をすばやくデプロイします。

      • コンテナーレジストリイメージの使用: コンテナーレジストリイメージを使用します。 [コンテナーイメージ] の下の [コンテナーレジストリイメージの選択] をクリックします。 [コンテナーイメージの選択] パネルで、[コンテナーイメージインスタンス] および [コンテナーレジストリリポジトリ] パラメーターを設定します。 [イメージバージョン] 列のイメージの中から、目的のイメージを見つけて、[操作] 列の [選択] をクリックします。

        説明
        • 別のアカウントに属するContainer Registryのパブリックイメージを使用して関数を作成することはできません。

        • 関数で設定されたイメージに変更が発生した場合は、関数をタイムリーに更新するようにしてください。 それ以外の場合、関数の呼び出しに失敗します。 詳細については、「使用状況のメモ」をご参照ください。

        • Container Registry Enterprise Editionインスタンスを使用している場合は、非高速化イメージのみを選択できます。 元の画像または加速画像を削除しないでください。 そうでない場合、関数呼び出しが影響を受けます。 詳細については、「使用状況のメモ」をご参照ください。

        • Container Registry Enterprise Editionインスタンスを使用する場合、カスタムドメイン形式のイメージURLはサポートされません。

        • Container Registry Enterprise Edition (Standard EditionおよびAdvanced Edition) インスタンスで、インデックスのみモードでイメージアクセラレーションが有効になっているリポジトリのイメージを使用して関数を作成することはできません。

        • Container Registryがインデックス専用モード機能を導入した後、Container Registry Enterprise Edition (Basic Edition) インスタンスで新しく作成された高速イメージリポジトリから作成されたイメージは、関数の作成には使用できません。 ただし、Container Registry Enterprise Edition (Basic Edition) インスタンスの以前の高速化イメージリポジトリのイメージは、引き続き関数の作成に使用できます。 インデックスのみモードの詳細については、「コンテナーイメージのリソースをオンデマンドで読み込む」をご参照ください。

      Startupコマンド

      コンテナーの起動コマンドを指定します。 このパラメーターを設定しない場合は、イメージ内のENTRYPOINTまたはCMD命令が使用されます。

      リスナーポート

      コンテナーイメージ内のHTTPサーバーがリッスンするポートを指定します。 デフォルトのポートは9000です。

    • 詳細設定: 実行タイムアウト時間や関数のハンドラーなどの詳細設定を構成します。 次の表に、このセクションのパラメーターを示します。

      パラメーター

      説明

      GPUアクセラレーション

      ビジネス要件に基づいて、GPU高速化インスタンスを使用するかどうかを指定します。 デフォルトでは、GPUアクセラレーションインスタンスの代わりにエラスティックインスタンスが使用されます。 詳細については、「インスタンスタイプと使用モード」をご参照ください。 各インスタンスタイプの課金については、「課金の概要」をご参照ください。 有効な値:

      • GPUの有効化

      • GPUの無効化

      説明

      このパラメーターは、[イベント関数][Web関数] 、または [タスク関数] を選択した場合にのみ必要です。

      GPUタイプ

      GPUカードタイプを指定します。 詳細については、「インスタンスタイプと使用モード」をご参照ください。

      リソースプランの仕様

      • GPUの有効化

        ビジネス要件に基づいて、[GPUメモリサイズ] ドロップダウンリストからGPUメモリサイズを選択します。 Function Computeは、選択したGPUメモリサイズに基づいて、vCPU容量およびメモリ容量フィールドを自動設定します。 各GPUサイズには、特定のvCPUおよびメモリサイズのみが許可されます。

      • GPUの無効化

        ビジネス要件に基づいて、vCPU容量メモリ容量を指定します。

      リソースの課金については、「課金の概要」をご参照ください。

      説明

      vCPUとメモリ容量 (GB) の比率は、1:1から1:4でなければなりません。

      一時ディスクのサイズ

      ビジネス要件に基づいてディスクサイズを選択します。 Function Computeは、512 MBの空きディスク容量を提供します。 詳細については、「課金の概要」をご参照ください。

      実行タイムアウト期間

      関数実行のタイムアウト時間を指定します。 デフォルト値は60秒です。 最大値は86,400秒です。 このパラメーターを600秒に設定することを推奨します。

      説明

      関数の実行時間が指定されたタイムアウト時間を超えると、関数の実行に失敗します。 より長いタイムアウト制限が必要な場合は、テクニカルサポートのためにDingTalkグループ64970014484に参加してください。

      インスタンスの同時実行

      関数インスタンスの同時実行性を指定します。 詳細については、「インスタンス同時実行の設定」をご参照ください。

      タイムゾーン

      関数のタイムゾーンを指定します。 関数のタイムゾーンを選択すると、その関数に環境変数TZが自動的に追加されます。 変数の値は、選択したタイムゾーンです。

      関数の役割

      コードロジックが他のAlibaba Cloudサービスにアクセスする必要がある場合は、関数のロールを作成し、ロールに最低限必要な権限を付与します。 詳細については、「他のAlibaba Cloudサービスへのアクセス権限付与」をご参照ください。

      VPCへのアクセス

      VPCリソースへのアクセスを許可するかどうかを指定します。 詳細については、「ネットワーク設定の構成」をご参照ください。

      [VPC]

      このパラメーターは、[VPCへのアクセス][はい] に設定した場合に必要です。 VPCを作成するか、ドロップダウンリストからアクセスする既存のVPCのIDを選択します。

      vSwitch

      このパラメーターは、[VPCへのアクセス][はい] に設定した場合に必要です。 vSwitchを作成するか、ドロップダウンリストから既存のvSwitchのIDを選択します。

      [セキュリティグループ]

      このパラメーターは、[VPCへのアクセス][はい] に設定した場合に必要です。 セキュリティグループを作成するか、ドロップダウンリストから既存のセキュリティグループを選択します。

      デフォルトNICによるインターネットへのアクセス許可

      デフォルトのネットワークインターフェースコントローラ (NIC) からインターネットへのアクセスを許可するかどうかを指定します。 [いいえ] を選択した場合、関数はfunction ComputeのデフォルトNICを介してインターネットにアクセスできません。

      重要

      静的パブリックIPアドレスを使用する場合は、[デフォルトNICからインターネットへのアクセスを許可] を [いいえ] に設定する必要があります。 それ以外の場合、設定された静的パブリックIPアドレスは有効になりません。 詳細については、「静的パブリックIPアドレスの設定」をご参照ください。

      ロギング

      ロギング機能を有効にするかどうかを指定します。 有効な値:

      • 有効化: ロギング機能を有効にします。 ログ機能を有効にすると、関数呼び出しログを表示できます。関数呼び出しログはSimple Log Serviceに保存され、ビジネス要件に基づいて照会できます。

      • 無効: ロギング機能を有効にしません。

    • 環境変数: 関数のランタイムで環境変数を設定します。 詳細については、「環境変数の設定」をご参照ください。

    関数の作成後、関数リストで関数を表示および更新できます。

説明

作成後に関数を更新すると、指定したリスニングポートを変更できます。 ただし、追加のリスニングポートを削除または追加することはできません。 関数の作成時にリスニングポートを指定した場合、別のリスニングポートを指定しないと、関数の更新時にリスニングポートが保持されます。

Serverless Devsを使用して関数を作成する

Serverless Devsを使用して、数回クリックするだけで、コンテナーイメージをビルドおよびプッシュし、関数をデプロイできます。

  1. 次のコマンドを実行してプロジェクトを初期化します。

    sudo s init

    表示されるページで、Alibaba Cloudアカウント、カスタムコンテナテンプレート、およびプログラミング言語を指定します。 この例では、Node.js を使用します。 プロジェクト名、プロジェクトが展開されるリージョンを設定し、Container Registryイメージを入力します。

  2. 次のコマンドを実行して、プロジェクトディレクトリに移動します。

    cd start-fc3-custom-container-nodejs
  3. s.yamlファイルを編集します。 YAMLファイルのパラメーターの詳細については、「YAML構文」をご参照ください。

    次のサンプルコードは、例を示しています。

    この例では、imageはContainer Registryイメージを示します。 <your namespace> 、<your image> 、および <your tag> を実際の値に置き換えます。 ステップ1でイメージを正しく設定した場合、ここで値を変更する必要はありません。

    edition: 3.0.0
    name: hello-world-app
    # access specifies the key information required by the current application.
    # For information about how to configure keys, visit https://www.serverless-devs.com/serverless-devs/command/config.
    # For more information about the sequence of keys, visit https://www.serverless-devs.com/serverless-devs/tool#.
    access: "default"
    
    vars: # The global variables
      region: "cn-hangzhou"
    
    resources:
      hello_world:
        # If you want to perform operations only on hello_world, you can add hello_world to the command line. Example:
        # Only build hello_world: s hello_world build.
        # If you run the s build command without adding hello_world, Serverless Devs performs the build operations on all business modules that are at the same level as hello_world in the current YAML file, such as the next_function module in the following comment.
        component: fc3 # The name of the component.
        actions: # The custom execution logic
          pre-deploy: # Run before deployment.
            - component: fc3 build --dockerfile ./code/Dockerfile  # The component to be run, which follows the "component: Component name Command Parameter" format.
        props:
          region: ${vars.region} # For more information about how to use variables, visit https://docs.serverless-devs.com/serverless-devs/yaml#%E5%8F%98%E9%87%8F%E8%B5%8B%E5%80%BC.
          functionName: "start-nodejs-ufrz"
          runtime: "custom-container"
          description: 'hello world by serverless devs'
          timeout: 30
          memorySize: 512
          cpu: 0.5
          diskSize: 512
          code: ./code
          customContainerConfig:
            image: 'registry.${vars.region}.aliyuncs.com/<your namespace>/<your image>:<your tag>'  # Your Container Registry image. Replace <your namespace>, <your image>, and <your tag> with the actual values.
          # triggers:
          #   - triggerName: httpTrigger # The trigger name.
          #     triggerType: http # The trigger type.
          #     description: 'xxxx'
          #     qualifier: LATEST # The function version.
          #     triggerConfig:
          #       authType: anonymous # The authentication type. Valid values: anonymous and function.
          #       disableURLInternet: false # Specifies whether to disable access to the URL over the Internet.
          #       methods: # The access methods supported by the HTTP trigger. Valid values: GET, POST, PUT, DELETE, and HEAD.
          #         - GET
          #         - POST
  4. 次のコマンドを実行して、プロジェクトをデプロイします。

    sudo s deploy

    次の出力が返されます。

      Steps for [deploy] of [hello-world-app]
    ====================
    
    DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
                BuildKit is currently disabled; enable it by removing the DOCKER_BUILDKIT=0
                environment-variable.
    
    Sending build context to Docker daemon   5.12kB
    Step 1/7 : FROM node:14-buster
    14-buster: Pulling from library/node
    2ff1d7c41c74: Already exists 
    b253aeafeaa7: Already exists 
    3d2201bd995c: Already exists 
    1de76e268b10: Already exists 
    d9a8df589451: Already exists 
    6f51ee005dea: Already exists 
    5f32ed3c3f27: Already exists 
    0c8cc2f24a4d: Already exists 
    0d27a8e86132: Already exists 
    Digest: sha256:a158d3b9b4e3fa813fa6c8c590b8f0a860e015ad4e59bbce5744d2f6fd8461aa
    Status: Downloaded newer image for node:14-buster
     ---> 1d12470fa662
    Step 2/7 : WORKDIR /usr/src/
     ---> Running in 70a8e2e4d1ea
    Removing intermediate container 70a8e2e4d1ea
     ---> 0d67b8fa2901
    Step 3/7 : COPY package*.json ./
     ---> 09eb15f8770a
    Step 4/7 : RUN npm install
     ---> Running in 8ae492be973b
    Step 5/7 : COPY . .
     ---> 7560c7b14431
    Step 6/7 : EXPOSE 9000
     ---> Running in 66b38e54ced0
    Removing intermediate container 66b38e54ced0
     ---> f73cce48d2ae
    Step 7/7 : ENTRYPOINT [ "node", "server.js" ]
     ---> Running in 2fb2f83fd6c0
    Removing intermediate container 2fb2f83fd6c0
     ---> fe51ae71448c
    Successfully built fe51ae71448c
    Successfully tagged registry.cn-hangzhou.aliyuncs.com/z****/z****:latest
    
    [2024-01-29 16:33:06][INFO][hello_world] get instanceName= and region=cn-hangzhou from registry.cn-hangzhou.aliyuncs.com/z****/z****
    [2024-01-29 16:33:06][INFO][hello_world] try to docker push registry.cn-hangzhou.aliyuncs.com/z****/z**** ...
    
    WARNING!  Your password will be stored unencrypted in /root/.docker/config.json.
    Configure a credential helper to remove this warning. See
    https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    
    Login Succeeded
    
    
    Using default tag: latest
    The push refers to repository [registry.cn-hangzhou.aliyuncs.com/z****/z****]
    85c1ec915b45: Pushed 
    37c36543a431: Pushed 
    e4afd7f70434: Pushed 
    0d5f5a015e5d: Layer already exists 
    3c777d951de2: Layer already exists 
    f8a91dd5fc84: Layer already exists 
    cb81227abde5: Layer already exists 
    e01a454893a9: Layer already exists 
    c45660adde37: Layer already exists 
    fe0fb3ab4a0f: Layer already exists 
    f1186e5061f2: Layer already exists 
    b2dba7477754: Layer already exists 
    latest: digest: sha256:6bf1ed4119d197a46c99082577632957056cb625f2ee0276d2af53f60d22837d size: 2841
    
    
    
      [hello_world] completed (688.45s)
    
      Result for [deploy] of [hello-world-app]
    ====================
    region:                cn-hangzhou
    cpu:                   0.5
    customContainerConfig: 
      image:            registry.cn-hangzhou.aliyuncs.com/z****/z****
      resolvedImageUri: registry.cn-hangzhou.aliyuncs.com/z****/z****@sha256:6bf1ed4119d197a46c99082577632957056cb625f2ee0276d2af53f60d22837d
    description:           hello world by serverless devs
    diskSize:              512
    functionName:          start-nodejs-ufrz
    handler:               handler
    instanceConcurrency:   1
    internetAccess:        true
    lastUpdateStatus:      Successful
    memorySize:            512
    role:                  
    runtime:               custom-container
    state:                 Active
    timeout:               30
    
    A complete log of this run can be found in: /root/.s/logs/0129162246
  5. 次のコマンドを実行して、関数をデバッグします。

    sudo s invoke -e "{\"key\":\"val\"}"

    次の出力が返されます。

     Steps for [invoke] of [hello-world-app]
    ====================
    ========= FC invoke Logs begin =========
    FC Invoke Start RequestId: 1-65b764db-15eb737f-0c67ab5cd968
    FC Invoke Start RequestId: 1-65b764db-15eb737f-0c67ab5cd968
    hello world!
    
    FC Invoke End RequestId: 1-65b764db-15eb737f-0c67ab5cd968
    
    Duration: 42.27 ms, Billed Duration: 43 ms, Memory Size: 512 MB, Max Memory Used: 47.77 MB
    ========= FC invoke Logs end =========
    
    Invoke instanceId: c-65b764db-15fa2aa8-bc50f7839399
    Code Checksum: undefined
    Qualifier: LATEST
    RequestId: 1-65b764db-15eb737f-0c67ab5cd968
    
    Invoke Result:
    OK
      [hello_world] completed (4.96s)
    
    A complete log of this run can be found in: /root/.s/logs/0129164202

関連ドキュメント

  • カスタムコンテナ関数を使用する場合、コンテナイメージが依存する基本環境では、データのダウンロードと解凍に時間がかかります。 コールドスタートを加速する方法については、「コールドスタートの待ち時間を短縮するためのベストプラクティス」をご参照ください。

  • Function Compute APIを呼び出して関数を作成することもできます。 詳細については、「CreateFunction」をご参照ください。

  • 一般的なシナリオと組み込みランタイム、カスタムランタイム、およびCustomer Containerランタイムの違いについては、「関数を作成するメソッドの選択」をご参照ください。