Azure Managed Service Column <Azure運用コラム>

Azureキューの紹介

Category: 実践編

2020.10.29

Azure キューとは

Azure ストレージが提供する3つ目のサービス、Azure キューを紹介します。

Azure キューは、非同期メッセージングサービスです。簡単に言うとストレージアカウントのなかに「キュー」という容れ物を作り、その中に「メッセージ」を溜めることができます。非同期メッセージングサービスがストレージサービスの一機能というのは、他のクラウドを使ったことのある方からすると違和感があるかもしれませんが、容れ物として Azure ストレージを利用している、と考えていただくと納得できるかと思います。実体は Azure ストレージですから、ストレージアカウントの総容量を超えない限り、数百万ものメッセージを格納できるのが特徴です。

非同期メッセージングとマイクロサービス

Azure キューのような非同期メッセージングサービスは、マイクロサービスにて重要な役割を果たします。マイクロサービスというのは、「独立した小さなサービス」をコンポーネントと用意し、それらを複数組み合わせることで1つのアプリケーションとする、システム設計の考え方です。このコンポーネントはサーバレスであることが多く、Azure では Azure functions や AKS がよく使われます。Azure キューは、これらのコンポーネントを繋ぐ役割を果たします。

本コラムでは Azure キューがどのように使われるか、イメージしやすいように、最も簡単なマイクロサービスを作ってみることにします。以下のように、「ユーザからのアクセスをトリガにしてメッセージを出力する function A」「Azure キュー」「Azure キュー内のメッセージをトリガとして実行される function B」の3つのコンポーネントからなるマイクロサービスを作ってみましょう。function B は何らかの処理を行うものとします。例えば、メッセージの内容をデータベースに書き込む、などです。

一見すると、Azure キューは要らないようにも感じます。Azure キューをなくして「ユーザからのアクセスがあったら内容をデータベースに書き込む」という1つの function にするとどうなるのでしょうか。

実は、ユーザ側からすると大きな違いが表れます。それは、Azure キューがないと「データベースに書き込む」という処理が完了するまで待たされるということです。簡単な処理であればいいですが、時間のかかる処理が完了するまで待たされるのはストレスですし、なにより、処理の結果をリアルタイムにユーザへ知らせる必要がないのであれば待ってもらう必要もなく、時間の無駄です。
「ユーザからのアクセス」と「データベースへの書き込み」を分離して、非同期にすることで、ユーザはアプリケーションの処理状況を気にせず、どんどんアクセスすることができます。(キューを使った非同期処理で一番身近な例は、メールかと思います。ユーザはメールサーバがメールを送信したかどうかを気にすることはないですよね。)

Azure キューを使ってシンプルなマイクロサービスを作ってみる

それでは、3つのコンポーネントを順番に作っていきます。

キューを作成する。

まずは、「メッセージ」の格納先となるキューを作成します。と、その前に、 キューストレージとして利用するためのストレージアカウントを用意しましょう。Blob ストレージや Azure File として利用していたストレージアカウントを流用してもよいのですが、ネットワーク的なアクセス制限がかかっていると function との連携がうまくいきません。今回はわかりやすく、キューストレージ専用のストレージアカウントを新規作成します。

ストレージアカウントを作成したら、左メニューから [キュー] をクリックします。 そして、以下のようにキューを作成します。

当然ながら、この時点では、メッセージは空の状態です。

キューストレージに出力する function を作成する

HTTP アクセスをトリガにして、キューストレージにメッセージを書き込む function を作成します。まずは、[関数アプリ] サービスの画面を開き、関数アプリを作成します。ランタイムは node.js とします。本コラムの本筋からは外れるので詳しい手順は割愛しますが、[ホスティング] タブにて、先程作成したストレージアカウントを指定するところがポイントです。(ここで、アクセス制限の掛かっているストレージアカウントを指定してしまうと、デプロイに失敗します。)

関数アプリを作成したら、関数を作成しましょう。[テンプレート] に “HTTP trigger” を選択して作成します。

本題の出力設定(出力バインド)を行います。[統合] をクリックすると、トリガ・入力・関数・出力の各要素のフローチャートのようなものが表示されます。今回は出力バインドの設定をしたいので、[出力] の [追加] をクリックします。”キューname” には最初に作成したキューの名前を、[Storage account connection] には接続先となる キューストレージを指定します。デフォルトの “AzureWebJobsStorage” を指定すると、関数アプリを作成するときに指定したストレージアカウントに接続します。このままでも良いのですが、今回は明示的にストレージアカウントの名前を指定しました。

次に、コードを記述します。[コードとテスト] を開いて、index.js に以下のコードをコピペしましょう。公式ドキュメント にて公開されているサンプルコードです。URL に “name=${value}” という形式でクエリを追加すると、”${value}” をメッセージとしてキューに格納します。

module.exports = function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    if (req.query.name || (req.body && req.body.name)) {
        context.res = {
            // status: 200, /* Defaults to 200 */
            body: "Hello" + (req.query.name || req.body.name)
        };    
        context.bindings.outputQueueItem = "Name passed to the function: " + 
                (req.query.name || req.body.name);
    }
    else {
        context.res = {
            status: 400,
            body: "Please pass a name on query string"
        };
    }
    context.done();
}

なお、メインのコード index.js とは別に、function.json にてトリガと出力の設定をしなければならないのですが、こちらは [統合] にて設定したものが勝手にコード化されているので、新たに用意する必要はありません。

それでは、実際に関数を実行してみます。画面右上の [関数の URL を取得] から URL を取得して、末尾にクエリ “?name=1st_test” と入れてみます。200 ok が返ってくるようなら成功していますので、ストレージアカウントのキューを見てみてください。以下のように、クエリの値 “1st_test” が入っているはずです。

キューストレージをトリガとする function を作成する

今度は逆に、キューストレージにキューが追加されたら、それをトリガに実行される function を作りましょう。関数アプリは同じでもいいですし、別でも構いません。キューストレージが共通していればいいので、[Storage account connection] にて明示的にストレージアカウントを指定している場合は別でも大丈夫です。”AzureWebJobsStorage” としている場合は同じ関数アプリに作成しましょう。

関数の追加をクリックしたら、テンプレートに、”Azure Queue Storage trigger” を選択します。トリガとなるストレージアカウントとキューは、先程の関数で出力バインドに設定したものを指定します。

この時点で、キューの画面を確認してみてください。先程あったはずの “1st_test” というメッセージがなくなっているはずです。そいて、この関数の [モニター] を見てみると、1回実行されていることがわかります。キュー内のメッセージをトリガにして関数が実行され、実行後にメッセージがデキューされた、ということです。(ただし、コード内には何も処理を書いていないので、何も行われないのですが)

ちなみに、URL に連続してアクセスすると、一瞬だけキューにメッセージが溜まりますが、すぐにデキューされることがわかります。

まとめ

Azure ストレージの機能の1つである、Azure キューについて使い方を紹介しました。手軽に使えるキューサービスであり、なおかつ、Azure functions との連携が簡単に行えることが分かっていただけたかと思います。本コラムを通して、非同期メッセージングサービスの使われ方がイメージできるようになれば幸いです。

おまけ. Azure キューと Service Bus キュー

Azure キューは、Azure ストレージの1機能という立て付けでしたが、キューに特化したサービスとして Service Bus キューものもあります。特化しているだけあって、より多くのことができるサービスですが、単純に Azure キューの上位互換、というわけでもないので、要件に合わせて選択していただければと思います。
Storage キューと Service Bus キューの比較

Tag: Azureキュー

Contactお問い合わせ

お見積もり・ご相談など、お気軽にお問い合わせください。

single.php