チュートリアル: マネージド ID を使用して Automation PowerShell Runbook を作成する

このチュートリアルでは、Azure Automation で PowerShell Runbook を作成し、リソースの操作に実行アカウントではなく、マネージド ID を使用する方法を説明します。 PowerShell Runbook は、Windows PowerShell に基づきます。 Azure Active Directory (Azure AD) のマネージド ID を使用すると、Runbook が Azure AD で保護された他のリソースに簡単にアクセスできます。

このチュートリアルでは、以下の内容を学習します。

  • マネージド ID にアクセス許可を割り当てる
  • PowerShell Runbook を作成する

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

前提条件

マネージド ID にアクセス許可を割り当てる

マネージド ID に、仮想マシンの停止と起動を許可するアクセス許可を割り当てます。

  1. Connect-AzAccount コマンドレットを使用して、Azure に対話的にサインインし、指示に従います。

    # Sign in to your Azure subscription
    $sub = Get-AzSubscription -ErrorAction SilentlyContinue
    if(-not($sub))
    {
        Connect-AzAccount
    }
    
    # If you have multiple subscriptions, set the one to use
    # Select-AzSubscription -SubscriptionId <SUBSCRIPTIONID>
    
  2. 下の変数に適切な値を指定し、スクリプトを実行します。

    $resourceGroup = "resourceGroupName"
    
    # These values are used in this tutorial
    $automationAccount = "xAutomationAccount"
    $userAssignedManagedIdentity = "xUAMI"
    
  3. PowerShell コマンドレット New-AzRoleAssignment を使用して、システム割り当てマネージド ID にロールを割り当てます。

    $role1 = "DevTest Labs User"
    
    $SAMI = (Get-AzAutomationAccount -ResourceGroupName $resourceGroup -Name $automationAccount).Identity.PrincipalId
    New-AzRoleAssignment `
        -ObjectId $SAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName $role1
    
  4. ユーザー割り当てマネージド ID にも同じロールの割り当てが必要です

    $UAMI = (Get-AzUserAssignedIdentity -ResourceGroupName $resourceGroup -Name $userAssignedManagedIdentity).PrincipalId
    New-AzRoleAssignment `
        -ObjectId $UAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName $role1
    
  5. このチュートリアルで使用するコマンドレット Get-AzUserAssignedIdentityGet-AzAutomationAccount を実行するには、システム割り当てマネージド ID に追加のアクセス許可が必要です。

    $role2 = "Reader"
    New-AzRoleAssignment `
        -ObjectId $SAMI `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName $role2
    

初めての PowerShell Runbook

