Arbeta med Azure Functions-proxyservrar

Den här artikeln förklarar hur du konfigurerar och arbetar med Azure Functions-proxyservrar. Med den här funktionen kan du ange slutpunkter i funktionsappen som implementeras av en annan resurs. Du kan använda dessa proxys för att dela upp ett stort API i flera funktionsappar (som i en mikrotjänstarkitektur), samtidigt som du presenterar en enda API-yta för klienter.

Standard Functions-fakturering gäller för proxykörningar. Mer information finns i prissättning för Azure Functions.

Detta är referensinformation för Azure Functions utvecklare. Om du inte har använt Azure Functions börjar du med följande resurser:

Anteckning

Proxys är tillgängliga i Azure Functions version 1.x till 3.x.

Du bör också överväga att använda Azure API Management för ditt program. Den har samma funktioner som Functions-proxy och andra verktyg för att skapa och underhålla API:er, till exempel OpenAPI-integrering, frekvensbegränsning och avancerade principer.

Skapa en proxy

Det här avsnittet visar hur du skapar en proxy i Functions-portalen.

  1. Öppna Azure Portaloch gå sedan till funktionsappen.
  2. Välj Ny proxy i den vänstra rutan.
  3. Ange ett namn för proxyn.
  4. Konfigurera slutpunkten som exponeras för den här funktionsappen genom att ange vägmallen och HTTP-metoderna. Dessa parametrar fungerar enligt reglerna för HTTP-utlösare.
  5. Ange en annan slutpunkt som webbadress till backend. Den här slutpunkten kan vara en funktion i en annan funktionsapp eller ett annat API. Värdet behöver inte vara statiskt och det kan referera till [programinställningar och] parametrar [från den ursprungliga klientbegäran.]
  6. Klicka på Skapa.

Proxyn finns nu som en ny slutpunkt i funktionsappen. Ur ett klientperspektiv motsvarar det en HttpTrigger i Azure Functions. Du kan prova den nya proxyn genom att kopiera proxy-URL:en och testa den med din favorit-HTTP-klient.

Ändra begäranden och svar

Med Azure Functions-proxyservrar kan du ändra begäranden till och svar från backend-delen. Dessa transformningar kan använda variabler enligt definitionen i Använda variabler.

Ändra backend-begäran

Som standard initieras backend-begäran som en kopia av den ursprungliga begäran. Förutom att ange backend-URL:en kan du göra ändringar i HTTP-metoden, rubriker och frågesträngsparametrar. De ändrade värdena kan referera till programinställningar och [parametrar från den ursprungliga klientbegäran.]

Du kan ändra backend-begäranden i portalen genom att expandera avsnittet åsidosätta begäran på proxyinformationssidan.

Ändra svaret

Som standard initieras klientsvaret som en kopia av backend-svaret. Du kan göra ändringar i svarets statuskod, orsaksfras, rubriker och brödtext. De ändrade värdena kan referera [till programinställningar], parametrar från den ursprungliga klientbegäranoch parametrar från backend-svaret.

Du kan ändra backend-begäranden i portalen genom att expandera avsnittet om åsidosättning av svar på informationssidan för proxyn.

Använda variabler

Konfigurationen för en proxy måste inte vara statisk. Du kan villkora den att använda variabler från den ursprungliga klientbegäran, backend-svaret eller programinställningarna.

Referera till lokala funktioner

Du kan använda localhost för att referera till en funktion i samma funktionsapp direkt, utan en proxybegäran för tur och retur.

"backendUri": "https://localhost/api/httptriggerC#1" refererar till en lokal HTTP-utlöst funktion på vägen /api/httptriggerC#1

Anteckning

Om funktionen använder auktoriseringsnivåer för funktion, administratör eller sys måste du ange koden och clientId enligt den ursprungliga funktions-URL:en. I det här fallet skulle referensen se ut så här: Vi rekommenderar att du lagrar dessa nycklar i programinställningarna och refererar till dem "backendUri": "https://localhost/api/httptriggerC#1?code=<keyvalue>&clientId=<keyname>" i dina proxy. [] På så sätt undviker du att lagra hemligheter i källkoden.

Parametrar för referensbegäran

Du kan använda begärandeparametrar som indata till backend-URL-egenskapen eller som en del av att ändra begäranden och svar. Vissa parametrar kan bindas från vägmallen som anges i basproxykonfigurationen, och andra kan komma från egenskaperna för den inkommande begäran.

Parametrar för vägmall

Parametrar som används i vägmallen kan refereras till med namn. Parameternamnen omges av kparenteser ( {} ).

Om en proxy till exempel har en vägmall, till exempel , kan /pets/{petId} backend-URL:en innehålla värdet {petId} , som i https://<AnotherApp>.azurewebsites.net/api/pets/{petId} . Om vägmallen avslutas med ett jokertecken, till exempel , är värdet en strängrepresentation av återstående /api/{*restOfPath} {restOfPath} sökvägssegment från den inkommande begäran.

