チュートリアル: 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 を設定すると、セキュリティが強化されたより複雑なプロセスになります。
既存のアプリケーションがない場合は、リソースにアクセスできる新しい Microsoft Entra ID アプリケーションとサービス プリンシパルを登録します。
az ad app create --display-name myApp
このコマンドにより、あなたの
client-id
であるappId
を持つ JSON が出力されます。 このid
はAPPLICATION-OBJECT-ID
であり、Graph API 呼び出しを使用してフェデレーション資格情報を作成するために使用されます。 後でAZURE_CLIENT_ID
の GitHub シークレットとして使用する値を保存します。サービス プリンシパルを作成する。
$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
サービス プリンシパルに新しいロール割り当てを作成します。 既定では、ロールの割り当ては既定のサブスクリプションに関連付けされます。
$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
次のコマンドを実行して、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
。
- GitHub Actions 環境のジョブ:
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 シークレットとして値を保存する方がより安全なオプションです。
GitHub で、お使いのリポジトリに移動します。
ナビゲーション メニューで [設定] に移動します。
[Security] (セキュリティ) > [Secrets and variables] (シークレットと変数) > [Actions] (アクション) を選びます。
[New repository secret](新しいリポジトリ シークレット) を選択します。
AZURE_CLIENT_ID
、AZURE_TENANT_ID
、AZURE_SUBSCRIPTION_ID
のシークレットを作成します。 GitHub シークレットには、Microsoft Entra アプリケーションの次の値を使用します。GitHub シークレット Microsoft Entra アプリケーション AZURE_CLIENT_ID アプリケーション (クライアント) ID AZURE_TENANT_ID ディレクトリ (テナント) ID AZURE_SUBSCRIPTION_ID サブスクリプション ID [Add secret](シークレットの追加) を選択して各シークレットを保存します。
ビルドに GitHub シークレットを追加する
SQLADMIN_PASS
とSQLADMIN_LOGIN
の GitHub リポジトリに 2 つの新しいシークレットを作成します。 複雑なパスワードを選択してください。そうしないと、SQL データベース サーバーの作成手順が失敗します。 このパスワードに再度アクセスすることはできないため、別途保存してください。ご自分の Azure サブスクリプション ID に
AZURE_SUBSCRIPTION_ID
シークレットを作成します。 サブスクリプション ID がわからない場合は、Azure シェルで次のコマンドを使用して検索します。SubscriptionId
列の値をコピーします。az account list -o table
Azure リソースを作成する
Azure リソースの作成ワークフローにより、ARM テンプレートが実行され、リソースが Azure にデプロイされます。 ワークフローは次のようになります。
- Checkout アクションを使用してソース コードをチェックアウトします。
- Azure Login アクションを使用して Azure にログインし、環境と Azure リソース情報を収集します。
- Azure Resource Manager デプロイ アクションを使用してリソースをデプロイします。
Azure リソースの作成ワークフローを実行するには、次のようにします。
リポジトリ内の
.github/workflows
のinfraworkflow.yml
ファイルを開きます。AZURE_RESOURCE_GROUP
値をお使いのリソース グループ名に変更します。ARM デプロイ アクションの
region
の入力を、お使いのリージョンに設定します。templates/azuredeploy.resourcegroup.parameters.json
を開き、rgLocation
プロパティをお使いのリージョンに更新します。
[Actions](アクション) に移動し、 [Run workflow](ワークフローの実行) を選択します。
[Actions](アクション) ページで緑色のチェックマークを確認して、アクションが正常に実行されたことを確認します。
リソースを作成したら、 [アクション] に移動し、[Azure リソースを作成] を選択して、ワークフローを無効にします。
発行プロファイル シークレットを作成する
Azure portal で、
Create Azure Resources
ワークフローで作成された新しいステージング App Service (スロット) を開きます。[発行プロファイルの取得] を選択します。
公開プロファイル ファイルをテキスト エディターで開き、その内容をコピーします。
AZURE_WEBAPP_PUBLISH_PROFILE
に新しい GitHub シークレットを作成します。
アプリをビルドし、デプロイする
ビルドを実行し、ワークフローをデプロイするには、次のようにします。
リポジトリ内の
.github/workflows
のworkflow.yaml
ファイルを開きます。AZURE_RESOURCE_GROUP
、AZURE_WEBAPP_NAME
、SQLSERVER_NAME
、DATABASE_NAME
の環境変数がinfraworkflow.yml
の環境変数と一致することを確認します。[Swap to production slot output](運用スロットにスワップ出力) の URL にアクセスして、デプロイされているアプリがを確認します。 サンプル アプリの My TodoList App が表示されます。
リソースをクリーンアップする
サンプル プロジェクトが不要になった場合は、Azure portal でリソース グループを削除し、GitHub でリポジトリを削除します。