次の方法で共有


コンテナーとAzure Functionsを操作する

この記事では、Azure Container Apps環境で実行Azure Functionsコンテナー化された関数アプリに対して提供されるサポートについて説明します。 詳細については、「Azure Functions の Azure Container Apps ホスティング」を参照してください。

Important

Azure Container Appsで直接Azure Functionsを実行するための新しいホスティング方法が利用できるようになりました。 Azure Container Apps における Native Azure Functions のサポートを参照してください。 この統合により、Azure Container Appsのすべての機能を使用できます。 また、関数プログラミング モデルと、Azure Functionsによって提供される自動スケールの簡略化のメリットもあります。

ほとんどの新しいワークロードには、このアプローチをお勧めします。 詳細については、Azure Container AppsAzure Functions を参照してください。

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

この記事の上部にあるコンテナー化された関数アプリのホスティング環境を選択します。

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

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

Azure Container Appsへのデプロイの詳細については、Azure Container Apps Azure Functions

Important

この記事では現在、connection stringを使用して既定のstorage アカウントに接続する方法について説明します。 セキュリティを最大限に高めるために、代わりに、Microsoft Entra 認証を使用してAzure Storageへのマネージド ID ベースの接続を作成します。 詳細については、「接続」を参照してください。

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

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

Important

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

Functions チームは、これらのベースイメージの更新プログラムを毎月公開することに専念しています。 通常の更新プログラムには、Functions ランタイムと言語の両方について、最新のマイナー バージョンの更新プログラムとセキュリティ修正プログラムが含まれます。 最新の基本イメージからコンテナーを定期的に更新し、コンテナーの更新されたバージョンを再デプロイする必要があります。 詳しくは、「カスタム コンテナーのメンテナンス」をご覧ください。

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

Dockerfile を生成する

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

Dockerfile を作成する方法は、projectの作成方法によって異なります。

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

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

    func init --docker-only
    

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

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

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

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

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

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

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

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

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

