Hyper-V上のubuntuVMにVSCで接続してAzure Core Toolsを使ってみる

# Hyper-V上のubuntuVMにVSCで接続してAzure Core Toolsを使ってみる

なんだかだんだんタイトルが長くなってきましたがそういうことです。

やることは公式の[Core Tools を使用してローカルで Azure Functions を開発する](https://learn.microsoft.com/ja-jp/azure/azure-functions/create-first-function-vs-code-python)なのでわざわざこれを読まなくても公式読んだ方が正確です。
(VSCのAzure Extension使った方が楽なのかもしれないけどAzureへの直接操作はやらないのでこっちでちまちまやります。)

## VSCでubuntuVMに接続

VSCを起動して左下の><をクリック。
「ホストに接続」からのVMを選択して接続。

エクスプローラーで適当なVM上のディレクトリを開く。

## Azure Core Toolsのインストール

### リポジトリの追加

キーを持ってきて

```
curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
```

パッケージリストに追加

```
sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-$(lsb_release -cs 2>/dev/null)-prod $(lsb_release -cs 2>/dev/null) main" > /etc/apt/sources.list.d/dotnetdev.list'
```

ところでリストにはUbuntu 22.04 jammyまでしかないですけどUbuntu 24.04 nobleに対応してるんでしょうかね？

### ローカル側の更新

リストを更新したのでローカル側のカタログを更新。

```
sudo apt-get update
```

一応接続はできて持ってこれてるようなので公式のリストが古いだけみたいですね。

```
Get:1 https://packages.microsoft.com/repos/microsoft-ubuntu-noble-prod noble InRelease [3,600 B]
Get:2 https://packages.microsoft.com/repos/microsoft-ubuntu-noble-prod noble/main all Packages [576 B]                      
Get:3 https://packages.microsoft.com/repos/microsoft-ubuntu-noble-prod noble/main amd64 Packages [13.8 kB] 
```

### インストール

最新版のバージョンについては[リリース](https://github.com/Azure/azure-functions-core-tools/releases/)を確認しろということのようなので念のため見ておきます。
バージョン4が2024/12/03時点では最新のようなので、安心してver4のインストールコマンドを叩きます。

```
sudo apt-get install azure-functions-core-tools-4
```

## プロジェクトの作成

ここからがちょっとややこしい感じで、一応公式的には「プロジェクトの作成」->「テンプレート注入」の流れになっています(し、ふつうはそうなんじゃないかとも思うんですが)どうもドキュメントがちょっと怪しい感じです。

もうすでにいろいろやり方がわかってて空っぽのプロジェクトがほしいんじゃいという人は「プロジェクトの作成」へ。
まだHelloWorldなんだがー？という人はプロジェクトの作成はすっ飛ばして「テンプレート注入」だけでいいようです。

### 正攻法

まずプロジェクトを作ります。

```
func init MyProjFolder --worker-runtime python --model V2
```

なんかぞろぞろと書き込まれます

```
Writing requirements.txt
Writing function_app.py
Writing .gitignore
Writing host.json
Writing local.settings.json
Writing /home/puipui/MyProjFolder/.vscode/extensions.json
```

次にプロジェクトルートへ移動します。
(ドキュメントではこの行程が抜けてるので、うっかりそのまま作業するとプロジェクトの中に新しくプロジェクトが生まれます。)

```
cd MyProjFolder
```

で、プロジェクトの中でテンプレート注入をします。

```
func new --template "Http Trigger" --name MyHttpTrigger
```

ドキュメントには書いてないですが、セキュリティレベルについて聞いてくるので2のANONYMOUSを選択します。

```
Select a number for Auth Level:
1. FUNCTION
2. ANONYMOUS
3. ADMIN
Choose option: 2
Appending to /home/puipui/MyProjFolder/function_app.py
The function "MyHttpTrigger" was created successfully from the "Http Trigger" template.
```

ドキュメントには「このコマンドは仮想環境で実行する必要があります。」と書いてありますが気にせずそのまま起動します。

```
func start
```

なんかごちゃごちゃっと出てきますが、特に問題なく起動してきます。

```
Found Python version 3.12.3 (python3).

Azure Functions Core Tools
Core Tools Version:       4.0.6610 Commit hash: N/A +0d55b5d7efe83d85d2b5c6e0b0a9c1b213e96256 (64-bit)
Function Runtime Version: 4.1036.1.23224

[2024-12-03T07:20:10.168Z] Worker process started and initialized.

Functions:

        MyHttpTrigger:  http://localhost:7071/api/MyHttpTrigger

For detailed output, run func with --verbose flag.
[2024-12-03T07:20:15.106Z] Host lock lease acquired by instance ID '000000000000000000000000C371E1E1'.
```

ウィンドウが右下に出てくると思うので「ブラウザーで開く」を選択します。

なにやらちょっとかわいらしい画面が出てきます。
(ところでコードを見た感じメソッドの指定がないんですが、GETでもPOSTでもうまく取り扱うんですかね？)

出力にある通り、 "http://localhost:7071/api/MyHttpTrigger" で待ち受けている状態です。
なのでとりあえずGETでうまくいくと仮定すると、nameになにか適当な値を渡せばいいはずです。

ということでとりあえずこんな感じでアクセスしてみます。

```
http://localhost:7071/api/MyHttpTrigger?name=poe
```

画面に与えた値が反映されるので、これでいいようです。

```
Hello, poe. This HTTP triggered function executed successfully.
       ^^^
```

止めるときは Ctrl+C で止められます。

### ドキュメントに書いてない方法

まずプロジェクトを置いておくディレクトリを作成してその中に入っておきます。

```
mkdir hoge
cd hoge
```

テンプレート注入コマンドを投入します。

```
func new --template "Http Trigger" --name MyHttpTrigger
```

ごそごそ作成が始まるのでいろいろと指定します。Pythonなのでまずは4を、次にANONYMOUSの2を指定します。

```
Select a number for worker runtime:
1. dotnet (isolated worker model)
2. dotnet (in-process model)
3. node
4. python
5. powershell
6. custom
Choose option: 4
python
Found Python version 3.12.3 (python3).
The new Python programming model is generally available. Learn more at https://aka.ms/pythonprogrammingmodel
Writing requirements.txt
Writing function_app.py
Writing .gitignore
Writing host.json
Writing local.settings.json
Writing /home/puipui/hoge/.vscode/extensions.json
Select a number for Auth Level:
1. FUNCTION
2. ANONYMOUS
3. ADMIN
Choose option: 2
Appending to /home/puipui/hoge/function_app.py
The function "MyHttpTrigger" was created successfully from the "Http Trigger" template.
```

これで作成されたのでとりあえず実行します。

```
func start
```

ウィンドウが右下に出てくると思うので「ブラウザーで開く」を選択します。
引数(?)を与えてみます。

```
http://localhost:7071/api/MyHttpTrigger?name=hogehoge
```

反映されているので動いていますね。

```
Hello, hogehoge. This HTTP triggered function executed successfully.
       ^^^^^^^^
```

## 最後に

どちらが楽かというのは主観なのでどっちでもいいんじゃないかとおもいます。
VSC使ってるなら[Azure Functions for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurefunctions)使った方がいいんじゃ？という意見も当然あると思いますが、便利すぎるがゆえに「本番に接続したまんまうっかりやってもうた」もあり得てしまうんじゃないかと。
その辺はトレードオフの問題ですので、目的にあったものを選べばいいんじゃないかな、と思います。