次の方法で共有


チュートリアル: GitHub Actions を使用して azure Container Apps に ASP.NET Core アプリとデータベースをデプロイする

このチュートリアルでは、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 に最新の更新プログラムをインストールします>更新プログラムのチェックを行います。
  • ツールGet ツールと機能を選択して、ASP.NET と Web 開発と >のワークロードがインストールされていることを確認します。

警告

この記事では、接続文字列を使用します。 ユーザー名、パスワード、またはアクセス キーを使用して接続を管理する場合は注意が必要です。 これらのシークレットは、ソース管理にコミットしたり、意図しないユーザーがアクセスする可能性がある安全でない場所に配置したりしないでください。 ローカル開発では、通常、シークレットの格納や Azure への直接接続を必要としないローカル データベースに接続します。 運用環境では、可能な場合は Microsoft Entra ID などのシークレットレスアプローチを使用して Azure SQL データベースに接続します

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

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 に接続すると、ローカルで作業中にアプリを実行し、タスクを保管することができます。

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

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

Visual Studio を使用して移行を追加する方法を示すスクリーンショット。

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

  1. 接続の横にあるサービス依存関係リストの右側にある LocalDB アイコンを選択し、[移行の追加] を選択します。
  2. [Entity Framework Migrations]\(Entity Framework の移行\) ダイアログで、Visual Studio がプロジェクトに含まれるDbContext クラスを見つけるのをしばらく待ちます。 値が読み込まれたら、[ 完了] を選択します。
  3. Visual Studio によってプロジェクトに Migrations フォルダーが生成され、初期移行クラスが作成されます。 このクラスを使用して、正しいスキーマでデータベースを更新できます。
  4. サービスの横にある LocalDB アイコンをもう一度選択し、[データベースの更新] を選択します。
  5. [Entity Framework Migrations]\(Entity Framework の移行\) ダイアログボックスで、Visual Studio が DbContext クラスをもう一度見つけて、[完了] を選択するまでしばらく待ちます。 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 Database: アプリのデータを格納する Azure SQL データベース。

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

Azure Container App と Azure Container Registry を作成する

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

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

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

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

    コンテナー アプリを作成する方法を示すスクリーンショット。

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

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

    新しいコンテナー レジストリを作成する方法を示すスクリーンショット。

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

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

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

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

Azure SQL Database を作成する

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

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

  1. 作成したコンテナー アプリの概要ページで、左側のナビゲーションで Service Connector (プレビュー) を選択します。

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

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

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

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

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

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

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

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

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

      サービス コネクタの使用方法を示すスクリーンショット。

  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 ] タブで、フォーム フィールドから接続文字列をコピーします。

    接続文字列を取得する方法を示すスクリーンショット。

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

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

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

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

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

    • [ シークレットの追加] を選択します

      GitHub シークレットを作成する方法を示すスクリーンショット。

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

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

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

    ワークフローを編集する方法を示すスクリーンショット。

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

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

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

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

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

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

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

    GitHub アクション ワークフローを示すスクリーンショット。

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

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