PowerShellでAzure CLIを活用してサブスクリプションを一括操作する方法

Azureを効率的に管理する上で、PowerShellとAzure CLIの組み合わせは強力なツールです。Azure CLIはコマンドラインからAzureリソースを管理するためのツールであり、PowerShellはその柔軟性とスクリプティング能力を活かして、複雑なタスクを簡素化する手段を提供します。本記事では、PowerShellを利用してAzure CLIを呼び出し、複数のAzureサブスクリプションを一括で操作する方法を解説します。これにより、大規模なAzure環境の管理がより効率的になり、時間と労力を節約することができます。

目次

PowerShellとAzure CLIの連携の基礎

PowerShellとAzure CLIを連携させることで、Azureリソースの操作をスクリプト化し、大規模な環境でも効率的な管理が可能になります。ここでは、連携のための基本的な準備手順を解説します。

PowerShellとAzure CLIのインストール

PowerShellとAzure CLIが正しくインストールされていることを確認します。以下の手順でインストールを行います。

PowerShellのインストール

  1. 最新バージョンのPowerShellをインストールします。公式ページからインストーラーをダウンロードしてください。
    PowerShellのダウンロード
  2. インストール後、以下のコマンドでバージョンを確認します。
   $PSVersionTable.PSVersion

Azure CLIのインストール

  1. Azure CLIの公式サイトから、OSに対応したインストーラーをダウンロードします。
    Azure CLIのダウンロード
  2. インストール後、以下のコマンドでインストールが成功したか確認します。
   az --version

PowerShellからAzure CLIを実行する準備

Azure CLIは、PowerShellから直接呼び出すことができます。以下のような構文を使用してAzure CLIコマンドを実行します。

az account list

必要なモジュールのインストール

Azure関連のPowerShellモジュールであるAzをインストールします。これにより、Azure CLIとPowerShellの操作を統合できます。

Install-Module -Name Az -AllowClobber -Scope CurrentUser

以上で、PowerShellとAzure CLIの連携準備が完了です。次に、Azure CLIの認証とサブスクリプション操作について解説します。

Azure CLIの認証とサブスクリプション選択の基礎

Azure CLIをPowerShellから操作する際には、認証を行い、対象となるサブスクリプションを適切に選択する必要があります。ここでは、その基本手順を解説します。

Azure CLIでの認証

Azure CLIを使用するには、Azureアカウントで認証を行う必要があります。以下のコマンドを使用して認証を開始します。

az login
  1. コマンドを実行すると、デフォルトブラウザが開き、Azureへのログインを求められます。
  2. 会社のアカウントやMicrosoftアカウントを使用してログインしてください。
  3. 認証が成功すると、現在のアカウント情報がPowerShellに表示されます。

サービスプリンシパルを使用した認証

サービスプリンシパルを使用してプログラムから認証する場合は、以下の手順を行います。

  1. サービスプリンシパルを作成します。
   az ad sp create-for-rbac --name "<ServicePrincipalName>"

出力されたappId、password、tenantを記録してください。

  1. サービスプリンシパルでログインします。
   az login --service-principal --username <appId> --password <password> --tenant <tenant>

サブスクリプションの一覧表示

ログイン後、関連付けられているすべてのサブスクリプションを確認できます。

az account list --output table

このコマンドで、サブスクリプションIDや名前が表示されます。

サブスクリプションの選択

操作対象のサブスクリプションを指定するには、以下のコマンドを使用します。

az account set --subscription "<SubscriptionID>"

現在のサブスクリプションの確認

現在選択されているサブスクリプションを確認するには、次のコマンドを実行します。

az account show --output table

PowerShellスクリプトへの組み込み

これらのコマンドをPowerShellスクリプトに組み込むことで、自動化された認証とサブスクリプション管理が可能です。以下は簡単な例です。

# ログイン
az login

# サブスクリプションを設定
$subscriptionId = "<YourSubscriptionID>"
az account set --subscription $subscriptionId

