チュートリアル: GitHub Actions を使って ASP.NET Core アプリと Database を Azure Container Apps にデプロイする

このチュートリアルでは、Visual Studio と GitHub Actions を使って、ASP.NET Core アプリと SQL Database を Azure Container Apps にデプロイする方法について説明します。 また、GitHub Actions で Entity Framework の移行とデータベース更新を管理する方法についても説明しますが、その概念は他の CI/CD ツールや環境にも適用できます。

前提条件

ASP.NET と Web 開発および Azure 開発ワークロードと共にインストールされた Visual Studio 2022 が必要です。

Visual Studio を既にインストールしている場合は、次のように実行します。

  • [ヘルプ]>[更新プログラムの確認] の順に選択して、Visual Studio に最新の更新プログラムをインストールします。
  • [ツール]>[ツールと機能を取得] の順に選択して、ASP.NET と Web 開発および Azure 開発ワークロードがインストールされていることを確認します。

サンプル アプリをローカルで設定する

ToDo サンプル アプリを使用してこのチュートリアルの手順に従ってください。 次のコマンドを使用して、GitHub からのアプリを複製します。

git clone https://github.com/Azure-Samples/msdocs-app-service-sqldb-dotnetcore.git
cd msdocs-app-service-sqldb-dotnetcore

プロジェクト フォルダーに移動し、Visual Studio で DotNetCoreSqlDb.sln ソリューションを開きます。

ToDo アプリケーションを使用する準備はできましたが、Visual Studio で使用できる localdb SQL server サーバーへの接続を確立する必要があります。 localdb に接続すると、ローカルで作業しながらアプリを実行し、ToDo を保持できます。

  1. Visual Studio ソリューション エクスプローラーで [接続済みサービス] ノードを右クリックし、[追加] > [SQL Server データベース]を選択します。
  2. [依存関係に接続する] ダイアログで、[SQL Server Express LocalDB (ローカル)] を選択し、[次へ] を選択します。
  3. [SQL Server Express LocalDB (ローカル) に接続] ダイアログで、次の値を設定します。
    • [接続文字列名]: 既定値のままにします。
    • [接続文字列の値]: 既定値のままにします。
    • [接続文字列の値の保存先]: [なし] を選択します。
    • [次へ] を選択します
  4. [変更の概要] 画面で、設定を既定値のままにし、[完了] を選択してワークフローを完了します。

Visual Studio に、LocalDB への接続など、サービスの依存関係の概要が表示されます。

A screenshot showing how to add a migration using Visual Studio.

次に、最初の移行を作成し、それを使って、ToDo アプリの正しいスキーマでローカル データベースを更新する必要があります。

  1. LocalDB 接続の横にあるサービス依存関係の一覧の右側にある [...] アイコンを選択し、[移行の追加] を選択します。
  2. [Entity Framework の移行] ダイアログで、プロジェクトに含まれている DbContext クラスが Visual Studio によって検出されるのをしばらく待ちます。 値が読み込まれたら、[完了] を選択します。
  3. Visual Studio によってプロジェクト内に Migrations フォルダーが生成され、最初の移行クラスが作成されます。 このクラスを使って、正しいスキーマでデータベースを更新できます。
  4. LocalDB サービスの横にある [...] アイコンをもう一度選択し、[データベースの更新] を選択します。
  5. [Entity Framework の移行] ダイアログで、DbContext クラスが Visual Studio によって検出されるのをもう一度待ってから、[完了] を選択します。 Visual Studio によって移行が実行され、LocalDB サーバーにデータベースのスキーマが作成されます。

Visual Studio の上部にある DotNetCoreSqlDb 実行ボタンを選択して、プロジェクトを起動します。

アプリが読み込まれたら、新しい ToDo を入力して、データベースが正しく動作していることを確認してください。 ToDo は、アプリのホーム ページのメイン リスト ビューに表示されます。

アプリのスタートアップ構成を調べる

サンプル アプリには、Program.cs ファイルに次のコードが含まれています。