新しいイメージを使用するように既存のデプロイを更新します。 Azure CLIを使用するか、Azure portalで新しいイメージを使用できるように関数アプリを更新します。

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 メニューまたは Home ページで、リソースの作成を選択します。

  2. [ 新規 ] ページで、[ Web>Function App] を選択します。

  3. [ホスティング オプションの選択] で、[Functions Premium>Select を選択します

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

  4. [ 基本 ] ページで、次の表に示すように関数アプリの設定を使用します。

    Setting 推奨値 Description
    Subscription あなたのサブスクリプション 関数アプリを作成するサブスクリプション。
    Resource Group myResourceGroup 関数アプリを作成する新しいリソース グループの名前。 既存のリソース グループに新しい関数アプリを作成するときの既知の制限があるため、リソース グループを作成する必要があります。
    関数アプリ名 アプリ名 新しい関数アプリを識別する名前。 有効な文字は、a-z (大文字と小文字の区別をしない)、0-9、および -です。
    安全な一意かつ既定のホスト名 Enabled アプリ名に関係なく、ドメイン名の競合を心配する必要がないように、この機能を有効にします。
    コードまたはコンテナー イメージをデプロイしますか? コンテナー イメージ レジストリからコンテナー化された関数アプリをデプロイします。 レジストリで関数アプリを作成するには、「 ローカル Linux コンテナーに関数アプリを作成する」を参照してください。
    Region 優先リージョン あなたや、関数がアクセスできる他のサービスに近い region を選択します。
    Linux プラン 新しいプラン (既定) アプリをホストする新しい Premium プランを作成します。 既存の Premium プランを選択することもできます。
    料金プラン エラスティックプレミアム EP1 EP1 は最もリーズナブルなプランです。 必要に応じて、より大きなプランを選択できます。
    ゾーン冗長性 Disabled 非運用アプリでは、この機能は必要ありません。
  5. Storage タブで新しいstorage アカウントを作成し、Monitoring タブに新しい Application Insight インスタンスを作成する既定のオプションをそのまま使用します。既存のstorage アカウントまたは Application Insights インスタンスを使用することもできます。

  6. Review + create を選択して、app configurationの選択内容を確認します。

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

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

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

Azure portalを使用してコンテナー化された関数アプリを作成する

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

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

  1. Azure portal メニューまたは Home ページで、リソースの作成を選択します。

  2. [ 新規 ] ページで、[ Web>Function App] を選択します。

  3. [ホスティング オプションの選択] で、[Container Apps 環境]>[選択] を選択します。

  4. [ 基本 ] ページで、次の表に示すように関数アプリの設定を使用します。

    Setting 推奨値 Description
    Subscription あなたのサブスクリプション 関数アプリを作成するサブスクリプション。
    Resource Group myResourceGroup 関数アプリを作成する新しいリソース グループの名前。 既存のリソース グループに新しい関数アプリを作成するときの既知の制限があるため、リソース グループを作成する必要があります。
    関数アプリ名 一意の名前* 新しい関数アプリを識別する名前。 有効な文字は、a-z (大文字と小文字の区別をしない)、0-9、および -です。
    Region 優先リージョン 自分や関数がアクセスできる他のサービスの近くの region を選択します。

    *アプリ名は、Azure Container Apps環境内で一意である必要があります。

  5. 引き続き Basics ページで、Azure Container Apps 環境 に推奨される新しい環境を受け入れます。 コストを最小限に抑えるために、新しい既定の環境は、従量課金 + 専用で作成され、ゾーン冗長性がない既定のワークロードプロファイルを使用します。 詳細については、「Azure Functions の Azure Container Apps ホスティング」を参照してください。

    既存の Container Apps 環境の使用を選択することもできます。 カスタム環境を作成するには、代わりに [ 新規作成] を選択します。 [Container Apps 環境の作成] ページでは、既定以外のワークロード プロファイルを追加したり、ゾーン冗長を有効にしたりできます。 環境の詳細については、Azure Container Apps 環境に関するページを参照してください。

  6. [ コンテナー ] タブを選択し、[ クイック スタート イメージの使用] の選択を解除します。 それ以外の場合、関数アプリは関数アプリ言語の基本イメージからデプロイされます。

  7. イメージの 種類 (パブリックまたはプライベート) を選択します。 Azure Container Registryまたはその他のプライベート レジストリを使用している場合は、Private を選択します。 レジストリ プレフィックスを含む イメージ 名を指定します。 プライベート レジストリを使用している場合は、イメージ レジストリの認証資格情報を指定します。 Public 設定では、Docker Hubにパブリックに格納されているイメージのみがサポートされます。

  8. [コンテナー リソース割り当て] で、目的の CPU コア数と使用可能なメモリを選択します。 環境に他のワークロード プロファイルが追加されている場合は、既定以外の ワークロード プロファイルを選択できます。 このページの選択肢は、アプリのホスティングのコストに影響します。 潜在的なコストの見積もりについては、Container Apps の価格に関するページを参照してください。

  9. Review + create を選択して、app configurationの選択内容を確認します。

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

Azure Functionsで画像を操作する

関数アプリ コンテナーがレジストリからデプロイされると、Functions はソース イメージに関する情報を保持します。

次のコマンドを使用して、イメージに関するデータを取得するか、使用されるデプロイのイメージを変更します。

コンテナー アプリのワークロード プロファイルを使用する

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

アプリに割り当てられる CPU およびメモリ リソースの量を設定することもできます。

Azure CLIまたはAzure portalを使用して、ワークロード プロファイルとリソース割り当ての両方を作成および管理できます。

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

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

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

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> を、storage アカウントの前のセクションで使用した名前に置き換えます。 また、<APP_NAME> を環境内で一意となる適切な名前に置き換えてください。

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

az functionapp container set コマンドを使用して、アプリによって使用される割り当てられたリソースとワークロード プロファイルを管理できます。

az functionapp container set --name <APP_NAME> --resource-group AzureFunctionsContainers-rg --workload-profile-name  <PROFILE_NAME> --cpu <CPU_COUNT> --memory <MEMORY_SIZE> 

アプリケーションの設定

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

Tip

既定では、コンテナー化された関数アプリは、受信要求がないかポート 80 を監視します。 アプリで別のポートを使用する必要がある場合は、 WEBSITES_PORT アプリケーション設定 を使用してこのポートを変更します。

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

Azure Container Appsでコンテナー化された関数アプリをホストする場合、ソース コード リポジトリから継続的デプロイを設定するには、次の 2 つの方法があります。

現在、コンテナー レジストリのイメージの変更に基づいてコンテナーを継続的にデプロイすることはできません。 代わりに、これらのソースコードベースの継続的デプロイメントパイプラインを使用する必要があります。

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

Important

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

Azure Pipelines または GitHub Actions を使用して、ソース コード リポジトリからの継続的デプロイを構成することもできます。

レジストリ内のイメージを更新するたびに、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> をお使いの関数アプリ名に置き換えます。

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

  2. Docker Hub を開き、サインインし、ナビゲーション バーの Repositories を選択します。 イメージを見つけて選択し、[ Webhook ] タブを選択し、 Webhook 名を指定して、 Webhook URL に URL を貼り付けて、[ 作成] を選択します。

    Docker Hub ウィンドウで webhook を追加する手順を示すスクリーンショット。

  3. webhookを設定すると、Azure FunctionsがDocker Hub でイメージを更新するたびにイメージを再デプロイします。

SSH 接続を有効にする

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

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

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

    この例では、Node.js バージョン 18 の基本イメージの SSH 対応バージョンを使用します。 Azure Functions基本イメージ repos にアクセスして、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. Azure portalで、関数アプリを見つけます。 左側のメニューで、 開発ツール>SSH を選択します。 [Go] \(移動) を選択します。 Azureがまだコンテナー イメージを更新している場合は、接続にしばらく時間がかかる場合があります。

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

    SSH セッションで実行されている Linux top コマンドを示すスクリーンショット。

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