Azure Functions × Node.js × Typescript をローカルの仮想環境上のDockerで動かして VSCodeからデバッグ実行したメモ

## 概要

Azureのチュートリアル「[Visual Studio Code から Azure Functions をデプロイする][*1]」を行っていたところ、
関数のローカル実行でエラーとなった。
Nodeのバージョンによるものだったため、関数のローカル実行をDocker上で行うようにした。
デバッグ実行の設定を調べるのに時間がかかったため、備忘録として残す。

[この時点のソース](https://github.com/hibohiboo/develop/tree/f2a54792b18b9b309bc917ac27a6ca3fdf6a6c16/tutorial/lesson/ms-function)
## 環境

* Windows 10 Home
* chocolatey 0.10.15
* Vagrant 2.2.10
* virtualbox 6.1.16
* Ubuntu 20.04 LTS 
* Docker version 19.03.13, build 4484c46d9d
* docker-compose version 1.27.4, build 40524192

※Vagrantは192.168.50.10のIPで立ち上げ。

## ツールの準備

* [Azure Functions Core Tools][*3]の手順にしたがい、64bit版をインストール

```ps
choco install azure-functions-core-tools-3 --params "'/x64'" -y
```

## ソース

### Dockerの設定
* 2020.11.01現在、Azure Functionsはnode v12までが対象。
* node.jsでAzure Functionsを動かせるようにこちらにもツールをインストール
* package.jsonはプロジェクトの作成で作ったものを利用している。

```dockerfile:docker/functions/Dockerfile
# docker-hubからnode入りコンテナを取得
# https://hub.docker.com/_/node/
FROM node:12.19.0
WORKDIR /app
# ツールのインストール
RUN npm i -g azure-functions-core-tools@3 --unsafe-perm true
# Functionsのインストール
COPY ./package.json /app/package.json
RUN npm install
```

```yml:docker/docker-compose.yml
version: "3.8"
services:
  az-functions:
    build: ./functions
    volumes:
      - ../HttpExample:/app/HttpExample
      - ../tsconfig.json:/app/tsconfig.json
      - ../local.settings.json:/app/local.settings.json
    ports:
      - 9229:9229
      - 7071:7071
    working_dir: /app
    command: [npm, run, start]
```

* vagrantを立ち上げ、`docker`ディレクトリで`docker-compose up`コマンドを入力してfunctionsが立ち上がることを確認。
* http://192.168.50.10:7071/api/HttpExample?name=test にアクセスできることを確認。

### デバッグ設定

vscodeからデバッグを行うとき、プロジェクトの作成で作成されたとおりではできなかった。

* 以下を追記している
  * addressに仮想環境のIPアドレス
  * remoteRootにdocker上のパス

```json:.vscode/launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Vagrant - Docker: Attach to Node Functions",
      "type": "node",
      "request": "attach",
      "remoteRoot": "/app",
      "address": "192.168.50.10",
      "port": 9229,
      "protocol": "auto",
    }
  ]
}
```

* docker上で動かすときに、`0.0.0.0`で動かさないと`attach`に失敗する。

```json:local.settings.json
{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "FUNCTIONS_WORKER_RUNTIME": "node",
    "languageWorkers:node:arguments": "--inspect=0.0.0.0:9229"
  }
}
```

* 再度`docker-compose up`で動かしなおす
* visual studioで「F5」キーを押し、ブレイクポイントで止まることを確認する
* 懸念点
  * デバッグ実行時、worker-bundle.jsの7148行目のstr = JSON.parse(str);でエラー。。。


## 参考

[Docker + Node.js のデバッグ Visual Studio Code編][*5]
[Visual Studio Code から Azure Functions をデプロイする][*1]
[Functions ローカルデバッグ][*2]
[Azure Functions Core Tools][*3]
[node debug guide][*9]
[Debianでsourcelist内のhttpsが取得出来ないとき][*4]
[lsb_release: command not found in latest Ubuntu Docker container](https://stackoverflow.com/questions/58395566/lsb-release-command-not-found-in-latest-ubuntu-docker-container)
[Visual Studio Codeで、Node.jsアプリケーションをデバッグする（ローカルプロセスアタッチ／リモートデバッグ）][*6]
[How to set inspect port for nodejs][*7]
[Visual Studio Codeで始めるデバッグ可能なnode.jsアプリ開発(express＋ejsでhelloworldするとこまでのチュートリアル)][*8]

[*1]:https://docs.microsoft.com/ja-jp/azure/developer/javascript/tutorial-vscode-serverless-node-01?tabs=bash
[*2]:https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-reference-node?tabs=v2#local-debugging
[*3]:https://github.com/Azure/azure-functions-core-tools
[*4]:https://scribble.washo3.com/linux/debian%E3%81%A7sourcelist%E5%86%85%E3%81%AEhttps%E3%81%8C%E5%8F%96%E5%BE%97%E5%87%BA%E6%9D%A5%E3%81%AA%E3%81%84%E3%81%A8%E3%81%8D.html
[*5]:https://qiita.com/tailix/items/fe3804e7a58978741d56
[*6]:https://kazuhira-r.hatenablog.com/entry/2018/11/08/235918
[*7]:https://github.com/Azure/azure-functions-core-tools/issues/557
[*8]:https://cloudsteady.jp/post/8867/
[*9]:https://nodejs.org/en/docs/guides/debugging-getting-started/