if(builder.Environment.IsDevelopment())
{
    builder.Services.AddDbContext<MyDatabaseContext>(options =>
        options.UseSqlServer(builder.Configuration.GetConnectionString("Default")));
}
else
{
    builder.Services.AddDbContext<MyDatabaseContext>(options =>
        options.UseSqlServer(Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")));
}

このコードにより、次の構成が適用されます。

  • アプリがローカルで実行される場合、localdb 接続文字列は appsettings.json ファイルからプルされ、Entity Framework に提供されます。 この構成により、localdb 接続文字列をソース管理にチェックインし、他の開発者が開発中にローカル データベースに簡単に接続できるようにすることができます。 また、Entity Framework の移行をローカルで実行することもできるようになります。 既定では、移行の実行時に、Entity Framework によって環境変数に格納されている接続文字列が検出されることはありません。
  • アプリが GitHub Actions ワークフローまたは運用環境で実行される場合、接続文字列は環境変数からプルされます。 環境変数を使うと、運用環境のセキュリティで保護された接続文字列がソース管理にチェックインされたり、構成ファイルに含まれたりするのを防ぐことができます。

Azure サービスを作成する

アプリを正常にデプロイするには、次の Azure サービスを作成する必要があります。

  • コンテナー アプリ: デプロイされたアプリケーションをホストして実行するために必要です。
  • コンテナー レジストリ: コンテナー化されたアプリのビルドされたイメージ成果物を格納します。
  • SQL データベース: アプリのデータを格納する Azure SQL データベースです。

Visual Studio の発行機能を使って、これらのリソースの作成を処理できます。

Azure コンテナー アプリと Azure コンテナー レジストリを作成する

  1. Visual Studio ソリューション エクスプローラーで、最上位レベルのプロジェクト ノードを右クリックし、[発行] を選択します。

  2. 発行ダイアログで、デプロイ ターゲットとして [Azure] を選んでから、[次へ] を選択します。

  3. 特定のターゲットについては、[Azure Container Apps (Linux)] を選んでから、[次へ] を選択します。

  4. デプロイする新しいコンテナー アプリを作成します。 [+ 新規作成] ボタンを選択して新しいダイアログを開き、次の値を入力します。

    A screenshot showing how to create a container app.

    • コンテナー アプリ名: 既定値のままにするか、名前を入力します。
    • サブスクリプション名: デプロイするサブスクリプションを選択します。
    • [リソース グループ]: [新規] を選択し、msdocs-app-db-ef という名前の新しいリソース グループを作成します。
    • コンテナー アプリ環境: [新規] を選択してコンテナー アプリ環境ダイアログを開き、次の値を入力します。
      • 環境名: 既定値のままにします。
      • 場所: 近くの場所を選択します。
      • Azure Log Analytics ワークスペースの: [新規作成] を選択して、Log Analytics ワークスペース ダイアログを開きます。
        • 名前: 既定値のままにします。
        • 場所: 近くの場所を選んでから、[OK] を選択してダイアログを閉じます。
      • [OK] を選択して、コンテナー アプリ環境ダイアログを閉じます。
    • [作成] 選択して、元のコンテナー アプリ ダイアログを閉じます。 Visual Studio によって、コンテナー アプリ リソースが Azure に作成されます。
  5. リソースが作成されたら、それがコンテナー アプリの一覧で選択されていることを確認してから、[次へ] を選択します。

  6. アプリの発行済みイメージ成果物を格納するには、Azure Container Registry を作成する必要があります。 コンテナー レジストリ画面で緑色の + アイコンを選択します。

    A screenshot showing how to create a new container registry.

  7. 既定値のままにして、[作成] を選択します。

  8. コンテナー レジストリが作成されたら、それが選択されていることを確認し、[次へ] を選択します。

  9. [配置の種類] 画面で、[GitHub Actions ワークフローを使用した CI/CD (yml ファイルが生成されます)] を選択し、[完了] を選択します。 管理者ユーザーが発行された Docker コンテナーにアクセスできるようにするよう求めるメッセージが Visual Studio に表示された場合は、[はい] 選択します。

Visual Studio によって発行プロファイルが作成され、表示されます。 発行の手順と詳細のほとんどは、GitHub Actions の .yml ファイルで説明されています。これを表示するには、発行プロファイルの概要ビューにある [ワークフローの編集] ボタンをクリックします。 このファイルについては、この記事で後ほど詳しく説明します。

Azure SQL データベースを作成する

  1. ソリューション エクスプローラーで、[接続済みサービス] ノードを右クリックし、[追加] > [SQL Server データベース]を選択します。
  2. [依存関係に接続する] ダイアログで、[Azure SQL Database] を選択し、[次へ] を選択します。
  3. [+ 新規作成] を選択して、新しいデータベースを追加します。
  4. [Azure SQL Database] ダイアログで、次の値を入力します。
    • [データベース名]: 既定値のままにします。
    • [サブスクリプション名]: 前と同じサブスクリプションを選択します。
    • [リソース グループ]: 前に作成した同じ msdocs-app-db-ef グループを選択します。
    • [データベース サーバー]: [新規...] を選択し、新しいポップアップに次の値を入力します。
      • [データベース サーバー名]: 一意のサーバー名を入力するか、自動生成された名前の末尾にランダムな数字を追加します。
      • 場所: 近くの場所を選択します。
      • [管理者ユーザー名]: 任意の値を入力します。
      • [管理者パスワード]: 任意の値を入力します。
      • [管理者パスワード (確認)] : 同じパスワードを入力して確認します。 [OK] を選択して [SQL Server] ダイアログを閉じます
    • [作成] を選択して、SQL サーバーとデータベースを作成します。
    • 操作が完了したら、一覧からサーバーを選択し、[次へ] を選択します
  5. [Azure SQL Database に接続] ダイアログでは、既定値をそのまま使用しますが、下部の [接続文字列の値の保存先] オプションで [なし] が選択されていることを確認してください。
  6. [完了] を選択すると、Visual Studio によって SQL リソースが作成されます。

コンテナー アプリを Azure SQL に接続する

  1. 作成したコンテナー アプリの概要ページで、左側のナビゲーションから [サービス コネクタ (プレビュー)] を選択します。

  2. [+ 作成] を選択して、新しい接続を作成します。

  3. [接続の作成] ポップアップで、次の値を入力します。

    • [コンテナー]: 作成した dotnetcoresqldb コンテナーを選択します。

    • [サービスの種類]: [SQL Database] を選択します。

    • [サブスクリプション]: コンテナー アプリの作成に使用したのと同じサブスクリプションを選択します。

    • 接続名: 既定値のままにします。

    • [SQL Server]: 前に作成したデータベース サーバーを選択します。

    • [SQL データベース]: 前に作成したデータベースを選択します。

    • クライアントの種類: [.NET] を選択します。

      A screenshot showing how to use service connector.

  4. [次へ: 認証] を選択し、次の値を入力します。

    • 認証の種類として [接続文字列] を選択します。
    • [ユーザー名]: データベース サーバーの作成時に使用したユーザー名を入力します。
    • [パスワード]: データベース サーバーの作成時に使用したパスワードを入力します。
  5. 残りの設定は既定値のままにし、[次へ: ネットワーク] を選択します。

  6. 既定値を選択したまま、[次へ: 確認および作成] を選択します。

  7. Azure によって設定が検証されたら、[作成] を選択します。

しばらくすると、SQL データベースへの接続が表示されます。 矢印を選択して接続を展開し、AZURE_SQL_CONNECTIONSTRING の値を確認します。 この接続名は、サンプル アプリで定義されている環境変数の接続文字列の名前と一致します。

GitHub Actions ワークフローを構成する

Visual Studio によって生成された GitHub Actions ワークフロー ファイルを GitHub で使用して、変更がプッシュされたときにアプリをビルドして Azure にデプロイできます。 現在、このプロセスは機能しますが、デプロイされたアプリは例外をスローします。 Azure SQL データベースは作成されましたが、スキーマを生成するステップを GitHub Actions ワークフローに追加する必要があります。 Azure SQL データベースの接続文字列は、シークレットとして GitHub に安全に格納し、実行時にワークフローで取得できます。

接続文字列を取得して GitHub シークレットに追加する

  1. Azure portal のメイン検索バーで作成したデータベースを検索し、それを結果から選択します。

  2. データベースの概要ページで、左側のナビゲーションから [接続文字列] を選択します。

  3. [ADO.NET] タブで、フォーム フィールドから接続文字列をコピーします。

    A screenshot showing how to retrieve the connection string.

  4. アプリのフォークされた GitHub リポジトリに移動します。

  5. [設定] タブで、左側のナビゲーションから [シークレット] > [アクション] を選択し、[New repository secret] (新しいリポジトリ シークレット) を選択します。

  6. [新しいシークレット] ページで、次の値を入力します。

    • [名前]: DbConnection の名前を入力します。

    • [シークレット]: Azure からコピーした接続文字列を貼り付けます。 必ず、接続文字列のパスワードのプレースホルダーを、データベースの作成時に選択したパスワードに置き換えてください。

    • [Add secret](シークレットの追加) を選択します。

      A screenshot showing how to create a GitHub secret.

これで、接続文字列は GitHub リポジトリ シークレットに安全に格納され、GitHub ワークフローを使用して取得できるようになりました。

GitHub Actions ワークフローを変更して移行を有効にする

  1. 発行の概要ページの [ワークフローの編集] ボタンを選択して、Visual Studio によって生成された GitHub Actions ワークフローの .yml ファイルを開きます。

    A screenshot showing how to edit the workflow.

  2. ワークフロー ファイルの末尾に次の yaml を追加します。

    - name: Run EF 
      run: | 
        dotnet tool install --global dotnet-ef
        dotnet tool restore
        dotnet ef database update -p DotNetCoreSqlDb --connection '${{ secrets.DBConnection }}'
    

    このコードによって、エンティティ フレームワークのコマンド ライン ツールがインストールされ、アプリの移行が実行されます。 また、ワークフローの実行時に、このコードによって database update コマンドの connection パラメーターも使用され、appsettings.json ファイルに格納されている localdb の接続文字列が GitHub シークレットに追加された値でオーバーライドされます。

GitHub Actions ワークフローを実行し、デプロイをテストする

  1. 次のコマンドを使用して変更内容をアプリケーションにコミットし、フォークされたリポジトリにプッシュします。

    git add --all
    git commit -m "Added GitHub Actions workflow"
    git push
    
  2. GitHub リポジトリに移動し、[アクション] タブを選択します。プッシュが成功した場合は、ワークフローの実行が自動的にトリガーされているはずです。

  3. アクティブなワークフローを選択し、各ステップの完了時にその詳細なログを表示します。 移行は最後に実行され、Azure のデータベースが更新されます。

    A screenshot showing the GitHub action workflow.

ワークフローが完了すると、アプリケーションは Azure Container Apps にデプロイされ、スキーマが更新されたデータベースに接続されます。

デプロイをテストするには、ローカルで行ったように、コンテナー アプリのホーム ページに移動し、ToDo を作成します。 コンテナー アプリの URL は、Azure portal のアプリの概要ページでいつでも確認できます。