コンテナーと 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 ホスティングに関するページを参照してください。
コンテナ化された関数アプリを作成する
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 で関数アプリを作成するときに、コンテナー レジストリ内のイメージから関数アプリをデプロイすることを選択できます。 コンテナー レジストリでコンテナー化された関数アプリを作成する方法については、「コンテナーでの関数アプリの作成」 を参照してください。
次の手順では、コンテナー レジストリから既存のコンテナー化された関数アプリを作成してデプロイします。
Azure portal のメニューまたは [ホーム] ページから [リソースの作成] を選択します。
[新規] ページで、 [計算]>、 [関数アプリ] の順に選択します。
[基本] ページで、下の表に指定されている関数アプリの設定を使用します。
設定 推奨値 説明 サブスクリプション 該当するサブスクリプション 関数アプリを作成するサブスクリプション。 リソース グループ myResourceGroup 関数アプリを作成する新しいリソース グループの名前。 既存のリソース グループに新しい関数アプリを作成するときの既知の制限があるため、リソース グループを作成する必要があります。 関数アプリ名 一意の名前* 新しい関数アプリを識別する名前。 有効な文字は、 a-z
(大文字と小文字の区別をしない)、0-9
、および-
です。コードまたはコンテナー イメージをデプロイしますか? コンテナー イメージ レジストリからコンテナー化された関数アプリをデプロイします。 レジストリで関数アプリを作成するには、ローカル コンテナーでの関数アプリの作成に関する記事を参照してください。 リージョン 優先リージョン 自分の近く、または関数がアクセスできる他のサービスの近くのリージョンを選択します。
*アプリ名は、Azure Functions ホストされているすべてのアプリの中でグローバルに一意である必要があります。
[ホスティング オプションとプラン] で、[Functions Premium] を選択します。
これにより、動的スケーリングをサポートする Premium プランで Azure Functions によってホストされる関数アプリが作成されます。 App Service プランで実行することもできますが、このような専用プランでは、関数アプリのスケーリングを管理する必要があります。
*アプリ名は、Azure Container Apps 環境内で一意である必要があります。 プレビューでは、すべてのリージョンがサポートされているわけではありません。 詳細については、「Container Apps ホスティングに関する考慮事項」 を参照してください。
[ホスティング オプションとプラン] で、[Azure Container Apps Environment プラン] を選択します。
これにより、関数アプリ コンテナーをホストする新しい Azure Container Apps Environment リソースが作成されます。 詳細については、「Azure Functions の Azure Container Apps ホスティング」を参照してください。
既定では、コストを最小限に抑えるために、ゾーン冗長のない従量課金プランで環境が作成されます。 既存の Container Apps 環境を選択することもできます。 環境の詳細については、「Azure Container Apps 環境」 を参照してください。
[ストレージ] タブで新しいストレージ アカウントを作成し、[監視] タブで新しい Application Insight インスタンスを作成する既定のオプションを受け入れます。既存のストレージ アカウントまたは Application Insights インスタンスを使用することもできます。
[デプロイ] タブを選択し、[クイックスタート イメージを使用する] の選択を解除します。 これを行わない場合、関数アプリは関数アプリ言語の基本イメージからデプロイされます。
[イメージの種類] としてパブリックまたはプライベートを選択します。 Azure Container Registryまたはその他のプライベート レジストリを使用している場合は、[プライベート] を選択します。 レジストリ プレフィックスを含む [イメージ] 名を指定します。 プライベート レジストリを使用している場合は、イメージ レジストリの認証資格情報を指定します。
[確認および作成] を選択して、アプリ構成の選択内容を確認します。
[確認と作成] ページで設定を確認し、[作成] を選択して関数アプリをプロビジョニングし、レジストリからコンテナー イメージをデプロイします。
Azure Functions でイメージを使用する
関数アプリ コンテナーがレジストリからデプロイされると、Functions はソース イメージに関する情報を保持します。 次のコマンドを使用して、イメージに関するデータを取得するか、使用されるデプロイのイメージを変更します。
az functionapp config container show
: デプロイに使用されるイメージに関する情報を返します。az functionapp config container set
: 前の例で示したように、レジストリ設定を変更するか、デプロイに使用されるイメージを更新します。
アプリケーションの設定
Azure Functions では、コンテナ化された関数アプリのアプリケーション設定を標準的な方法で操作できます。 詳細については、アプリケーション設定の使用に関する記事を参照してください。
Azure への継続的デプロイを有効にする
レジストリ内のイメージを更新するたびに、イメージのデプロイを Azure Functions に自動的に更新させることができます。
次のコマンドを使用して継続的デプロイを有効にし、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>
をお使いの関数アプリ名に置き換えます。デプロイの Webhook URL をクリップボードにコピーします。
[Docker Hub] を開いてサインインし、ナビゲーション バーの [リポジトリ] を選択します。 イメージを検索して選択し、[Webhooks] タブを選択します。次に、Webhook の名前を指定して、[Webhook URL] に URL を貼り付け、[作成] を選択します。
Webhook の設定後は、Docker Hub でイメージを更新するたびに、それが Azure Functions によって再デプロイされます。
SSH 接続を有効にする
SSH では、コンテナーとクライアント間の通信をセキュリティで保護できます。 SSH が有効になっている場合は、App Service Advanced Tools (Kudu) を使用してコンテナーに接続できます。 SSH を使用してコンテナーに簡単に接続できるように、Azure Functions には、SSH が既に有効になっている基本イメージが用意されています。 必要な作業は、Dockerfile を編集してから、イメージをリビルドして再デプロイするだけです。 その後、[高度なツール (Kudu)] を使用してコンテナーに接続することができます。
Dockerfile で、次の例に示すように、
FROM
命令の基本イメージに文字列-appservice
を追加します。FROM mcr.microsoft.com/azure-functions/node:4-node18-appservice
この例では、Node.js バージョン 18 の基本イメージの SSH 対応バージョンを使用します。 Azure Functions 基本イメージ リポジトリにアクセスして、SSH 対応の基本イメージを最新バージョンで使用していることを確認します。
docker build
コマンドを使用してイメージをリビルドします。次の例に示すように、<DOCKER_ID>
は、実際の Docker Hub アカウント ID に置き換えてください。docker build --tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 .
更新済みのイメージを Docker Hub にプッシュします。初回プッシュ時よりもはるかに短時間で済みます。 イメージの更新されたセグメントのみを今すぐアップロードする必要があります。
docker push <DOCKER_ID>/azurefunctionsimage:v1.0.0
Azure Functions によってイメージが自動的に関数アプリに再デプロイされます。この処理の所要時間は 1 分未満です。
ブラウザーで
https://<app_name>.scm.azurewebsites.net/
を開きます。<app_name>
は、一意の名前に置き換えてください。 この URL は、関数アプリ コンテナーの [高度なツール (Kudu)] エンドポイントです。自分の Azure アカウントにサインインし、 [SSH] を選択して、コンテナーとの接続を確立します。 Azure によるコンテナー イメージの更新がまだ行われている場合、接続に少し時間がかかる場合があります。
コンテナーとの接続が確立されたら、
top
コマンドを実行して、現在実行中のプロセスを表示します。
次の手順
次の記事では、コンテナーのデプロイと管理の詳細について説明しています。