伝説のどいつまの伝説~失敗編~

岩美に永住したい新米エンジニアのあれやこれやな話。

【1 人アドベントカレンダー 2020】第 18 日目

だいぶアドベントカレンダーの趣旨からは外れてしまいますが、今年も 1 人アドベントカレンダー実施することにしました。
25 日まで毎日更新頑張ります!
qiita.com

今日の項目内容

今回から サービスの接続 のラーニングパスに移っていきます。
ご自分のサービスにゆるく接続するために Azure でメッセージング モデルを選ぶ

  • メッセージやイベントを使用するかどうかを選択する
  • キューを使用するメッセージベースの配信を選択する

学習内容まとめ

メッセージやイベントを使用するかどうかを選択する

分散アプリケーションの用語で、メッセージとイベントがある。
メッセージには以下の特性がある。

イベントには、以下の特性がある。

  • 何かが発生したことを示す軽量の通知
  • 送信されたイベントの受信者が複数のこともあれば、まったくいないこともある
  • パブリッシャーのそれぞれに対して多数のサブスクライバーが存在する
  • 受信側コンポーネントがどのようなアクションを実行するかについて想定していない
  • 一部のイベントは個別ユニットであり、他のイベントに関連しない
  • 一部のイベントは、一連の関連する順序つけられたイベントに属する

イベントは、ブロードキャストに使用されることが多く、ほぼ一時的。メッセージは分散アプリケーションで通信の処理を保証する必要がある場合に使用される可能性が高い。
送信側コンポーネントは通信が宛先コンポーネントによって特定の方法で処理されることを想定しているか、という点でどちらがふさわしいか選択できる。

キューを使用するメッセージベースの配信を選択する

「音楽共有アプリケーション用のアーキテクチャを計画している」という仮定に基づき、理解を深めていく。
今回の要件には、Azure では Azure Queue Storage と Azure Service Bus のソリューションが適している。
キューは、以下の点において、非常に有用である。

信頼性の向上
混み合い時、宛先コンポーネント側でメッセージを処理する準備が整うまでメッセージを単純に待機させることができる為、メッセージ交換の信頼性が向上する。

メッセージの配信保証 通常、キューシステムによりキュー内の各メッセージを宛先コンポーネントに配信する処理が行われるが、以下のようなアプローチでも実現が可能。
At-Least-Once 保証 : キューからメッセージを取得するコンポーネントの少なくとも 1 つへ、各メッセージが配信されることが保証される
At-Most-Once 保証 : 同じメッセージが 2 回配信されることはない、自動重複データ検出
FIFO : キューに入れられたのと同じ順番でキューから出されている保証があるかを検討する必要がある

トランザクションのサポート
e コマースアプリケーションなどを例に考えた場合、クレジットカードメッセージが配信されずに、すべての注文内容が支払いなしに処理されることを防ぐためにもメッセージをトランザクションにグループ化することによって回避できる。
データベースの場合と同様に、単一のユニットとして成功または失敗する。
なので、クレジット カード情報のメッセージ配信が失敗した場合は、注文詳細のメッセージ配信も失敗する。

本日の内容は以上です。

【1 人アドベントカレンダー 2020】第 17 日目

だいぶアドベントカレンダーの趣旨からは外れてしまいますが、今年も 1 人アドベントカレンダー実施することにしました。
25 日まで毎日更新頑張ります!
qiita.com

今日の項目内容

Azure API Management を使用して、複数の Azure Functions アプリを一貫した API として公開する

  • API Management で関数アプリから新しい API を作成する
  • 演習 - API Management で関数アプリから新しい API を作成する
  • Azure API Management を使用して API を構成する利点
  • 演習 - 既存の API に別の Azure Functions アプリを追加する

学習内容まとめ

API Management で関数アプリから新しい API を作成する

Azure API Management (APIM) は、API の発行、セキュリティ保護、変換、保守、および監視に使用できるフルマネージドクラウド サービス。
要求の認証と承認、レート制限とクォータの適用、要求と応答の交換、ログとトレース、API バージョン管理など、API 呼び出しの仲介に関連する全てのタスクを処理する。
使用プランを選択する場合は、従量課金レベルを選択できる。

