Azureが提供するサービスに、さまざまなイベントによって駆動し、サーバーの構築や保守をすることなくプログラムを実行できる「Azure Functions」というものがある。
Azure Functionsについての詳細は、以下のサイトを参照のこと。
https://www.fenet.jp/dotnet/column/tool/1486/
今回は、Pythonで動作するAzure FunctionsをAzure portal上で作成し、サンプルプログラムを作成してみたので、その手順を共有する。
前提条件
下記サイトの手順に従って、Azure Portalのアカウントを作成済であること。
https://qiita.com/qt-luigi/items/53341070a7fd4de802f9
やってみたこと
- Azure PortalでAzure Functionsの作成
- ローカル環境で動作するための環境構築
- ローカル環境でのAzure Functions動作検証
- Azure上でのAzure Functions動作検証
Azure PortalでAzure Functionsの作成
Pythonで動作するAzure Functionsの作成は、Azure Portal上で行える。その手順は、以下の通り。
1) Azure Portalにログインし、「関数アプリ」を選択する。
2) 新規で関数アプリを作成するため、「作成」ボタンを押下する。
3) 今回は従量課金プランを利用するため、「消費」を選択し「選択」ボタンを押下する。
5) ランタイムスタックにPythonを選択し、それ以外の各項目を入力後、「Storage」タブを選択する。
6) ストレージアカウントを指定し、それ以外の各項目を入力後、「ネットワーク」タブを選択する。
7) パブリックアクセスを有効にし、「監視」タブを選択する。
8) ログ取得を行うため、Application Insightsを有効にし、「デプロイ」タブを選択する。
9) 継続的デプロイは無効、基本認証を有効にし、「確認および作成」ボタンを押下する。
10) 作成するFunctionsの内容を確認し、「作成」ボタンを押下する。
12) 完了すると以下の画面が表示されるため、「リソースに移動」ボタンを押下する。
13) 関数アプリが作成され、以下の画面が表示されることが確認できる。
ローカル環境で動作するための環境構築
ローカル環境でAzure Functionsの動作確認を行うための環境構築は、以下の通り。
1) Python 3.11をインストールする。
1-1) 以下のサイトにアクセスし、「Windows installer (64-bit)」を押下し、Python3.11.9をダウンロードする。
https://www.python.org/downloads/windows/
1-2) ダウンロードした「python-3.11.9-amd64.exe」をダブルクリックする。
1-3) 以下の画面が表示されるため、各チェックボックスにチェックを入れ「Install Now」ボタンを押下する。
1-4) インストール完了すると以下の画面が表示されるため、「Close」ボタンを押下する。
1-5) コマンドプロンプト上で「python –version」コマンドを実行すると、インストールされたPythonのバージョンを確認できる。
2) その他、以下のサイトに記載のAzure CLI、Azurite ストレージ エミュレーター、Azure Functions Core Toolsのインストールを行う。
https://learn.microsoft.com/ja-jp/azure/azure-functions/create-first-function-cli-python?tabs=windows%2Cbash%2Cazure-cli%2Cbrowser
2-1) Azure CLIは、以下のサイトにアクセスし、「Azure CLIの最新のMSI (64ビット)」を押下し、ダウンロードする。
https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli-windows?tabs=azure-cli
2-2)「azure-cli-2.67.0-x64.msi」をダブルクリックする。
2-3) 以下の画面が表示されるため、ライセンスを確認し、チェックボックスにを入れ、「Install」ボタンを押下する。
2-4) インストール完了すると以下の画面が表示されるため、「Finish」ボタンを押下する。
2-5) コマンドプロンプトで「az –version」コマンドを実行すると、インストールされたazure-cliのバージョンが確認できる。
2-6) Azurite ストレージ エミュレーターは、以下のサイトにアクセスし「Download Node.js」ボタンを押下し、node.jsをダウンロードするところから始める。
https://nodejs.org/en
2-7)「node-v22.12.0-x64.msi」をダブルクリックする。
2-8) 以下の画面が表示されるため、「Next」ボタンを押下する。
2-9) ライセンスの内容を確認し、チェックボックスにチェックを入れ「Next」ボタンを押下する。
2-12) チェックボックスにチェックを入れ、「Next」ボタンを押下する。
2-14) インストールが完了すると以下の画面が表示されるため、「Finish」ボタンを押下する。
2-15) コマンドプロンプトで「node -v」「npm -v」コマンドを実行すると、以下のように、node,npmのバージョンを確認できる。
2-16) ストレージ エミュレーター(azurite)のインストールを行うため、コマンドプロンプトで「npm install -g azurite」コマンドを実行する。
2-17) azuriteのログ出力を行うためのフォルダ(下図では「C:\work\azure\python\azurite」)を作成する。
2-18) ストレージ エミュレーター(azurite)の実行は、以下のように、「azurite –silent –location (ログ出力先フォルダ) –debug (出力ログのパス)」コマンドの実行により行える。
また、azuriteコマンドを終了するには、Ctrl+Cを押下する。
2-19) Azure Functions Core Toolsは、以下のサイトにアクセスし「v4.x – Windows 64 ビット」リンクを押下する。
https://learn.microsoft.com/ja-jp/azure/azure-functions/create-first-function-cli-python?tabs=windows%2Cbash%2Cazure-cli%2Cbrowser
2-20)「func-cli-x64.msi」をダブルクリックする。
2-21) 以下の画面が表示されるので、「Next」ボタンを押下する。
2-22) ライセンスを確認し、チェックボックスにチェックを入れ、「Next」ボタンを押下する。
2-25) インストールが完了すると以下の画面が表示されるため、「Finish」ボタンを押下する。
2-26) コマンドプロンプトで「func –version」コマンドを実行すると、以下のように、Azure Functions Core Toolsのバージョンを確認できる。
ローカル環境でのAzure Functions動作検証
ローカル環境でのPythonによるAzure Functionsアプリを作成し、動作検証を行う。その手順は、以下の通り。
1) PythonによるAzure Functionsアプリを作成するためのフォルダ(下図では「C:\work\azure\python\azureFuncPython」)を作成する。
2) コマンドプロンプトで1)のフォルダに移動し、Python仮想環境を作成するコマンド「py -m venv .venv」を実行する。
上記コマンドを実行すると、以下のように、.venvフォルダが作成されていることが確認できる。
3) コマンドプロンプトで「.venv\scripts\activate」を実行し、仮想環境をアクティブ化する。
4) コマンドプロンプトで「func init –python」コマンドを実行し、Python v2 関数プロジェクトを作成する。
5) コマンドプロンプトで「func new –name HttpExample –template “HTTP trigger” –authlevel “anonymous”」コマンドを実行し、HTTPトリガーを利用した関数「HttpExample」を追加する。
なお、認証レベルANONYMOUSは、認証なしでHTTPトリガーを利用した関数「HttpExample」にアクセスするためのオプションである。
6) 5)の実行が終わると、以下のようなソースコードが作成されることが確認できる。
7) そのままFunctionを実行するとエラーになるため、「function_app.py」を以下のように修正する。(コメントアウトされている部分が修正前ソースコード。)
import azure.functions as func import datetime import json import logging #app = func.FunctionApp() app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS) #@app.route(route="HttpExample", auth_level=func.AuthLevel.Anonymous) @app.route(route="HttpExample") def HttpExample(req: func.HttpRequest) -> func.HttpResponse: logging.info('Python HTTP trigger function processed a request.') name = req.params.get('name') if not name: try: req_body = req.get_json() except ValueError: pass else: name = req_body.get('name') if name: return func.HttpResponse(f"Hello, {name}. This HTTP triggered function executed successfully.") else: return func.HttpResponse( "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.", status_code=200 )
その他、作成されたソースコードの内容は、以下の通り。
●host.json
{ "version": "2.0", "logging": { "applicationInsights": { "samplingSettings": { "isEnabled": true, "excludedTypes": "Request" } } }, "extensionBundle": { "id": "Microsoft.Azure.Functions.ExtensionBundle", "version": "[4.*, 5.0.0)" } }
●local.settings.json
{ "IsEncrypted": false, "Values": { "FUNCTIONS_WORKER_RUNTIME": "python", "AzureWebJobsStorage": "UseDevelopmentStorage=true" } }
●requirements.txt
# Do not include azure-functions-worker in this file # The Python Worker is managed by the Azure Functions platform # Manually managing azure-functions-worker may cause unexpected issues azure-functions
8) 別のコマンドプロンプトでazuriteを実行しつつ、コマンドプロンプトで「func start」コマンドを実行する。
9) ブラウザ上で「http://localhost:7071/api/HttpExample」にアクセスすると、以下のように、function_app.pyで定義していたHttpResponseが返却されることが確認できる。
10) ブラウザ上で「http://localhost:7071/api/HttpExample?name=purinit」にアクセスすると、以下のように、function_app.pyで定義していたHttpResponseが、nameの値を置き換え返却されることが確認できる。
11)「func start」コマンドの実行を終了するには、Ctrl+Cを押下する。
Azure上でのAzure Functions動作検証
Azure上に、PythonによるAzure Functionsアプリをデプロイし、動作検証を行う。その手順は、以下の通り。
1) Azure上にAzure Functionsアプリをデプロイするため、「az login –tenant (既定のディレクトリのテナントID)」コマンドを実行し、Azure環境にログインする。
2) 以下の画面が表示されるため、アカウントを選択し「続行」ボタンを押下する。
4) 以下のように、Azure環境にログインされたことが確認できる。
なお、az loginコマンドを実行した場合は、以下のようなエラーメッセージが表示されたため、上記1)~4)の手順を実行している。
5) 以下のように、Azure Functionsアプリのデプロイ先となるAzure Functionsが、起動していることを確認する。
6) コマンドプロンプトで「func azure functionapp publish
9) 以下のように、デプロイしたAzure Functions 関数で、関数「HttpExample」が表示されていることが確認できる。
10) アプリファイルを見ると、以下のように、デプロイしたソースコードの表示が確認できる。
11) ブラウザ上で「https://azurefuncpython.azurewebsites.net/api/httpexample」にアクセスすると、以下のように、function_app.pyで定義していたHttpResponseが返却されることが確認できる。
12) ブラウザ上で「https://azurefuncpython.azurewebsites.net/api/httpexample?name=purinit」にアクセスすると、以下のように、function_app.pyで定義していたHttpResponseが、nameの値を置き換え返却されることが確認できる。
13) 出力されたログを確認するには、「監視」メニューから「ログ」を選択する。
14) 以下の画面が表示されるため、右上の「×」を押下し「Log Analyticsへようこそ」の画面を閉じる。
15) 以下の画面が表示されるため、「必ずクエリハブを表示する」をオフにし、右上の「×」を押下し「クエリ パック」の画面を閉じる。
16) 例えば過去1時間分のトレースログを見るには、時間の範囲を「過去1時間」に設定し、クエリ「traces | order by timestamp」を指定の上、「実行」ボタンを押下する。
17) 以下のようにトレースログが表示され、function_app.py内の文言「Python HTTP trigger function processed a request.」がログに出力されていることが確認できる。
要点まとめ
- Azureが提供するサービスに、さまざまなイベントによって駆動し、サーバーの構築や保守をすることなくプログラムを実行できる「Azure Functions」というものがある。
- Pythonで動作するAzure Functionsを作成や(ローカル環境・Azure環境での)実行は、Azureの公式サイトの手順に従って、実施することができる。