コンテナーと Azure Functions を使用する

この記事では、Azure Container Apps 環境で実行されている関数アプリを操作するために Azure Functions が提供するサポートについて説明します。 Container Apps での関数アプリのホスティングのサポートは、現在プレビュー段階です。 詳細については、「Azure Functions の Azure Container Apps ホスティング」を参照してください。

この記事では、Linux コンテナーで実行されている関数アプリを操作するために Azure Functions が提供するサポートについて説明します。

記事の冒頭で、お使いのコンテナ化された関数アプリのホスティング環境を選択してください。

すぐに始めたい場合は、次の記事で、Linux コンテナーで実行されている最初の関数を作成する方法と、コンテナー レジストリからサポートされている Azure ホスティング サービスにイメージをデプロイする方法を確認できます。

Azure Container Apps で最初のコンテナ化された Azure Functions を作成する

Azure Container Apps へのデプロイの詳細については、Azure Functions の Azure Container Apps ホスティングに関するページを参照してください。

コンテナ化された関数アプリを作成する

Functions を使用すると、作成して管理する Linux コンテナーとして関数アプリを簡単にデプロイして実行できます。 Functions では、コンテナー化された関数アプリを作成するときに使用できる言語固有の基本イメージのセットが保持されます。

重要

独自のコンテナーを作成する場合は、コンテナーの基本イメージを、サポートされている最新の基本イメージに更新しておく必要があります。 Azure Functions でサポートされている基本イメージは言語固有であり、Azure Functions 基本イメージ リポジトリにあります。

Functions チームは、これらの基本イメージの毎月の更新プログラムを公開できるよう取り組んでいます。 通常の更新プログラムには、Functions ランタイムと言語の両方について、最新のマイナー バージョンの更新プログラムとセキュリティ修正プログラムが含まれます。 最新の基本イメージからコンテナーを定期的に更新し、コンテナーの更新されたバージョンを再デプロイする必要があります。

コマンド ラインからローカルのコンテナー化された関数アプリを作成し、そのイメージをコンテナー レジストリに発行する方法の完全な例については、ローカル コンテナーでの関数アプリの作成に関する記事を参照してください。

Dockerfile を生成する

Functions ツールには、関数コード プロジェクトと共に Dockerfile を生成する Docker オプションが用意されています。 このファイルを Docker で使用すると、正しい基本イメージ (言語とバージョン) から派生したコンテナーに関数を作成できます。

Dockerfile を作成する方法は、プロジェクトの作成方法によって異なります。

  • Azure Functions Core Tools を使用して Functions プロジェクトを作成する場合は、次の例のように、func init コマンドを実行するときに --docker オプションを含めます。

    func init --docker
    
  • 次の例のように、既存のプロジェクト フォルダーで func init コマンドを実行するときに --docker-only オプションを使用することで、既存のプロジェクトに Dockerfile を追加することもできます。

    func init --docker-only
    

完全な例については、ローカル コンテナーでの関数アプリの作成に関する記事を参照してください。

コンテナーでの関数アプリの作成

コード プロジェクトに Core Tools によって生成された Dockerfile があれば、Docker を使用して、ローカル コンピューター上にコンテナー化された関数アプリを作成できます。 次の docker build コマンドを使用すると、ローカル ディレクトリ内のプロジェクトからコンテナー化された関数のイメージが作成されます。

docker build --tag <DOCKER_ID>/<IMAGE_NAME>:v1.0.0 .

コンテナーを作成する方法の例については、「コンテナー イメージをビルドしてローカルで検証する」を参照してください。

レジストリ内のイメージを更新する

関数コード プロジェクトに変更を加えたり、最新の基本イメージを更新したりする必要がある場合は、コンテナーをローカルで再構築し、選択したコンテナー レジストリに更新されたイメージを再発行する必要があります。 次のコマンドを使用すると、更新されたバージョン番号でルート フォルダーからのイメージが再構築され、レジストリにプッシュされます。