# 現在のサブスクリプションを確認
az account show --output table

これで、Azure CLIをPowerShellから利用する準備が整いました。次に、サブスクリプションを一括操作する方法について解説します。

サブスクリプションの一括取得と出力

複数のサブスクリプションを一括で取得し、必要な情報をPowerShellで効率的に出力する方法を解説します。この操作により、サブスクリプションの状況を迅速に把握できるようになります。

サブスクリプションの一覧を取得する

Azure CLIを使用して、現在のアカウントに関連付けられているすべてのサブスクリプションを取得します。

$subscriptions = az account list --output json | ConvertFrom-Json

このコマンドでは、サブスクリプション情報をJSON形式で取得し、PowerShellオブジェクトに変換します。

サブスクリプション情報の表示

取得したサブスクリプション情報を整形して表示します。以下の例では、Name、SubscriptionId、Stateを出力します。

$subscriptions | ForEach-Object {
    [PSCustomObject]@{
        Name           = $_.name
        SubscriptionId = $_.id
        State          = $_.state
    }
} | Format-Table -AutoSize

このスクリプトは、次のような表形式でサブスクリプション情報を表示します:

NameSubscriptionIdState
My Subscription 1xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxEnabled
My Subscription 2yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyyEnabled

特定条件に基づくフィルタリング

例えば、StateがEnabledのサブスクリプションのみを抽出したい場合は、以下のようにフィルタリングします。

$enabledSubscriptions = $subscriptions | Where-Object { $_.state -eq "Enabled" }

$enabledSubscriptions | ForEach-Object {
    [PSCustomObject]@{
        Name           = $_.name
        SubscriptionId = $_.id
        State          = $_.state
    }
} | Format-Table -AutoSize

CSV形式でのエクスポート

取得したサブスクリプション情報をCSV形式でエクスポートして記録します。

$subscriptions | ForEach-Object {
    [PSCustomObject]@{
        Name           = $_.name
        SubscriptionId = $_.id
        State          = $_.state
    }
} | Export-Csv -Path "subscriptions.csv" -NoTypeInformation -Encoding UTF8

このスクリプトにより、subscriptions.csvファイルが作成され、サブスクリプション情報が記録されます。

PowerShellスクリプトの全体例

以下は、一括取得、整形表示、CSV出力をまとめたスクリプトの例です。

# サブスクリプション情報の取得
$subscriptions = az account list --output json | ConvertFrom-Json

# 整形して表示
$subscriptions | ForEach-Object {
    [PSCustomObject]@{
        Name           = $_.name
        SubscriptionId = $_.id
        State          = $_.state
    }
} | Format-Table -AutoSize

# CSVファイルへのエクスポート
$subscriptions | ForEach-Object {
    [PSCustomObject]@{
        Name           = $_.name
        SubscriptionId = $_.id
        State          = $_.state
    }
} | Export-Csv -Path "subscriptions.csv" -NoTypeInformation -Encoding UTF8

これで、サブスクリプションの情報を効率的に取得して利用する準備が整いました。次に、サブスクリプションに対する一括操作の方法について解説します。

サブスクリプションに対する一括操作の仕組み

サブスクリプションごとに異なる操作を実行するためのスクリプトを作成する方法を解説します。これにより、複数のAzureサブスクリプションを効率的に管理できるようになります。

一括操作の全体像

サブスクリプションに対して一括操作を行う際には、以下の手順を踏みます。

  1. 対象となるサブスクリプションをリスト化。
  2. 各サブスクリプションごとに必要な操作を実行。
  3. 操作結果を記録または出力。

操作対象のサブスクリプションの取得

まず、操作対象となるサブスクリプションの情報を取得します。以下のスクリプトで、有効なサブスクリプションのみを抽出します。

$subscriptions = az account list --output json | ConvertFrom-Json | Where-Object { $_.state -eq "Enabled" }

一括操作スクリプトの作成

