自動化

【PlayFab】Azure関数をローカルでデバッグする方法【VSCodeを使用】

playfab-local-debug

この記事では、PlayFab で Azure 関数をローカルでデバッグする方法について解説していきます。

「え?何の話?」という状態の人は、Azure関数でCloudScriptを実行する方法を参照してからまた戻ってきてください。

ローカルでバッグについては詰まりポイントが多く、ゼロから調べてやると挫折してしまう可能性が高いです。

この記事では、挫折ポイントを先回りして解決しているので、スムーズにデバッグ作業に映ることができます。

では、さっそく見ていきましょう。

Azure関数をローカルでデバッグする方法

ローカルデバッグの概念

まずはじめに、ローカルデバッグの概念について理解していきましょう。

簡単な図を作成してみました。

Unity側からAzure関数を呼び出すと、Azureに登録されている関数が呼び出される、というのは通常の動きですね。

ここでは「通常モード」と呼ぶことにします。

ねこじょーかー
ねこじょーかー
厳密にはCloudScript経由でAzure関数を呼び出しているのですが、画像を簡略化するために割愛しています!

通常モードとは別に、Azure関数として登録する前でも、ローカルサーバーとしてデバッグして実行結果を確認することもできます。

ここでは「デバッグモード」と呼ぶことにします。

通常モードの場合でもデバッグできる、という話を聞いたのですが、知識不足でこのやり方はわかっていません。

この記事ではデバッグモードにフォーカスして解説をしていきます。

通常モードとデバッグモードの違い

デバッグモードのときにも、ローカルのHelloWorld関数を自動で呼び出してくれればいいのですが、そうはいきません。

というのも、通常モードとデバッグモードでは、発行されるURLが異なるためです。

URLの違い

HelloWorld関数を呼び出した場合

通常モード
  • https://test.azurewebsites.net/api/HelloWorld が呼び出される
  • 呼び出す関数名によってURLは変わる
デバッグモード
  • http://localhost:7071/api/CloudScript/ExecuteFunction が呼び出される
  • 関数名を変えても、必ずこのURLになる

上記の通り。

通常モードの場合、関数によってURLが変わります。

しかし、デバッグモードの場合は、URLが固定で発行されるため、普通にデバッグしようと思ってもURLが見つからずエラーとなります。

なんだ、デバッグできないのか…

諦めるのはまだ早いです。

ExecuteFunction関数を用意してあげて、そこからHelloWorld関数を呼び出すと、デバッグすることができることを確認しました。

次からはこの方法について解説していきます。

Azure Functions Core Tools のインストール

ソースコードを触る前に、Azure Functions Core Tools のインストールを参考にして、デバッグに必要なツールをインストールしましょう。

Azure Functions Core Tools のインストール」という段落だけ作業できれば問題ありません。

ツールの準備はこれで終了です。

ExecuteFunction関数の準備

ペンギンくん
ペンギンくん
でも、デバッグ用に関数を準備するのは大変そうだね。

私も同じことを思い、諦めようかなと考えました。

が、調べに調べ、なんとかExecuteFunctionのサンプルに出会うことができました。

上記ソースコードをコピーして、次に進んでください。

定数の準備

まずはじめに目に留まるのはこの3行。

private const string DEV_SECRET_KEY = "PLAYFAB_DEV_SECRET_KEY";
private const string TITLE_ID = "PLAYFAB_TITLE_ID";
private const string CLOUD_NAME = "PLAYFAB_CLOUD_NAME";

クラウド名はなくても動作したのでよくわかりませんが、シークレットキーとタイトルIDの設定は必要です。

以下から確認することができます。

ねこじょーかー
ねこじょーかー
定数を自分の値に書き換えるだけでしょ。楽勝。

と思っていたのですが、実際の処理を見ると、定数から環境変数を取り出すという処理をしていることに気づきました。

string title = Environment.GetEnvironmentVariable(TITLE_ID, EnvironmentVariableTarget.Process);
var secretKey = Environment.GetEnvironmentVariable(DEV_SECRET_KEY, EnvironmentVariableTarget.Process);

なので、定数に直接自分の値を入れるのではなく、環境変数として登録して上げる必要があります。

Azure関数を使うときの環境変数の設定方法は、Azure関数で環境変数を設定する方法を参照してください。

ペンギンくん
ペンギンくん
登録が面倒だから今すぐ試したい!

こんな人もいるかと思うので、環境変数として参照している箇所を直接書き換えて実行するパターンも念のため書いておきますね。

すぐ試したい人だけ作業

55行目付近にあるタイトルIDを、自分のIDに書き換えます。

var functionContext = new FunctionContextInternal
{
  CallerEntityProfile = await GetEntityProfile(callerEntityToken),
  TitleAuthenticationContext = new TitleAuthenticationContext
  {
    // Id = Environment.GetEnvironmentVariable(TITLE_ID, EnvironmentVariableTarget.Process),
    Id = "XXXXX",
    EntityToken = await GetTitleEntityToken()
  },
  FunctionArgument = execRequest.FunctionParameter
};

