0
votes

I have an HTTP triggered Consumption plan Azure Function that I want to keep warm by POSTing an empty payload to it regularly.

I am doing this with a Scheduled Function with this configuration:

__init__.py

import os
import datetime
import logging

import azure.functions as func

import urllib.parse, urllib.request, urllib.error

def main(mytimer: func.TimerRequest) -> None:
    try:
        url = f"https://FUNCTIONNAME.azurewebsites.net/api/predictor?code={os.environ['CODE']}"
        request = urllib.request.Request(url, {})
        response = urllib.request.urlopen(request)
    except urllib.error.HTTPError as e:
        message = e.read().decode()
        if message == "expected outcome":
            pass
        else:
            logging.info(f"Error: {message}")

function.json

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "mytimer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "0 */9 5-17 * * 1-5"
    }
  ]
}

When I inspect my logs they are filled with HTML. Here is a snippet of the HTML:

...
<h1>Server Error</h1>
...
<h2>502 - Web server received an invalid response while acting as a gateway or proxy server.</h2>
<h3>There is a problem with the page you are looking for, and it cannot be displayed. When the Web server (while acting as a gateway or proxy) contacted the upstream content server, it received an invalid response from the content server.</h3>

Running the logic of __init__.py locally works fine. What might be wrong here?

1

1 Answers

0
votes

Hmm... That is weird. Looks like the response wasn't able to route to the correct instance I guess.

BTW, I believe you could simply have the time triggered function in the same function app as the one you want to keep warm. This function really doesn't have to do anything too.

Also, you might want to take a look at Azure Functions Premium which supports having pre-warmed instances. Note that this is still in preview.