Azure Function 角色,例如停止 Azure 虚拟机的权限
Azure Function role like permissions to Stop Azure Virtual Machines
我希望使用计划的 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
和
-编辑 1-
我希望在 Lambda 的 AWS 资源客户端中基于具有各种权限的分配角色获得类似于 运行 时间凭证的东西。不过,我会看看证书。
好吧,我真的不明白您希望如何在不进行身份验证的情况下进行身份验证,我想您唯一的选择就是证书?
https://azure.microsoft.com/en-us/resources/samples/active-directory-dotnet-daemon-certificate-credential/
有一些关于使用 C# 进行 REST API 调用以启动和停止 VM 的在线资源。这是这样一个文档的link:
https://msftstack.wordpress.com/2016/01/03/how-to-call-the-azure-resource-manager-rest-api-from-c/
您可以使用以上内容作为参考来为 start/stop 您的虚拟机创建 C# 函数。
但是,使用 C# 进行这些 REST 调用需要预先打包 HTTP 请求和 post 处理 HTTP 响应。如果您的用例仅需要 start/stop VM,则更简单的方法是使用 Azure Functions 中的 PowerShell 来调用 Start-AzureRmVM
和 Stop-AzureRmVM
cmdlet。
以下是有关如何创建 HTTP 触发的 PowerShell 函数以启动和停止 VM 的步骤:
设置服务主体以获取用户名、密码和租户ID。一些用户可能认为这种初始设置很乏味,但由于这是一次性任务,我觉得在函数中利用 运行 Azure PowerShell 是值得的。网上有很多文档,但这里有一些 link 文档,介绍如何设置您的服务主体:
我。 http://blog.davidebbo.com/2014/12/azure-service-principal.html(我用的就是这个)
登录 Functions 门户访问您的 Functions 应用程序。
点击Function app settings->Configure app settings并为设置SP_USERNAME
、[=13=添加键值对],和 TENANTID
(您可以使用其他所需的键名)。
创建一个 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客户端。在请求正文中,提供虚拟机的虚拟机名称和资源组值,例如
{
"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 函数。如果执行成功,日志输出应该类似于 StartVm 函数的日志条目。
$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函数执行成功后,您还可以在其
run.ps1
中再添加一个GetVm函数,内容如下文件以验证 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 的基础结构中创建 VM 似乎需要大约 9 分钟才能完成,但 Function 的执行会在 5 分钟后终止。您可以编写另一个脚本来单独轮询结果。当我们在即将发布的版本中开始支持最长执行时间的自定义配置时,将取消此限制。
--更新--
我刚刚意识到您正在尝试创建 scheduled 函数。在这种情况下,您可以使用定时器触发的 PowerShell 函数并对虚拟机名称和资源组进行硬编码。
我希望使用计划的 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
和
-编辑 1-
我希望在 Lambda 的 AWS 资源客户端中基于具有各种权限的分配角色获得类似于 运行 时间凭证的东西。不过,我会看看证书。
好吧,我真的不明白您希望如何在不进行身份验证的情况下进行身份验证,我想您唯一的选择就是证书?
https://azure.microsoft.com/en-us/resources/samples/active-directory-dotnet-daemon-certificate-credential/
有一些关于使用 C# 进行 REST API 调用以启动和停止 VM 的在线资源。这是这样一个文档的link:
https://msftstack.wordpress.com/2016/01/03/how-to-call-the-azure-resource-manager-rest-api-from-c/
您可以使用以上内容作为参考来为 start/stop 您的虚拟机创建 C# 函数。
但是,使用 C# 进行这些 REST 调用需要预先打包 HTTP 请求和 post 处理 HTTP 响应。如果您的用例仅需要 start/stop VM,则更简单的方法是使用 Azure Functions 中的 PowerShell 来调用 Start-AzureRmVM
和 Stop-AzureRmVM
cmdlet。
以下是有关如何创建 HTTP 触发的 PowerShell 函数以启动和停止 VM 的步骤:
设置服务主体以获取用户名、密码和租户ID。一些用户可能认为这种初始设置很乏味,但由于这是一次性任务,我觉得在函数中利用 运行 Azure PowerShell 是值得的。网上有很多文档,但这里有一些 link 文档,介绍如何设置您的服务主体:
我。 http://blog.davidebbo.com/2014/12/azure-service-principal.html(我用的就是这个)
登录 Functions 门户访问您的 Functions 应用程序。
点击Function app settings->Configure app settings并为设置
SP_USERNAME
、[=13=添加键值对],和TENANTID
(您可以使用其他所需的键名)。创建一个 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客户端。在请求正文中,提供虚拟机的虚拟机名称和资源组值,例如
{ "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 函数。如果执行成功,日志输出应该类似于 StartVm 函数的日志条目。
$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函数执行成功后,您还可以在其
run.ps1
中再添加一个GetVm函数,内容如下文件以验证 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 的基础结构中创建 VM 似乎需要大约 9 分钟才能完成,但 Function 的执行会在 5 分钟后终止。您可以编写另一个脚本来单独轮询结果。当我们在即将发布的版本中开始支持最长执行时间的自定义配置时,将取消此限制。
--更新-- 我刚刚意识到您正在尝试创建 scheduled 函数。在这种情况下,您可以使用定时器触发的 PowerShell 函数并对虚拟机名称和资源组进行硬编码。