GYAOのtsです。
我々のチームは、オールパブリッククラウドで、Microservice Architectureを採用した次期バックエンドを設計中です。
経緯
前回の投稿でfunctionsを使用したAPIの作成と監視についてチーム内で話し合ったが、チームとして下記の方向で概ね合意が取れているので、この記事で監視も含めてプロトタイプを作成してみる。構成は下記のような形。
今回のscopeはPowerBIとLogicAppsの部分は割愛する(別記事で)。
Hands on
今回実現したいことは以下の通り。
■ AzureFunctionsでAPIを2本作成する。
・DB登録用API・・・store
・DB削除用API・・・remove
■ storeAPI、removeAPIはAzureServiceBusの特定のトピック(storeトピック)にpublish。
■ AzureFunctions(subscriber)がAzureServiceBusの特定のトピック(storeトピック)をsubscribe。DB(cosmosDB)に対して処理を行う。
以上、たったこんだけ。
+ 監視は適宜行います。
AzureServiceBus
まずはPublish、 Subscribeするトピックを作成します。
AzureFunctions
store
Http-ServiceBusのPublisherを作成する。
詳しくは前回の投稿を参照。
#r "Newtonsoft.Json"
using System;
using System.Net;
using System.Threading.Tasks;
using Newtonsoft.Json;
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, ICollector<string> outputSbQueue, TraceWriter log)
{
log.Info("C# HTTP trigger function processed a request.");
// Get request body
string jsonContent = await req.Content.ReadAsStringAsync();
dynamic data = JsonConvert.DeserializeObject(jsonContent);
if (data == null) {
return req.CreateResponse(HttpStatusCode.BadRequest,
"Please pass a messsage in the request body.");
}
else {
outputSbQueue.Add($"{data}");
return req.CreateResponse(HttpStatusCode.OK, $"{data}");
}
}
remove
同じHttp-ServiceBusのPublisherを作成するが、publishする際のデータ構造が変わっただけなので割愛
doStore
subscriber。topicに流れてきたデータをもとに実際にcosmosDBに対して処理を行う。
using System;
using System.Threading.Tasks;
public static void Run(string mySbMsg, TraceWriter log, out object outputDocument)
{
log.Info($"C# ServiceBus topic trigger function processed message: {mySbMsg}");
outputDocument = mySbMsg;
}
AzureAppInsights
Functions、ServiceBusの監視をApplicationsで一元管理します。
今回はErrorやExceptionがあった場合、slackにサマリーを飛ばします。
Functions
Functions自体の監視は前回の投稿を参照。
今回はそれに加えてErrorsWebhookという関数を作成した。Azureのリソースのメトリックアラートをすべてここに飛ばし、監視する。
using System.Net;
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
log.Info("Error was occurred...");
// Get request body
dynamic data = await req.Content.ReadAsAsync<object>();
log.Error($"{data}");
return req.CreateResponse(HttpStatusCode.OK);
}
ServiceBus
servicebusに関しては
アクティビティログアラートで設定する形か?現在調査中。
webhookで先程作成したfunctions(ErrorsWebhookを指定する)
ApplicationInsightsとSlack
ApplicationInsightsで拾ったErrorについてはSlackに送信したいので下記を使用する。
cloudbot
定期便とエラー毎のレポートを送ってくれる