Ytterligare begärandeparametrar

Förutom parametrarna för vägmallen kan följande värden användas i konfigurationsvärden:

  • {request.method}: DEN HTTP-metod som används för den ursprungliga begäran.
  • {request.headers. <HeaderName> }: En rubrik som kan läsas från den ursprungliga begäran. Ersätt <HeaderName> med namnet på den rubrik som du vill läsa. Om rubriken inte ingår i begäran blir värdet den tomma strängen.
  • {request.querystring. <ParameterName> }: En frågesträngsparameter som kan läsas från den ursprungliga begäran. Ersätt <ParameterName> med namnet på den parameter som du vill läsa. Om parametern inte ingår i begäran blir värdet den tomma strängen.

Referensparametrar för backend-svar

Svarsparametrar kan användas som en del av att ändra svaret till klienten. Följande värden kan användas i konfigurationsvärden:

  • {backend.response.statusCode}: HTTP-statuskoden som returneras i backend-svaret.
  • {backend.response.statusReason}: HTTP-orsaksfrasen som returneras i backend-svaret.
  • {backend.response.headers. <HeaderName> }: En rubrik som kan läsas från backend-svaret. Ersätt <HeaderName> med namnet på den rubrik som du vill läsa. Om rubriken inte ingår i svaret blir värdet den tomma strängen.

Referensprograminställningar

Du kan också referera till programinställningar som definierats för funktionsappen genom att omge inställningsnamnet med procenttecken (%).

Till exempel skulle en backend-URL för ha "%ORDER_PROCESSING_HOST%" ersatt med värdet https://%ORDER_PROCESSING_HOST%/api/orders för ORDER_PROCESSING_HOST inställningen.

Tips

Använd programinställningar för backend-värdar när du har flera distributioner eller testmiljöer. På så sätt kan du se till att du alltid pratar med rätt backend-sida för den miljön.

Felsöka proxy

Genom att lägga till "debug":true flaggan till valfri proxyserver i din aktiverar proxies.json du felsökningsloggning. Loggar lagras i D:\home\LogFiles\Application\Proxies\DetailedTrace och är tillgängliga via de avancerade verktygen (kudu). Alla HTTP-svar innehåller också ett Proxy-Trace-Location huvud med en URL för att få åtkomst till loggfilen.

Du kan felsöka en proxyserver från klientsidan genom att lägga till en Proxy-Trace-Enabled rubrik som är inställd på true . Detta loggar också en spårning till filsystemet och returnerar spårnings-URL:en som en rubrik i svaret.

Blockera proxyspårningar

Av säkerhetsskäl kanske du inte vill tillåta att någon anropar din tjänst för att generera en spårning. De kommer inte att kunna komma åt spårningsinnehållet utan dina inloggningsuppgifter, men genereringen av spårningen förbrukar resurser och visar att du använder funktionsproxies.

Inaktivera spårningar helt och "debug":false hållet genom att lägga till en viss proxy i proxies.json din .

Avancerad konfiguration

De proxys som du konfigurerar lagras i en proxies.json-fil som finns i roten för en funktionsappkatalog. Du kan redigera den här filen manuellt och distribuera den som en del av din app när du använder någon av de distributionsmetoder som stöds av Functions.

Tips

Om du inte har ställt in någon av distributionsmetoderna kan du även arbeta med filen proxies.json i portalen. Gå till funktionsappen, välj Plattformsfunktioner och välj sedan App Service Editor. På så sätt kan du visa hela filstrukturen för funktionsappen och sedan göra ändringar.

Proxies.json definieras av ett proxyobjekt, som består av namngivna proxys och deras definitioner. Om redigeringsredigeraren stöder det kan du referera till ett JSON-schema för att slutföra koden. En exempelfil kan se ut så här:

{
    "$schema": "http://json.schemastore.org/proxies",
    "proxies": {
        "proxy1": {
            "matchCondition": {
                "methods": [ "GET" ],
                "route": "/api/{test}"
            },
            "backendUri": "https://<AnotherApp>.azurewebsites.net/api/<FunctionName>"
        }
    }
}

