Azure功能角色,如停止Azure虚拟机的权限

时间:2016-11-28 06:53:42

标签: c# azure azure-functions

我希望使用预定的C#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 -

我希望基于具有各种权限的已分配角色,为Lambda的AWS资源客户端提供类似于运行时凭据的内容。我会看看证书。

2 个答案:

答案 0 :(得分:7)

在线使用C#进行REST API调用以启动和停止VM。这是指向此类文档的链接:

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

您可以使用上面的参考来创建C#函数来启动/停止您的VM。

但是,使用C#进行这些REST调用需要预先打包HTTP请求并对HTTP响应进行后处理。如果您的用例只是要求启动/停止VM,则更简单的方法是使用Azure Functions中的PowerShell来调用Start-AzureRmVMStop-AzureRmVM cmdlet。

以下是有关如何创建HTTP触发的PowerShell函数以启动和停止VM的步骤:

  1. 设置服务主体以获取用户名,密码和租户ID。某些用户可能认为这种初始设置很乏味,但由于它是一次性任务,我觉得在功能中利用运行Azure PowerShell是值得的。网上有很多文档,但这里有一些指向如何设置服务主体的文档的链接:

    我。 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. 登录函数门户以访问您的Function应用程序。

  3. 点击功能应用设置 - >配置应用设置,然后为设置SP_USERNAMESP_PASSWORD和{{1>添加键值对(您可以使用其他所需的键名称。)

  4. 创建一个名为HTTP的触发PowerShell函数,例如, StartVm ,其TENANTID文件中包含以下内容。

  5.     $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
    
    
    1. 点击保存按钮。

    2. 接下来,点击日志按钮打开日志查看器。

    3. 点击测试按钮打开简单的HTTP客户端。在请求正文中,提供VM的vmname和resourcegroup值,例如

    4.     {
              "vmname": "testvm",
              "resourcegroup": "testresourcegroup"
          }
      
      1. 点击运行按钮,等待几秒钟。 run.ps1 cmdlet运行完成需要一些时间。如果是这样,您应该在日志查看器中看到类似的条目。
      2. 
            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)
        
        
        1. 重复步骤4-8,在其Start-AzureRmVM文件中创建 StopVm 功能及以下内容。如果执行成功,则日志输出应类似于 StartVm 功能的日志条目。
        2. 
              $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
          
          
          1. StopVm 功能执行成功时,您还可以在其run.ps1文件中添加另一个带有以下内容的 GetVm 功能,以验证该VM是否确实存在已经停止了。
          2. 
                $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)
            
            

            注意:仅供参考,虽然您可以编写一个函数来通过调用run.ps1 cmdlet来创建VM,但它不会在Azure Functions中运行完成。 Azure功能基础架构中的VM创建似乎需要约9分钟才能完成,但功能的执行在5分钟后终止。您可以编写另一个脚本来单独轮询结果。当我们在即将发布的一个版本中开始支持自定义配置以实现最长执行时间时,将解除此限制。

            <强> - 更新 - 我刚刚意识到你正在尝试创建预定功能。在这种情况下,您可以使用Timer触发的PowerShell函数并对vmname和resourcegroup进行硬编码。

答案 1 :(得分:0)

好吧,我真的不明白你如何在没有身份验证的情况下进行身份验证,我想你唯一的选择就是证书?
https://azure.microsoft.com/en-us/resources/samples/active-directory-dotnet-daemon-certificate-credential/