[Azure] IoT Hubと接続したローカルFunctionsアプリをステップ実行デバッグする

前回の記事で、IoT Hubと Azure Functionsとの接続が固まったので、ここからはよりAzure Functionsの開発をしやすいように、デバッグ環境を整えたいと思います。

:::note info
前回の記事
[[Azure]IoT Hubへの通信をローカル実行Functions(Python)で受けて表示する方法 #Python - Qiita](https://qiita.com/fsd_maclala/items/1e138e496b6799b8af22)

:::

## 環境
Windows11, WSL2
```
❯ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.2 LTS"
```
vscode

![スクリーンショット 2024-03-13 182149.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249097/b2be39cf-d805-fc1d-8184-263bb16ba0aa.png)


## 大まかな流れ

1. 記事を書くにあたっての背景
1. vscodeの設定
1. ブレイクポイントの動作確認


## 記事を書くにあたっての背景

普段私はPycharmユーザーで、MacやLinuxでPycharmを使っているときにややこしいと思ったことはあまりないのですが、Windows + WSL環境ではうまく動いてくれないことが多いと感じます。

理由として、WSLとWindowsのファイルシステムが地続きではない事が最も大きな原因でしょう。

Windows側のPycharmアプリから、WSL内部のリソースを参照しようとするときに問題が起こるケースが多々あります。

Pycharm自体はPythonのテストを書くのが楽だったり、使い慣れているという理由で結局Windows環境でも使っているのですが、正直、余計な問題に対処させられたり、フルで機能を使えなかったりと悲しいことが多いです。

今回もPycharmでAzure Functionsのステップデバッグ等をやりたいと思ったのですが、どうもうまくいくイメージが湧かず、解決できそうな文献も見つけられなかったため、仕方なくvscodeを使ってやることにしました。（なお、vscodeでやるとめちゃくちゃ簡単にできました）

ということで、やはりWindows + vscodeは強いですね。。


## vscodeの設定

結論から言うと、vscodeを起動して、WSLに接続して、Azure Functionの拡張をインストールしたら、後は特に設定もなくデバッグが出来ました。

というと身も蓋もないので、一応デバッグの設定にかかわる部分の記録を取って置きたいとおもいます。

拡張をインストールし終わると、プロジェクト直下.vscodeディレクトリの中に4つのjsonファイルが出来てました。

### .vscode/extensions.json

```json:extensions.json
{
  "recommendations": [
    "ms-azuretools.vscode-azurefunctions",
    "ms-python.python"
  ]
}
```


### .vscode/launch.json

```json:launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Attach to Python Functions",
            "type": "python",
            "request": "attach",
            "port": 9091,
            "preLaunchTask": "func: host start"
        }
    ]
}
```

### .vscode/settings.json
```json:settings.json
{
    "azureFunctions.deploySubpath": ".",
    "azureFunctions.scmDoBuildDuringDeployment": true,
    "azureFunctions.projectLanguage": "Python",
    "azureFunctions.projectRuntime": "~4",
    "debug.internalConsoleOptions": "neverOpen"
}
```

### .vscode/tasks.json
```json:tasks.json
{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "func",
			"label": "func: host start",
			"command": "host start",
			"problemMatcher": "$func-python-watch",
			"isBackground": true
		}
	]
}
```

正直なところどれがFunctionsのランタイムにデバッガを接続するような設定になっているのかいまいちわかっていないのですが、tasks.jsonとlaunch.jsonはもろにそのあたりの情報が書かれている感じです。
Functionsランタイムはport:9091で起動して、それにデバッガが繋げに行くということが行われているのでしょう。

## ブレイクポイントの動作確認

ということで、左側のRun and Debugのボタンを押すと、"Attach to Python Functionsという項目が増えております。

これをクリックするとvscode下部にターミナルが開き、func startするのと同じログが流れます。

![スクリーンショット 2024-03-13 184724.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249097/931835de-0ac2-decf-6400-4346e8a4f6a5.png)

この状態で、IoT Hubにメッセージを送ると、無事コード実行がブレイクポイントで停止しました。

:::note info
IoT Hubにメッセージを送る方法はこちら
[Azure IoT Hubにエッジデバイスからデータを送信から確認まで #Azure - Qiita](https://qiita.com/fsd_maclala/items/d5a295039abd913b6af9)

:::

![スクリーンショット 2024-03-13 184846.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249097/4a945cb7-515a-5313-a5b4-4e1681ac096d.png)

ということで、Azure Functionsコード中の任意の場所でブレイクできるようになりました。
これで開発が随分楽になると思います。

いい開発はいいデバッグ環境の構築から、ですね。