🌐

Azure App Service の MySQL In App における接続文字列の取得

2024/04/21に公開
2

TL;DR

C# を利用して MySQL In App の接続文字列を取得するときは、以下のように書くこと。

Environment.GetEnvironmentVariable("MYSQLCONNSTR_localdb");

追記

まゆきさんから「MYSQLCONNSTR_ など一部の prefix は特別扱いされているので localdb だけで読み込めそう」というご指摘コメントをいただきました!感謝 🙏

ハマったこと

謎にハマったので備忘録として残します。Azure Web Apps には MySQL In App という機能があり、ちょこっと MySQL を動かしてみるときに使える機能です。本番運用向けではなく、開発用途向けの機能なので、その点はお間違えの無いよう。

Azure WebApps - MySQL In App

で、この接続文字列を環境変数から取得して DB アクセスをしてみようとしたわけです。

イマドキの C# / .NET における環境変数の取得は Environment.GetEnvironmentVariable を直接使うのでなく IConfiguration インターフェースを経由して行います。なのでいつも通りやってみたら null が返って来たんですね。なんでやん。

実験結果

ASP.NET Core MVC でこんな感じの実験コードを書いて Web Apps にデプロイしてみました。結果は ⬇️ の JSON の通りです。

[HttpGet]
public IActionResult GetConnStr([FromServices] IConfiguration config)
{
    var connStr1 = config.GetValue<string>("MYSQLCONNSTR_localdb");
    var connStr2 = config.GetConnectionString("MYSQLCONNSTR_localdb");
    var connStr3 = Environment.GetEnvironmentVariable("MYSQLCONNSTR_localdb");

    var obj = new { connStr1, connStr2, connStr3 };
    return this.Ok(obj);
}
{
    "connStr1": null,
    "connStr2": null,
    "connStr3": "Database=localdb;Data Source=127.0.0.1:49580;User Id=azure;Password=6#vWHD_$"
}

基本的に起動時に環境変数は全て IConfiguration に読み込まれているはずなんですが、何かが起こっているのやら。Kudu を眺めたり、ASP.NET Core の起動処理を眺めたり、アレコレ調べてみたんですが、パッとは答えには辿り着けませんでした。まぁ MySQL In App を使って本番運用することもないし、ただの遊びの一環だったので目を瞑りましょう。全然納得できないけど。

Discussion