身份validation问题 – 从Azure函数调用的Azure REST API
我正在使用Azure函数来调用Azure SQL数据仓库的其余API,以便在白天的特定时间暂停和恢复服务器(2个函数)。 在我之前创build的azure函数中,我从来不必调用REST API,因为我只使用可用的输出选项。 而SQL DW只有REST API选项。
我使用nodejs创build了一个函数应用程序,并从那里调用这些REST API。 我通过了azure色的REST API文档,并尝试了在那里解释的过程。 首先,我在azure活动目录中添加函数app作为租户,并获得tenantID(它是端点URL的一部分)和应用程序ID /客户端ID,然后尝试调用loginURL,如https:// docs.microsoft.com/en-us/azure/active-directory/active-directory-protocols-oauth-code#request-an-authorization-code通过传递所需的parameters.Though它被提及为GET,我试着GET和POST,他们没有工作。
module.exports = function(context) { var unirest = require('unirest'); var subscriptionId='subscriptionId'; context.log("starting the function"); unirest.post('https://login.windows.net/tenantID/oauth2/authorize') .headers({'Accept': 'application/json', 'Content-Type': 'application/json'}) .send({ "client_id": "clientID ", "response_type": "code","grant_type":"authorization_code" }) .end(function (response) { context.log(response.body); }); });
这段代码只是为了获得authentication码,然后再有一个方法来获得令牌,然后调用实际的SQL DW暂停/恢复方法。 当我从VS2015运行相同的(删除模块导出和更改上下文到控制台),我得到如下相同的错误
<html><head><title>Continue</title></head><body><form method="POST" name="hiddenform" action="https://login.microsoftonline.com/9b8d9cda-ddb4-43bb-8725-bc0e9af83b43/oauth2/authorize"><noscript><p>Script is disabled. Click Submit to continue</p><input type="submit" value="Submit" /></noscript></form><script language="javascript">window.setTimeout('document.forms[0].submit()', 0);</script></body></html>
我不知道我在这里错过了什么。 如果有人曾经做过,请分享您的意见/解决scheme。
更新:添加Azure AD – 注册权限页面作为对其中一个注释的回复。 让我知道这个是否符合要求。
我发现有关权限的问题。 我必须在AAD中为应用程序提供SQL数据库服务器pipe理器RBACangular色。 Resume命令行工作正常,但暂停命令行不起作用。 发生以下exception。
Suspend-AzureRmSqlDatabase:40640:服务器遇到意外的exception。 在行:9 char:35 + $ resultDatabase = $ database | 挂起AzureRmSqlDatabase; + ~~~~~~~~~~~~~~~~~~~~~~~ CategoryInfo:CloseError:(:) [Suspend-AzureRmSqlDatabase],CloudException + FullyQualifiedErrorId:Microsoft.Azure.Commands .Sql.DatabaseActivation.Cmdlet.SuspendAzureSqlDatabase
你会打开在函数中使用PowerShell实现相同的结果吗? Azure SQL数据仓库(DW)具有PowerShell命令,允许您暂停和恢复Azure SQL DW。 与制作HTTP请求和处理HTTP响应相比,使用PowerShell似乎更容易。
以下是如何创buildHTTP触发的PowerShell函数来暂停和恢复 Azure SQL DW的步骤。 您可以使用相同的run.ps1
文件重新创build一个定时器触发的PowerShell函数。
-
设置服务主体以获取用户名,密码和租户ID。 这是一个一次性的任务,我觉得在函数中利用正在运行的Azure PowerShell是值得的。 网上有很多文档,但是这里有一些关于如何设置你的服务主pipe的文档的链接:
一世。 http://blog.davidebbo.com/2014/12/azure-service-principal.html (我用过这个)
-
loginfunction门户访问您的function应用程序。
-
点击function应用程序设置 – >configuration应用程序设置,并添加设置
SP_USERNAME
,SP_PASSWORD
和TENANTID
(您可以使用其他所需的键名称)。 -
创build名为的HTTP触发的PowerShell函数,例如SuspendSqlDataWarehouse ,其
run.ps1
文件中包含以下内容。
$ requestBody = Get-Content $ req -Raw | ConvertFrom JSON的 #设置服务主体凭证 #SP_PASSWORD,SP_USERNAME,TENANTID是应用程序设置 $ 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; #挂起SQL数据仓库 $ database = Get-AzureRmSqlDatabase -ResourceGroupName $ requestBody.resourcegroup -ServerName $ requestBody.server -DatabaseName $ requestBody.databasename if($ database.Status -ne“Paused”)#IF-condition在2/3/2017添加 { $ resultDatabase = $ database | 挂起AzureRmSqlDatabase; $ resultDatabase | 输出string; }
-
点击保存button。
-
接下来,点击Logsbutton打开日志查看器。
-
点击testingbutton打开简单的HTTP客户端。 在请求正文中,为SQL DW提供resourcegroup,server和databasename值,例如
{ “resourcegroup”:“testresourcegroup”, “server”:“testserver”, “databasename”:“testsqldw” }
- 点击运行button,等待几秒钟。
Get-AzureRmSqlDatabase
和Suspend-AzureRmSqlDatabase
cmdlet需要一段时间(Get-AzureRmSqlDatabase
分钟)才能运行完成。 当它发生时,您应该在日志查看器中看到类似的条目。
2016-12-09T18:02:07.990function启动(Id = 3c270254-f935-4a32-8b27-13131b6257d4) 2016-12-09T18:02:09.224 Microsoft.Azure.Commands.Profile.Models.PSAzureContext 2016-12-09T18:02:09.224 Microsoft.Azure.Commands.Profile.Models.PSAzureContext 2016-12-09T18:03:25过去1分钟没有新的痕迹。 2016-12-09T18:04:25过去2分钟没有新的踪影。 2016-12-09T18:05:11.787 ResourceGroupName:testresourcegroup ServerName:testserver DatabaseName:testsqldw 地点:美国西部 DatabaseId:[一些guid] 版本:DataWarehouse sorting规则名称:SQL_Latin1_General_CP1_CI_AS CatalogCollation: MaxSizeBytes:10995116277760 状态:已暂停 CreationDate:12/9/2016 5:14:35 PM CurrentServiceObjectiveId:[一些guid] CurrentServiceObjectiveName:DW400 RequestedServiceObjectiveId:[一些guid] RequestedServiceObjectiveName: ElasticPoolName: 最早的恢复date:1/1/0001 12:00:00 AM 标签: ResourceId:/ subscriptions / [一些guid] / resourceGroups / testresourcegroup /提供商 /Microsoft.Sql/servers/testserver/databases/tests qldw CreateMode: 2016-12-09T18:05:11.787function完成(成功,Id = 3c270254-f935-4a32-8b27-13131b6257d4)
- 重复步骤4-8,在其
run.ps1
文件中使用以下内容创buildResumeSqlDataWarehouse函数。
$ requestBody = Get-Content $ req -Raw | ConvertFrom JSON的 #设置服务主体凭证 #SP_PASSWORD,SP_USERNAME,TENANTID是应用程序设置 $ 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; #恢复SQL数据仓库 $ database = Get-AzureRmSqlDatabase -ResourceGroupName $ requestBody.resourcegroup -ServerName $ requestBody.server -DatabaseName $ requestBody.databasename $ resultDatabase = $ database | 简历,AzureRmSqlDatabase; $ resultDatabase | 输出string;
日志条目将类似于以下内容:
2016-12-09T18:17:34.625function启动(Id = 55f6d69e-a32e-4153-89c8-e821c4429421) 2016-12-09T18:17:36.504 Microsoft.Azure.Commands.Profile.Models.PSAzureContext 2016-12-09T18:17:36.504 Microsoft.Azure.Commands.Profile.Models.PSAzureContext 2016-12-09T18:18:07.836 ResourceGroupName:testresourcegroup ServerName:testserver DatabaseName:testsqldw 地点:美国西部 DatabaseId:[一些guid] 版本:DataWarehouse sorting规则名称:SQL_Latin1_General_CP1_CI_AS CatalogCollation: MaxSizeBytes:10995116277760 状态:在线 CreationDate:12/9/2016 5:14:35 PM CurrentServiceObjectiveId:[一些guid] CurrentServiceObjectiveName:DW400 RequestedServiceObjectiveId:[一些guid] RequestedServiceObjectiveName: ElasticPoolName: 最早的恢复date:1/1/0001 12:00:00 AM 标签: ResourceId:/ subscriptions / [一些guid] / resourceGroups / testresourcegroup /提供商/ Microsoft.Sql /服务器/ TESTSERVER /数据库/testing qldw CreateMode: 2016-12-09T18:18:07.836function已完成(成功,Id = 55f6d69e-a32e-4153-89c8-e821c4429421)
注意:我注意到暂停SQL数据仓库需要几分钟的时间。 在当前版本的Azure函数中,所有函数的最大执行时间为5分钟。 如果您的function在5分钟之前执行暂停/恢复命令,这是正常的,因为任务本身将被启动。 您可以编写另一个函数来查询SQL数据仓库的状态,直到获得预期的Paused/Online
值。