身份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函数。

  1. 设置服务主体以获取用户名,密码和租户ID。 这是一个一次性的任务,我觉得在函数中利用正在运行的Azure PowerShell是值得的。 网上有很多文档,但是这里有一些关于如何设置你的服务主pipe的文档的链接:

    一世。 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. loginfunction门户访问您的function应用程序。

  3. 点击function应用程序设置 – >configuration应用程序设置,并添加设置SP_USERNAMESP_PASSWORDTENANTID (您可以使用其他所需的键名称)。

  4. 创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;
     }

  1. 点击保存button。

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

  3. 点击testingbutton打开简单的HTTP客户端。 在请求正文中,为SQL DW提供resourcegroup,server和databasename值,例如

     {
        “resourcegroup”:“testresourcegroup”,
        “server”:“testserver”,
        “databasename”:“testsqldw”
     }
  1. 点击运行button,等待几秒钟。 Get-AzureRmSqlDatabaseSuspend-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
     CatalogCollat​​ion: 
     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)

  1. 重复步骤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
     CatalogCollat​​ion: 
     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值。