次の方法で共有


Azure でパッケージ ファイルから関数を実行する

Azure では、関数アプリのデプロイ パッケージ ファイルから、関数を直接実行できます。 他のオプションは、関数アプリの c:\home\site\wwwroot (Windows) または /home/site/wwwroot (Linux) ディレクトリ内のファイルをデプロイすることです。

この記事では、パッケージから関数を実行するメリットについて説明します。 関数アプリでこの機能を有効にする方法も示します。

パッケージ ファイルから実行することのメリット

パッケージ ファイルからの関数の実行には、複数のメリットがあります。

  • ファイル コピー ロック問題のリスクを軽減します。
  • 運用環境のアプリにデプロイできます (再起動が必要です)。
  • アプリで実行されるファイルを検証します。
  • Azure Resource Manager デプロイのパフォーマンスが向上します。
  • 特に大規模な npm パッケージのツリーを利用する JavaScript 関数の場合は、コールド スタート時間を短縮します。

詳細については、こちらのお知らせをご覧ください。

パッケージから関数を実行できるようにする

関数アプリをパッケージから実行できるようにするには、WEBSITE_RUN_FROM_PACKAGE アプリ設定を関数アプリに追加します。 WEBSITE_RUN_FROM_PACKAGE アプリ設定には次のいずれかの値を指定できます。

Value 説明
1 関数アプリが、その c:\home\data\SitePackages (Windows) または /home/data/SitePackages (Linux) フォルダーにデプロイされたローカル パッケージ ファイルから実行されることを示します。
<URL> 実行する特定のパッケージ ファイルのリモートの場所を示す URL を設定します。 Linux で動作する従量課金プランの関数アプリには必須です。

次の表は、特定のオペレーティング システムとホスティング プランに対するデプロイで推奨される WEBSITE_RUN_FROM_PACKAGE 値を示しています。

ホスティング プラン Windows Linux
従量課金プラン 1 が強く推奨されます。 サポートされるのは <URL> のみです。
Premium 1 が推奨されます。 1 が推奨されます。
専用 1 が推奨されます。 1 が推奨されます。

一般的な考慮事項

  • パッケージ ファイルは .zip 形式になっている必要があります。 tar および gzip 形式はサポートされていません。
  • zip デプロイをお勧めします。
  • 関数アプリを Windows にデプロイするときは、WEBSITE_RUN_FROM_PACKAGE1 に設定して、zip 配置によって発行する必要があります。
  • パッケージから実行すると、wwwroot フォルダーが読み取り専用になり、このディレクトリにファイルを書き込むとエラーが発生します。 ファイルは、Azure portal でも読み取り専用です。
  • デプロイ パッケージ ファイルの最大サイズは 1 GB です。
  • デプロイ パッケージから実行する場合、ローカル キャッシュは使用できません。
  • プロジェクトでリモート ビルドを使用する必要がある場合は、WEBSITE_RUN_FROM_PACKAGE アプリ設定を使用しないでください。 代わりに、SCM_DO_BUILD_DURING_DEPLOYMENT=true デプロイ カスタマイズ アプリ設定を追加します。 Linux の場合は、さらに ENABLE_ORYX_BUILD=true 設定を追加します。 詳細については、「リモート ビルド」を参照してください。

Note

WEBSITE_RUN_FROM_PACKAGE アプリの設定は MSDeploy では動作しません。詳しくは、MSDeploy と ZipDeploy に関するページをご覧ください。 デプロイ時に ARM-MSDeploy Deploy Failed のようなエラーが発生します。 このエラーを解決するには、/MSDeploy/ZipDeploy に変更します。

WEBSITE_RUN_FROM_PACKAGE 設定を追加する

関数アプリの設定は、いくつかの方法で追加、更新、削除できます。

関数アプリの設定に変更を加えるためには、関数アプリを再起動する必要があります。

zip アーカイブの作成

デプロイする zip アーカイブには、関数アプリの実行に必要なすべてのファイルを含める必要があります。 組み込みの .zip 圧縮機能またはサードパーティ製のツールを使用して、Functions プロジェクト フォルダーのコンテンツから zip アーカイブを手動で作成できます。

アーカイブには、抽出されたフォルダーのルートにある host.json ファイルを含める必要があります。 関数アプリに対して選択した言語スタックによって、追加の要件が作成されます。

重要

デプロイ用に、コンパイルした出力を生成する言語の場合は、プロジェクト フォルダー全体ではなく、発行する予定の出力フォルダーの内容を圧縮してください。 zip アーカイブの内容を Functions で抽出する場合、host.json ファイルはパッケージのルート内に存在する必要があります。

WEBSITE_RUN_FROM_PACKAGE = 1 を使用する

このセクションでは、ローカル パッケージ ファイルから関数アプリを実行する方法について説明します。

オンサイト パッケージからのデプロイに関する考慮事項

  • オンサイト パッケージの使用は、デプロイ パッケージから実行する場合に推奨される方法です (従量課金プランでホストされた Linux で実行されている場合を除く)。
  • デプロイ パッケージをサイトにアップロードする方法としては、zip デプロイが推奨されます。
  • zip デプロイを使用していない場合は、c:\home\data\SitePackages (Windows) または /home/data/SitePackages (Linux) フォルダーに packagename.txt という名前のファイルがあることを確認してください。 このファイルには、このフォルダーにある現在実行中のパッケージ ファイルの、空白を除いた名前だけが含まれています。

zip デプロイとの統合

Zip デプロイは、関数アプリ プロジェクトを wwwroot ディレクトリにデプロイできるようにする Azure App Service の機能です。 プロジェクトは、.zip デプロイ ファイルとしてパッケージ化されます。 同じ API を使用して、パッケージを c:\home\data\SitePackages (Windows) または /home/data/SitePackages (Linux) フォルダーに配置できます。

