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

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

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

  • GitHub Actions ワークフローを使用して、Azure Resource Manager テンプレート (ARM テンプレート) を使って Azure にリソースを追加する
  • GitHub Actions ワークフローを使用して、最新の Web アプリ変更を含むコンテナーを構築する

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

前提条件

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

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

サンプルのダウンロード

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

https://github.com/Azure-Samples/dotnetcore-containerized-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 ID アプリケーションとサービス プリンシパルを登録します。

    az ad app create --display-name myApp
    

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

  2. サービス プリンシパルを作成する。 $appID を、JSON 出力のアプリ ID に置き換えてください。

    このコマンドを実行すると、サービス プリンシパル id を持つ JSON 出力が生成されます。 サービス プリンシパル id は、次のステップの az role assignment create コマンドで、--assignee-object-id 引数の値として使用されます。

    後で AZURE_TENANT_ID の GitHub シークレットとして使用するために、JSON 出力から appOwnerOrganizationId をコピーします。

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

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

    • APPLICATION-OBJECT-ID を Microsoft Entra ID アプリケーションの 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](シークレットの追加) を選択して各シークレットを保存します。

SQL Server シークレットを追加する

リポジトリに SQL_SERVER_ADMIN_PASSWORD の新しいシークレットを作成します。 このシークレットには、パスワード セキュリティの Azure 標準を満たす任意のパスワードを設定できます。 このパスワードに再度アクセスすることはできないため、別途保存してください。

Azure リソースを作成する

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

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

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

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

  3. WEB_APP_NAMESQL_SERVER_NAME の値を Web アプリ名と SQL サーバー名に更新します。

  4. [Actions](アクション) に移動し、 [Run workflow](ワークフローの実行) を選択します。

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

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

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

コンテナー レジストリと SQL シークレットを追加する

  1. Azure portal で、リソース グループで新しく作成される Azure コンテナー レジストリを開きます。

  2. [アクセス キー] に移動し、ユーザー名とパスワードの値をコピーします。

  3. リポジトリに ACR_USERNAMEACR_PASSWORD パスワードの新しい GitHub シークレットを作成します。

  4. Azure portal で Azure SQL データベースを開きます。 [接続文字列] を開いて、値をコピーします。

  5. SQL_CONNECTION_STRING の新しいシークレットを作成します。 {your_password} は実際の SQL_SERVER_ADMIN_PASSWORD に置き換えます。

イメージのビルド、プッシュ、デプロイ

ビルド、プッシュ、デプロイのワークフローにより、最新のアプリ変更を含むコンテナーがビルドされ、コンテナーが Azure コンテナー レジストリにプッシュされ、プッシュされた最新のコンテナーを指す Web アプリケーション ステージング スロットが更新されます。 ワークフローには、ビルド ジョブとデプロイ ジョブを含めます。

  • ビルド ジョブでは、Checkout アクションを使用してソース コードがチェックアウトされます。 次に、Docker Login アクションとカスタム スクリプトを使用して Azure Container Registry で認証し、コンテナー イメージがビルドされ、Azure Container Registry にデプロイされます。
  • デプロイ ジョブでは、Azure Login アクションを使用して Azure にログインし、環境と Azure リソース情報が収集されます。 次に、Web アプリ設定が Azure App Service Settings アクションを使用して更新され、Azure Web Deploy アクションを使用して App Service ステージング スロットにデプロイされます。 最後に、カスタム スクリプトを実行して SQL データベースが更新され、ステージング スロットが運用に入れ替えられます。

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

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

  2. AZURE_RESOURCE_GROUPWEB_APP_NAME の環境変数が azuredeploy.yaml の環境変数と一致することを確認します。

  3. Azure Container Registry ログイン サーバーの ACR_LOGIN_SERVER 値を更新します。

次の手順