PlayFabからキュー経由でAzure Functionsを実行する

2021/02/01に公開

はじめに

PlayFabでは、Cloud Scriptという機能を使用することで、任意のコードをサーバ側で実行させることができます。もともとは、PlayFab側でCloud Script用に独自に書いたコードしか実行できなかったようなのですが、2020年2月に、Azure Functionsで作成した関数を、Cloud Scriptの1スクリプトとして実行できるようになりました。(まだプレビュー版ではありますが。)

通信イメージはこんなかんじです。①~④の順番で同期的に通信されます。

Cloud Script 通信イメージ

しかし、Azure Functions側の処理に少し時間がかかる場合や、呼び出し回数が非常に多いと想定される場合は、PlayFabとAzure Functionsの間に、Azure Storage Queue(キュー)を挟むことで、全体の処理効率が良くなる場合があります。PlayFabは、Cloud Scriptの実行時間に制限があるため、それを回避するために使用することも考えられます。

Queueを使用した通信イメージ

本記事では、キューを経由させてAzure Functionsを実行させる方法を記述します。

前提知識

下記アーキテクチャの基本的な内容を知っていれば、大丈夫だと思います。

  • PlayFab
  • Azure Functions
  • Azure Storage

手順

0. 準備

あらかじめ、PlayFab上で、タイトルを1つ作成しておきます。

タイトルの様子

1. キューストレージの作成

【1】Azureでストレージアカウントを作成できていない場合は、新しく作成します。参考:ストレージアカウントの作成 : くらう道

【2】ストレージアカウントの接続文字列を控えておきます。Azure Portalから確認する場合は、サイドメニューの「アクセスキー」を選択し、「キーの表示」ボタンをクリックして確認してください。この接続文字列は、あとで使用します。

ストレージアカウントの接続文字列

【3】新しいキューを作ります。Azure Portalから作成する場合は、サイドメニューの「キュー」を選択し、「+ キュー」ボタンをクリックすることで、キューの新規作成画面がでてきます。ここでは例として、キューの名前を「request-test」としました。名前を入力したら「OK」ボタンをクリックします。

キューの作成

2. 関数の作成

【1】Azure Functionsの環境変数に、さきほど控えたストレージアカウントの接続文字列を追加します。Azure Portalの場合は、サイドメニューから「構成」を選択し、「+新しいアプリケーション設定」ボタンをクリックすることで、新しい環境変数の追加画面が出てきます。(ランタイムがC#の場合は、「+新しい接続文字列」ボタン)。ただし、下記スクリーンショットのように、初期状態で「AzureWebJobsStorage」という変数が存在する場合、すでにその変数に接続文字列が格納されている可能性がありますので、値を確認したうえで、同じであれば、新規追加する必要はありません。

Azure Functions 環境変数

【2】Azure Functionsで新しい関数を作成してください。その際、トリガーは、「HTTPトリガー」ではなく、「Queueトリガー」としてください。参考:Azure Functions の Azure Queue storage トリガー

作成方法については、開発環境によっていろいろあるため割愛します。例として、Pythonをランタイムとして作成した場合、function.jsonファイルの中身は以下のようになります。

function.json
{
    "scriptFile": "__init__.py",
    "bindings": [
        {
            "name": "msg",
            "type": "queueTrigger",
            "direction": "in",
            "queueName": "request-test",
	    "connection": "ストレージアカウント接続文字列を格納した環境変数名"
        }
    ]
}

queueNameには、さきほど作成したキューの名前を入れておきます。connectionには、ストレージアカウント接続文字列を格納した環境変数名を入れておきます。ただし、環境変数名が「AzureWebJobsStorage」の場合は、connectionキーは省略しても構いません。

【3】関数の中身をコーディングします。例えば、下記はPythonのコードです。

__init__.py
import json
import azure.functions as func


def main(msg: func.QueueMessage):
    """ メイン処理
    """

    message = msg.get_body().decode('utf-8')
    logging.info('[Message]' + message)

    data = json.loads(message) # ここで、dataの中には、PlayFabのメタデータや、Cloud Script呼び出し時のパラメータが格納されている

【4】関数をデプロイします。

3. Cloud Scriptに登録

【1】PlayFabタイトルのページから、サイドメニューの「自動化」を選択し、「Functions(プレビュー)」を選択します。そして右上の、「関数の登録」ボタンをクリックします。

関数一覧

【2】トリガーの種類として「Queue」を選択します。関数名には、任意の名前を入力します。キュー名は、新しく作成したキューの名前を入力します。接続文字列には、あらかじめ控えておいた接続文字列を貼り付けます。入力が完了したら、「関数の登録」ボタンをクリックします。

関数登録

4. 完了

以上で作業完了となります。実際に、Cloud Scriptを呼び出すと、数百ミリ秒でレスポンスが返ってきます。しかし、レスポンスが返ってきた時点で、Azure Functionsの処理も完了しているという保証はなく、順次キューからリクエストが取り出され、処理されます。

補足

キューを使用しない場合は、Cloud Scriptは同期的に処理されるため、Azure Functionsのレスポンスをそのまま受け取ることができます。しかし、キューを使用する場合は、Cloud Scriptのレスポンス内に(当然ながら)Azure Functionsのレスポンスは含まれないため、処理結果を受け取りたい場合は、別途仕組みを考える必要があります。

Discussion