次に、各サブスクリプションに対して必要な操作を実行するスクリプトを作成します。以下は、サブスクリプション内のリソースグループをリスト化する例です。

foreach ($subscription in $subscriptions) {
    Write-Output "Processing Subscription: $($subscription.name)"

    # サブスクリプションを設定
    az account set --subscription $subscription.id

    # リソースグループを取得
    $resourceGroups = az group list --output json | ConvertFrom-Json

    # リソースグループの名前を表示
    $resourceGroups | ForEach-Object {
        Write-Output "  Resource Group: $($_.name)"
    }
}

操作内容のカスタマイズ

上記のスクリプトを基に、特定の操作を実行するようにカスタマイズできます。例えば、すべてのリソースグループにタグを付与する場合は次のようにします。

foreach ($subscription in $subscriptions) {
    Write-Output "Adding tags to Subscription: $($subscription.name)"

    # サブスクリプションを設定
    az account set --subscription $subscription.id

    # リソースグループにタグを付与
    $resourceGroups = az group list --output json | ConvertFrom-Json
    foreach ($rg in $resourceGroups) {
        az group update --name $rg.name --set tags.Project="AzureManagement"
        Write-Output "  Tag added to Resource Group: $($rg.name)"
    }
}

操作結果の記録

操作結果をCSVファイルにエクスポートすることで、後から確認できるようにします。

$results = @()
foreach ($subscription in $subscriptions) {
    az account set --subscription $subscription.id

    $resourceGroups = az group list --output json | ConvertFrom-Json
    foreach ($rg in $resourceGroups) {
        $results += [PSCustomObject]@{
            SubscriptionName = $subscription.name
            ResourceGroup    = $rg.name
            Operation        = "TagAdded"
        }
    }
}

# CSVファイルに保存
$results | Export-Csv -Path "operation_results.csv" -NoTypeInformation -Encoding UTF8

スクリプト全体の例

以下は、サブスクリプションごとにリソースグループにタグを付与し、その結果を記録する完全なスクリプト例です。

# 有効なサブスクリプションの取得
$subscriptions = az account list --output json | ConvertFrom-Json | Where-Object { $_.state -eq "Enabled" }

# 結果を格納する配列
$results = @()

# 各サブスクリプションに対する操作
foreach ($subscription in $subscriptions) {
    Write-Output "Processing Subscription: $($subscription.name)"
    az account set --subscription $subscription.id

    $resourceGroups = az group list --output json | ConvertFrom-Json
    foreach ($rg in $resourceGroups) {
        az group update --name $rg.name --set tags.Project="AzureManagement"
        Write-Output "  Tag added to Resource Group: $($rg.name)"

        # 結果を記録
        $results += [PSCustomObject]@{
            SubscriptionName = $subscription.name
            ResourceGroup    = $rg.name
            Operation        = "TagAdded"
        }
    }
}

# CSVファイルにエクスポート
$results | Export-Csv -Path "operation_results.csv" -NoTypeInformation -Encoding UTF8

このスクリプトにより、サブスクリプションごとに操作を一括で行い、結果を記録できます。次に、エラー処理と例外対応のベストプラクティスについて解説します。

エラー処理と例外対応のベストプラクティス

サブスクリプションを一括操作するスクリプトでは、エラーが発生する可能性があります。エラー処理を適切に実装することで、スクリプトの信頼性と運用性を向上させることができます。ここでは、エラー処理と例外対応のベストプラクティスを解説します。

基本的なエラー処理

PowerShellスクリプトでは、try-catch構文を使用してエラーをキャッチし、適切に処理できます。以下の例では、azコマンドのエラーをキャッチしてログに記録します。

try {
    # Azure CLIコマンドの実行
    az account set --subscription $subscription.id
    $resourceGroups = az group list --output json | ConvertFrom-Json
} catch {
    # エラーが発生した場合の処理
    Write-Output "Error: Failed to set subscription or retrieve resource groups for $($subscription.name)"
    Write-Output $_.Exception.Message
}

エラー処理のスコープを限定する

