Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
In questa guida introduttiva si usano gli strumenti da riga di comando per sviluppatori di Azure per creare un'API Web scalabile con endpoint di funzione che rispondono alle richieste HTTP. Dopo aver testato il codice in locale, è possibile distribuirlo in una nuova app per le funzioni serverless creata in un piano a consumo Consumo Flessibile in Funzioni di Azure.
L'origine del progetto usa Azure Developer CLI (azd) per semplificare la distribuzione del codice in Azure. Questa distribuzione segue le procedure consigliate correnti per le distribuzioni di Funzioni di Azure sicure e scalabili.
Per impostazione predefinita, il piano Flex Consumption segue un modello di fatturazione con pagamento in base al consumo, il che significa che il completamento di questa guida introduttiva comporta un costo ridotto di pochi centesimi di USD o inferiore nell'account Azure.
Prerequisites
Un account Azure con una sottoscrizione attiva. Creare un account gratuitamente.
-
Java 17 Developer Kit
- Se si usa un'altra versione supportata di Java, è necessario aggiornare il file pom.xml del progetto.
- La
JAVA_HOMEvariabile di ambiente deve essere impostata sul percorso di installazione della versione corretta di Java Development Kit (JDK).
- Apache Maven 3.8.x
- Uno strumento di test HTTP sicuro per l'invio di richieste con payload JSON agli endpoint di funzione. Questo articolo usa
curl.
Inizializzare il progetto
Usare il azd init comando per creare un progetto di codice di Funzioni di Azure locale da un modello.
Nel terminale locale o nel prompt dei comandi eseguire questo comando
azd initin una cartella vuota:azd init --template functions-quickstart-dotnet-azd -e httpendpoint-dotnetQuesto comando esegue il pull dei file di progetto dal repository dei modelli e inizializza il progetto nella cartella corrente. Il flag
-eimposta un nome per l'ambiente corrente. Inazdl'ambiente mantiene un contesto di distribuzione univoco per l'app ed è possibile definire più di uno. Viene usato anche nel nome del gruppo di risorse creato in Azure.Eseguire questo comando per andare alla cartella dell'app
http:cd httpCreare un file denominato local.settings.json nella cartella
httpche contiene questi dati JSON:{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated" } }Questo file è necessario durante l'esecuzione locale.
Nel terminale locale o nel prompt dei comandi eseguire questo comando
azd initin una cartella vuota:azd init --template azure-functions-java-flex-consumption-azd -e httpendpoint-javaQuesto comando esegue il pull dei file di progetto dal repository dei modelli e inizializza il progetto nella cartella corrente. Il flag
-eimposta un nome per l'ambiente corrente. Inazdl'ambiente mantiene un contesto di distribuzione univoco per l'app ed è possibile definire più di uno. Viene usato anche nel nome del gruppo di risorse creato in Azure.Eseguire questo comando per andare alla cartella dell'app
http:cd httpCreare un file denominato local.settings.json nella cartella
httpche contiene questi dati JSON:{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "java" } }Questo file è necessario durante l'esecuzione locale.
Nel terminale locale o nel prompt dei comandi eseguire questo comando
azd initin una cartella vuota:azd init --template functions-quickstart-javascript-azd -e httpendpoint-jsQuesto comando esegue il pull dei file di progetto dal repository dei modelli e inizializza il progetto nella cartella radice. Il flag
-eimposta un nome per l'ambiente corrente. Inazdl'ambiente mantiene un contesto di distribuzione univoco per l'app ed è possibile definire più di uno. Viene usato anche nel nome del gruppo di risorse creato in Azure.Creare un file denominato local.settings.json nella cartella radice che contiene questi dati JSON:
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "node" } }Questo file è necessario durante l'esecuzione locale.
Nel terminale locale o nel prompt dei comandi eseguire questo comando
azd initin una cartella vuota:azd init --template functions-quickstart-powershell-azd -e httpendpoint-psQuesto comando esegue il pull dei file di progetto dal repository dei modelli e inizializza il progetto nella cartella radice. Il flag
-eimposta un nome per l'ambiente corrente. Inazdl'ambiente mantiene un contesto di distribuzione univoco per l'app ed è possibile definire più di uno. Viene usato anche nel nome del gruppo di risorse creato in Azure.Eseguire questo comando per andare alla cartella dell'app
src:cd srcCreare un file denominato local.settings.json nella cartella
srcche contiene questi dati JSON:{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "powershell", "FUNCTIONS_WORKER_RUNTIME_VERSION": "7.2" } }Questo file è necessario durante l'esecuzione locale.
Nel terminale locale o nel prompt dei comandi eseguire questo comando
azd initin una cartella vuota:azd init --template functions-quickstart-typescript-azd -e httpendpoint-tsQuesto comando esegue il pull dei file di progetto dal repository dei modelli e inizializza il progetto nella cartella radice. Il flag
-eimposta un nome per l'ambiente corrente. Inazdl'ambiente mantiene un contesto di distribuzione univoco per l'app ed è possibile definire più di uno. Il nome dell'ambiente viene usato anche nel nome del gruppo di risorse creato in Azure.Creare un file denominato local.settings.json nella cartella radice che contiene questi dati JSON:
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "node" } }Questo file è necessario durante l'esecuzione locale.
Nel terminale locale o nel prompt dei comandi eseguire questo comando
azd initin una cartella vuota:azd init --template functions-quickstart-python-http-azd -e httpendpoint-pyQuesto comando esegue il pull dei file di progetto dal repository dei modelli e inizializza il progetto nella cartella radice. Il flag
-eimposta un nome per l'ambiente corrente. Inazdl'ambiente mantiene un contesto di distribuzione univoco per l'app ed è possibile definire più di uno. Il nome dell'ambiente viene usato anche nel nome del gruppo di risorse creato in Azure.Creare un file denominato local.settings.json nella cartella radice che contiene questi dati JSON:
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "python" } }Questo file è necessario durante l'esecuzione locale.
Creare e attivare un ambiente virtuale
Nella cartella principale, eseguire questi comandi per creare e attivare un ambiente virtuale denominato .venv:
python3 -m venv .venv
source .venv/bin/activate
Se Python non installa il pacchetto venv nella distribuzione Linux, eseguire il comando seguente:
sudo apt-get install python3-venv
Eseguire l'ambiente locale
Eseguire questo comando dalla cartella dell'app in un terminale o nel prompt dei comandi:
func startmvn clean package mvn azure-functions:runnpm install func startnpm install npm startQuando l'host Funzioni viene avviato nella cartella del progetto locale, scrive gli endpoint URL delle funzioni attivate da HTTP nell'output del terminale.
Note
Poiché l'autorizzazione della chiave di accesso non viene applicata durante l'esecuzione in locale, l'URL della funzione restituito non include il valore della chiave di accesso e non è necessario per chiamare la funzione.
Nel browser, andare all'endpoint
httpget, che dovrebbe essere simile a questo URL:Da una nuova finestra del terminale o del prompt dei comandi eseguire questo comando
curlper inviare una richiesta POST con un payload JSON all'endpointhttppost:curl -i http://localhost:7071/api/httppost -H "Content-Type: text/json" -d @testdata.jsoncurl -i http://localhost:7071/api/httppost -H "Content-Type: text/json" -d "@src/functions/testdata.json"Questo comando legge i dati del payload JSON dal file di progetto
testdata.json. È possibile trovare esempi di entrambe le richieste HTTP nel file di progettotest.http.Al termine, premere CTRL+C nella finestra del terminale per arrestare il processo host
func.exe.
- Eseguire
deactivateper arrestare l'ambiente virtuale.
Esaminare il codice (facoltativo)
È possibile esaminare il codice che definisce i due endpoint della funzione di trigger HTTP:
[Function("httpget")]
public IActionResult Run([HttpTrigger(AuthorizationLevel.Function, "get")]
HttpRequest req,
string name)
{
var returnValue = string.IsNullOrEmpty(name)
? "Hello, World."
: $"Hello, {name}.";
_logger.LogInformation($"C# HTTP trigger function processed a request for {returnValue}.");
return new OkObjectResult(returnValue);
}
@FunctionName("httpget")
public HttpResponseMessage run(
@HttpTrigger(
name = "req",
methods = {HttpMethod.GET},
authLevel = AuthorizationLevel.FUNCTION)
HttpRequestMessage<Optional<String>> request,
final ExecutionContext context) {
context.getLogger().info("Java HTTP trigger processed a request.");
// Parse query parameter
String name = Optional.ofNullable(request.getQueryParameters().get("name")).orElse("World");
return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
}
const { app } = require('@azure/functions');
app.http('httpget', {
methods: ['GET'],
authLevel: 'function',
handler: async (request, context) => {
context.log(`Http function processed request for url "${request.url}"`);
const name = request.query.get('name') || await request.text() || 'world';
return { body: `Hello, ${name}!` };
}
});
import { app, HttpRequest, HttpResponseInit, InvocationContext } from "@azure/functions";
export async function httpGetFunction(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
context.log(`Http function processed request for url "${request.url}"`);
const name = request.query.get('name') || await request.text() || 'world';
return { body: `Hello, ${name}!` };
};
app.http('httpget', {
methods: ['GET'],
authLevel: 'function',
handler: httpGetFunction
});
Questo file function.json definisce la funzione httpget:
{
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "Request",
"methods": [
"get"
],
"route": "httpget"
},
{
"type": "http",
"direction": "out",
"name": "Response"
}
]
}
Questo file run.ps1 implementa il codice della funzione:
using namespace System.Net
# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)
# Write to the Azure Functions log stream.
Write-Host "PowerShell HTTP trigger function processed a request."
# Interact with query parameters
$name = $Request.Query.name
$body = "This HTTP triggered function executed successfully. Pass a name in the query string for a personalized response."
if ($name) {
$body = "Hello, $name. This HTTP triggered function executed successfully."
}
# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
StatusCode = [HttpStatusCode]::OK
Body = $body
})
@app.route(route="httpget", methods=["GET"])
def http_get(req: func.HttpRequest) -> func.HttpResponse:
name = req.params.get("name", "World")
logging.info(f"Processing GET request. Name: {name}")
return func.HttpResponse(f"Hello, {name}!")
È possibile esaminare il progetto di modello completo qui.
È possibile esaminare il progetto di modello completo qui.
È possibile esaminare il progetto di modello completo qui.
È possibile esaminare il progetto di modello completo qui.
È possibile esaminare il progetto di modello completo qui.
È possibile esaminare il progetto di modello completo qui.
Dopo aver verificato le funzioni in locale, è possibile pubblicarle in Azure.
Distribuisci in Azure
Questo progetto è configurato per l'uso del comando azd up al fine di distribuire questo progetto in una nuova app per le funzioni in un piano a consumo Flex in Azure.
Tip
Il progetto include un set di file Bicep (nella infra cartella) che azd utilizza per creare una distribuzione sicura in un piano di consumo Flex che segue le procedure consigliate.
Eseguire questo comando affinché
azdpossa creare le risorse di Azure necessarie in Azure e distribuire il progetto di codice nella nuova app per le funzioni:azd upLa cartella radice contiene il file di definizione
azure.yamlrichiesto daazd.Se non è già stato eseguito l'accesso, viene chiesto di eseguire l'autenticazione con l'account Azure.
Quando richiesto, specificare questi parametri di distribuzione obbligatori:
Parameter Description Sottoscrizione di Azure Sottoscrizione in cui vengono create le risorse. Località di Azure Area di Azure in cui creare il gruppo di risorse che contiene le nuove risorse di Azure. Vengono visualizzate solo le aree che attualmente supportano il piano Consumo Flessibile. vnetEnabled Scegliere False. Se impostato su True, la distribuzione crea l'applicazione di funzione in una nuova rete virtuale. Il comando
azd upusa le risposte a questi prompt con i file di configurazione Bicep per completare queste attività di distribuzione:Creare e configurare queste risorse di Azure necessarie (equivalenti a
azd provision):- Piano Consumo Flessibile e app per le funzioni
- Archiviazione di Azure (richiesta) e Application Insights (consigliata)
- Criteri di accesso e ruoli per l'account
- Connessioni da servizio a servizio che usano identità gestite (anziché stringhe di connessione archiviate)
- (Opzione) Rete virtuale per eseguire in modo sicuro sia l'app per le funzioni che le altre risorse di Azure
Creare un pacchetto e distribuire il codice nel contenitore di distribuzione (equivalente a
azd deploy). L'app viene quindi avviata ed eseguita nel pacchetto distribuito.
Al termine del comando, vengono visualizzati i collegamenti alle risorse create.
Richiamare la funzione in Azure
È ora possibile richiamare gli endpoint di funzione in Azure effettuando richieste HTTP agli URL usando lo strumento di test HTTP o dal browser (per le richieste GET). Quando le funzioni vengono eseguite in Azure, viene applicata l'autorizzazione della chiave di accesso ed è necessario fornire una chiave di accesso alla funzione con la richiesta.
È possibile usare Core Tools per ottenere gli endpoint URL delle funzioni in esecuzione in Azure.
Nel terminale locale o nel prompt dei comandi, eseguire questi comandi per ottenere i valori dell'endpoint URL:
$APP_NAME = azd env get-value AZURE_FUNCTION_NAME func azure functionapp list-functions $APP_NAME --show-keysIl comando
azd env get-valueottiene il nome dell'app per le funzioni dall'ambiente locale. Quando si usa l'opzione--show-keysconfunc azure functionapp list-functions, il valore Invoke URL: restituito per ogni endpoint include una chiave di accesso a livello di funzione.Come in precedenza, usare lo strumento di test HTTP per convalidare questi URL nell'app per le funzioni in esecuzione in Azure.
Ridistribuire il codice
Eseguire il comando azd up quante volte è necessario per effettuare il provisioning delle risorse di Azure e distribuire gli aggiornamenti del codice nell'app per le funzioni.
Note
I file di codice distribuiti vengono sempre sovrascritti dal pacchetto di distribuzione più recente.
Le risposte iniziali alle azd richieste e a qualsiasi variabile di ambiente generata da azd, vengono archiviate localmente nell'ambiente denominato. Usare il azd env get-values comando per esaminare tutte le variabili nell'ambiente usato durante la creazione di risorse di Azure.
Pulire le risorse
Al termine dell'uso dell'app per le funzioni e delle risorse correlate, usare questo comando per eliminare l'app per le funzioni e le relative risorse da Azure ed evitare di sostenere ulteriori costi:
azd down --no-prompt
Note
L'opzione --no-prompt indica a azd di eliminare il gruppo di risorse senza conferma.
Questo comando non influisce sul progetto di codice locale.