Azure App Service アプリの環境変数設定から参照、スワップ時の動作確認

2020-12-02App Service,Azure

Azure App Service アプリの環境変数設定手順を紹介します。
接続文字列やアプリ設定、アプリからの参照方法、デプロイスロットのスワップ(切り替え時)の挙動などについて確認しています。

※Azure App Serviceのランタイムスタックは、Python 3.12を利用しています。
※Azure App Serviceのオペレーティング システムは、Linuxを利用しています。

スポンサーリンク

Azure App Serviceの環境変数設定と参照、スロットスワップ時の動作

Azure App Serviceの環境変数

Azure App Service アプリでは環境変数を利用できます。
環境変数を使って、アプリの設定や接続文字列に関する情報を外部に持つ事ができます。
環境変数としてアプリに渡されるため、コードを変更せずにアプリケーションの動作を変更できます。

App Service アプリを構成する

環境変数には、アプリ設定と接続文字列があります。
アプリ設定はアプリケーション全体の設定、接続文字列はデータベースなどのリソースに接続するための情報を設定します。

アプリ設定や接続文字列もスロットごとに異なる値を持つことができます。
環境変数を利用する事で、コードを変更せずにデプロイスロットごとにアプリの動作を変更できます。

接続文字列の設定手順

接続文字列は設定にある環境変数から設定します。
デプロイスロットの設定有無を分けて2つの接続文字列を設定しています。

    • test_env_01
      • 値:test1234
      • 種類:Custom
      • デプロイスロットの設定:チェックなし
    • test_env_02
      • 値:test2345
      • 種類:Custom
      • デプロイスロットの設定:チェックあり
接続文字列を設定
環境変数で接続文字列のタブを選択します。
追加を選択します。
環境変数で接続文字列を追加(Azure App Service アプリで環境変数を設定して参照する)

接続文字列を設定します。
適用を選択して追加します。

※この時点ではまだ反映されません。

接続文字列を設定して追加(デプロイスロットの設定なし)(Azure App Service アプリで環境変数を設定して参照する)
接続文字列を設定して追加(デプロイスロットの設定あり)(Azure App Service アプリで環境変数を設定して参照する)
接続文字列で選択できる接続の種類(デプロイスロットの設定なし)(Azure App Service アプリで環境変数を設定して参照する)
接続文字列のタブで適用を選択します。 接続文字列を適用(Azure App Service アプリで環境変数を設定して参照する)
変更内容の保存のメッセージが表示されます。
確認を選択します。
接続文字列追加時の確認メッセージ(Azure App Service アプリで環境変数を設定して参照する)
環境変数に設定した接続文字列が表示されます。 環境変数の接続文字列を表示(Azure App Service アプリで環境変数を設定して参照する)

※環境変数の設定は運用スロットで実施しています。

環境変数はデプロイスロットごとに設定

環境変数はデプロイスロットごとに設定します。

スロットを追加する

新しくデプロイスロットを作成する際に、環境変数を引き継ぐかどうかは、Clone settings fromで指定できます。
指定したデプロイスロットの環境変数を引き継ぐことができます。
Do not clone settingsを指定すると、環境変数は引き継がれません。

他のデプロイスロットで設定された環境変数は、作成済みのデプロイスロットには、反映されません。

デプロイスロットの環境変数引き継ぎ状況
デプロイスロット作成時に設定を引き継ぐかを指定できます。

スロット追加時の設定引き継ぎ選択(Azure App Service アプリで環境変数を設定して参照する)
作成済みのデプロイスロットには、他のデプロイスロットで設定した環境変数は反映されません。 デプロイスロットで接続文字列が設定されていない場合(Azure App Service アプリで環境変数を設定して参照する)

※事前にステージングスロット(01)を作成した状態で、運用スロットの接続文字列を追加しています。

設定した接続文字列をアプリから参照

サンプルのPythonスクリプトを利用して、アプリから接続文字列を参照します。
接続の種類に応じた接頭辞を付与して参照します。

接続文字列の構成

接続の種類にカスタムを指定した場合、CUSTOMCONNSTR_が接頭辞として付与されます。
たとえば、接続文字列test_env_01を参照する場合は、CUSTOMCONNSTR_test_env_01となります。

Pythonスクリプトから接続文字列を参照

Pythonスクリプトを作成し保存します。
今回はtest_env.pyという名前で保存しています。
参照した接続文字列を表示し、参照できない場合はNot Setと表示します。

import os

# 環境変数の名前を指定  (test_env_02参照時はCUSTOMCONNSTR_test_env_02に変更する)
env_variable_name = 'CUSTOMCONNSTR_test_env_01’