WEBSITE_RUN_FROM_PACKAGE アプリ設定の値を 1 に設定すると、zip デプロイ API によって、パッケージが c:\home\data\SitePackages (Windows) または /home/data/SitePackages (Linux) フォルダーにコピーされます。ファイルが c:\home\site\wwwroot (Windows) または /home/site/wwwroot (Linux) に抽出されるのではありません。 それは、packagename.txt ファイルも作成します。 関数アプリが自動的に再起動されたら、パッケージは、読み取り専用ファイルシステムとして wwwroot にマウントされます。 zip デプロイの詳細については、Azure Functions の zip デプロイに関する記事を参照してください。

Note

デプロイが行われると、関数アプリの再起動がトリガーされます。 デプロイ中に現在実行されている関数の実行は終了します。 ステートレスな関数と防御的な関数を記述する方法については、「ステートレスな関数を記述する」を参照してください。

WEBSITE_RUN_FROM_PACKAGE = URL を使用する

このセクションでは、URL エンドポイントにデプロイされたパッケージから関数アプリを実行する方法について説明します。 このオプションがサポートされるのは、従量課金プランを使用して Linux でホストされるパッケージから実行する場合のみです。

URL からのデプロイに関する考慮事項

  • Windows で実行されている関数アプリでは、アプリケーション パッケージが WEBSITE_RUN_FROM_PACKAGE = <URL> を介して URL エンドポイントにデプロイされるときにコールド スタート時間がわずかに増加します。
  • また、URL を指定するとき、更新済みのパッケージを発行した後にトリガーを手動で同期する必要もあります。
  • Functions ランタイムには、パッケージの URL へのアクセス許可が必要です。
  • Azure Blob Storage にパブリック BLOB としてパッケージをデプロイしないでください。 代わりに、Shared Access Signature (SAS) があるプライベート コンテナーを使用するか、マネージド ID を使用してパッケージにアクセスするための Functions ランタイムを有効にします。
  • デプロイに使用する SAS URL はいずれも維持する必要があります。 SAS の有効期限が切れると、パッケージをデプロイできなくなります。 この場合は、新しい SAS を生成し、関数アプリで設定を更新する必要があります。 マネージド ID を使用 することで、この管理上の負担をなくすことができます。
  • Premium プランで実行している場合は、コールドスタートを排除してください。
  • 専用プランで実行している場合は、必ず Always On を有効にしてください。
  • Azure Storage Explorer を使用して、ご利用のストレージ アカウントの BLOB コンテナーにパッケージ ファイルをアップロードできます。

Blob Storage に手動でパッケージをアップロードする

URL オプションを使用するときに ZIP 形式のパッケージをデプロイするには、圧縮された .zip パッケージを作成し、デプロイ先にアップロードする必要があります。 次の手順では、Blob Storage のコンテナーにデプロイします。

  1. 適当なユーティリティを使って、プロジェクトの .zip パッケージを作成します。

  2. Azure portal で、ストレージ アカウント名を検索するか、ストレージ アカウント リストで参照します。

  3. ストレージ アカウントで、 [データ ストレージ] の下の [コンテナー] を選びます。

  4. [+ コンテナー] を選んで、アカウントに新しい Blob Storage コンテナーを作成します。

  5. [新しいコンテナー] ページで、名前を指定し ("deployments" など)、匿名アクセス レベルプライベートになっていることを確認して、[作成] を選択します。

  6. 作成したコンテナー、[アップロード] の順に選択し、プロジェクトで作成した .zip ファイルの場所に移動して、[アップロード] を選択します。

  7. アップロードが完了したら、アップロードした BLOB ファイルを選んで、URL をコピーします。 マネージド ID を使用していない場合は、SAS URL の生成が必要な場合があります。

  8. 関数アプリを検索するか、 [関数アプリ] ページで参照します。

  9. 関数アプリで、[設定] を展開し、[環境変数] を選びます。

  10. [アプリ設定] タブで [+ 追加] を選択します。

  11. 名前の値 WEBSITE_RUN_FROM_PACKAGE を入力し、として Blob Storage 内のパッケージの URL を貼り付けます。

  12. [適用] を選択したら、[適用][確認] の順に選択して設定を保存し、関数アプリを再起動します。

これで、Azure で関数を実行し、デプロイ パッケージの .zip ファイルのデプロイが成功したことを検証できます。

マネージド ID を使用して Azure Blob Storage からパッケージを取得する

Microsoft Entra ID で要求を承認するように Azure Blob Storage を構成できます。 この構成とは、有効期限がある SAS キーを生成する代わりに、アプリケーションのマネージド ID を使用することです。 既定では、アプリのシステム割り当て ID が使用されます。 ユーザー割り当て ID を指定する場合は、WEBSITE_RUN_FROM_PACKAGE_BLOB_MI_RESOURCE_ID アプリ設定をその ID のリソース ID に設定できます。 この設定は SystemAssigned を値として受け入れることもできます。これは、設定を省略することと同じです。

ID を使用してパッケージをフェッチできるようにするには、次のようにします。

  1. Blob がプライベート アクセス用に構成されていることを確認します。

  2. ID に、パッケージ blob に対するスコープを持つ Storage Blob データリーダー ロールを付与します。 ロールの割り当ての作成の詳細については、「blob データにアクセスするための Azure ロールの割り当て」を参照してください。

  3. WEBSITE_RUN_FROM_PACKAGE アプリケーション設定をパッケージの BLOB URL に設定します。 この URL は通常、https://{storage-account-name}.blob.core.windows.net/{container-name}/{path-to-package} または同様の形式です。