Share via


チュートリアル: GitHub Actions を使用して App Service にデプロイし、データベースに接続する

GitHub Actions ワークフローを設定して、Azure SQL Database バックエンドで ASP.NET Core アプリケーションをデプロイする方法について説明します。 これが完了すると、ASP.NET アプリは Azure 内で実行され、SQL Database に接続された状態になります。 まず、ARM テンプレートを使用してリソースを作成します。

このチュートリアルでは、コンテナーは使用しません。 コンテナー化された ASP.NET Core アプリケーションにデプロイする場合は、GitHub Actions を使用した App Service for Containers へのデプロイとデータベースへの接続に関する記事をご覧ください。

このチュートリアルでは、次の作業を行う方法について説明します。

  • GitHub Actions ワークフローを使用して、Azure Resource Manager テンプレート (ARM テンプレート) を使って Azure にリソースを追加する
  • GitHub Actions ワークフローを使用して ASP.NET Core アプリケーションを構築する

Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。

前提条件

このチュートリアルを完了するには、次のものが必要です。

  • アクティブなサブスクリプションが含まれる Azure アカウント。 無料でアカウントを作成できます
  • GitHub アカウント。 ない場合は、無料でサインアップしてください。
    • Resource Manager テンプレートとワークフロー ファイルを保存するための GitHub リポジトリ。 リポジトリを作成するには、新しいリポジトリの作成に関するページをご覧ください。

サンプルのダウンロード

Azure Samples リポジトリにサンプル プロジェクトをフォークします。

https://github.com/Azure-Samples/dotnetcore-sqldb-ghactions

リソース グループの作成

https://shell.azure.com で Azure Cloud Shell を開きます。 ローカルにインストールした場合は、Azure CLI を使用することもできます (Cloud Shell の詳細については、Cloud Shell の概要に関するページを参照してください)。

az group create --name {resource-group-name} --location {resource-group-location}

デプロイ資格情報を生成する

OpenID Connect は、短期間のトークンを使用する認証方法です。 GitHub Actions を使用して OpenID Connect を設定すると、セキュリティが強化されたより複雑なプロセスになります。

  1. 既存のアプリケーションがない場合は、リソースにアクセスできる新しい Microsoft Entra アプリケーションとサービス プリンシパルを登録します。

    az ad app create --display-name myApp
    

    このコマンドにより、あなたの client-id である appId を持つ JSON が出力されます。 この objectIdAPPLICATION-OBJECT-ID であり、Graph API 呼び出しを使用してフェデレーション資格情報を作成するために使用されます。 後で AZURE_CLIENT_ID の GitHub シークレットとして使用する値を保存します。

  2. サービス プリンシパルを作成する。 $appID を、JSON 出力のアプリ ID に置き換えてください。 このコマンドを実行すると、次のステップで使用される異なる objectId を持つ JSON 出力を生成します。 新しい objectIdassignee-object-id です。

    このコマンドにより、異なる objectId を持つ JSON 出力が生成され、次のステップで使用されます。 新しい objectIdassignee-object-id です。

    後で AZURE_TENANT_ID の GitHub シークレットとして使用するために、appOwnerTenantId をコピーします。

     az ad sp create --id $appId
    
  3. サブスクリプションとオブジェクト別に新しいロールの割り当てを作成します。 既定では、ロールの割り当ては既定のサブスクリプションに関連付けされます。 $subscriptionId をサブスクリプション ID に、$resourceGroupName をリソース グループ名に、$assigneeObjectId を生成された assignee-object-id (新しく作成されたサービス プリンシパル オブジェクト ID) に置き換えます。

    az role assignment create --role contributor --subscription $subscriptionId --assignee-object-id  $assigneeObjectId --assignee-principal-type ServicePrincipal --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroupName
    
  4. 次のコマンドを実行して、Microsoft Entra アプリケーションの新しいフェデレーション ID 資格情報を作成します。

    • APPLICATION-OBJECT-ID を Microsoft Entra アプリケーションの objectId (アプリの作成中に生成) に置き換えてください。
    • 後で参照するには、CREDENTIAL-NAME の値を設定します。
    • subject を設定します。 この値は、ワークフローに応じて、GitHub によって定義されます。
      • GitHub Actions 環境のジョブ: repo:< Organization/Repository >:environment:< Name >
      • 環境に関連付けられていないジョブの場合は、ワークフローのトリガーに使用される ref パスに基づいて、ブランチ/タグの ref パスを含めます: repo:< Organization/Repository >:ref:< ref path>。 たとえば、repo:n-username/ node_express:ref:refs/heads/my-branch または repo:n-username/ node_express:ref:refs/tags/my-tag です。
      • プル要求イベントによってトリガーされるワークフローの場合: repo:< Organization/Repository >:pull_request
    az ad app federated-credential create --id <APPLICATION-OBJECT-ID> --parameters credential.json
    ("credential.json" contains the following content)
    {
        "name": "<CREDENTIAL-NAME>",
        "issuer": "https://token.actions.githubusercontent.com",
        "subject": "repo:octo-org/octo-repo:environment:Production",
        "description": "Testing",
        "audiences": [
            "api://AzureADTokenExchange"
        ]
    }
    