265行目付近にあるタイトルIDを、自分のIDに書き換えます。

// Append the title name if applicable
string title = "XXXXX";
// string title = Environment.GetEnvironmentVariable(TITLE_ID, EnvironmentVariableTarget.Process);
if (!string.IsNullOrEmpty(title))
{
  sb.Append(title).Append(".");
}

170行目付近にあるシークレットキーを、自分のIDに書き換えます。

var getEntityTokenUrl = GetServerApiUri("/Authentication/GetEntityToken");

// Grab the developer secret key from the environment variables (app settings) to use as header for GetEntityToken
var secretKey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
// var secretKey = Environment.GetEnvironmentVariable(DEV_SECRET_KEY, EnvironmentVariableTarget.Process);

これで定数の準備は完了です。

playfab.local.settings.json の作成

デバッグをするには、playfab.local.settings.json というファイルを作成して、所定のフォルダに配置する必要があります。

以下の内容でファイルを作成しましょう。

playfab.local.settings.json
{ "LocalApiServer": "http://localhost:7071/api/" }

あとはこのファイルを所定のフォルダに置くのですが、Mac と Windows で場所が変わります。

Mac の人は、以下のコマンド「TMPDIR」というフォルダを開き、ファイルを配置してください。

open $TMPDIR

Windows の人は、「TEMP」というフォルダを開き、ファイルを配置してください。

具体的な手順は、Windows 10 ユーザーのTempフォルダー(一時フォルダ)を開く方法が参考になりそうです。

これでようやくExecuteFunctionの準備が整いました。

ローカルデバッグをする

ついにローカルデバッグをしていきます。

まずは、タイトルのデバッグを有効にする作業が必要です。

  1. 左のPlayFabアイコンをクリック
  2. 反映したいタイトルを右クリック
  3. Enable local debuggingをクリック

F5で実行して30秒くらいすると、ターミナルが以下の状態になります。

この状態になったら、あとはUnityから実行してみましょう。

デバッグをすると、まず最初にExecuteFunctionが実行されます。

ExecuteFunctionを経由して、ローカルのHelloWorld関数が呼び出されます。

実行後は、通常モードと同様に同じようなログが出力されることが確認できます。

これでひと通りの作業は完了です。

ローカルでバッグをやめる

ローカルでバッグをやめるときは、先ほど配置した playfab.local.settings.json を削除してください。

削除までしなくても、リネームするだけでローカルデバッグではなくなることも確認しています。

どちらかやりやすい方で切り替えしましょう。

まとめ

Azure関数をローカルでデバッグする方法について解説しました。

3行でまとめると以下のとおりです。

ローカルでバッグの方法まとめ
  1. Azure Functions Core Tools をインストール
  2. ExecuteFunction関数の用意
  3. デバッグする

簡単ですね。

ゼロから調べると大変ですが、この記事を見ながらやればそこまで時間はかからないはずです。

毎回Azureにアップロードして実行するのも面倒ですからね。

PlayFabでは現状、Azure関数を使わないとデバッグができないので、ぜひこの機会にAzure関数を導入してみましょう。

オンライン書籍「猫でもわかる PlayFab 入門」
playfab-book

日本で初めて、PlayFab の参考書を発売しました。

100時間以上の学習内容を凝縮した参考書です。入門として必要な知識は、すべてこの本に記載しました。

 

POSTED COMMENT

  1. 新一 より:

    前回、質問させていただいたバイナリデータと画像の件は、上手くいきました!ありがとうございます!

    今回、ガチャを実装しようと思って、ねこじょーかーさんのサイトのドロップアイテムを見て作ろうと思ったのですが、まず、Azure関数を使うということで、環境設定等を試みました。そこは、おそらく突破できたのですが、HelloWorldでできるか試そうとしたところ、VScodeでHelloWorldのAzure関数内で、現在のコンテキストにFunctionContextという名前は存在しません。というエラーが出てしまいました。探して解決しようと思いましたが、策が見つからず質問させていただきました。解答よろしくお願いします。

    • ねこじょーかー より:

      新一さん、こんばんは!
      前回の件はうまくいったとのことで、安心しました!

      今回は FunctionContext のクラスが見つからない、ということですね。
      パッと思いつくのは以下の2点です。

      ■正しくパッケージ追加ができているか
      FunctionContext は「PlayFab.Plugins.CloudScript」の名前空間のクラスです。
      なので、そもそもこの名前空間を参照できない場合は、
      パッケージ追加がうまくいっていない可能性が高いです。

      以下の記事を参考に、もう一度環境を確認してみてください。
      https://playfab-master.com/playfab-azure

      ■公式のサンプルで試していないか
      公式ドキュメントの HelloWorld のサンプルは「FunctionExecutionContext」というクラスになっており、
      「PlayFab.Samples」の参照が必要になってきます。

      上記ではなく、以下の記事の HelloWorld を試してみてください。
      https://playfab-master.com/playfab-azure-cloudscript

      上記が問題ないという場合、あとは VSCode を再起動してみるとか、それくらいでしょうか…

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です