どちらのマネージド ID でも実行可能な Runbook を作成します。 この Runbook は、停止した VM を起動したり、実行中の VM を停止したりします。

  1. Azure portal にサインインし、お使いの Automation アカウントに移動します。

  2. [プロセス オートメーション][Runbook] を選択します。

  3. [Runbook の作成] を選択します。

    1. Runbook に miTesting という名前を付けます。
    2. [Runbook の種類] ドロップダウン メニューから、 [PowerShell] を選択します。
    3. [作成] を選択します
  4. Runbook エディターで、次のコードを貼り付けます。

    Param(
     [string]$resourceGroup,
     [string]$VMName,
     [string]$method,
     [string]$UAMI 
    )
    
    $automationAccount = "xAutomationAccount"
    
    # Ensures you do not inherit an AzContext in your runbook
    Disable-AzContextAutosave -Scope Process | Out-Null
    
    # Connect using a Managed Service Identity
    try {
            $AzureContext = (Connect-AzAccount -Identity).context
        }
    catch{
            Write-Output "There is no system-assigned user identity. Aborting."; 
            exit
        }
    
    # set and store context
    $AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription `
        -DefaultProfile $AzureContext
    
    if ($method -eq "SA")
        {
            Write-Output "Using system-assigned managed identity"
        }
    elseif ($method -eq "UA")
        {
            Write-Output "Using user-assigned managed identity"
    
            # Connects using the Managed Service Identity of the named user-assigned managed identity
            $identity = Get-AzUserAssignedIdentity -ResourceGroupName $resourceGroup `
                -Name $UAMI -DefaultProfile $AzureContext
    
            # validates assignment only, not perms
            if ((Get-AzAutomationAccount -ResourceGroupName $resourceGroup `
                    -Name $automationAccount `
                    -DefaultProfile $AzureContext).Identity.UserAssignedIdentities.Values.PrincipalId.Contains($identity.PrincipalId))
                {
                    $AzureContext = (Connect-AzAccount -Identity -AccountId $identity.ClientId).context
    
                    # set and store context
                    $AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext
                }
            else {
                    Write-Output "Invalid or unassigned user-assigned managed identity"
                    exit
                }
        }
    else {
            Write-Output "Invalid method. Choose UA or SA."
            exit
         }
    
    # Get current state of VM
    $status = (Get-AzVM -ResourceGroupName $resourceGroup -Name $VMName `
        -Status -DefaultProfile $AzureContext).Statuses[1].Code
    
    Write-Output "`r`n Beginning VM status: $status `r`n"
    
    # Start or stop VM based on current state
    if($status -eq "Powerstate/deallocated")
        {
            Start-AzVM -Name $VMName -ResourceGroupName $resourceGroup -DefaultProfile $AzureContext
        }
    elseif ($status -eq "Powerstate/running")
        {
            Stop-AzVM -Name $VMName -ResourceGroupName $resourceGroup -DefaultProfile $AzureContext -Force
        }
    
    # Get new state of VM
    $status = (Get-AzVM -ResourceGroupName $resourceGroup -Name $VMName -Status `
        -DefaultProfile $AzureContext).Statuses[1].Code  
    
    Write-Output "`r`n Ending VM status: $status `r`n `r`n"
    
    Write-Output "Account ID of current context: " $AzureContext.Account.Id
    
  5. エディターの 8 行目で、必要に応じて $automationAccount 変数の値を変更します。

  6. [保存][テスト] ペイン の順に選択します。

  7. パラメーター RESOURCEGROUPVMNAME に適切な値を設定します。 METHOD パラメーターに SA を、UAMI パラメーターに xUAMI を入力します。 この Runbook は、システム割り当てマネージド ID を使用して VM の電源状態の変更を試行します。

  8. [スタート] を選択します。 この Runbook が完了すると、出力は次のようになります。

     Beginning VM status: PowerState/deallocated
    
    OperationId : 5b707401-f415-4268-9b43-be1f73ddc54b
    Status      : Succeeded
    StartTime   : 8/3/2021 10:52:09 PM
    EndTime     : 8/3/2021 10:52:50 PM
    Error       : 
    Name        : 
    
     Ending VM status: PowerState/running 
    
    Account ID of current context: 
    MSI@50342
    
  9. METHOD パラメーターの値を UA に変更します。

  10. [スタート] を選択します。 Runbook は、ユーザー割り当てマネージド ID を使用して VM の電源状態の変更を試行します。 この Runbook が完了すると、出力は次のようになります。

    Using user-assigned managed identity
    
     Beginning VM status: PowerState/running 
    
    OperationId : 679fcadf-d0b9-406a-9282-66bc211a9fbf
    Status      : Succeeded
    StartTime   : 8/3/2021 11:06:03 PM
    EndTime     : 8/3/2021 11:06:49 PM
    Error       : 
    Name        : 
    
     Ending VM status: PowerState/deallocated 
    
    Account ID of current context: 
    9034f5d3-c46d-44d4-afd6-c78aeab837ea
    

リソースをクリーンアップする

不要になったリソースを削除するには、次の Runbook を実行します。

#Remove runbook
Remove-AzAutomationRunbook `
    -ResourceGroupName $resourceGroup `
    -AutomationAccountName $automationAccount `
    -Name "miTesting" `
    -Force

# Remove role assignments
Remove-AzRoleAssignment `
    -ObjectId $UAMI `
    -ResourceGroupName $resourceGroup `
    -RoleDefinitionName $role1

Remove-AzRoleAssignment `
    -ObjectId $SAMI `
    -ResourceGroupName $resourceGroup `
    -RoleDefinitionName $role2

Remove-AzRoleAssignment `
    -ObjectId $SAMI `
    -ResourceGroupName $resourceGroup `
    -RoleDefinitionName $role1

次の手順

このチュートリアルでは、Azure Automation で PowerShell Runbook を作成し、リソースの操作に実行アカウントではなく、マネージド ID を使用しました。 PowerShell ワークフロー Runbook については、以下を参照してください。