チュートリアル: 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 を設定すると、セキュリティが強化されたより複雑なプロセスになります。
既存のアプリケーションがない場合は、リソースにアクセスできる新しい 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](シークレットの追加) を選択して各シークレットを保存します。
SQL Server シークレットを追加する
リポジトリに SQL_SERVER_ADMIN_PASSWORD
の新しいシークレットを作成します。 このシークレットには、パスワード セキュリティの Azure 標準を満たす任意のパスワードを設定できます。 このパスワードに再度アクセスすることはできないため、別途保存してください。
Azure リソースを作成する
Azure リソースの作成ワークフローにより、ARM テンプレートが実行され、リソースが Azure にデプロイされます。 ワークフローは次のようになります。
- Checkout アクションを使用してソース コードをチェックアウトします。
- Azure Login アクションを使用して Azure にログインし、環境と Azure リソース情報を収集します。
- Azure Resource Manager デプロイ アクションを使用してリソースをデプロイします。
Azure リソースの作成ワークフローを実行するには、次のようにします。
リポジトリ内の
.github/workflows
のazuredeploy.yaml
ファイルを開きます。AZURE_RESOURCE_GROUP
値をお使いのリソース グループ名に変更します。WEB_APP_NAME
とSQL_SERVER_NAME
の値を Web アプリ名と SQL サーバー名に更新します。[Actions](アクション) に移動し、 [Run workflow](ワークフローの実行) を選択します。
[Actions](アクション) ページで緑色のチェックマークを確認して、アクションが正常に実行されたことを確認します。
コンテナー レジストリと SQL シークレットを追加する
Azure portal で、リソース グループで新しく作成される Azure コンテナー レジストリを開きます。
[アクセス キー] に移動し、ユーザー名とパスワードの値をコピーします。
リポジトリに
ACR_USERNAME
とACR_PASSWORD
パスワードの新しい GitHub シークレットを作成します。Azure portal で Azure SQL データベースを開きます。 [接続文字列] を開いて、値をコピーします。
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 データベースが更新され、ステージング スロットが運用に入れ替えられます。
ビルド、プッシュ、およびデプロイ ワークフローを実行するには、次のようにします。
リポジトリ内の
.github/workflows
のbuild-deploy.yaml
ファイルを開きます。AZURE_RESOURCE_GROUP
とWEB_APP_NAME
の環境変数がazuredeploy.yaml
の環境変数と一致することを確認します。Azure Container Registry ログイン サーバーの
ACR_LOGIN_SERVER
値を更新します。