演習 - API Management で関数アプリから新しい API を作成する

サンドボックスを用いて演習を行う。
f:id:d01tsumath:20201216123846p:plain
f:id:d01tsumath:20201216124720p:plain
f:id:d01tsumath:20201216124736p:plain
f:id:d01tsumath:20201216124959p:plain

Azure API Management を使用して API を構成する利点

APIM を使用した API の作成には、次のような利点がある。

  • クライアントアプリは、個々のマイクロサービスを使用した基礎となる技術的な実装ではなく、ビジネス ロジックを表す API と結合される。クライアントアプリを再構成または更新することなく、サービスの場所と定義を変更することができる。
  • API Management は仲介役として機能する。配置されている場所にかかわらず、適切なマイクロサービスに要求が転送され、ユーザーに応答が返される。マイクロサービスがホストされているさまざまな URI がユーザーに表示されることはない。
  • API Management ポリシーを使用して、製品のすべてのマイクロサービスに一貫したルールを適用可能。例として、好みの形式に応じて、すべての XML 応答を JSON に変換できる。
  • ポリシーを使用して、一貫したセキュリティ要件を適用することもできる。

演習 - 既存の API に別の Azure Functions アプリを追加する

サンドボックスを用いて演習を行う。
f:id:d01tsumath:20201216130153p:plain
f:id:d01tsumath:20201216130248p:plain

本日の内容は以上です。
当初の目標の「サーバーレス アプリケーションの作成」が終了しました。
f:id:d01tsumath:20201216130438p:plain
次回からはまた別のものをやります。

【1 人アドベントカレンダー 2020】第 16 日目

だいぶアドベントカレンダーの趣旨からは外れてしまいますが、今年も 1 人アドベントカレンダー実施することにしました。
25 日まで毎日更新頑張ります!
qiita.com

今日の項目内容

Azure Functions と SignalR Service を使って、Web アプリケーションの自動更新を有効にする

  • ストレージ アカウントを使用して静的な Web サイトをホストする
  • 演習 - ストレージ アカウントを使用して静的な Web サイトをホストする

学習内容まとめ

ストレージ アカウントを使用して静的な Web サイトをホストする

前回、ローカル上でテストまで行えたので、今回はクラウドに公開していく。
まず、Azure 上にローカル関数をデプロイする必要がある。
その後、静的な HTML, JavaScript を使用できるようにする。

演習 - ストレージ アカウントを使用して静的な Web サイトをホストする

サンドボックスを用いて演習を行う。
f:id:d01tsumath:20201216121452p:plain
f:id:d01tsumath:20201216121705p:plain

本日の内容は以上です。

【1 人アドベントカレンダー 2020】第 15 日目

だいぶアドベントカレンダーの趣旨からは外れてしまいますが、今年も 1 人アドベントカレンダー実施することにしました。
25 日まで毎日更新頑張ります!
qiita.com

今日の項目内容

Azure Functions と SignalR Service を使って、Web アプリケーションの自動更新を有効にする

  • ポーリングベースの Web アプリの制限事項を分析する
  • 演習 - ポーリングベースの Web アプリの制限事項を分析する
  • SignalR Service を使って Web アプリケーションの自動更新を有効にする
  • 演習 - SignalR Service を使用して Web アプリケーションの自動更新を有効にする

学習内容まとめ

ポーリングベースの Web アプリの制限事項を分析する

ポーリングは、主となるシステムが他のシステムに対して一定間隔で順繰りに要求がないか尋ねる制御方法。
ここでは、株式情報の読み取りプログラムを例に構成を考えていく。

サーバー

株価情報は Azure CosmosDB に格納される。
HTTP 要求にてトリガーされ、バインディングを使用してデータベースのコンテンツを返却する。
このバインディングfunction.json ファイルで構成される。

