-
Notifications
You must be signed in to change notification settings - Fork 0
MS_AzureFunctions
- 戻る(AzureのPaaS)
- FaaS
- Azure WebJobs
- Azure Functions
- Azure API Management
- CaaS
- Azure Kubernetes Service (AKS)
- Azure Container Instances (ACI)
- Azure Web App for Containers
- Azure Functions on Docker
- Tools
- Visual Studio Tools for Docker(
MS_VSToolsForDocker.md) - Visual Studio Code Docker extension(
MS_VSCodeDockerExtension.md)
- Visual Studio Tools for Docker(
- Container Registry
- FaaS
イベント駆動のアプリケーションを処理するサービス
- サーバレス・アーキテクチャ(.NET開発基盤部会 Wiki)
- Azure WebJobsの後継
- 非常駐型のプロセスをイベントによってトリガーして実行する。
- イベント駆動の「機能」実行プラットフォーム
- 柔軟で強力なスクリプト実行環境
- HTTP API のエンドポイントとして公開可能
- 様々なプログラミング言語に対応
C#, Node.js/JavaScript, F#, Python,
PHP, Batch, Bash(MS_Bash.md), PowerShell
- コールドスタートが非常に遅いと言う話は、
ホスティング オプションで対応するのが一般的らしい。 - Linux や Docker にも対応。
補足(コールドスタートとホスティング オプション): 本文の
「ホスティング オプションで対応する」という一行は重要で、
プランの選択が性能特性を決める。
プラン 課金 コールドスタート VNET 統合 従量課金(Consumption) 実行回数・実行時間 あり(数秒) 不可 Flex Consumption 実行分+常時稼働インスタンス 緩和できる(Always Ready) 可 Premium インスタンス確保 無い(事前ウォーム済み) 可 App Service プラン プランの費用 無い(常時起動なら) 可 コールドスタートは、
呼び出し → インスタンスの割り当て → ランタイム起動 → 依存関係の読み込み → 実行 └────── ここが数秒かかる(アイドル後の初回のみ)──────┘という構造で発生する。
アイドル状態が続くとインスタンスが解放されるため、
アクセスが疎らな API では毎回これに当たる。対処は、
手段 内容 Premium / Flex プラン 事前ウォーム済みインスタンスを確保する(費用は増える) 定期的な ping タイマー トリガで自分を叩く(対症療法) 依存関係を減らす 起動時に読み込む DLL やパッケージを絞る 言語の選択 .NET Isolated / Node は比較的速い 対話的な API を従量課金プランで公開しない、というのが実務上の原則になる
(初回が遅い!も同種の問題)。
- インフラを抽象化し設計者はビジネス、開発者はコードに注力
- データやリソースの連携部分を抽象化
- 任意の処理が実装・実行できる
- 業務要件に応じて自動的にスケーリング
- 料金的/時間的なコストの低さ
- 利用開始のコストは低く
- 簡単に体験できる
強いて言えばロックインされること。
補足(デメリットは「ロックイン」だけではない): 「強いて言えば」と
あるが、実務では次の制約が効いてくる。設計段階で確認すべき点である。
制約 内容 実行時間の上限 従量課金は既定 5 分・最大 10 分。長時間処理は分割するか別基盤へ コールドスタート 前述 状態を持てない 呼び出し間で状態が保持されない。外部ストアが必要(または Durable Functions) ローカル デバッグとの差 ローカルでは動くが本番で動かない、が起きやすい(スケール、同時実行) 同時実行の制御が難しい 勝手にスケールするため、下流の DB を圧迫することがある 費用の予測が難しい 実行回数次第。暴走すると青天井になり得る 特に最後の 2 つは注意が要る。
「勝手にスケールする」ことは長所だが、
下流(DB や外部 API)がスケールしない場合、
Functions が並列に押し寄せて下流を落とす。
maxConcurrentCallsやhost.jsonでの同時実行数の上限設定、
あるいはキューによる平準化が要る
(クラウド アプリケーション アーキテクチャ ガイドの
「スロットル パターン」「キュー ベースの負荷平準化」)。なお、「ロックイン」については、
バインディングを使うほど移植性が下がるという関係にある。
純粋な関数として書き、
バインディングを薄い層に留めれば移植性は保てる。
- HTTP
- サービスへ接続するもっとも簡単な方法
- 簡単に作成でき、ワークフローを自動化
- WebHook
- 非同期処理の要求を受信するエンドポイント
- ASP.NET の WebHook library を使えば、token 検証機能を利用可能
- タイマー
Cron の表現方法で記述可能
移行メモ: 原典の「バインディング」の項は見出しのみで
本文が存在しない。以下の補足で内容を補う。
補足(バインディングこそが Functions の本体): トリガーだけが
説明されているが、バインディングは Functions の生産性を決める中核機能である。
種別 役割 トリガー 関数を起動するきっかけ(1 関数に 1 つ) 入力バインディング 起動時に外部データを引数として受け取る 出力バインディング 戻り値を外部に書き出す 例えば「Blob が置かれたら、Cosmos DB を引いて、キューに投げる」処理は、
接続コードを一切書かずに属性(または設定)だけで記述できる。[Function("Sample")] [QueueOutput("out-queue")] // 出力バインディング public string Run( [BlobTrigger("in/{name}")] string content, // トリガー [CosmosDBInput(...)] MyDoc doc) // 入力バインディング { return doc.Id + ":" + content.Length; }つまり、接続文字列の管理・リトライ・シリアライズを
ランタイムが肩代わりするのがバインディングの価値である。
前掲の「ロックイン」は、まさにこの利便性の裏返しになる。主なトリガーには、本文の HTTP / WebHook / タイマーに加え、
Blob / Queue / Service Bus / Event Hubs / Event Grid /
Cosmos DB の変更フィード などがある
(Azureのメッセージング・サービス)。なお、状態を持つ処理(複数関数のオーケストレーション、
長時間の待ち合わせ、人間の承認待ち)には
Durable Functions という拡張がある。
前掲の「状態を持てない」という制約への公式な答えである。
- OS は Ubuntu
- C# は mono?(今なら Core や .NET5 だろうか?
- Azure Functions runtime の Docker イメージを利用して、
- 自分の Docker イメージを Azure Functions にデプロイできる。
補足(最新化:本文の疑問への回答): 「今なら Core や .NET5 だろうか?」
という疑問はそのとおりで、現在 mono は使われていない。.NET の Functions は 2 つのモデルに整理されている。
モデル 内容 インプロセス Functions ホストと同じプロセスで動く。.NET の版がホストに縛られる。サポート終了(2026 年 11 月) 分離ワーカー(Isolated) 別プロセスで動く。.NET の版を自由に選べる。現在の推奨 新規開発では分離ワーカー モデルを選ぶ。
インプロセス モデルは移行が必要になる。また、Docker 対応については、現在は
- Azure Functions のカスタム コンテナ(Premium / App Service プラン)、
- Azure Container Apps 上での Functions ホスト
という選択肢があり、後者は
Functions のプログラミング モデルを保ったまま
Container Apps の基盤に載せられるため、
コンテナ前提の環境では有力である
(AzureのPaaS)。
- さーばーれす あーきてくちゃ…?
Azure Functions でサーバーレスアーキテクチャが何かを理解する記事
https://qiita.com/hat22/items/f7b2aec5211951dd7622 - Linux ベースの Azure Function App の作り方(CLI ベースでの開発方法)
https://qiita.com/567000/items/36a87ee087628a548bb9 - Linux と Docker で入門する Azure のサーバレス
https://qiita.com/cvusk/items/f3ded5db2c95e8bf78bc
- Azure Functions – Cloud Solution Architect チームブログ
https://blogs.technet.microsoft.com/azure-sa-members/azurefunctions/
- Azure Functions サーバーレス コンピューティング
https://azure.microsoft.com/ja-jp/services/functions/ - Azure の更新情報
- Linux 上での Azure Functions
https://azure.microsoft.com/ja-jp/updates/azure-functions-on-linux/ - Azure Functions Premium プランでの Linux のサポート
https://azure.microsoft.com/ja-jp/updates/linux-support-on-azure-functions-premium-plan/
- Linux 上での Azure Functions
- Azure Functions のドキュメント
https://docs.microsoft.com/ja-jp/azure/azure-functions/- Visual Studio Code を使用して C# 関数を作成する - Azure Functions
https://docs.microsoft.com/ja-jp/azure/azure-functions/create-first-function-vs-code-csharp
- Visual Studio Code を使用して C# 関数を作成する - Azure Functions
- Azure Functions のスケールとホスティング
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-scale- Linux 上で Azure portal から Function App を作成する
https://docs.microsoft.com/ja-jp/azure/azure-functions/create-function-app-linux-app-service-plan - カスタム イメージを使用して Linux 上で Azure Functions を作成する
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-create-function-linux-custom-image
- Linux 上で Azure portal から Function App を作成する
- Azure Functions の Docker 版をローカルで起動する | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/9739 - Azure Functions on Linux にカスタムのイメージをデプロイする - ROMANCE DAWN for the new world
https://gooner.hateblo.jp/entry/2018/01/22/070743
Tags: 移行, クラウド, コンテナ, Azure
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。