ASP.NET CoreでMySQLを使ってみる -Web Appsにデプロイ

はじめに

今回は、前回作成したWeb Appsのリソースに対して、アプリケーションのデプロイをします。

接続文字列を環境変数から取得する

MySQL In Appの接続文字列はMYSQLCONNSTR_localdbという環境変数から取得することができます。
しかし、本来使用すべきフォーマットと異なる形式なので、欲しい情報を拾って正しいフォーマットに整形してあげる必要があります。
Startup.csのStartupおよびConfigureServices付近を以下のように変更してください。

private readonly IWebHostEnvironment _env;

public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
    Configuration = configuration;
    _env = env;
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    if (_env.IsDevelopment())
    {
        services.AddDbContext<UserContext>(options => options.UseMySql(Configuration.GetConnectionString("UserContext")));
    }
    else
    {
        String connectionString = Environment.GetEnvironmentVariable("MYSQLCONNSTR_localdb");
        Regex reg = new Regex(@"Database=(?<database>.*?);Data Source=(?<address>.*?):(?<port>.*?);User Id=(?<user>.*?);Password=(?<password>.*?)$", RegexOptions.IgnoreCase | RegexOptions.Singleline);
        Match match = reg.Match(connectionString);
        connectionString = $"server={match.Groups["address"].Value};port={match.Groups["port"].Value};user={match.Groups["user"].Value};password={match.Groups["password"].Value};Database={match.Groups["database"].Value}";
        services.AddDbContext<UserContext>(options => options.UseMySql(connectionString));
    }
}

開発環境の場合はappsettings.jsonから、本番環境の場合は環境変数から接続文字列を取得するようになっています。

自動マイグレーションの設定

開発時にはマイグレーションのコマンドを実行しましたが、デプロイ時にわざわざWeb Appsのコンソールからコマンドを実行するのはあまり良い方法ではありません。アプリケーション起動時にマイグレーションを自動で行うようにしましょう。
Startup.csのConfigure()内に、以下のコードを追記してください。

using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
    using (var context = serviceScope.ServiceProvider.GetService<UserContext>())
    {
        context.Database.Migrate();
    }
}

デプロイ

前提として、Visual Studio CodeにApp Serviceの拡張機能をインストールしておいてください。
左側のメニューに作成したリソースが表示されていればOKです。設定方法は割愛しますが、「Azure Functionsを使ってみた -Visual Studio Code連携 - RFC0000」と同じような流れでやれば大丈夫かと思います。
f:id:sublimer:20191218203223p:plain
デプロイ先のリソースを右クリックして、「Deploy to Web App...」を選択します。
デプロイするか確認するダイアログが表示されるので、「Deploy」をクリックします。
デプロイが完了すると右下に以下のようなダイアログが表示されます。
f:id:sublimer:20191218203947p:plain
「Browse Website」をクリックするとデプロイされたアプリケーションを開くことができます。

動作確認

https://<アプリケーションの名前>.azurewebsites.net/Users にアクセスして、データの登録や削除を試してみてください。
閲覧、登録、更新、削除が一通りできます。
f:id:sublimer:20191218205754p:plain

参考サイト

blog.rsuter.com

おわりに

自分でデータベースを準備しなくても、WebAppsだけでデータベースを使ったアプリケーションをデプロイできました。
Azure、ASP.NET Core、Visual Studio Codeと、Microsoftのテクノロジーだけで完結しているのはとても素晴らしいと思います。