{
  "bindings": [
    {
      "type": "httpTrigger", // 関数を HTTP によってトリガーされる関数として定義する
      "authLevel": "anonymous", // 認証されていない受信要求を許可する
      "direction": "in", // 認証されていない受信要求を許可する
      "name": "req", //  req というパラメータを通じて要求コンテキストを公開する
      "methods": ["get"] // GET 要求を受入
    },
    {
      "type": "http", // 関数で HTTP 応答を返す
      "direction": "out", // 関数で HTTP 応答を返す
      "name": "res" // res という名前のパラメータを通じて応答コンテキストを公開
    },
    {
      "type": "cosmosDB", // 関数呼び出し時、CosmosDB データを使用できるようにする
      "direction": "in", // 関数呼び出し時、CosmosDB データを使用できるようにする
      "name": "stocks", // stock というパラメータを通じて、関数にデータを公開
      "ConnectionStringSetting": "AzureCosmosDBConnectionString", // 接続文字列を使用して CosmosDB データに接続する
      "databaseName": "stocksdb", // stockdb データベースをポイントする
      "collectionName": "stocks" // stocks データコレクションをポイントする
    }
  ]
}

演習 - ポーリングベースの Web アプリの制限事項を分析する

サンドボックスを用いて演習を行う。
f:id:d01tsumath:20201215110640p:plain
f:id:d01tsumath:20201215110923p:plain

SignalR Service を使って Web アプリケーションの自動更新を有効にする

ポーリングから、接続されているクライアントにデータ更新をプッシュするアプリに移行する。
この設計では、トラフィックが減り、データが変更されたときにのみ更新することで効率的な UI を作成することができる。
これを、 Azure CosmosDBAzure FunctionsSignalR を用いて実装する。
ポーリングと対照に好ましい設計は、クライアントとサーバー間の永続的な接続。
永続的な接続の利点としては、サーバーでは自由にクライアントにデータをプッシュできる点にある。これにより、ネットワークトラフィックとサーバーへの負荷が軽減される。

演習 - SignalR Service を使用して Web アプリケーションの自動更新を有効にする

サンドボックスを用いて演習を行う。

本日の内容は以上です。

【1 人アドベントカレンダー 2020】第 14 日目

だいぶアドベントカレンダーの趣旨からは外れてしまいますが、今年も 1 人アドベントカレンダー実施することにしました。
25 日まで毎日更新頑張ります!
qiita.com

今日の項目内容

Azure Functions で Webhook を使用して GitHub イベントを監視する

  • GitHub イベントを使用して Azure 関数をトリガーする
  • 演習 - GitHub イベントを使用して Azure 関数をトリガーする
  • シークレットを使用して Webhook ペイロードをセキュリティで保護する
  • 演習 - シークレットを使用して Webhook ペイロードをセキュリティで保護する

学習内容まとめ

GitHub イベントを使用して Azure 関数をトリガーする

GitHub の Gollum イベントを使用して、Wiki の更新をリッスンできる。
このイベントが発生し、Azure Functions 関数がトリガーされると、ペイロードを解析して送信されたデータを取得し処理することができる。
Gollum イベントのペイロードには以下が含まれている。

pages : 更新されたページ

  • page_name : ページの名前
  • title : 現在のページタイトル
  • action : ページ上で実行されたアクション。作成 / 編集ができる
  • html_url : HTML wiki ページ。

repository : Wiki ページを含むリポジトリに関する情報

sender : Webhook を起動するイベントを発生させたユーザーに関する情報

演習 - GitHub イベントを使用して Azure 関数をトリガーする

サンドボックスを用いて演習を行う。

シークレットを使用して Webhook ペイロードをセキュリティで保護する

関数は、ペイロードを受信するように構成されると、構成したエンドポイントに送信されるペイロードをリッスンするようになる。
Webhook のシークレットを設定すると、ペイロード URL に送信された POST 要求が GitHub からのものであることを確認できる。
シークレットを設定すると、Webhook の POST 要求で x-hub-signature ヘッダーを受け取る。
シークレット トークンが設定されると、GitHub はそれを使用して各ペイロードのハッシュ署名を作成し、ヘッダーの各要求と共に x-hub-signature として渡される。

演習 - シークレットを使用して Webhook ペイロードをセキュリティで保護する

