🥞

Azure Functionsをローカルで開発・デバッグする

2022/12/08に公開

この文書について

  • Azure Functionsはとても便利なサービスですが、徒手で挑むと動作確認デバッグが若干面倒です。
  • Azure Functionsの開発を効率的に進めるためのクイックリファレンスを作りました(基本的にはMS learnに則ってます
  • ターミナル環境で完結するように書いています。VSCodeとの連携等については別途参考URLをご参照ください

読むとできるようになること

  • ローカルでPython等でコードを書いてその場でFunctions模擬環境での実行
    (print( )関数やブレークポイントを使ったデバッグも可能)
  • 上記が可能な環境の整備
  • 上記で作成したコードのAzure環境への反映

前提

  • Python 3.5~3.10が動く環境
  • Azure CLIがインストール済であること
  • Ubuntu等aptが動く環境
    • Windows10以降をお使いの場合、WSL2で簡単にUbuntu環境を構築できます(参照)
  • (上記をサンプルに書きますが、Python以外の言語やDebian/Win/Mac等の環境については参考文献参照でインストール可能です)

手順

Azure Functions Core Toolsをインストール

適当なディレクトリ(/tmpなど)で以下のコマンドを実行

$ sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-$(lsb_release -cs)-prod $(lsb_release -cs) main" > /etc/apt/sources.list.d/dotnetdev.list'
$ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
$ sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
$ sudo apt-get update
$ sudo apt-get install azure-functions-core-tools-4

Mac/Windows/Debian系Linuxの環境については以下を参照してください
https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-run-local?tabs=v4%2Clinux%2Cpython%2Cportal%2Cbash#create-a-local-functions-project

関数アプリプロジェクトの作成

Python 3.5 - 3.10のいずれかが動作しているディレクトリで以下のコマンドを実行

$ func init MyFunctionProj

「MyFunctionProj」の部分はお好きな名前を指定してください(ここで指定する名前は単なるディレクトリ名なので、ドメイン名衝突等を気にする必要はありません。以下では functions_rest_test を指定して進めます)

上記コマンドを実行するとどの言語を用いるか聞かれるので今回はpythonを選択します。

Select a number for worker runtime:
1. dotnet
2. dotnet (isolated process)
3. node
4. python
5. powershell
6. custom
Choose option: 4
python
Found Python version 3.8.10 (python3.8).
Did you know? There is a new Python programming model in public preview. For fewer files and a decorator based approach, learn how you can try it out today at https://aka.ms/pythonprogrammingmodel
Writing requirements.txt
Writing getting_started.md
Writing .gitignore
Writing host.json
Writing local.settings.json
Writing /home/miz/projects/functions_rest_test/.vscode/extensions.json

この操作はポータル上での「関数アプリの作成」に相当します。

この手順の詳細は↓です
https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-run-local?tabs=v4%2Clinux%2Cpython%2Cportal%2Cbash#create-a-local-functions-project

VSCodeを使用しAzure Functions拡張機能を導入している場合VSCodeのAzureメニューからも関数アプリを作成可能ですが今のところ.NET系プロジェクトしか作成できないため上記手順をお勧めします

関数の作成

上記で作成された関数アプリプロジェクトのディレクトリに移動し、

$ func new

を実行します。様々なトリガーで動く種々の関数を作成できますが、ここでは(WebAPIを作りたい方が多いと思うので)「9. HTTP trigger」を選択します。その後、関数名を聞かれるため名前を指定します。
(以下、myfunc を指定したとします。この名前は重複を気にする必要はありません。また、特に設定を変えない限りトリガーパスは /api/(関数名) となります)

上記を実行すると指定した関数名のディレクトリが作成されます。

$ ls  
getting_started.md  host.json  local.settings.json  myfunc  requirements.txt
$ ls myfunc/
__init__.py  __pycache__  function.json

上記の__init__.py が具体的に実行されるpythonファイルになります

ローカルでの実行

(myfunc配下ではなく) 関数アプリプロジェクトのディレクトリで

$ func start

を実行します。
すると、

のようにローカルサーバのURLが表示されるため、ブラウザでアクセスすると関数の動作を確認できます。

また、init.py 等のPythonファイルにprint文を挿入することで簡易なデバッグも可能です

Azureへの反映 (デプロイ)

作成した関数アプリ / 関数の動作を一通り確認したら、Azureに反映します。

Azure CLIで未ログインの場合、ログインしておきます

$ az login

また、Azure側で関数アプリがまだない場合は関数アプリを作成しておいてください。
(Azureポータル最上部の検索から「関数アプリ」(日本語)もしくは「Function App」(英語)を検索 > Services 配下の関数アプリ / Function App を選択 > 作成 / Create)

Azureに反映するために以下のコマンドを関数アプリプロジェクトのディレクトリ内で実行します。

$ func azure functionapp publish (Azure上の関数アプリ名)

デプロイがうまくいくと、ポータルの関数アプリの関数 > 関数画面で作成した関数がデプロイされているのを確認できます

Azureへの反映の詳細は以下を参照してください
https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-run-local?tabs=v4%2Clinux%2Cpython%2Cportal%2Cbash#publish

Discussion