App Serviceのアプリケーション設定で改行を含む値を登録する方法
はじめに
App Service の アプリケーション設定における改行を含む値を登録する方法についてご紹介いたします。
概要
App Service のアプリケーション設定における改行を含む値を登録するには、
- 高度な編集を利用する
- Base64 エンコードした値を登録し、アプリケーション側では Base64 デコードして利用する
- Kay Vault を利用する
のいずれかの方法ご利用いただくこと可能となります。詳細については、以下にてご説明いたします。
この記事で解消したい問題
ポータル上の アプリケーション設定の追加/編集機能からは”\n”や”\r\n”を設定しても改行として反映されません。
失敗する例
失敗例1) ポータルのアプリケーション設定から編集
改行コードをそれぞれ(\r\n, \n)設定、保存してみます。
高度な編集で確認すると、改行コードがエスケープされていることが確認できます。
また、後述の検証コードの実行結果を確認すると改行コードが文字列として表示されます。
失敗例2) az cli を使用してアプリケーション設定を設定
az cli を使用して以下のコマンドを実行してみます。
az webapp config appsettings set -g appservicejapanrg -n linux-python310-webapp --settings LF=aaa\nbbb\nccc
アプリケーション設定を確認すると以下のように”\“がエスケープされ”n”のみ文字列として登録されます。
次に、”\\n”を追加してコマンドを実行します。
az webapp config appsettings set -g appservicejapanrg -n linux-python310-webapp --settings LF=aaa\\nbbb\\nccc
アプリケーション設定を確認すると、一つの”\“だけエスケープされ、”\n”が文字列として登録されます。
※ CRLFの場合も同様です
以下、回避策についてご案内します。
検証用ソースコード
今回検証に使用したソースコード(Python3.10)は以下になります。
import base64
import logging
import os
from flask import Flask
app = Flask(__name__)
logger = logging.getLogger('azure.mgmt.resource')
logger.setLevel(logging.INFO)
@app.route('/')
def index():
""" 環境変数より取得した値をログ出力します
"""
lf = os.environ['LF']
print('LF:')
print(lf)
crlf = os.environ['CRLF']
print('CRLF:')
print(crlf)
return f'<h2>LF:</h2><br><pre>{lf}</pre><br><h2>CRLF:</h2><br><pre>{crlf}</pre>'
@app.route('/encode')
def newline():
""" Base64でエンコードされた値をデコードしてログ出力します
"""
encode_lf = os.environ['LF']
print('LF:')
print(encode_lf)
# base64 デコード処理
decode_lf = base64.b64decode(encode_lf).decode()
print(decode_lf)
encode_crlf = os.environ['CRLF']
print('CRLF:')
print(encode_crlf)
# base64 デコード処理
decode_crlf = base64.b64decode(encode_crlf).decode()
print(decode_crlf)
return f'<h2>LF:</h2><br><pre>{decode_lf}</pre><br><h2>CRLF:</h2><br><pre>{decode_crlf}</pre>'
回避策
回避策1) アプリケーション設定の「高度な編集」を利用する方法
アプリケーション設定の「高度な編集」で文字列に改行コード(CRLF/LF)を追加することにより、改行をすることが可能となります。
実行結果
注意点
「高度な編集」にて文字列に改行コード(CRLF/LF)を設定して保存した場合においても、アプリケーション設定で確認する場合においては表示が異なります。
アプリケーション設定で確認をすると空白に変換され、表示されます。
また、アプリケーション設定の編集で確認すると、改行コードも空白もなく連結されて表示されます。
「高度な編集」で保存後にアプリケーション設定の追加/編集機能で値を編集をして保存した場合、改行コードの設定が削除されてしまい、アプリケーション設定で設定した値に上書きされてしまいます。
あらためて「高度な編集」で確認してみると、改行コードも空白もない文字列として登録されています。
実行結果
※ CRLFの場合も同様です
回避策2) Base64 エンコードした値を登録し、アプリケーション側では Base64 デコードして利用する方法
次の改行(CRLF/LF)を含む値を base64 でエンコードし、エンコードした値をアプリケーション設定に設定し、プログラム側ではデコード処理することにより改行を含む値を取得することが可能となります。
aaa
bbb
ccc
上記改行(CRLF/LF)を含む文字列をエンコードするとそれぞれ以下の文字列になります。
echo -n "aaa\r\nbbb\r\nccc" | base64
YWFhDQpiYmINCmNjYw==
$ echo -n "aaa\nbbb\nccc" | base64
YWFhCmJiYgpjY2M=
実行結果(/encodeエンドポイント)
回避策3) Kay Vault を利用する方法
Key Vault に改行(CRLF/LF)を含むデータを登録し、アプリケーションから利用します。
###前提条件 Key Vault が作成されており、App Service からKey Vaultへのアクセスはできていること
Key Vault シークレットへの設定手順
- 改行(CRLF/LF)を含むデータを secretfile.txt (ファイル名は任意)として保存します。
-
az Cli を使用して、Key Vault シークレットに設定します。
az keyvault secret set --vault-name "<your-unique-keyvault-name>" --name "MultilineSecret" --file "secretfile.txt"
登録後、Key Vault にて確認すると以下のようになります。
- 作成した シークレットの「シークレット識別子」をコピーして、App Service -> 構成 -> アプリケーション設定 にて環境変数を設定します。
値: @Microsoft.KeyVault(SecretUri=●シークレット識別子●)
実行結果
※ CRLFの場合も同様です
まとめ
以上のように、高度な編集、Base64、Key Vault のいずれかをご利用いただくことで、改行を含む値を登録することが可能となります。
Appendix
アプリケーション設定に関する詳細については以下の公式ドキュメントを参照していただけますと幸いです。
< App Service アプリを構成する >
https://learn.microsoft.com/ja-jp/azure/app-service/configure-common?tabs=portal
< Azure Key Vault に複数行のシークレットを格納する >
https://learn.microsoft.com/ja-jp/azure/key-vault/secrets/multiline-secrets
2023 年 03 月 10 日時点の内容となります。
本記事の内容は予告なく変更される場合がございますので予めご了承ください。