2016-11-28 139 views
0

我希望能夠使用預定的C#Azure功能管理一些Azure資源。Azure功能角色像停止Azure虛擬機的權限

目前在我所做的命令行應用程序中,我一直使用庫的「Microsoft.IdentityModel.Clients.ActiveDirectory」作爲令牌授權,「Microsoft.Azure.Management.Compute」用於客戶端調用資源管理所以。

//... var credential generated my AD authentication and extending Microsoft.Rest.ServiceClientCredentials 
using (var client = new ComputeManagementClient(credential)) { 
    client.SubscriptionId = "[SOME_SUBSCRIPTION_ID]"; 
    client.VirtualMachines.BeginPowerOff("[RESOURCE_GROUP]", "[VM_NAME]"); 
} 

我的管理客戶端可以與Azure資源進行交互,而無需提供用戶證書或密鑰 - 密鑰(如證書建立)嗎?

我以前的經驗與AWS有關,無可否認,它令我對Azure資源管理的看法感到困惑。

舊帖子我已經看了有:Start and Stop Azure Virtual Machine

Is it possible to stop/start an Azure ARM Virtual from an Azure Function?

-edit 1-

我希望類似的東西,運行時間在AWS資源憑證Lambda的客戶端基於具有各種權限的指定角色。我會看看證書。

+0

您是使用Azure Scheduler還是Automation Runbook運行腳本?如果您使用的是自動化,那麼您有一個憑證資源並使用它您不必對任何憑證進行硬編碼,也可以使用Azure密鑰庫 –

+0

腳本是一種C#函數,它需要一個Timer Trigger參數才能在每日計劃。我遵循了[入門]的介紹性鏈接(https://azure.microsoft.com/en-us/blog/introducing-azure-functions),並查看了[最佳實踐](https://docs.microsoft .com/en-us/azure/azure-functions/functions-best-practices),但最初對資源管理認證的最佳實踐以及運行時憑證的可能性感到困惑。在這個時候,我可能會堅持使用AD密鑰和祕密作爲參數。 – user2781163

回答

0

嗯,我真的不明白你如何期待沒有驗證的身份驗證,我猜你唯一的選擇是證書?
https://azure.microsoft.com/en-us/resources/samples/active-directory-dotnet-daemon-certificate-credential/

+0

我正在考慮在運行時生成憑證。與AWS Lambda中的AWS資源客戶端或EC2實例類似,您可以根據您分配的角色(可選)不提供任何憑據,也可以爲您完成該任務。我的術語可能會更好抱歉。 – user2781163

+0

呵呵,我明白了,Azure並未提供該功能。 – 4c74356b41

+0

希望很快。目前通過資源組和/或訂閱級別訪問(使用客戶端密鑰和生成的密鑰)創建Active Directory作爲參數對我有所幫助。我不確定這是否是一個骯髒的解決方案,而不是適合Azure功能訪問資源的「Azure方式」。 – user2781163

5

有幾個資源在線使用C#使REST API調用來啓動和停止VM。這裏有一個鏈接,這樣一個文件:

https://msftstack.wordpress.com/2016/01/03/how-to-call-the-azure-resource-manager-rest-api-from-c/

你可以使用上面作爲參考來創建C#功能來啓動/停止您的虛擬機。

但是,使用C#進行這些REST調用需要預先打包HTTP請求並後處理HTTP響應。如果您的用例只是調用啓動/停止VM,則更簡單的方法是使用Azure函數中的PowerShell調用Start-AzureRmVMStop-AzureRmVM cmdlet。