Varje proxy har ett eget namn, till exempel proxy1 i föregående exempel. Motsvarande proxydefinitionsobjekt definieras av följande egenskaper:

  • matchCondition: Obligatoriskt – ett objekt som definierar de begäranden som utlöser körningen av den här proxyn. Den innehåller två egenskaper som delas med [HTTP-utlösare:]
    • methods(metoder): En matris med HTTP-metoder som proxyn svarar på. Om den inte anges svarar proxyn på alla HTTP-metoder på vägen.
    • route: Krävs – definierar vägmallen, som styr vilka begärande-URL:er som proxyn svarar på. Till skillnad från HTTP-utlösare finns det inget standardvärde.
  • backendUri: URL:en för den backend-resurs som begäran ska ske med proxy. Det här värdet kan referera till programinställningar och parametrar från den ursprungliga klientbegäran. Om den här egenskapen inte ingår svarar Azure Functions HTTP 200 OK.
  • requestOverrides: Ett objekt som definierar transformeringen till backend-begäran. Se [Definiera ett requestOverrides-objekt.]
  • responseOverrides: Ett objekt som definierar transformningar till klientsvaret. Se [Definiera ett responseOverrides-objekt.]

Anteckning

Route-egenskapen i Azure Functions-proxyservrar inte egenskapen routePrefix för funktionsappens värdkonfiguration. Om du vill inkludera ett prefix, till /api exempel , måste det inkluderas i egenskapen route.

Inaktivera enskilda proxys

Du kan inaktivera enskilda proxyservrar genom att "disabled": true lägga till i proxyn i proxies.json filen. Detta gör att alla begäranden som uppfyller matchCondition returnerar 404.

{
    "$schema": "http://json.schemastore.org/proxies",
    "proxies": {
        "Root": {
            "disabled":true,
            "matchCondition": {
                "route": "/example"
            },
            "backendUri": "https://<AnotherApp>.azurewebsites.net/api/<FunctionName>"
        }
    }
}

Program Inställningar

Proxybeteendet kan styras av flera appinställningar. De beskrivs alla i referensreferensen för Functions Inställningar appen

Reserverade tecken (strängformatering)

Proxys läser alla strängar från en JSON-fil med \ som escape-symbol. Proxy proxys tolkar också kparenteser. Se en fullständig uppsättning exempel nedan.

Tecken Tecken som är rymt Exempel
{ eller } {{ eller }} {{ example }} --> { example }
\ \\ example.com\\text.html --> example.com\text.html
" \" \"example\" --> "example"

Definiera ett requestOverrides-objekt

Objektet requestOverrides definierar ändringar som görs i begäran när backend-resursen anropas. Objektet definieras av följande egenskaper:

  • backend.request.method: Den HTTP-metod som används för att anropa backend-metoden.
  • backend.request.querystring. <ParameterName>: En frågesträngsparameter som kan anges för anropet till backend-delen. Ersätt <ParameterName> med namnet på den parameter som du vill ange. Observera att om en tom sträng anges ingår parametern fortfarande i backend-begäran.
  • backend.request.headers. <HeaderName>: Ett -huvud som kan anges för anropet till backend.headers. Ersätt <HeaderName> med namnet på rubriken som du vill ange. Observera att om en tom sträng anges ingår parametern fortfarande i backend-begäran.

Värden kan referera till programinställningar och parametrar från den ursprungliga klientbegäran.

En exempelkonfiguration kan se ut så här:

{
    "$schema": "http://json.schemastore.org/proxies",
    "proxies": {
        "proxy1": {
            "matchCondition": {
                "methods": [ "GET" ],
                "route": "/api/{test}"
            },
            "backendUri": "https://<AnotherApp>.azurewebsites.net/api/<FunctionName>",
            "requestOverrides": {
                "backend.request.headers.Accept": "application/xml",
                "backend.request.headers.x-functions-key": "%ANOTHERAPP_API_KEY%"
            }
        }
    }
}

Definiera ett responseOverrides-objekt

Objektet requestOverrides definierar ändringar som görs i svaret som skickas tillbaka till klienten. Objektet definieras av följande egenskaper:

  • response.statusCode: HTTP-statuskoden som ska returneras till klienten.
  • response.statusReason: HTTP-orsaksfrasen som ska returneras till klienten.
  • response.body: Strängrepresentationen av brödtexten som ska returneras till klienten.
  • response.headers. <HeaderName>: Ett huvud som kan anges för svaret till klienten. Ersätt <HeaderName> med namnet på rubriken som du vill ange. Om du anger den tomma strängen inkluderas inte -huvudet i svaret.

Värden kan referera till programinställningar, parametrar från den ursprungliga klientbegäran och parametrar från backend-svaret.

En exempelkonfiguration kan se ut så här:

{
    "$schema": "http://json.schemastore.org/proxies",
    "proxies": {
        "proxy1": {
            "matchCondition": {
                "methods": [ "GET" ],
                "route": "/api/{test}"
            },
            "responseOverrides": {
                "response.body": "Hello, {test}",
                "response.headers.Content-Type": "text/plain"
            }
        }
    }
}

Anteckning

I det här exemplet anges svarstexten direkt, så backendUri ingen egenskap behövs. Exemplet visar hur du kan använda Azure Functions-proxyservrar för att fingera API:er.