エラー処理を必要な範囲に限定することで、スクリプト全体の可読性と保守性を向上させます。以下は、特定のリソースグループに対してエラー処理を行う例です。

foreach ($rg in $resourceGroups) {
    try {
        # リソースグループの操作
        az group update --name $rg.name --set tags.Project="AzureManagement"
        Write-Output "Tag added to Resource Group: $($rg.name)"
    } catch {
        # 個別のリソースグループエラーを記録
        Write-Output "Error updating Resource Group: $($rg.name)"
        Write-Output $_.Exception.Message
    }
}

エラーの種類に応じた対応

エラーにはさまざまな種類があり、それぞれに応じた対応が必要です。

ネットワークエラー

Azure CLIコマンドがネットワークエラーで失敗する場合があります。この場合、リトライロジックを実装します。

$retryCount = 0
$maxRetries = 3
$success = $false

while (-not $success -and $retryCount -lt $maxRetries) {
    try {
        az account set --subscription $subscription.id
        $success = $true
    } catch {
        $retryCount++
        Write-Output "Retry $retryCount for subscription $($subscription.name)"
        Start-Sleep -Seconds 5
    }
}

if (-not $success) {
    Write-Output "Failed to set subscription after $maxRetries retries: $($subscription.name)"
}

認証エラー

認証エラーが発生した場合、再ログインを促すメッセージを表示します。

try {
    az login
} catch {
    Write-Output "Authentication failed. Please log in again using 'az login'."
}

エラーの記録とレポート

エラーをログに記録することで、問題を後から確認しやすくなります。以下は、エラー情報をCSVに記録する例です。

$errors = @()

try {
    az account set --subscription $subscription.id
} catch {
    $errors += [PSCustomObject]@{
        SubscriptionName = $subscription.name
        ErrorMessage     = $_.Exception.Message
        Timestamp        = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")
    }
}

# エラーをCSVにエクスポート
$errors | Export-Csv -Path "error_log.csv" -NoTypeInformation -Encoding UTF8

スクリプト全体でのエラー対応例

以下は、一括操作全体でエラー処理を組み込んだスクリプトの例です。

$subscriptions = az account list --output json | ConvertFrom-Json | Where-Object { $_.state -eq "Enabled" }
$errors = @()

foreach ($subscription in $subscriptions) {
    try {
        az account set --subscription $subscription.id
        $resourceGroups = az group list --output json | ConvertFrom-Json
        foreach ($rg in $resourceGroups) {
            try {
                az group update --name $rg.name --set tags.Project="AzureManagement"
                Write-Output "Tag added to Resource Group: $($rg.name)"
            } catch {
                $errors += [PSCustomObject]@{
                    SubscriptionName = $subscription.name
                    ResourceGroup    = $rg.name
                    ErrorMessage     = $_.Exception.Message
                }
            }
        }
    } catch {
        $errors += [PSCustomObject]@{
            SubscriptionName = $subscription.name
            ResourceGroup    = "N/A"
            ErrorMessage     = $_.Exception.Message
        }
    }
}

# エラーをCSVにエクスポート
$errors | Export-Csv -Path "error_log.csv" -NoTypeInformation -Encoding UTF8

このようにエラー処理を適切に組み込むことで、スクリプトがより堅牢で信頼性の高いものになります。次に、応用例として特定リソースの操作やカスタムスクリプトの利用方法を解説します。

応用例:特定リソースの管理とカスタムスクリプト

サブスクリプション管理のスクリプトを応用することで、特定のAzureリソースを効率的に操作できます。ここでは、特定リソースの操作例とカスタムスクリプトの作成方法を解説します。

特定リソースの操作

複数のサブスクリプションにまたがるリソースの中から、特定条件に合致するリソースを抽出し、一括で操作する方法を紹介します。

例1: タグが付いていないリソースグループを取得

以下のスクリプトでは、タグが付いていないリソースグループを取得し、タグを付与します。