az acr build --registry <REGISTRY_NAME> --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.1 .

<REGISTRY_NAME> を Container Registry インスタンスに置き換え、<LOGIN_SERVER> をログイン サーバー名に置き換えます。

この時点で、新しいイメージを使用するにはデプロイを更新する必要があります。 次の例では、新しいイメージを使用するよう関数アプリを更新しています。

az functionapp config container set --image <IMAGE_NAME> --registry-password <SECURE_PASSWORD>--registry-username <USER_NAME> --name <APP_NAME> --resource-group <RESOURCE_GROUP>

この例では、<IMAGE_NAME> は新しいイメージのバージョンを含んだフル ネームです。 プライベート レジストリでは、ユーザー名とパスワードを指定する必要があります。 これらの資格情報は安全に保存します。

継続的デプロイを有効にすることも検討する必要があります。

コンテナーを使用した Azure portal での作成

Azure portal で関数アプリを作成するときに、コンテナー レジストリ内のイメージから関数アプリをデプロイすることを選択できます。 コンテナー レジストリでコンテナー化された関数アプリを作成する方法については、「コンテナーでの関数アプリの作成」 を参照してください。

次の手順では、コンテナー レジストリから既存のコンテナー化された関数アプリを作成してデプロイします。

  1. Azure portal のメニューまたは [ホーム] ページから [リソースの作成] を選択します。

  2. [新規] ページで、 [計算]>、 [関数アプリ] の順に選択します。

  3. [基本] ページで、下の表に指定されている関数アプリの設定を使用します。

    設定 提案された値 説明
    サブスクリプション 該当するサブスクリプション 関数アプリを作成するサブスクリプション。
    リソース グループ myResourceGroup 関数アプリを作成する新しいリソース グループの名前。 既存のリソース グループに新しい関数アプリを作成するときの既知の制限があるため、リソース グループを作成する必要があります。
    関数アプリ名 一意の名前* 新しい関数アプリを識別する名前。 有効な文字は、a-z (大文字と小文字の区別をしない)、0-9、および -です。
    コードまたはコンテナー イメージをデプロイしますか? コンテナー イメージ レジストリからコンテナー化された関数アプリをデプロイします。 レジストリで関数アプリを作成するには、ローカル コンテナーでの関数アプリの作成に関する記事を参照してください。
    リージョン 優先リージョン 自分の近く、または関数がアクセスできる他のサービスの近くのリージョンを選択します。

*アプリ名は、Azure Functions でホストされているすべてのアプリ間でグローバルに一意である必要があります。

  1. [ホスティング オプションとプラン] で、[Functions Premium] を選択します。

    Screenshot of the Basics tab in the Azure portal when creating a function app for hosting a container in a Functions Premium plan.

    これにより、動的スケーリングをサポートする Premium プランで Azure Functions によってホストされる関数アプリが作成されます。 App Service プランで実行することもできますが、このような専用プランでは、関数アプリのスケーリングを管理する必要があります。

