継続的インテグレーションと継続的デプロイ (CI/CD) のために、Azure Resource Manager テンプレート (ARM テンプレート) を Azure Pipelines と統合できます。 この記事では、Azure Pipelines を使用してテンプレートをデプロイする 2 つのより高度な方法について説明します。
オプションを選択する
この記事に進む前に、パイプラインから ARM テンプレートをデプロイするためのさまざまなオプションを検討しましょう。
ARM テンプレートのデプロイ タスクを使用します。 このオプションが最も簡単なオプションです。 この方法は、リポジトリから直接テンプレートをデプロイする場合に機能します。 このオプションについては、この記事では取り上げませんが、代わりに 、ARM テンプレートと Azure Pipelines の継続的インテグレーションに関するチュートリアルで説明します。 ARM テンプレートデプロイ タスクを使用して GitHub リポジトリからテンプレートをデプロイする方法を示します。
Azure PowerShell スクリプトを実行するタスクを追加します。 このオプションには、ローカル テストの実行時に使用したのと同じスクリプトを使用できるため、開発ライフ サイクル全体で一貫性を提供できるという利点があります。 スクリプトはテンプレートをデプロイしますが、パラメーターとして使用する値の取得などの他の操作を実行することもできます。 このオプションは、この記事に示されています。 Azure PowerShell タスクを参照してください。
Visual Studio には、PowerShell スクリプトを含む Azure リソース グループ プロジェクト が用意されています。 このスクリプトは、プロジェクトから Resource Manager がアクセスできるストレージ アカウントに成果物をステージングします。 成果物は、リンクされたテンプレート、スクリプト、アプリケーション バイナリなどのプロジェクト内の項目です。 プロジェクトのスクリプトを引き続き使用する場合は、この記事に示す PowerShell スクリプト タスクを使用します。
タスクをコピーして展開するタスクを追加します。 このオプションは、プロジェクト スクリプトの代わりに便利です。 パイプラインで 2 つのタスクを構成します。 1 つのタスクは、成果物をアクセシビリティ対応の場所にステージングします。 もう 1 つのタスクでは、その場所からテンプレートがデプロイされます。 このオプションは、この記事に示されています。 タスクのコピーとデプロイを参照してください。
プロジェクトを準備する
この記事では、ARM テンプレートと Azure DevOps 組織がパイプラインを作成する準備ができているものとします。 次の手順は、準備ができていることを確認する方法を示しています。
Azure DevOps 組織があること。 お持ちでない場合は、 無料で作成してください。 チームに既に Azure DevOps 組織がある場合は、使用する Azure DevOps プロジェクトの管理者であることを確認してください。
Azure サブスクリプションへの サービス接続 を構成しました。 パイプライン内のタスクは、サービス プリンシパルの ID で実行されます。 接続を作成する手順については、「 DevOps プロジェクトの作成」を参照してください。
プロジェクトのインフラストラクチャを定義する ARM テンプレート があります。
パイプラインの作成
以前にパイプラインを追加していない場合は、新しいパイプラインを作成する必要があります。 Azure DevOps 組織から、[ パイプライン ] と [ 新しいパイプライン] を選択します。
コードの格納場所を指定します。 次の図は、 Azure Repos Git の選択を示しています。
そのソースから、プロジェクトのコードを含むリポジトリを選択します。
作成するパイプラインの種類を選択します。 スターター パイプラインを選択できます。
Azure PowerShell タスクまたはコピー ファイルを追加してタスクをデプロイする準備ができました。
Azure PowerShell タスク
このセクションでは、プロジェクトで PowerShell スクリプトを実行する 1 つのタスクを使用して継続的配置を構成する方法について説明します。 テンプレートをデプロイする PowerShell スクリプトが必要な場合は、 Deploy-AzTemplate.ps1 または Deploy-AzureResourceGroup.ps1に関するページを参照してください。
次の YAML ファイルは 、Azure PowerShell タスクを作成します。
trigger:
- master
pool:
vmImage: 'ubuntu-latest'
steps:
- task: AzurePowerShell@5
inputs:
azureSubscription: 'script-connection'
ScriptType: 'FilePath'
ScriptPath: './Deploy-AzTemplate.ps1'
ScriptArguments: -Location 'centralus' -ResourceGroupName 'demogroup' -TemplateFile templates\mainTemplate.json
azurePowerShellVersion: 'LatestVersion'
タスクを AzurePowerShell@5
に設定すると、パイプラインは Az モジュールを使用します。 スクリプトで AzureRM モジュールを使用している場合は、タスクを AzurePowerShell@3
に設定します。
steps:
- task: AzurePowerShell@3
azureSubscription
の場合は、作成したサービス接続の名前を指定します。
inputs:
azureSubscription: '<your-connection-name>'
scriptPath
の場合は、パイプライン ファイルからスクリプトへの相対パスを指定します。 リポジトリ内でパスを確認できます。
ScriptPath: '<your-relative-path>/<script-file-name>.ps1'
ScriptArguments
で、スクリプトに必要なパラメーターを指定します。 次の例は、スクリプトのパラメーターをいくつか示していますが、スクリプトのパラメーターをカスタマイズする必要があります。
ScriptArguments: -Location 'centralus' -ResourceGroupName 'demogroup' -TemplateFile templates\mainTemplate.json
[保存] を選択すると、ビルド パイプラインが自動的に実行されます。 ビルド パイプラインの概要に戻り、状態を確認します。
現在実行中のパイプラインを選択すると、タスクの詳細を確認できます。 完了すると、各ステップの結果が表示されます。
タスクのコピーとデプロイ
このセクションでは、2 つのタスクを使用して継続的デプロイを構成する方法を示します。 1 つ目のタスクはストレージ アカウントに成果物をステージングし、2 番目のタスクはテンプレートをデプロイします。
ストレージ アカウントにファイルをコピーするには、サービス接続のサービス プリンシパルにストレージ BLOB データ共同作成者ロールまたはストレージ BLOB データ所有者ロールが割り当てられている必要があります。 詳細については、「 AzCopy の概要」を参照してください。
次の YAML は 、Azure ファイル コピー タスクを示しています。
trigger:
- master
pool:
vmImage: 'windows-latest'
steps:
- task: AzureFileCopy@4
inputs:
SourcePath: 'templates'
azureSubscription: 'copy-connection'
Destination: 'AzureBlob'
storage: 'demostorage'
ContainerName: 'projecttemplates'
name: AzureFileCopy
このタスクには、環境に合わせて変更する部分がいくつかあります。
SourcePath
は、パイプライン ファイルを基準とした成果物の場所を示します。
SourcePath: '<path-to-artifacts>'
azureSubscription
の場合は、作成したサービス接続の名前を指定します。
azureSubscription: '<your-connection-name>'
ストレージ名とコンテナー名には、アーティファクトの格納に使用するストレージ アカウントとコンテナーの名前を指定します。 ストレージ アカウントが存在する必要があります。
storage: '<your-storage-account-name>'
ContainerName: '<container-name>'
ファイルのコピー タスクを作成したら、ステージング されたテンプレートをデプロイするタスクを追加する準備ができました。
次の YAML は、 Azure Resource Manager テンプレートのデプロイ タスクを示しています。
- task: AzureResourceManagerTemplateDeployment@3
inputs:
deploymentScope: 'Resource Group'
azureResourceManagerConnection: 'copy-connection'
subscriptionId: 'aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e'
action: 'Create Or Update Resource Group'
resourceGroupName: 'demogroup'
___location: 'West US'
templateLocation: 'URL of the file'
csmFileLink: '$(AzureFileCopy.StorageContainerUri)templates/mainTemplate.json$(AzureFileCopy.StorageContainerSasToken)'
csmParametersFileLink: '$(AzureFileCopy.StorageContainerUri)templates/mainTemplate.parameters.json$(AzureFileCopy.StorageContainerSasToken)'
deploymentMode: 'Incremental'
deploymentName: 'deploy1'
このタスクには、さらに詳しく確認する部分がいくつかあります。
deploymentScope
:Management Group
、Subscription
、Resource Group
のオプションからデプロイのスコープを選択します。 スコープの詳細については、「 デプロイ スコープ」を参照してください。azureResourceManagerConnection
: 作成したサービス接続の名前を指定します。subscriptionId
: ターゲット サブスクリプション ID を指定します。 このプロパティは、リソース グループのデプロイ スコープとサブスクリプションのデプロイ スコープにのみ適用されます。resourceGroupName
___location
: デプロイ先のリソース グループの名前と場所を指定します。 存在しない場合、そのタスクがリソース グループを作成します。resourceGroupName: '<resource-group-name>' ___location: '<___location>'
csmFileLink
: ステージングされたテンプレートのリンクを指定します。 値を設定するときは、ファイル コピー タスクから返される変数を使用します。 次の例では、mainTemplate.jsonという名前のテンプレートにリンクします。 テンプレートという名前 の フォルダーが含まれるのは、ファイル コピー タスクがファイルのコピー先であるためです。 パイプラインで、テンプレートへのパスとテンプレートの名前を指定します。csmFileLink: '$(AzureFileCopy.StorageContainerUri)templates/mainTemplate.json$(AzureFileCopy.StorageContainerSasToken)'
パイプラインは次のようになります。
trigger:
- master
pool:
vmImage: 'windows-latest'
steps:
- task: AzureFileCopy@4
inputs:
SourcePath: 'templates'
azureSubscription: 'copy-connection'
Destination: 'AzureBlob'
storage: 'demostorage'
ContainerName: 'projecttemplates'
name: AzureFileCopy
- task: AzureResourceManagerTemplateDeployment@3
inputs:
deploymentScope: 'Resource Group'
azureResourceManagerConnection: 'copy-connection'
subscriptionId: 'aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e'
action: 'Create Or Update Resource Group'
resourceGroupName: 'demogroup'
___location: 'West US'
templateLocation: 'URL of the file'
csmFileLink: '$(AzureFileCopy.StorageContainerUri)templates/mainTemplate.json$(AzureFileCopy.StorageContainerSasToken)'
csmParametersFileLink: '$(AzureFileCopy.StorageContainerUri)templates/mainTemplate.parameters.json$(AzureFileCopy.StorageContainerSasToken)'
deploymentMode: 'Incremental'
deploymentName: 'deploy1'
[保存] を選択すると、ビルド パイプラインが自動的に実行されます。 [ ジョブ ] フレームで、[ ジョブ ] を選択してジョブの状態を確認します。
次のステップ
- パイプラインで what-if 操作を使用するには、パイプライン 内の What-If を使用して ARM テンプレートをテストする方法に関するページを参照してください。
- GitHub Actions で ARM テンプレートを使用する方法については、「GitHub Actions を 使用して Azure Resource Manager テンプレートをデプロイする」を参照してください。