Active Directory 作成アプリケーション、サービス プリンシパル、およびフェデレーション資格情報を Azure portal で作成する方法については、「Connect GitHub および Azure」を参照してください。

認証用の GitHub シークレットを構成する

ログイン アクションには、アプリケーションのクライアント IDテナント IDサブスクリプション IDを指定する必要があります。 これらの値は、ワークフロー内で直接指定するか、GitHub シークレットに格納してワークフローで参照できます。 GitHub シークレットとして値を保存する方がより安全なオプションです。

  1. GitHub で、お使いのリポジトリに移動します。

  2. ナビゲーション メニューで [設定] に移動します。

  3. [Security] (セキュリティ) > [Secrets and variables] (シークレットと変数) > [Actions] (アクション) を選びます。

    シークレットを追加しているスクリーンショット

  4. [New repository secret](新しいリポジトリ シークレット) を選択します。

  5. AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_SUBSCRIPTION_ID のシークレットを作成します。 GitHub シークレットには、Microsoft Entra アプリケーションの次の値を使用します。

    GitHub シークレット Microsoft Entra アプリケーション
    AZURE_CLIENT_ID アプリケーション (クライアント) ID
    AZURE_TENANT_ID ディレクトリ (テナント) ID
    AZURE_SUBSCRIPTION_ID サブスクリプション ID
  6. [Add secret](シークレットの追加) を選択して各シークレットを保存します。

ビルドに GitHub シークレットを追加する

  1. SQLADMIN_PASSSQLADMIN_LOGIN の GitHub リポジトリに 2 つの新しいシークレットを作成します。 複雑なパスワードを選択してください。そうしないと、SQL データベース サーバーの作成手順が失敗します。 このパスワードに再度アクセスすることはできないため、別途保存してください。

  2. ご自分の Azure サブスクリプション ID に AZURE_SUBSCRIPTION_ID シークレットを作成します。 サブスクリプション ID がわからない場合は、Azure シェルで次のコマンドを使用して検索します。 SubscriptionId 列の値をコピーします。

    az account list -o table
    

Azure リソースを作成する

Azure リソースの作成ワークフローにより、ARM テンプレートが実行され、リソースが Azure にデプロイされます。 ワークフローは次のようになります。

Azure リソースの作成ワークフローを実行するには、次のようにします。

  1. リポジトリ内の .github/workflowsinfraworkflow.yml ファイルを開きます。

  2. AZURE_RESOURCE_GROUP 値をお使いのリソース グループ名に変更します。

  3. ARM デプロイ アクションの region の入力を、お使いのリージョンに設定します。

    1. templates/azuredeploy.resourcegroup.parameters.json を開き、rgLocation プロパティをお使いのリージョンに更新します。
  4. [Actions](アクション) に移動し、 [Run workflow](ワークフローの実行) を選択します。

    GitHub Actions ワークフローを実行して、リソースを追加する。

  5. [Actions](アクション) ページで緑色のチェックマークを確認して、アクションが正常に実行されたことを確認します。

    リソースの作成の正常実行。

  6. リソースを作成したら、 [アクション] に移動し、[Azure リソースを作成] を選択して、ワークフローを無効にします。

    Azure リソースを作成ワークフローを無効にする。

発行プロファイル シークレットを作成する

  1. Azure portal で、Create Azure Resources ワークフローで作成された新しいステージング App Service (スロット) を開きます。

  2. [発行プロファイルの取得] を選択します。

  3. 公開プロファイル ファイルをテキスト エディターで開き、その内容をコピーします。

  4. AZURE_WEBAPP_PUBLISH_PROFILE に新しい GitHub シークレットを作成します。

アプリをビルドし、デプロイする

ビルドを実行し、ワークフローをデプロイするには、次のようにします。

  1. リポジトリ内の .github/workflowsworkflow.yaml ファイルを開きます。

  2. AZURE_RESOURCE_GROUPAZURE_WEBAPP_NAMESQLSERVER_NAMEDATABASE_NAME の環境変数が infraworkflow.yml の環境変数と一致することを確認します。

  3. [Swap to production slot output](運用スロットにスワップ出力) の URL にアクセスして、デプロイされているアプリがを確認します。 サンプル アプリの My TodoList App が表示されます。

リソースをクリーンアップする

サンプル プロジェクトが不要になった場合は、Azure portal でリソース グループを削除し、GitHub でリポジトリを削除します。

次の手順