*アプリ名は、Azure Container Apps 環境内で一意である必要があります。 プレビューでは、すべてのリージョンがサポートされているわけではありません。 詳細については、「Container Apps ホスティングに関する考慮事項」 を参照してください。

  1. [ホスティング オプションとプラン] で、[Azure Container Apps Environment プラン] を選択します。

    Portal create Basics tab for a containerized function app hosted in Azure Container Apps.

    これにより、関数アプリ コンテナーをホストする新しい Azure Container Apps Environment リソースが作成されます。 詳細については、「Azure Functions の Azure Container Apps ホスティング」を参照してください。

    既定では、コストを最小限に抑えるために、ゾーン冗長のない従量課金プランで環境が作成されます。 既存の Container Apps 環境を選択することもできます。 環境の詳細については、「Azure Container Apps 環境」 を参照してください。

  1. [ストレージ] タブで新しいストレージ アカウントを作成し、[監視] タブで新しい Application Insight インスタンスを作成する既定のオプションを受け入れます。既存のストレージ アカウントまたは Application Insights インスタンスを使用することもできます。
  1. [デプロイ] タブを選択し、[クイックスタート イメージを使用する] の選択を解除します。 これを行わない場合、関数アプリは関数アプリ言語の基本イメージからデプロイされます。

  2. [イメージの種類] としてパブリックまたはプライベートを選択します。 Azure Container Registryまたはその他のプライベート レジストリを使用している場合は、[プライベート] を選択します。 レジストリ プレフィックスを含む [イメージ] 名を指定します。 プライベート レジストリを使用している場合は、イメージ レジストリの認証資格情報を指定します。

  3. [確認および作成] を選択して、アプリ構成の選択内容を確認します。

  4. [確認と作成] ページで設定を確認し、[作成] を選択して関数アプリをプロビジョニングし、レジストリからコンテナー イメージをデプロイします。

  1. [確認および作成] を選択して、アプリ構成の選択内容を確認します。

  2. [確認と作成] ページで設定を確認した後、[作成] を選択して、既定の基本イメージを使用して関数アプリをプロビジョニングします。

  3. 関数アプリ リソースが作成されたら、[リソースに移動] を選択し、関数アプリ ページで [デプロイ センター] を選択します。

  4. [デプロイ センター] で、イメージのソースとしてコンテナー レジストリを接続できます。 また、レジストリ内のコンテナーへの更新プログラムのより堅牢な継続的デプロイのために、GitHub Actions または Azure Pipelines を有効にすることもできます。

Azure Functions でイメージを使用する

関数アプリ コンテナーがレジストリからデプロイされると、Functions はソース イメージに関する情報を保持します。 次のコマンドを使用して、イメージに関するデータを取得するか、使用されるデプロイのイメージを変更します。

Container Apps のワークロード プロファイル

ワークロード プロファイルは、デプロイ リソースをより適切に制御できるようにする Container Apps の機能です。 また、Azure Container Apps 上の Azure Functions でもワークロード プロファイルがサポートされています。 詳細については、「Azure Container Apps のワークロード プロファイル」を参照してください。

ワークロード プロファイルは、Azure CLI を使用して、または Azure portal で作成および管理できます。

ワークロード プロファイルは、コンテナー アプリ環境を作成するときに有効にします。 例については、「プロファイルでコンテナー アプリを作成する」を参照してください。

環境内のプロファイルを追加、編集、削除できます。 例については、「プロファイルを追加する」を参照してください。

ワークロード プロファイルが有効になっている環境でコンテナー化された関数アプリを作成する場合は、実行するプロファイルも指定する必要があります。 これは、次の例のように、az functionapp create コマンドの --workload-profile-name パラメーターを使用して行います。

az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime <LANGUAGE_STACK> --image <IMAGE_URI>  --workload-profile-name  PROFILE_NAME> --cpu <CPU_COUNT> --memory <MEMORY_SIZE> 

az functionapp create コマンドで、--environment パラメーターは Container Apps 環境を指定し、--image パラメーターは関数アプリに使用するイメージを指定します。 この例では、<STORAGE_NAME> を、前のセクションで使用したストレージ アカウントの名前に置き換えます。 また、<APP_NAME> を、ユーザーに適したグローバルに一意の名前に置き換えます。

また、<CPU_COUNT> を目的の仮想 CPU の数 (最小 0.5 からプロファイルによって許可される最大まで) に置き換えます。 <MEMORY_SIZE> の場合は、1 GB からプロファイルによって許可される最大までの専用メモリの量を選択します。

アプリケーションの設定

Azure Functions では、コンテナ化された関数アプリのアプリケーション設定を標準的な方法で操作できます。 詳細については、アプリケーション設定の使用に関する記事を参照してください。

Azure への継続的デプロイを有効にする

重要

