2016-11-28 101 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进行硬编码。