いろいろ思うところがあってPython on Functionsとか見てました。まだPreviewな機能ですけど。というわけで完全に自分用メモです。
前提条件
- Azure Functions v2
- 現状PythonサポートはLinuxのみ(ポータルでランタイムスタック選べる範囲としては)
- なおLinuxなConsumption Planもでましたが、まだ地域は限定的です。(日本にはない)
- Python 3.6.x
- Python 3.7サポートはもうすぐ(ランタイムは入ってそうだけどFunctions Toolsのサポートがまだ)
開発環境に必要な条件
- Python 3.6.x
- Azure Functions Core Tools 2.2.70以降
あと直接デプロイするならAzure CLIなども必要です。またPython 3.7系がインストールされていたりする場合うまく動作しません。(Functions Core Toolsが3.6系を強制してるため)
Functionsのプロジェクト単位でPythonのvenvを使うのですがvenvはPythonのバージョンを変えられないので、現状で回避するにはAnanondaを使って3.6を指定して作ったconda環境でfuncコマンドを実行したりしましょう。。。
PythonなFunction Appの作成
プロジェクト用フォルダーでfuncコマンドを実行します。Anaconda使う場合はPython 3.6環境にしておきます。( conda create -n py36 python=3.6 anaconda とかして環境作成後 activate py36 とかおけばいいでしょう)
ややこしいですが、次にPythonのvenvを作成します。python -m venv .env を実行するとvenvができあがります。作成したら .env\scriptsフォルダーにactivateがあるので実行してアクティブにします。(Windowsの場合)
これでPython 3.6なvenvができあがります。(やっと土台ができました)
この環境下で func init でPythonを選択します。
必要なファイルやパッケージなどが生成されます。
プロジェクトフォルダーに移動して func new コマンドで新しいFunctionを作ります。
あとはプロジェクトフォルダーで func start すればローカル上でFunctionsが実行されます。違いが分かりにくいですが作成したFunction内の __init__.py が実行されます。
さてデバッグしないのであればこれだけで最低限いろいろできます。でもせっかくなのでVisual Studio Codeでデバッグもできるようにしましょう。
一番お手軽な方法はFunctionsのプロジェクト作成からVisual Studio Codeで行う方法です。コマンドパレットからAzure Functions: Create New Projectを実行していけばfunc initした状態+Visual Studio Codeでデバッグするのに必要な設定が追加されます。(.vscodeフォルダーにいろいろできます)
あとはコマンドパレットからAzure Functions: Create New Functionを実行していけばよいです。
できあがったらF5でデバッグ実行するとFunctionsに必要なランタイムなどの復元が終わってFunctionsのホストが起動し、アタッチされた状態になります。Httpトリガーなら指定URLをたたけば呼び出されるので、ブレイクポイントなどでデバッグすることができるようになります。
Anacondaな環境だと最初のFunctionsプロジェクトを作成するときにPython 3.6のパス(Conda環境の)を指定すればvenvも良しなにしてくれるので、手間がないですね。
Azureへのデプロイと動作確認
ここまでくれば通常のFunctionsと変わりません。Git連携してもいいですし直接デプロイしてもよいです。
Git連携した場合はソースは弄れなくなりますが、ポータル上でテスト実行したりログみたりすることができます。
※Visual Studio Codeから直接デプロイしようとすると何故かWindowsは非サポートですとか言われて怒られるので謎。
Tips
venvである .env フォルダなどは gitignoreされてますが .vscode はされてないのでGit連携する際などは注意しましょう。現状、Python 3.6が前提ですが、Python 3.6必須なのはfunc init時(VSCodeだとCreate New Project時)だけです。その時にconda環境下のPython 3.6などを指定することができればいいだけです。。(作成後のデバッグ実行などは別にPython 3.7でもいい)
早く3.7対応してほしい。
PythonなFunctionsで必要なパッケージは requirements.txt ファイルに記述すると最初にpipでインストールしてくれます。
デバッグ実行時などは .vscode\task.json にある runFunctionsHostを実行するようになっています。ここでvenvのactivateとfunc host startなどを実行するように記述しているのですがWindowsの場合、VSCodeのシェルがPowerShell前提の書き方になってるので注意。
参考
まとめ
とりあえず最低限のスタートラインには立てたかな?という感じ。