【问题标题】:Azure Function role like permissions to Stop Azure Virtual MachinesAzure Function 角色,例如停止 Azure 虚拟机的权限
【发布时间】:2016-11-28 06:53:42
【问题描述】:

我希望使用计划的 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]");
}

我的管理客户端能否在不提供用户凭据或 Key-Secret 等凭据建立的情况下与 Azure 资源交互?

我之前的经验与 AWS 相关,诚然它混淆了我对 Azure 资源管理的看法。

我看过的旧帖子是:Start and Stop Azure Virtual Machine

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

-编辑 1-

我希望基于具有各种权限的分配角色,在 AWS 资源客户端中为 Lambda 提供类似于运行时凭证的东西。不过我会看看证书。

【问题讨论】:

  • 您是否使用 Azure 调度程序或自动化运行手册或什么来运行脚本?如果您使用的是自动化,那么您有一个凭据资源,并且使用它您不必对任何凭据进行硬编码,您也可以使用 Azure Key Vault
  • 脚本是一个 C# 函数,它采用 Timer Trigger 参数按每日计划运行。我按照getting started 的介绍性链接查看了best practices,但最初对资源管理身份验证的最佳实践和运行时凭据的可能性感到困惑。此时我可能会坚持使用 AD 密钥和秘密作为参数。

标签: c# azure azure-functions


【解决方案1】:

网上有一些关于使用 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。一些用户可能会认为此初始设置很乏味,但由于它是一次性任务,因此我认为在 Functions 中利用运行 Azure PowerShell 是值得的。网上有很多文档,但这里有一些关于如何设置服务主体的文档链接:

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

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

  2. 登录到 Functions 门户以访问您的 Function 应用程序。

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

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

$requestBody = 获取内容 $req -Raw | ConvertFrom-Json # 设置服务主体凭据 # SP_PASSWORD、SP_USERNAME、TENANTID 是应用设置 $secpasswd = ConvertTo-SecureString $env:SP_PASSWORD -AsPlainText -Force; $mycreds = 新对象 System.Management.Automation.PSCredential ($env:SP_USERNAME, $secpasswd) 添加-AzureRmAccount -ServicePrincipal -Tenant $env:TENANTID -Credential $mycreds; $context = 获取 AzureRmContext; 设置-AzureRmContext -Context $context; # 启动虚拟机 启动-AzureRmVM -ResourceGroupName $requestBody.resourcegroup -Name $requestBody.vmname |外串
  1. 点击保存按钮。

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

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

{ "vmname": "testvm", “资源组”:“测试资源组” }
  1. 单击运行按钮并等待几秒钟。 Start-AzureRmVM cmdlet 需要一些时间才能运行完成。当它出现时,您应该会在日志查看器中看到类似的条目。
2016-11-30T07:11:26.479 功能已启动(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 --------- -------- ---------- ------------ 是的 好的 好的 2016-11-30T07:11:59.327 功能完成(成功,Id=1e38ae2c-3cca-4e2f-a85d-f62c0d565c34)
  1. 重复步骤 4-8 以在其 run.ps1 文件中创建具有以下内容的 StopVm 函数。如果执行成功,日志输出应该类似于 StartVm 函数的日志条目。
$requestBody = 获取内容 $req -Raw | ConvertFrom-Json # 设置服务主体凭据 # SP_PASSWORD、SP_USERNAME、TENANTID 是应用设置 $secpasswd = ConvertTo-SecureString $env:SP_PASSWORD -AsPlainText -Force; $mycreds = 新对象 System.Management.Automation.PSCredential ($env:SP_USERNAME, $secpasswd) 添加-AzureRmAccount -ServicePrincipal -Tenant $env:TENANTID -Credential $mycreds; $context = 获取 AzureRmContext; 设置-AzureRmContext -Context $context; # 停止虚拟机 停止-AzureRmVM -ResourceGroupName $requestBody.resourcegroup -Name $requestBody.vmname -Force |外串
  1. StopVm函数执行成功后,您还可以在其run.ps1文件中添加另一个GetVm函数,内容如下.
$requestBody = 获取内容 $req -Raw | ConvertFrom-Json # 设置服务主体凭据 # SP_PASSWORD、SP_USERNAME、TENANTID 是应用设置 $secpasswd = ConvertTo-SecureString $env:SP_PASSWORD -AsPlainText -Force; $mycreds = 新对象 System.Management.Automation.PSCredential ($env:SP_USERNAME, $secpasswd) 添加-AzureRmAccount -ServicePrincipal -Tenant $env:TENANTID -Credential $mycreds; $context = 获取 AzureRmContext; 设置-AzureRmContext -Context $context; # 获取虚拟机 获取-AzureRmVM -ResourceGroupName $requestBody.resourcegroup -Name $requestBody.vmname -Status |外串

已停止 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.PSAzureContext 2016-11-30T07:54:02.040 Microsoft.Azure.Commands.Profile.Models.PSAzureContext 2016-11-30T07:54:02.977 资源组名称:测试资源组 名称:testvm 引导诊断: ConsoleScreenshotBlobUri:https://teststorage.blob.core.windows.net/boot 诊断-vmtest-[someguid]/testvm.[someguid].screenshot.bmp 磁盘[0]: 名称:windowsvmosdisk 状态[0]: 代码:ProvisioningState/succeeded 级别:信息 DisplayStatus : 配置成功 时间 : 11/30/2016 7:15:15 AM 扩展[0]: 名称:BGInfo VMAgent: VmAgentVersion:未知 状态[0]: 代码:ProvisioningState/不可用 级别:警告 显示状态:未准备好 消息:VM 代理无响应。 时间 : 11/30/2016 7:54:02 AM 状态[0]: 代码:ProvisioningState/succeeded 级别:信息 DisplayStatus : 配置成功 时间 : 11/30/2016 7:15:15 AM 状态[1]: 代码:PowerState/deallocated 级别:信息 DisplayStatus : VM 已解除分配 2016-11-30T07:54:02.977 功能完成(成功,Id=1841757f-bbb8-45cb-8777-80edb4e75ced)

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我在考虑在运行时生成凭据。类似于 AWS Lambda 或 EC2 实例中的 AWS 资源客户端,您可以选择性地不必提供任何凭证,并根据您分配的角色为您完成。我的术语本来可以更好的抱歉。
    • 哦,我明白了,Azure 还不提供该功能。
    • 希望很快。目前创建具有资源组和/或订阅级别访问权限(使用客户端密钥和生成的机密)作为参数的 Active Directory 确实对我有帮助。我不确定这是否是一个肮脏的解决方案,而不是 Azure Function 访问资源的正确“Azure 方式”。
    猜你喜欢
    • 2014-12-12
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 2022-11-02
    • 2021-01-10
    • 1970-01-01
    相关资源
    最近更新 更多