Azure功能角色类似于停止Azure虚拟机的权限



我希望使用计划的C#Azure函数来管理一些Azure资源。

目前,在我制作的一个命令行应用程序中,我一直在使用库"Microsoft.IdentityModel.Clients.ActiveDirectory"进行令牌授权,并使用库"Microsoft.Azure.Management.Computer"进行客户端调用以进行类似的资源管理。

//... 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资源管理的看法。

我看过的旧帖子是:启动和停止Azure虚拟机

是否可以从Azure功能停止/启动Azure ARM Virtual?

-编辑1-

我希望在Lambda的AWS资源客户端中,基于具有各种权限的指定角色,可以获得类似于运行时凭据的东西。不过我会看一下证书。

有一些关于使用C#进行REST API调用以启动和停止虚拟机的在线资源。这里有这样一个文件的链接:

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函数中使用PowerShell来调用Start-AzureRmVMStop-AzureRmVMcmdlet。

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

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

    i。http://blog.davidebbo.com/2014/12/azure-service-principal.html(我用过这个)

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

  2. 登录功能门户以访问您的功能应用程序。

  3. 单击功能应用程序设置->配置应用程序设置,并添加设置SP_USERNAMESP_PASSWORDTENANTID的键值对(您可以使用其他所需的密钥名称)。

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

$requestBody=获取内容$req-Raw|ConvertFromJson#设置服务主体凭据#SP_PASSWORD、SP_USERNAME、TENANTID是应用程序设置$secpasswd=转换为SecureString$env:SP_PASSWORD-AsPlainText-Force;$mycreds=新对象System.Management.Automation.PSCredential($env:SP_USERNAME,$secpasswd)添加AzureRmAccount-ServicePrincipal-租户$env:TENSID-凭据$mycreds;$context=获取AzureRmContext;Set AzureRmContext-上下文$Context;#启动VM启动AzureRmVM-资源组名称$requestBody.resourcegroup-名称$requestBody.vmname |输出字符串
  1. 单击保存按钮。

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

  3. 单击Test按钮打开简单的HTTP客户端。在请求主体中,提供VM的vmname和resourcegroup值,例如

{"vmname":"testvm","resourcegroup":"testresourcegroup"}
  1. 单击运行按钮并等待几秒钟。Start-AzureRmVMcmdlet运行到完成需要一些时间。当它出现时,您应该在日志查看器中看到类似的条目
2016-11-30T07:11:26.479功能启动(Id=1e38ae2c-3cca-4e2f-a85d-f62c0d565c34)2016-11-30T07:11:28.276 Microsoft.Azure.Commands.Profile.Models.PSAzureContext2016-11-30T07:11:28.276 Microsoft.Azure.Commands.Profile.Models.PSAzureContext2016-11-30T07:1:59.312 RequestId IsSuccessStatusCode StatusCode ReasonPhrase-------------------------True OK OK2016-11-30T07:11:59.327函数已完成(成功,Id=1e38ae2c-3cca-4e2f-a85d-f62c0d565c34)
  1. 重复步骤4-8创建StopVm函数,其run.ps1文件中包含以下内容。如果执行成功,则日志输出应类似于StartVm函数的日志条目
$requestBody=获取内容$req-Raw|ConvertFromJson#设置服务主体凭据#SP_PASSWORD、SP_USERNAME、TENANTID是应用程序设置$secpasswd=转换为SecureString$env:SP_PASSWORD-AsPlainText-Force;$mycreds=新对象System.Management.Automation.PSCredential($env:SP_USERNAME,$secpasswd)添加AzureRmAccount-ServicePrincipal-租户$env:TENSID-凭据$mycreds;$context=获取AzureRmContext;Set AzureRmContext-上下文$Context;#停止VMStop-AzureRmVM-ResourceGroupName$requestBody.resourcegroup-Name$requestBody_vmname-Force|Out String
  1. StopVm函数执行成功时,您还可以在其run.ps1文件中添加另一个具有以下内容的GetVm数,以验证VM是否确实已停止
$requestBody=获取内容$req-Raw|ConvertFromJson#设置服务主体凭据#SP_PASSWORD、SP_USERNAME、TENANTID是应用程序设置$secpasswd=转换为SecureString$env:SP_PASSWORD-AsPlainText-Force;$mycreds=新对象System.Management.Automation.PSCredential($env:SP_USERNAME,$secpasswd)添加AzureRmAccount-ServicePrincipal-租户$env:TENSID-凭据$mycreds;$context=获取AzureRmContext;Set AzureRmContext-上下文$Context;#获取VMGet-AzureRmVM-ResourceGroupName$requestBody.resourcegroup-Name$requestBody_vmname-Status|Out String

停止的VM上的GetVM函数的日志条目将类似于以下内容:

2016-11-30T07:53:59.956功能启动(Id=1841757f-bbb8-45cb-8777-80edb4e75ced)2016-11-30T07:54:02.040 Microsoft.Azure.Commands.Profile.Models.PSAzureContext2016-11-30T07:54:02.040 Microsoft.Azure.Commands.Profile.Models.PSAzureContext2016-11-30T07:54:02.977资源组名称:testresourcegroup名称:testvmBootDiagnostics:控制台屏幕截图Blob Uri:https://teststorage.blob.core.windows.net/boot诊断vmtest-[someguid]/testvm。[someguid].screenshot.bmp磁盘[0]:名称:windowsvmosdisk状态[0]:代码:ProvisioningState/成功级别:信息DisplayStatus:设置成功时间:2016年11月30日上午7:15:15扩展[0]:名称:BGInfoVMAgent:VmAgentVersion:未知状态[0]:代码:ProvisioningState/不可用级别:警告显示状态:未就绪消息:VM代理没有响应。时间:2016年11月30日上午7:54:02状态[0]:代码:ProvisioningState/成功级别:信息DisplayStatus:设置成功时间:2016年11月30日上午7:15:15状态[1]:代码:PowerState/deallocated级别:信息显示状态:VM已解除分配2016-11-30T07:54:02.977函数已完成(成功,Id=1841757f-bbb8-45cb-8777-80edb4e75ced)

注意:仅供参考,虽然您可以通过调用New-AzureRmVMcmdlet编写函数来创建VM,但它不会在Azure函数中运行到完成。Azure Function基础设施中的VM创建似乎需要大约9分钟才能完成,但Function的执行将在5分钟后终止。您可以编写另一个脚本来单独轮询结果。当我们在即将发布的一个版本中开始支持自定义配置以获得最长执行时间时,这一限制将被取消。

--更新我刚刚意识到您正试图创建计划的函数。在这种情况下,您可以使用定时器触发的PowerShell函数,并对vmname和resourcegroup进行硬编码。

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

最新更新