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の公式サイトの手順に従って、実施することができる。
