サンドボックスを用いて演習を行う。

本日の内容は以上です。

【1 人アドベントカレンダー 2020】第 13 日目

だいぶアドベントカレンダーの趣旨からは外れてしまいますが、今年も 1 人アドベントカレンダー実施することにしました。
25 日まで毎日更新頑張ります!
qiita.com

今日の項目内容

Azure Functions で Webhook を使用して GitHub イベントを監視する

  • Webhook によってトリガーされる関数を作成する
  • 演習 - Webhook によってトリガーされる Azure 関数を作成する
  • GitHub リポジトリの Webhook を設定する
  • 演習 - GitHub リポジトリの Webhook を設定する

学習内容まとめ

Webhook によってトリガーされる関数を作成する

Webhook はユーザー定義の HTTP コールバックのこと。
例えば、コードのリポジトリへのプッシュや Wiki ページの更新などのイベントでトリガーされる。
Webhook を関数と共に使用して、更新されたバージョンのアプリケーションのデプロイなどのタスクを実行できる。

演習 - Webhook によってトリガーされる Azure 関数を作成する

サンドボックスを用いて演習を行う。
f:id:d01tsumath:20201213222649p:plain

GitHub リポジトリの Webhook を設定する

GitHub では、組織または特定のリポジトリに Webhook を設定できる。
Webhook の設定は 2 ステップのプロセスで行える。

  1. Webhook が GitHub を介してどのように動作するか、それがリッスンするイベントを指定する
  2. Webhook から受け取ったペイロードを受け取って管理するように Azure Functions で関数を設定する

演習 - GitHub リポジトリの Webhook を設定する

サンドボックスを用いて演習を行う。
f:id:d01tsumath:20201213224212p:plain
f:id:d01tsumath:20201213224457p:plain

本日の内容は以上です。

【1 人アドベントカレンダー 2020】第 12 日目

だいぶアドベントカレンダーの趣旨からは外れてしまいますが、今年も 1 人アドベントカレンダー実施することにしました。
25 日まで毎日更新頑張ります!
qiita.com

今日の項目内容

Visual Studio で Azure 関数を開発、テスト、デプロイする

  • Visual Studio を使用してローカルで簡単な Azure 関数を作成してテストする
  • 演習 - Visual Studio を使用し、ローカルで簡単な Azure 関数を作成してテストする
  • 簡単な Azure 関数を発行する
  • 演習 - 簡単な Azure 関数を発行する
  • 演習 - Azure 関数の単体テストを行う

学習内容まとめ

Visual Studio を使用してローカルで簡単な Azure 関数を作成してテストする

Azure 関数は静的クラスとして実装される。
このクラスでは、クラスのエントリポイントとして機能する Run という静的な非同期メソッドが提供される。
以下の例のように、メソッドに渡すパラメータでトリガーのコンテキストを指定する。

public static class Function1
{
    [FunctionName("Function1")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");

        string name = req.Query["name"];

        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        dynamic data = JsonConvert.DeserializeObject(requestBody);
        name = name ?? data?.name;

        return name != null
            ? (ActionResult)new OkObjectResult($"Hello, {name}")
            : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
    }
}

演習 - Visual Studio を使用し、ローカルで簡単な Azure 関数を作成してテストする

f:id:d01tsumath:20201212112707p:plain
f:id:d01tsumath:20201212112721p:plain
f:id:d01tsumath:20201212112743p:plain
f:id:d01tsumath:20201212112754p:plain

簡単な Azure 関数を発行する

Azure Functions を利用すると、App Service の継続的インテグレーションを使用して、関数アプリを簡単にデプロイできる。
Functions は BitBucket, Dropbox, GitHub, Azure DevOps と統合されている。
これにより、統合されたサービスのいずれかを使用して行われる関数コードの更新により Azure へのデプロイがトリガーされるワークフローが可能になる。

演習 - 簡単な Azure 関数を発行する

サンドボックスを用いて演習を行う。
f:id:d01tsumath:20201212115146p:plain

演習 - Azure 関数の単体テストを行う

f:id:d01tsumath:20201212115857p:plain

本日の内容は以上です。