【问题标题】:How to run a repetitive task in Azure that makes an HTTP request and stores result in a storage container?如何在 Azure 中运行发出 HTTP 请求并将结果存储在存储容器中的重复性任务?
【发布时间】:2020-09-04 22:55:03
【问题描述】:

我想创建一个 Azure 任务,它每 5 分钟(假设)向 API 发出一个 HTTP GET 请求。作为此请求的结果返回的文件将存储在存储容器中。但是,我不知道这样做的最佳途径是什么。

我尝试过的:

  • 在 Azure 门户中创建了一个存储容器(用于接收返回的文件)
  • 尝试在 Azure devops 中创建管道。不知道在哪里添加此任务。
  • 阅读 Azure 资源,了解如何创建 taskbatch API

问题是我是 Azure 的新手,还不了解这一切的架构,所以我什至不确定谷歌需要哪些关键字。

完成此 Azure 的最佳方法是什么?这是在 Azure devops 或 Azure 门户中完成的吗?哪个是更好的选择?最后,也是最重要的一点,您能否提供一个可以在 Azure 环境中工作的简单示例 HTTP GET 任务?

【问题讨论】:

  • 嗨,这个问题有更新吗? Krzysztof Madej 的回答是否有助于解决您的问题?如果可以,请考虑接受它作为答案。如果您仍然被阻止,请随时告诉我。
  • 几乎就在那里,除了我需要将返回的文件(作为对函数调用的响应)重定向到存储容器的部分。我查看了输出绑定,但到目前为止只能将字符串值写入存储容器。我需要使用 powershell 以某种方式将文件写入存储容器
  • 也许AzCopyaz storage file copy 通过命令行?
  • 我认为azcopyaz storage file copy 会要求我先保存文件?然后将这个保存的文件复制到存储容器中?在这种情况下,Azure 是否允许函数应用执行 OutFile 以保存到临时存储?
  • 是的,这两个工具需要我们先保存文件。嗯,但我不确定 Azure 中是否允许这样做,因为我更熟悉 Azure Devops...

标签: azure azure-devops azure-devops-rest-api


【解决方案1】:

整个过程:

1.正如Krzysztof Madej建议的那样,您可以使用带有- cron: "*/5 * * * *" 的yaml 管道每五分钟运行一次管道。但是根据您的描述,您还应该启用always: true,以便即使源代码库没有更改,您的管道也可以运行。

2.此外,要使用该格式的计划,您需要禁用任何 CI 触发器或 PR 触发器。

如果您只想使用计划的触发器来运行管道,则必须通过在 YAML 文件中指定 pr: none 和 trigger: none 来禁用 PR 和持续集成触发器。

3.除了时间表(每5分钟一次),您还需要一个Powershell任务来调用rest api。获取响应,然后将响应写入新创建的 json 文件。(或文本文件)

4.之后,您可以使用Azure File Copy task将包含响应的文件上传到Azure存储容器。

这是我的最小工作示例:

pool:
  vmImage: 'windows-latest'

schedules:
- cron: "*/5 * * * *"
  displayName: Run every 5 mins
  branches:
    include:
    - master
  always: 'true'

steps:
- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |
      #Call the rest api.
      $url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)_apis/projects/$env:SYSTEM_TEAMPROJECTID/teams?api-version=5.1"
      $response = Invoke-RestMethod -Uri $url -Method Get -Headers @{
          Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
      }
      #Get the response and then pass it into one spcific file.
      write-host $($response | ConvertTo-Json -Depth 100)
      $response | ConvertTo-Json -depth 100 | Out-File "$(System.DefaultWorkingDirectory)\Backup-$(Build.BuildId).json"
  env:
      SYSTEM_ACCESSTOKEN: $(System.AccessToken)

- task: AzureFileCopy@4
  inputs:
    SourcePath: '$(System.DefaultWorkingDirectory)\Backup-$(Build.BuildId).json'
    azureSubscription: 'xxx'
    Destination: 'AzureBlob'
    storage: 'xxx'
    blobPrefix: 'xxx'
    ContainerName: 'xxx'

另外:

这里是similar topic,关于如何使用AzureFileCopy 进行备份。如果遇到AzureFileCopy任务的权限问题,可以参考this link

【讨论】:

    【解决方案2】:

    您应该可以使用 scheduled triggers 处理此问题

    # YAML file in the master branch
    schedules:
    - cron: "*/5 * * * *"
      displayName: Run every 5 mins
      branches:
        include:
        - master
    
    

    你可以使用这个task 或者通过powershell调用rest API

    Invoke-RestMethod -Uri 'https://cat-fact.herokuapp.com/facts' -Headers @{ 'Authentication' = 'Bearer xxxxxxxxxxxxxxxx'  }
    

    但是,我建议您为此目的使用 Azure Functions。您可以在那里使用timer trigger,然后您可以使用各种语言进行 REST API 调用,您还将与Azure Blob 集成,从而非常容易地保存响应。

    假设您已按如下方式定义绑定:

    {
        "bindings": [
            {
                "authLevel": "function",
                "type": "httpTrigger",
                "direction": "in",
                "name": "req",
                "methods": [
                    "get",
                    "post"
                ]
            },
            {
                "type": "blob",
                "name": "inBlob",
                "direction": "in",
                "dataType": "binary",
                "path": "samples-input/text.zip"
            },
            {
                "type": "blob",
                "name": "outBlob",
                "direction": "out",
                "path": "samples-output/string.txt"
            }
        ]
    }
    

    然后

    push-outputbinding -name outBlob -value $someValue
    

    如果无法保存在存储帐户中,您的功能将失败。因此,您不需要任何特定代码来测试内容是否已保存。

    【讨论】:

    • 谢谢。我在 Powershell 中创建了一个 Azure 函数,它使用 Invoke-RestMethodOutFile 将响应保存到我命名为 test.xml 的文件中。该函数运行没有错误(也在我的本地机器上测试过)。但是,如何验证该文件是否已成功保存在函数的相关存储容器中?
    • 我使用push-outputbindingvalue 成功编写了一个字符串值。但是,如何在此处推送实际返回的文件?看起来value 只接受字符串?
    • 我刚刚编辑了我的答案。看起来您可能在将流放入 blob github.com/Azure/azure-functions-host/issues/4264 时遇到问题
    • docs.microsoft.com/en-us/azure/azure-functions/… 请将您的文件作为字节数组读取并将其作为值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 2015-03-17
    • 1970-01-01
    相关资源
    最近更新 更多