Elastic Premium プランでコンテナーを実行するとき、Webhook ベースのデプロイは現在サポートされていません。 このセクションで説明する継続的デプロイ方法を使用する必要がある場合は、そうではなく、App Service プランにコンテナーをデプロイしてください。 Elastic Premium プランで実行すると、リポジトリ内のコンテナーを更新するたびに、アプリを手動で再起動する必要があります。

レジストリ内のイメージを更新するたびに、イメージのデプロイを Azure Functions に自動的に更新させることができます。

  1. 次のコマンドを使用して継続的デプロイを有効にし、Webhook URL を取得します。

    az functionapp deployment container config --enable-cd --query CI_CD_URL --output tsv --name <APP_NAME> --resource-group AzureFunctionsContainers-rg
    

    az functionapp deployment container config コマンドは、継続的デプロイを有効にして、デプロイの Webhook URL を返します。 この URL は、後から az functionapp deployment container show-cd-url コマンドを使用していつでも取得できます。

    これまでと同様に、<APP_NAME> をお使いの関数アプリ名に置き換えます。

  2. デプロイの Webhook URL をクリップボードにコピーします。

  3. [Docker Hub] を開いてサインインし、ナビゲーション バーの [リポジトリ] を選択します。 イメージを検索して選択し、[Webhooks] タブを選択します。次に、Webhook の名前を指定して、[Webhook URL] に URL を貼り付け、[作成] を選択します。

    Screenshot showing how to add the webhook in your Docker Hub window.

  4. Webhook の設定後は、Docker Hub でイメージを更新するたびに、それが Azure Functions によって再デプロイされます。

SSH 接続を有効にする

SSH では、コンテナーとクライアント間の通信をセキュリティで保護できます。 SSH が有効になっている場合は、App Service Advanced Tools (Kudu) を使用してコンテナーに接続できます。 SSH を使用してコンテナーに簡単に接続できるように、Azure Functions には、SSH が既に有効になっている基本イメージが用意されています。 必要な作業は、Dockerfile を編集してから、イメージをリビルドして再デプロイするだけです。 その後、[高度なツール (Kudu)] を使用してコンテナーに接続することができます。

  1. Dockerfile で、次の例に示すように、FROM 命令の基本イメージに文字列 -appservice を追加します。

    FROM mcr.microsoft.com/azure-functions/node:4-node18-appservice
    

    この例では、Node.js バージョン 18 の基本イメージの SSH 対応バージョンを使用します。 Azure Functions 基本イメージ リポジトリにアクセスして、SSH 対応の基本イメージを最新バージョンで使用していることを確認します。

  2. docker build コマンドを使用してイメージをリビルドします。次の例に示すように、<DOCKER_ID> は、実際の Docker Hub アカウント ID に置き換えてください。

    docker build --tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 .
    
  3. 更新済みのイメージを Docker Hub にプッシュします。初回プッシュ時よりもはるかに短時間で済みます。 イメージの更新されたセグメントのみを今すぐアップロードする必要があります。

    docker push <DOCKER_ID>/azurefunctionsimage:v1.0.0
    
  4. Azure Functions によってイメージが自動的に関数アプリに再デプロイされます。この処理の所要時間は 1 分未満です。

  5. ブラウザーで https://<app_name>.scm.azurewebsites.net/ を開きます。<app_name> は、一意の名前に置き換えてください。 この URL は、関数アプリ コンテナーの [高度なツール (Kudu)] エンドポイントです。

  6. 自分の Azure アカウントにサインインし、 [SSH] を選択して、コンテナーとの接続を確立します。 Azure によるコンテナー イメージの更新がまだ行われている場合、接続に少し時間がかかる場合があります。

  7. コンテナーとの接続が確立されたら、top コマンドを実行して、現在実行中のプロセスを表示します。

    Screenshot that shows Linux top command running in an SSH session.

次のステップ

次の記事では、コンテナーのデプロイと管理の詳細について説明しています。