以下是關於如何創建HTTP觸發PowerShell函數來啓動和停止虛擬機的步驟:

  1. 設置一個服務主體,以獲取用戶名,密碼和租戶ID。這個初始設置可能會被一些用戶認爲是乏味的,但由於這是一次性任務,我覺得在函數中利用運行的Azure PowerShell是值得的。網上有很多文檔,但這裏有一些關於如何設置您的服務主體的文檔的鏈接:

    i。 http://blog.davidebbo.com/2014/12/azure-service-principal.html(我用過這個)

    ii。 https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-service-principal-portal

  2. 登錄函數入口訪問您的函數應用程序。

  3. 點擊功能的應用程序設置 - >配置應用程序設置並添加鍵值對的設置SP_USERNAMESP_PASSWORD,並TENANTID(您可以使用其他需要的鍵名)。

  4. 創建一個名爲的HTTP觸發的PowerShell函數,例如, StartVm在其run.ps1文件中包含以下內容。

 
    $requestBody = Get-Content $req -Raw | ConvertFrom-Json 

    # Set Service Principal credentials 
    # SP_PASSWORD, SP_USERNAME, TENANTID are app settings 
    $secpasswd = ConvertTo-SecureString $env:SP_PASSWORD -AsPlainText -Force; 
    $mycreds = New-Object System.Management.Automation.PSCredential ($env:SP_USERNAME, $secpasswd) 
    Add-AzureRmAccount -ServicePrincipal -Tenant $env:TENANTID -Credential $mycreds; 
    $context = Get-AzureRmContext; 
    Set-AzureRmContext -Context $context; 

    # Start VM 
    Start-AzureRmVM -ResourceGroupName $requestBody.resourcegroup -Name $requestBody.vmname | Out-String 

  • 點擊保存按鈕。

  • 接下來,點擊日誌按鈕打開日誌查看器。

  • 點擊測試按鈕打開簡單的HTTP客戶端。在請求主體中,爲VM提供vmname和resourcegroup值,例如

  •  
        { 
         "vmname": "testvm", 
         "resourcegroup": "testresourcegroup" 
        } 
    
  • 點擊運行按鈕並等待幾秒鐘。 Start-AzureRmVM cmdlet運行完成需要一些時間。當它發生時,您應該在日誌查看器中看到類似的條目。
  •  
    
        2016-11-30T07:11:26.479 Function started (Id=1e38ae2c-3cca-4e2f-a85d-f62c0d565c34) 
        2016-11-30T07:11:28.276 Microsoft.Azure.Commands.Profile.Models.PSAzureContext 
        2016-11-30T07:11:28.276 Microsoft.Azure.Commands.Profile.Models.PSAzureContext 
        2016-11-30T07:11:59.312 RequestId   IsSuccessStatusCode   StatusCode ReasonPhrase  
        ---------   -------------------   ---------- ------------  
                 True     OK OK 
        2016-11-30T07:11:59.327 Function completed (Success, Id=1e38ae2c-3cca-4e2f-a85d-f62c0d565c34) 
    
    
  • 重複步驟4-8以與其run.ps1文件中的以下內容創建StopVm功能。如果執行成功,日誌輸出應類似於啓動功能的日誌條目。
  •  
    
        $requestBody = Get-Content $req -Raw | ConvertFrom-Json 
    
        # Set Service Principal credentials 
        # SP_PASSWORD, SP_USERNAME, TENANTID are app settings 
        $secpasswd = ConvertTo-SecureString $env:SP_PASSWORD -AsPlainText -Force; 
        $mycreds = New-Object System.Management.Automation.PSCredential ($env:SP_USERNAME, $secpasswd) 
        Add-AzureRmAccount -ServicePrincipal -Tenant $env:TENANTID -Credential $mycreds; 
        $context = Get-AzureRmContext; 
        Set-AzureRmContext -Context $context; 
    
        # Stop VM 
        Stop-AzureRmVM -ResourceGroupName $requestBody.resourcegroup -Name $requestBody.vmname -Force | Out-String 
    
    
  • StopVm功能執行成功時,也可以添加其他GetVm功能在其run.ps1文件中的以下內容,以驗證該VM具有確實已經停止。
  •  
    
        $requestBody = Get-Content $req -Raw | ConvertFrom-Json 
    
        # Set Service Principal credentials 
        # SP_PASSWORD, SP_USERNAME, TENANTID are app settings 
        $secpasswd = ConvertTo-SecureString $env:SP_PASSWORD -AsPlainText -Force; 
        $mycreds = New-Object System.Management.Automation.PSCredential ($env:SP_USERNAME, $secpasswd) 
        Add-AzureRmAccount -ServicePrincipal -Tenant $env:TENANTID -Credential $mycreds; 
        $context = Get-AzureRmContext; 
        Set-AzureRmContext -Context $context; 
    
        # Get VM 
        Get-AzureRmVM -ResourceGroupName $requestBody.resourcegroup -Name $requestBody.vmname -Status | Out-String 
    
    

    上停止VM的GetVM功能的日誌條目將是類似以下內容:

     
    
        2016-11-30T07:53:59.956 Function started (Id=1841757f-bbb8-45cb-8777-80edb4e75ced) 
        2016-11-30T07:54:02.040 Microsoft.Azure.Commands.Profile.Models.PSAzureContext 
        2016-11-30T07:54:02.040 Microsoft.Azure.Commands.Profile.Models.PSAzureContext 
        2016-11-30T07:54:02.977 ResourceGroupName   : testresourcegroup 
        Name      : testvm 
        BootDiagnostics   : 
         ConsoleScreenshotBlobUri : https://teststorage.blob.core.windows.net/boot 
        diagnostics-vmtest-[someguid]/testvm.[someguid].screenshot.bmp 
        Disks[0]     : 
         Name      : windowsvmosdisk 
         Statuses[0]    : 
         Code     : ProvisioningState/succeeded 
         Level     : Info 
         DisplayStatus   : Provisioning succeeded 
         Time     : 11/30/2016 7:15:15 AM 
        Extensions[0]    : 
         Name      : BGInfo 
        VMAgent     : 
         VmAgentVersion   : Unknown 
         Statuses[0]    : 
         Code     : ProvisioningState/Unavailable 
         Level     : Warning 
         DisplayStatus   : Not Ready 
         Message    : VM Agent is unresponsive. 
         Time     : 11/30/2016 7:54:02 AM 
        Statuses[0]    : 
         Code      : ProvisioningState/succeeded 
         Level     : Info 
         DisplayStatus   : Provisioning succeeded 
         Time      : 11/30/2016 7:15:15 AM 
        Statuses[1]    : 
         Code      : PowerState/deallocated 
         Level     : Info 
         DisplayStatus   : VM deallocated 
        2016-11-30T07:54:02.977 Function completed (Success, Id=1841757f-bbb8-45cb-8777-80edb4e75ced) 
    
    

    注:僅供參考,而你可以寫一個函數來通過調用New-AzureRmVM cmdlet創建VM,它將不會在Azure函數中運行到完成。在Azure Function的基礎架構中創建虛擬機似乎需要大約9分鐘才能完成,但函數的執行在5分鐘內終止。您可以編寫另一個腳本分別對結果進行輪詢。在我們即將發佈的其中一個版本中,我們開始支持自定義配置以實現最長執行時間時,此限制將被解除。

    --Update-- 我才意識到你想創建計劃功能。在這種情況下,您可以使用定時器觸發的PowerShell函數並對vmname和resourcegroup進行硬編碼。