Azure Functionsで作成した関数のHttpTriggerエンドポイントを保護する


作成した関数のエンドポイントを簡易的に保護する方法になります。

公式Doc👉関数のアクセスキー

HttpTriggerのAzure関数を追加する

VisualStudio上で追加したいディレクトリで右クリック → [追加] → [新しいAzure関数]

Triggerの選択画面がでるので、Http Trigerを選択します。

デフォルトで作られる関数はおそらく👇こんな感じです。(既に保護していた場合はuthorizationLevel.Annonymousの箇所がFunctionだったりAdminになってるかもです)

 public static class Function1
    {
        [FunctionName("Function1")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Annonymous, "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;

            string responseMessage = string.IsNullOrEmpty(name)
                ? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
                : $"Hello, {name}. This HTTP triggered function executed successfully.";

            return new OkObjectResult(responseMessage);
        }

この状態でAzure Functionsへデプロイするとどうなる?

デプロイはできます。この関数のURLを叩くと、動いてくれます。

しかし、認証等ないのでこの関数のURLを知ってしまえば誰でも使えてしまいます。

ですので、URLが特定されづらいものにしたほうがよりセキュアなものになります。

関数のURLを特定しづらいものにするには?

先程、関数を追加したときのデフォルトのコードを見ると、「AuthorizationLevel.Annonymous」というものがあります。

こちらのAnnonymousを「Function」or「Admin」などに変えてあげてください。

[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] 

変えた後、再度デプロイします。

再度、関数のURLを叩くと401となるのが確認できるかと思います。(local実行ではおそらく確認できないので再デプロイして試してください。)

これを設定してあげると、リクエストするときに関数のURLの他に関数キーが必要になります。

Portal上の👇の画面の[コードとテスト]から[関数のURLの取得]でParameterに関数キーがくっついた状態で取得できると思いますので、その状態でリクエストすると認証は通るかと思います。

この関数キーはデプロイすると自動で作成してくれるので自分で作成する必要はとくにありません。

再デプロイしてもキーが変わることもないです。

関数キーの確認・変更

関数キーはPortal上から関数に飛んで、[関数キー]という項目を押すと確認できます。

もし関数キーが漏洩してしまった場合はコチラから再度変更できます。

各関数ごとに違う関数キーも付けることができるのでお試しください。

注意

今回の方法でどこかしらでこの関数のURLを指定していた場合(例えばフロントエンドなど)、

URLは漏洩してしまうので、そこらへんは考慮が必要になります。

まとめ

特に関数のURLが公開されてないのであれば関数キーを使った方法は、十分セキュアなのかなと思います。