Azure Functions と .NET ソリューションを使用したサーバーレス アプリケーションの構築
公開: 2023-09-21サーバーレス コンピューティングは、開発者がサーバーについて考えることなくアプリケーションやサービスを構築および実行できるようにするクラウド実行モデルです。 サーバーレスでは、アプリケーションはサーバーの稼働維持に依存しません。クラウド プロバイダーがサーバーの割り当てとプロビジョニングを動的に管理します。 これにより、開発者はサーバー管理ではなく、ビジネス ロジックのコーディングに集中できるようになります。
Microsoft Azure Functions は、サーバーのプロビジョニングや管理を必要とせずに、Web エンドポイントとバックグラウンド処理ジョブを構築およびホストするためのサーバーレス コンピューティング サービスです。 Azure Functions を使用すると、インフラストラクチャを明示的にプロビジョニングまたは管理することなく、イベントに応答してコードをオンデマンドで実行できます。 このブログ投稿では、 ASP.NET 開発サービスの活用など、.NET ソリューションを使用して Azure Functions でサーバーレス アプリケーションを構築する方法を説明します。
Azure 関数とは何ですか?
Azure Functions を使用すると、インフラストラクチャのデプロイや管理を行わずに、クラウドでコードを実行できます。 Functions を使用すると、サーバーの管理を気にせずに、当面の問題に必要なコードだけを作成できます。 Azure はすべてのインフラストラクチャとサーバーを管理します。
Azure Functions の重要な側面と利点は次のとおりです。
- イベント駆動型: 関数は、多くの Azure サービスやサードパーティ サービスからのイベントによってトリガーされます。 これらには、HTTP リクエスト、タイマー、キュー、サーバーレス API などが含まれます。 これらのイベントに応答してコードを実行することができます。
- 自動的にスケーリング: Azure は、受信要求レートと処理負荷に基づいて、関数を自動的に管理し、スケーリングします。 サーバーを手動でプロビジョニングおよびスケールする必要はありません。
- 実行ごとに支払う: コードの実行に必要なコンピューティング リソースに対してのみ支払います。 機能が実行されていないときはアイドル料金は発生しません。
- 複数の言語: 関数は C#、JavaScript、Python、PowerShell、Java などをサポートしています。 好みの言語で関数を開発できます。
- サーバーレス エクスペリエンス: Functions を使用すると、コードの作成に集中し、サーバーのプロビジョニング、構成、管理をすべて Azure に任せることができます。 真のサーバーレス体験が得られます。
.NET 関数をローカルで開発する
.NET 関数をローカルで開発するには、Azure Functions をローカルと Azure の両方で開発、テスト、デプロイするためのコマンド ライン インターフェイスである Azure Functions Core Tools が必要です。
開発環境をセットアップするには:
- .NET Core SDK 最新バージョンをインストールする
- dotnet tool install -g Microsoft.Azure.WebJobs.Script.WebHost を使用して Azure Functions Core Tools をインストールします
- Functions App プロジェクトのディレクトリを作成し、func init を実行します。
- これにより、関数テンプレートを使用してサンプル関数プロジェクトがスキャフォールディングされます。
これで、関数コードを追加し、ローカルでテストし、func CLI を使用して Azure に発行できるようになりました。 HTTP によってトリガーされる C# 関数の run.csx ファイルを追加します。
ソース {csharp}
コピー
#r “ニュートンソフト.Json”
Microsoft.AspNetCore.Mvc を使用します。
Microsoft.Extensions.Primitives を使用します。
Newtonsoft.Json を使用します。
System.Net を使用する。
System.Threading.Tasks を使用します。
public static async Task<IActionResult> Run(HttpRequest req、ILogger ログ)
{
log.LogInformation(“C# HTTP トリガー関数がリクエストを処理しました。”);
文字列名 = req.Query[“名前”];
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
動的データ = JsonConvert.DeserializeObject(requestBody);
名前=名前?? データ?.名前;
名前を返します != null
? (ActionResult)new OkObjectResult($”こんにちは、{name}”)
: new BadRequestObjectResult(“クエリ文字列またはリクエスト本文に名前を渡してください”);
}
ローカルホスト上で Functions Gateway を起動する func host start を実行して、ローカルでテストします。 これで、Postman またはブラウザ (http://localhost:7071/api/HttpExample?name=John) を使用してトリガーできるようになりました。
Azure Functions のトリガーとバインディングの選択
Azure Functions は、トリガーとバインディングと呼ばれるさまざまなイベント ソースとターゲットをサポートしています。 ユースケースに基づいて、適切なトリガーとバインディングを選択することが重要です。
Functions の一般的なトリガーのいくつかは次のとおりです。
- HTTP トリガー: REST API および Web エンドポイントの構築用。 コードは HTTP リクエストによってトリガーされます。
- タイマー トリガー: スケジュールに従って実行されるスケジュールされたジョブ (たとえば、5 分ごと)。
- キュー トリガー: ストレージ キューからのメッセージを処理します。
- BLOB トリガー: Azure Blob Storage 内の新規または更新された BLOB に反応するため。
バインディングにより、関数が外部のデータ ストアおよびサービスと対話できるようになります。 一般的なバインディングには次のものがあります。
- ストレージ キュー: ストレージ キューにメッセージを出力します。
- Blob Storage: Azure Blob Storage への読み取りおよび書き込み用。
- Cosmos DB: Azure Cosmos DB データベース サービスでのドキュメントのクエリと変更用。
- Service Bus: Azure Service Bus のキューおよびトピックからのメッセージを処理します。
適切なトリガーとバインディングを選択すると、さまざまな機能をデータやサービスと統合してエンドツーエンドのソリューションを構築できます。
耐久性のある関数の使用
Durable Function を使用すると、障害や再起動が発生した場合でも一連の操作を確実に実行できるステートフル関数を作成できます。 これにより、長時間実行されるワークフローをステート マシンとして構築できます。
たとえば、Durable Functions を使用して、以下で構成されるワークフローを構築できます。
- オーケストレーター機能: アクティビティ関数の実行を適切な順序で調整するステート マシンとして機能します。
- アクティビティ関数: オーケストレーター関数によって呼び出すことができる、小さな独立した作業単位。
Durable Function を使用する利点は次のとおりです。
- 信頼性の高い再試行: Durable Functions は、アクティビティ関数が失敗した場合に自動的に再試行します。
- 非同期呼び出し: オーケストレーター関数は、アクティビティ関数を非同期で実行し、その完了を待つことができます。
- チェックポイント: 状態は継続的にチェックポイントされるため、アプリの再起動や障害の後でもワークフローを復元できます。
2 つのアクティビティを調整する単純なワークフローを見てみましょう。
ソース {csharp}
コピー
[関数名(“オーケストレーター”)]
public static async Task RunOrchestrator(
[OrchestrationTrigger] IDurableOrchestrationContext コンテキスト)
{
var Output1 = await context.CallActivityAsync<string>(“DotNetActivity”, “Hello”);
var Output2 = await context.CallActivityAsync<string>(“DotNetActivity”, Output1);
// 結果を返す
出力 2 を返します。
}
[関数名(“DotNetActivity”)]
public static Task<string> Run(
[ActivityTrigger]文字列入力、
ILogger ログ)
{
log.LogInformation($”DotNetActivity 関数が処理されました: {input}”);
return Task.FromResult(input.ToUpper());
}
Durable Function を使用すると、複雑なプロセスを信頼性の高いワークフローに分割できます。
Azure Functions 開発のベスト プラクティス
Azure Functions 開発で従うべきベスト プラクティスは次のとおりです。
- 依存関係注入を使用する: テスト容易性を向上させるために、関数にサービスを依存関係を注入します。
- 長時間実行されるプロセスを避ける: 関数は、小さな処理単位でコードを実行することを目的としています。 コードの実行は短くしてください。
- 不変のデータ型を使用する: 関数はステートレスであるため、問題を引き起こす可能性のある変更可能な型や副作用を避けてください。
- 一元化されたエラー処理: どこでも個別にエラーを処理するのではなく、共通のエラー処理ロジックを追加します。
- 構造化されたログ: 標準化されたログは、デバッグ、監視、監査証跡に役立ちます。
- スロットリングと再試行: 指数バックオフを使用した再試行を実装することで、スロットル エラーを処理します。
- バージョニング: 重大な変更を避けるために、トリガー、バインディング、入出力を厳密にバージョン管理します。
- 監視と計測: Application Insights などのツールを使用して、ログ記録、パフォーマンスの監視、使用状況分析を行います。
- コンテキスト バインディングを使用する: コンテキスト バインディングを利用して、依存関係を追加せずにアプリ設定などにアクセスします。
これらのベスト プラクティスに従うと、Azure Functions を使用して堅牢で信頼性が高く、スケーラブルなサーバーレス アプリケーションを構築するのに役立ちます。
Azure への機能のデプロイ
関数の準備ができたら、Azure CLI、PowerShell、Visual Studio を介して、または Azure Functions コア ツール CLI から直接、関数を Azure にデプロイできます。
コピー
func azure functionapp public <関数アプリ名>
これにより、関数プロジェクト フォルダーが Azure Function App に公開されます。 Azure に機能をデプロイすることの主な利点は次のとおりです。
- 自動スケーリング – 受信リクエストの量または時間トリガーに基づいて関数がスケーリングします。
- 高可用性 – データセンター全体の複数のインスタンスにより高可用性が実現します。
- 監視とログ – Application Insights などのツールを使用して、パフォーマンスやエラーなどを監視します。
- サーバーレス プラットフォーム – プロビジョニング/管理するサーバーはありません。 コードだけに集中できます。
- 継続的デプロイ – CI/CD パイプラインを使用して、コード変更時の自動デプロイを行います。
Azure はすべてのインフラストラクチャを処理し、アイドル状態のコストを回避し、大規模なサーバーレス アプリケーションを確実に実行するための完全なサーバーレス プラットフォームを提供します。
結論
Azure Functions を使用したサーバーレス コンピューティングにより、開発者はすべてのインフラストラクチャと運用管理を Azure にオフロードしながら、ビジネス ロジックに集中できます。 ASP.NET Core 開発者を雇用するオプションを含むネイティブ .NET 開発サポートにより、C# で堅牢なサーバーレス ソリューションを簡単に構築できます。 トリガー、バインディング、Durable Functions を使用すると、開発者はエンドツーエンドのイベント駆動型アーキテクチャとワークフローをステートレス関数およびステートフル関数として構築できます。 Azure Functions をベスト プラクティスと組み合わせることで、サーバーレス アプリケーションを簡単かつ大規模に構築してクラウドにデプロイできるようになります。