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の暗号化/復号化も行える。