foreach ($subscription in $subscriptions) {
    Write-Output "Processing Subscription: $($subscription.name)"
    az account set --subscription $subscription.id

    $resourceGroups = az group list --output json | ConvertFrom-Json
    foreach ($rg in $resourceGroups) {
        if (-not $rg.tags) {
            az group update --name $rg.name --set tags.Project="DefaultTag"
            Write-Output "Tag added to Resource Group: $($rg.name)"
        }
    }
}

例2: 特定リージョンのリソースグループを操作

特定のリージョンに属するリソースグループを抽出して操作します。

$targetRegion = "eastus"
foreach ($subscription in $subscriptions) {
    Write-Output "Processing Subscription: $($subscription.name)"
    az account set --subscription $subscription.id

    $resourceGroups = az group list --output json | ConvertFrom-Json
    foreach ($rg in $resourceGroups) {
        if ($rg.location -eq $targetRegion) {
            Write-Output "Resource Group in target region: $($rg.name)"
        }
    }
}

カスタムスクリプトの作成

カスタムスクリプトを作成して、操作内容を拡張する方法を解説します。

例1: スケールセットのサイズ変更

特定サブスクリプション内の仮想マシンスケールセットのサイズを変更します。

foreach ($subscription in $subscriptions) {
    Write-Output "Processing Subscription: $($subscription.name)"
    az account set --subscription $subscription.id

    $vmScaleSets = az vmss list --output json | ConvertFrom-Json
    foreach ($vmss in $vmScaleSets) {
        az vmss scale --name $vmss.name --resource-group $vmss.resourceGroup --new-capacity 2
        Write-Output "Scaled VM Scale Set: $($vmss.name) to capacity 2"
    }
}

例2: ストレージアカウントのログ設定

ストレージアカウントに診断ログを有効化するスクリプトです。

foreach ($subscription in $subscriptions) {
    Write-Output "Processing Subscription: $($subscription.name)"
    az account set --subscription $subscription.id

    $storageAccounts = az storage account list --output json | ConvertFrom-Json
    foreach ($sa in $storageAccounts) {
        az monitor diagnostic-settings create `
            --name "storageDiagnostics" `
            --resource $sa.id `
            --logs '[{"category":"StorageRead", "enabled":true}, {"category":"StorageWrite", "enabled":true}]'
        Write-Output "Enabled diagnostics for Storage Account: $($sa.name)"
    }
}

操作結果の保存

以下のスクリプトでは、操作結果をCSVファイルに保存します。

$results = @()

foreach ($subscription in $subscriptions) {
    az account set --subscription $subscription.id

    $resourceGroups = az group list --output json | ConvertFrom-Json
    foreach ($rg in $resourceGroups) {
        $results += [PSCustomObject]@{
            SubscriptionName = $subscription.name
            ResourceGroup    = $rg.name
            Operation        = "TagAdded"
        }
    }
}

# CSVファイルに保存
$results | Export-Csv -Path "operation_results.csv" -NoTypeInformation -Encoding UTF8

応用例を活用するメリット

  • 特定条件のリソースを効率的に管理可能。
  • 繰り返し操作をスクリプト化することで人的ミスを防止。
  • 大規模なAzure環境での作業を効率化。

これらのカスタムスクリプトを活用することで、Azureの管理タスクをさらに効率化できます。最後に、これまでの内容をまとめます。

まとめ

本記事では、PowerShellを使ってAzure CLIを操作し、サブスクリプションを一括管理する方法を解説しました。PowerShellとAzure CLIの連携の基礎から始め、サブスクリプション情報の取得、一括操作、エラー処理、応用例まで、実践的な手法を詳しく説明しました。

適切なエラー処理やカスタムスクリプトの活用により、Azureの複数サブスクリプションやリソースを効率的に管理できます。これにより、管理業務の自動化が進み、時間と労力を節約できるだけでなく、人的ミスを防ぐことが可能になります。

この手法を活用して、Azure環境の管理をさらに効率化してください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次