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

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

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

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

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

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

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

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

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

説明
1 関数アプリが、その d:\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 では機能しません。 デプロイ時に ARM-MSDeploy Deploy Failed のようなエラーが発生します。 /MSDeploy を /ZipDeploy に変更すると、このエラーは解決します。

WEBSITE_RUN_FROM_PACKAGE 設定の追加

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

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

WEBSITE_RUN_FROM_PACKAGE = 1 を使用する

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

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

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

zip デプロイとの統合

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

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

Note

デプロイが行われると、関数アプリの再起動がトリガーされます。 デプロイ中に現在実行されている関数の実行は終了します。 ステートレス機能と防御機能を記述する方法については、「Azure Functions のパフォーマンスと信頼性の向上」を参照してください。

WEBSITE_RUN_FROM_PACKAGE = URL を使用する

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

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

  • Windows で関数アプリを実行している場合、アプリ設定 WEBSITE_RUN_FROM_PACKAGE = <URL> は、コールドスタートのパフォーマンス低下につながるため推奨されません。
  • また、URL を指定するとき、更新済みのパッケージを発行した後にトリガーを手動で同期する必要もあります。
  • Functions ランタイムには、パッケージの URL へのアクセス許可が必要です。
  • Azure Blob Storage にパブリック BLOB としてパッケージをデプロイすることは避けてください。 代わりに、Shared Access Signature (SAS) があるプライベート コンテナーを使用するか、マネージド ID を使用してパッケージにアクセスするための Functions ランタイムを有効にします。
  • デプロイに使用する SAS URL はいずれも維持する必要があります。 SAS の有効期限が切れると、パッケージをデプロイできなくなります。 この場合は、新しい SAS を生成し、関数アプリで設定を更新する必要があります。 マネージド ID を使用 することで、この管理上の負担をなくすことができます。
  • Premium プランで実行している場合は、コールドスタートを排除してください。
  • Dedicated プランで実行する場合は、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. [OK] を選択します。 次に、[保存]>[続行] の順に選択して設定を保存し、アプリを再起動します。

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

Azure Blob torage でホストされている .zip ファイルから実行するように構成された関数アプリを次に示します。

WEBSITE_RUN_FROM_ZIP app setting

マネージド 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 に設定します。 これは、"https://{storage-account-name}.blob.core.windows.net/{container-name}/{path-to-package}" のような形式になります。

次のステップ