# 環境変数の値を取得  
env_variable_value = os.getenv(env_variable_name, 'Not Set’)

# コンソールに表示
print(f'{env_variable_name} = {env_variable_value}’)

接続文字列を設定したデプロイスロットで確認します。
Pythonスクリプトから接続文字列を参照できている事が確認できます。

# test_env_01を参照
root@xxxxxxxxxx:/home/site/wwwroot# python test_env.py
CUSTOMCONNSTR_test_env_01 = test1234

# test_env_02を参照
root@xxxxxxxxxx:/home/site/wwwroot# python test_env.py
CUSTOMCONNSTR_test_env_02 = test2345

別のデプロイスロットに設定された接続文字列は参照できません。

# test_env_01を参照
root@xxxxxxxxxx:/home/site/wwwroot# python ./env_test.py
CUSTOMCONNSTR_test_env_01 = Not Set

# test_env_02を参照
root@xxxxxxxxxx:/home/site/wwwroot# python ./env_test.py
CUSTOMCONNSTR_test_env_02 = Not Set

デプロイスロットをスワップした場合の接続文字列

デプロイスロットをスワップした時に、環境変数を移行する事ができます。
各スロット固有の環境変数を作成したい場合は、デプロイスロットの設定にチェックを入れておきます。

スワップされる設定

デプロイスロットをスワップして、接続文字列がどう移行するかを確認します。

    • test_env_01:デプロイスロットの設定はチェックなし
      • ソースに指定したスロットからターゲットのスロットへ移行する 
    • test_env_02:デプロイスロットの設定はチェックあり 
      • ソースに指定したスロットからターゲットのスロットへ移行しない

デプロイスロットの設定にチェックを入れてない、接続文字列だけが移行します。

デプロイスロットをスワップして確認
デプロイスロットをスワップします。
Config Changesに変更点が表示されます。
Source slot changesとTarget slot changesにtest_env_01が表示されています。
Swapする場合の環境変数引き継ぎ(ソーススロット)(Azure App Service アプリで環境変数を設定して参照する)
Swapする場合の環境変数引き継ぎ(ターゲットスロット)(Azure App Service アプリで環境変数を設定して参照する)
運用スロットとステージングスロットの間で、接続文字列が移行されていることを確認できます。 Swap後の環境変数設定(運用スロット)(Azure App Service アプリで環境変数を設定して参照する)
Swap後の環境変数設定(ステージングスロット)(Azure App Service アプリで環境変数を設定して参照する)

Pythonスクリプトから接続文字列を参照してみます。

Pythonスクリプトから接続文字列を参照

運用スロットで接続文字列を参照します。
test_env_02(デプロイスロットの設定チェックあり)を参照できます。

# test_env_01を参照
root@xxxxxxxxxx:/home/site/wwwroot# python env_test.py
CUSTOMCONNSTR_test_env_01 = Not Set

# test_env_02を参照
root@xxxxxxxxxx:/home/site/wwwroot# python env_test.py
CUSTOMCONNSTR_test_env_02 = test2345

ステージングスロットで接続文字列を参照します。
test_env_01(デプロイスロットの設定チェックなし)を参照できます。

# test_env_01を参照
root@xxxxxxxxxx:/home/site/wwwroot# python test_env.py
CUSTOMCONNSTR_test_env_01 = test1234

# test_env_02を参照
root@xxxxxxxxxx:/home/site/wwwroot# python test_env.py
CUSTOMCONNSTR_test_env_02 = Not Set

アプリ設定の追加手順

環境変数のアプリ設定を追加します。
接続文字列の場合と異なり、種類の選択はありません。

    • test_app_env_01
      • 値:test3456
      • デプロイスロットの設定:チェックなし
アプリ設定を追加
環境変数でアプリ設定のタブを選択します。
追加を選択します。
名前、値などを設定します。
適用を選択して保存します。

アプリケーション設定を追加(Azure App Service アプリで環境変数を設定して参照する)
適用を選択して保存します。
確認メッセージが表示されます。
確認を選択します。

アプリケーション設定を適用(Azure App Service アプリで環境変数を設定して参照する)
環境変数のアプリ設定が追加されています。 環境変数でアプリケーション設定を参照(Azure App Service アプリで環境変数を設定して参照する)

アプリ設定を参照

サンプルのPythonスクリプトを利用して、アプリからアプリ設定を参照します。
接続文字列の場合とは異なり、接頭辞は付与されません。
アプリ設定の名前をそのまま指定して参照します。

Pythonスクリプトからアプリ設定を参照

Pythonスクリプトを作成し保存します。
今回はtest_app_env.pyという名前で保存しています。
参照した接続文字列を表示し、参照できない場合はNot Setと表示します。

import os

# 環境変数の名前を指定
env_variable_name = 'test_app_env_01’

# 環境変数の値を取得  
env_variable_value = os.getenv(env_variable_name, 'Not Set’)

# コンソールに表示
print(f'{env_variable_name} = {env_variable_value}’)

Pythonスクリプトからアプリ設定を参照します。
アプリ設定を参照できている事が確認できます。

# test_app_env_01を参照
root@xxxxxxxxxx:/home/site/wwwroot# python test_app_env.py
test_app_env_01 = test3456

デプロイスロットをスワップした場合のアプリ設定

アプリ設定も接続文字列と同様の動作になります。
各スロット固有のアプリ設定を作成したい場合は、デプロイスロットの設定にチェックを入れておきます。

スワップされる設定

アプリ設定でデプロイスロットの設定にチェックを入れていない場合、スワップ操作と共に、ソースとして指定したスロットからターゲットのスロットへ移行します。

環境変数にシークレットを保管する事は推奨されていない

環境変数にシークレットを保管する事は推奨されていません。
Key Vaultにシークレットを保管して参照する事が推奨されています。

Azure App Service と Azure Functions でアプリ設定として Key Vault 参照を使用する

マネージドIDなどを利用した接続設定も推奨されています。

Azure App Service から Azure サービスとデータベースへのセキュリティで保護された接続

—広告—

最後に

Azure App Serviceアプリの環境変数の設定方法について確認しました。
環境変数の設定手順や、Pythonスクリプトでの参照方法、デプロイスロットをスワップする際の動作を確認しました。
デプロイスロットをスワップする際に、環境変数を引き継ぐかどうか選択できる事も分かりました。

引き続き色々試してみたいと思います。

スポンサーリンク