Azure Functionsで関数を作成して、ログをApplication Insightsに転送してみた

# はじめに

Azure には Azure Functions というサービスがあります。
これは「[サーバを考慮することなく、アプリケーションが実行可能な、イベント駆動型のサーバレスコンピューティングプラットフォーム](https://azure.microsoft.com/ja-jp/services/functions/#overview)」というサービスです。
要はAzureにおけるAWS Lambda（多分）。

またAWS Lambdaだと、アプリケーションの標準出力をCloudWatch Logsに転送し、集約管理します。
同じように Azure Functionsの場合は`Application Insights`（Azure Monitorというサービスの１機能）と連携し、アプリログを転送/集約管理するそうです。

ということで試しにやってみました、というのが今回の記事です。

## 構築の流れ

### Azure Functions の外枠を作る

まずは Azure Portalからアプリケーションを実行するための外枠を作成します。

- リソース一覧のコンピューティングカテゴリから`関数アプリ`を選択
![20220323_142104_01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396115/2a81db10-82ea-3066-e9e3-bbceb358ef4e.jpeg)

- 関数アプリを作成
![20220323_142128_01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396115/37d9673f-e580-c4cf-2ff8-c4a64a29c6f0.jpeg)

- 今回はPythonを選択
  - Azure Functionsでサポートしている言語の一覧は[こちら](https://docs.microsoft.com/ja-jp/azure/azure-functions/supported-languages)
  - 関数アプリ名の命名ルールは[こちら](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/management/resource-name-rules#microsoftweb)
 
![20220323_142913_01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396115/c23e96c6-ca55-4dec-6689-02b21f148e4e.jpeg)

- ストレージアカウントとプランを選択
  - [公式マニュアル](https://docs.microsoft.com/ja-jp/azure/azure-functions/storage-considerations)によると「トリガーの管理や関数実行のログ記録などの操作に Azure Storage を使用しているため」、ストレージアカウントは必須らしい
  - プランについては、いくつか種類がある模様（[プランの概要](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-scale#overview-of-plans)）
    今回は`従量課金プラン`を選択。
  - Pythonの場合、選択可能なOSはLinuxのみ
    - 使用する言語によっては Windowsも選べるらしい。（[オペレーティング システム/ランタイム](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-scale#operating-systemruntime)）

![20220323_142927_01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396115/fd212f40-6626-4c2d-a730-23657160f19c.jpeg)

- Application Insightsを有効にする
![20220323_143003_01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396115/37273430-35e5-9020-c5c7-1167b4df1259.jpeg)

- 作成
![20220323_143031_01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396115/196f80b1-fdbe-9eea-36e6-4fd89624a9a1.jpeg)

- 完成！
![20220323_143138_01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396115/a986b75e-1a2d-4e0a-dd95-b8c03aa10d20.jpeg)

- 関数アプリはまだない
![20220323_143158_01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396115/787868ea-c5c0-bef3-5ca3-0e0786a01ac8.jpeg)

### 関数アプリをデプロイする

Azure Functionsでの関数アプリのデプロイは、VSCodeの拡張機能を使用するそうです。
こちらは「[Visual Studio Code と Python を使用して Azure に関数を作成する](https://docs.microsoft.com/ja-jp/azure/azure-functions/create-first-function-vs-code-python)」に詳細手順があるので、ここでは省略します。

今回は次のようなhttpトリガーのサンプルコードをデプロイしてみました。
```python
import logging
import azure.functions as func

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')
    logging.critical('Test Critical Level')
    logging.error('Test Error Level')
    logging.warn('Test Warn Level')
    logging.info('Test info Level')
    logging.debug('Test Debug Level')

    print('Test Message')

    return func.HttpResponse(
        "This HTTP triggered function executed successfully.",
        status_code=200
    )
```
### 関数アプリを実行してみる

関数アプリを実行するためのURLが画面右上から取得できるので、
こちらをブラウザで打鍵して、ログを出力させてみます。

- 関数のURLを取得
![20220324_165225_01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396115/faccb899-bde2-4953-78e9-a487e95802b7.jpeg)

- ブラウザで取得したURLに接続して、関数アプリを実行 
![20220324_165352_01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396115/532e05b0-0909-50fd-39be-54a6c8522fc9.jpeg)

### Application Insights で確認する

最後にApplication Insightsでログが転送されていることを確認します。

- 関数アプリの最初の画面から Application Insightsの画面に移動
<img width="200" alt="20220324_165732_01.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396115/339c0180-36a0-b7a9-ae22-a5c619e28472.jpeg">

![20220324_165914_01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396115/953330d5-e45d-075e-104c-f927fc5a641d.jpeg)

- テストメッセージが出力されることを確認！
  - 関数アプリから出力したログは`traces`というテーブルに格納される模様
    - ログクエリは`KQL`という言語で記述するらしい。KQLに関するドキュメントは[こちら](https://docs.microsoft.com/ja-jp/azure/azure-monitor/logs/log-query-overview)
  - ログレベルの一覧は[こちら](https://docs.microsoft.com/ja-jp/azure/azure-functions/configure-monitoring?tabs=v2#configure-log-levels)
  - デフォルトだと`Debug`レベルは転送されない様子
    - この辺りは関数アプリの設定ファイル（[hosts.json](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-host-json)）でコントロールするようだ
![20220324_171406_01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2396115/137d079e-7cd8-77c7-79e8-89f314fcfdda.jpeg)

# まとめ

ということでまとめです。

- Azure Functionsのアプリログを Application Insightsを転送するのは簡単にできます
  - [Azure Monitorのマニュアル](https://docs.microsoft.com/ja-jp/azure/azure-monitor/app/app-insights-overview#how-application-insights-works)では「SDK or エージェントをインストールして」と記載されているが、Azure Functionsについては特に不要なようです。

# おまけ
- 関数アプリの中にしれっと`print文`を混ぜていたのですが、そちらもちゃんとApplication Insightsに転送されていました。ログレベルはInformationになるようです。
  - ログレベルを気にしないのであれば、単純にprint文で良いかもしれない（監視で困るかな？）