Azure Functions上で動作するアプリケーションにおいて、環境変数を定義し利用することができる。
今回は、Azure Functions上で動作するPythonアプリケーションにおいて、SQL Databaseへの接続情報を環境変数として定義してみたので、その手順を共有する。
前提条件
下記サイトの手順に従って、Azure Functions上で動作しマネージドIDを利用してSQL Databaseに接続するPythonアプリケーションの作成が完了していること。
やってみたこと
- local.settings.jsonへの環境変数定義
- ローカル上でのAzure Functions動作検証
- Azure Functionsの環境変数定義
- Azure上でのAzure Functions動作検証
local.settings.jsonへの環境変数定義
local.settings.jsonへの環境変数定義や暗号化/復号化を、Azure Functions Core Tools のコマンドを用いて行える。その手順は、以下の通り。
1) local.settings.jsonの配置場所は、以下の通り。
2) 変更前のlocal.settings.jsonの値は、以下の通り。
{ "IsEncrypted": false, "Values": { "FUNCTIONS_WORKER_RUNTIME": "python", "AzureWebJobsStorage": "UseDevelopmentStorage=true" } }
3) local.settings.jsonの値は、Azure Functions Core Tools の「func settings list –showValue」コマンドによっても確認できる。
4)「func settings add “ENV” “local”」コマンドによって、以下のように、local.settings.jsonに環境変数ENV=localの値を追加できる。
5) 同様に、func settings addコマンドにより、他に必要な環境変数を追加する。
なお、「DRIVER_NAME」の値は、以下の画面赤枠の、SQL Serverドライバ名から取得できる。
7) この時点でlocal.settings.jsonの値を確認した結果は、以下の通り。
{ "IsEncrypted": false, "Values": { "FUNCTIONS_WORKER_RUNTIME": "python", "AzureWebJobsStorage": "UseDevelopmentStorage=true", "ENV": "local", "DRIVER_NAME": "{ODBC Driver 17 for SQL Server}", "SERVER_NAME": "azure-db-purinit.database.windows.net", "DATABASE_NAME": "azureSqlDatabase", "USER_ID": "purinit@azure-db-purinit", "PASSWORD": "(設定したパスワード)", "AUTH": "ActiveDirectoryMsi" }, "ConnectionStrings": {} }
8)「func settings encrypt」コマンドによって、local.settings.jsonの値を暗号化できる。
9) 暗号化したlocal.settings.jsonの値を確認した結果は、以下の通り。
{ "IsEncrypted": true, "Values": { "FUNCTIONS_WORKER_RUNTIME": "CfDJ8LSmyxluVh5AkwQC3VuxDYc/T82FHtQ4lELsX+KywXWdCOWWIlgOCMBjAR0Btfm9Vo1URw/Fhj4zRI9vju7WuDUsHkzhTPuJgBKlc7RQ2jnWcU4mZXSAjT9BAiBvgIdOmA==", "AzureWebJobsStorage": "CfDJ8LSmyxluVh5AkwQC3VuxDYdeKqkehRxY5fKrknLUfrxrYKG4Ouun03rmrSwQlrB7gRxQvX7VcO7eIG5q4qtaDvurmnCJ7s8s9E+f23j9mgWi0QgjoZOfx30lwXp+Ye/q3j5lDHhxWzbDA7CRr52INWk=", "ENV": "CfDJ8LSmyxluVh5AkwQC3VuxDYcZ4d0INcsQuZINSen12T1yqpKjSueqXS6B8f5qOrt0LjwVNF7E/uFPJi/QbmRKbDEePkpWKpiZ3c8mNNVKg5/D61qpLvubNwiz6Uhu8vOFJw==", "DRIVER_NAME": "CfDJ8LSmyxluVh5AkwQC3VuxDYcn8ubyyoRmaGZyG7mT/VBSmiOag4C9onMSZAgv5ZmxiLsSQ9y2R37AvoqHggy0hquQ3/5xuaFoRgJZ1yw2vCL6p6gxaB4glYNxxuMtrvuUNUG7eVuvdTf2086qZ9VW0eI=", "SERVER_NAME": "CfDJ8LSmyxluVh5AkwQC3VuxDYeDbwZy3cCGR+pigT8MhzDpCrxEFk0p5igD4GWnuwB8gAVPsf3o8usGIGyyesedzJWMGmn7UWsKh9Un4iDsmtnNMd1fH54agKcHgaOAkupqgo8ZzJzvVTU4vTFXkWjJqrAsUoOfizmmXenwLUOyP9sR", "DATABASE_NAME": "CfDJ8LSmyxluVh5AkwQC3VuxDYfh5pxdzHMeIR8Ouz0U0P3E4/F9n6vSFoXF0u3wM1JA9JHCP2TR3Bp96PgltwOlG9D/xORxkFMjcz5YqS3b6GzEtZ9YvNGkUkk5pWoy3Y6rC4K+sVS8vSIP/68/Z+OZ0+8=", "USER_ID": "CfDJ8LSmyxluVh5AkwQC3VuxDYduwplRntl7FjU3iizNDNPUq0gaBHkR4F1PSOZvTCJu70xWc1f04i6TU61tMHxPX6fiPR+MefXkBFv4nZCUSIdXXJtgWmFjZvDyOkte3JJVoFoQlAPbQwKtX8pBLcu66SM=", "PASSWORD": "CfDJ8LSmyxluVh5AkwQC3VuxDYdaD5HCj0sBMQMy/yETkYWn814CQzAafkvhgvjQdbgT+Q43+TDcslunXgn+PbDO8N8K+T8M7U0MT0tFOGnshxmUxQwJfNed5bhzkJfirRpHKw==", "AUTH": "CfDJ8LSmyxluVh5AkwQC3VuxDYeZrsgz7cfgqrPm8dKLcY6CRrrMbaGrkBaNIRFZoHa2qrLKV4g504SXAwEGhZev/lLL4cmOz1XSAL8AMCrAiHGQzeTousUtb/epDukqG5lzEymPR2hIoAUjcgoQo5kHwqs=" }, "ConnectionStrings": {} }
10)「func settings list –showValue」コマンドを利用すると、今まで通り、暗号化する前の設定値の確認ができる。
11)「func settings decrypt」コマンドによって、local.settings.jsonの値を復号化できる。
12) 復号化したlocal.settings.jsonの値を確認した結果は、以下の通り。
{ "IsEncrypted": false, "Values": { "FUNCTIONS_WORKER_RUNTIME": "python", "AzureWebJobsStorage": "UseDevelopmentStorage=true", "ENV": "local", "DRIVER_NAME": "{ODBC Driver 17 for SQL Server}", "SERVER_NAME": "azure-db-purinit.database.windows.net", "DATABASE_NAME": "azureSqlDatabase", "USER_ID": "purinit@azure-db-purinit", "PASSWORD": "(設定したパスワード)", "AUTH": "ActiveDirectoryMsi" }, "ConnectionStrings": {} }
ローカル上でのAzure Functions動作検証
ローカル環境でのPythonによるAzure Functionsアプリの動作検証を行う。その手順は、以下の通り。
1) PythonによるAzure Functionsアプリの構成は、以下の通り。このうち赤枠の「function_app.py」を修正する。
2) 修正後の「function_app.py」の内容は、以下の通り。
import azure.functions as func import datetime import json import logging import pyodbc import os app = func.FunctionApp(http_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.') # SQL Database接続情報 ENV = os.getenv('ENV') DRIVER_NAME = os.getenv('DRIVER_NAME') SERVER_NAME = os.getenv('SERVER_NAME') DATABASE_NAME = os.getenv('DATABASE_NAME') USER_ID = os.getenv('USER_ID') PASSWORD = os.getenv('PASSWORD') AUTH = os.getenv('AUTH') # SQL Databaseに接続し、データを取得し表示 if ENV == 'local': conn = pyodbc.connect('DRIVER=' + DRIVER_NAME + ';SERVER=' + SERVER_NAME + ';DATABASE=' + DATABASE_NAME + ';UID=' + USER_ID + ';PWD=' + PASSWORD + ';') else: conn = pyodbc.connect('DRIVER=' + DRIVER_NAME + ';SERVER=' + SERVER_NAME + ';DATABASE=' + DATABASE_NAME + ';Authentication=' + AUTH + ';Encrypt=yes;') cursor = conn.cursor() cursor.execute('SELECT name, sex FROM dbo.USER_DATA WHERE id = 1') for row in cursor: logging.info(row[0]) logging.info(row[1]) # SQL Database接続後に処理を終了する cursor.close() conn.close() 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 )
3) local.settings.jsonを暗号化した状態で動作検証するため、「func settings encrypt」コマンドを実行する。
4) コマンドプロンプトで「.venv\scripts\activate」を実行し、仮想環境をアクティブ化する。
5) 別のコマンドプロンプトでazuriteを実行しつつ、コマンドプロンプトで「func start」コマンドを実行する。
6) ブラウザ上で「http://localhost:7071/api/HttpExample」にアクセスすると、以下のように、function_app.pyで定義していたHttpResponseが返却されることが確認できる。
7) コンソール上には、以下の赤枠部分に、USER_DATAテーブルから取得した値の表示が確認できる。
Azure Functionsの環境変数定義
Azure Functionsの環境変数定義は、Azure Portalから行える。その手順は、以下の通り。
1) Azure Portalにログインし、環境変数を設定するAzure Functionsを選択し、「設定」メニューから「環境変数」を選択する。
3) 環境変数ENV=azureの値を設定するため、以下のように指定し「適用」ボタンを押下する。
4) 同様に、他に必要な環境変数を追加する。環境変数追加後に値を確認するには、以下のように「値を表示する」ボタンを押下する。
5) 以下のように、環境変数の各値が確認できる。ここでこの環境変数を反映するため、「適用」ボタンを押下する。
6) 以下のダイアログを表示されるため、「確認」ボタンを押下する。
なお、「DRIVER_NAME」の値は、以下の画面赤枠のドライバ名から取得できる。
Azure上でのAzure Functions動作検証
Azure上でのAzure Functions動作検証は、「ローカル上でのAzure Functions動作検証」で修正した「function_app.py」を用いて確認できる。Azure上にAzure Functionsアプリをデプロイして確認した結果は、以下の通り。
1) ブラウザ上で「https://azurefuncpython.azurewebsites.net/api/httpexample」にアクセスすると、以下のように、function_app.pyで定義していたHttpResponseが返却されることが確認できる。
2) このときのアクセスログを確認すると、以下の赤枠部分に、USER_DATAテーブルから取得した値の表示が確認できる。
なお、Azure Functions動作検証手順は、以下の記事の「Azure上でのAzure Functions動作検証」を参照のこと。
要点まとめ
- Azure Functions上で、環境変数を定義できる。
- Azure Functionsをローカルで動作する際の環境変数はlocal.settings.jsonで定義でき、local.settings.jsonの暗号化/復号化も行える。