Condividi tramite


Parte 6: Codice di avvio dell'app principale

parte precedente: Dipendenze e variabili di ambiente

Subito dopo le import istruzioni, il codice di avvio dell'app inizializza le variabili chiave usate nelle funzioni di gestione delle richieste.

Prima di tutto, l'applicazione crea l'oggetto app Flask, che funge da base per definire le route e gestire le richieste HTTP in ingresso. Recupera quindi l'URL dell'endpoint API di terze parti da una variabile di ambiente. In questo modo l'endpoint può essere facilmente configurato senza modificare la codebase:

app = Flask(__name__)
app.config["DEBUG"] = True

number_url = os.environ["THIRD_PARTY_API_ENDPOINT"]

Ottiene quindi l'oggetto DefaultAzureCredential, che è la credenziale consigliata da usare per l'autenticazione con i servizi di Azure. Consulta Autenticare le applicazioni ospitate su Azure con DefaultAzureCredential.

credential = DefaultAzureCredential()

Quando viene eseguito in locale, DefaultAzureCredential cerca le variabili di ambiente AZURE_TENANT_ID, AZURE_CLIENT_IDe AZURE_CLIENT_SECRET che contengono informazioni per l'entità servizio usata per lo sviluppo locale. Quando viene eseguito in Azure, per impostazione predefinita DefaultAzureCredential usa l'identità gestita assegnata dal sistema abilitata nell'app. È possibile eseguire l'override del comportamento predefinito con le impostazioni dell'applicazione, ma in questo scenario di esempio viene usato il comportamento predefinito.

Il codice recupera quindi la chiave di accesso dell'API di terze parti da Azure Key Vault. Nello script di provisioning, il Key Vault viene creato usando az keyvault createe il segreto viene memorizzato con az keyvault secret set.

È possibile accedere alla risorsa Key Vault stessa tramite un URL, che viene caricato dalla variabile di ambiente KEY_VAULT_URL.

key_vault_url = os.environ["KEY_VAULT_URL"]

Per recuperare un segreto da Azure Key Vault, l'applicazione deve creare un oggetto client che comunica con il servizio Key Vault. Poiché l'obiettivo è leggere un segreto, l'app usa la SecretClient classe dalla azure.keyvault.secrets libreria. Questo client richiede due input:

  • URL del Vault delle Chiavi, in genere recuperato da una variabile di ambiente
  • Oggetto credenziale, ad esempio l'istanza DefaultAzureCredential creata in precedenza, che rappresenta l'identità in cui è in esecuzione l'app.
keyvault_client = SecretClient(vault_url=key_vault_url, credential=credential)

La creazione di un SecretClient oggetto non autentica immediatamente l'applicazione. Il client è semplicemente un costrutto locale che archivia l'URL di Key Vault e l'oggetto delle credenziali. L'autenticazione e l'autorizzazione vengono eseguite solo quando si richiama un'operazione tramite il client, ad esempio get_secret, che genera una chiamata API REST alla risorsa di Azure.

api_secret_name = os.environ["THIRD_PARTY_API_SECRET_NAME"]
vault_secret = keyvault_client.get_secret(api_secret_name)

# The "secret" from Key Vault is an object with multiple properties. The key we
# want for the third-party API is in the value property. 
access_key = vault_secret.value

Anche se l'identità di un'applicazione è autorizzata ad accedere ad Azure Key Vault, deve anche essere autorizzata in modo esplicito a eseguire operazioni specifiche, ad esempio la lettura dei segreti. Senza questa autorizzazione, una chiamata a get_secret() non riesce, anche se l'identità è altrimenti valida. Per risolvere questo problema, lo script di provisioning imposta un criterio di accesso "get secrets" per l'app usando il comando dell'interfaccia della riga di comando di Azure, az keyvault set-policy. Per ulteriori informazioni, vedere Key Vault Autenticazione e Concedi all'app l'accesso a Key Vault. L'ultimo articolo illustra come impostare un criterio di accesso usando il portale di Azure. L'articolo è scritto sia per l'identità gestita, ma si applica allo stesso modo a un principio del servizio usato nello sviluppo locale.

Infine, il codice dell'app configura l'oggetto client tramite il quale può scrivere messaggi in una coda di archiviazione di Azure. L'URL della coda si trova nella variabile di ambiente STORAGE_QUEUE_URL.

queue_url = os.environ["STORAGE_QUEUE_URL"]
queue_client = QueueClient.from_queue_url(queue_url=queue_url, credential=credential)

Come per Azure Key Vault, l'applicazione utilizza un client specifico dell'SDK di Azure per interagire con Azure Queue Storage. In questo caso, usa la QueueClient classe della libreria azure-storage-queue.

Per inizializzare il client, l'app usa il metodo from_queue_url, fornendo l'URL completo della coda e un oggetto di credenziali. Questo oggetto credenziale è di nuovo l'istanza DefaultAzureCredential creata in precedenza, che rappresenta l'identità con cui è in esecuzione l'app.

Come indicato in precedenza in questa guida, tale autorizzazione viene concessa assegnando il ruolo di "Contributore dati della coda di archiviazione" all'identità dell'applicazione, sia essa un'identità gestita in Azure oppure un'entità del servizio durante lo sviluppo locale. Questa assegnazione di ruolo viene eseguita nello script di provisioning usando il comando dell'interfaccia della riga di comando di Azure az role assignment create.

Supponendo che tutto questo codice di avvio abbia esito positivo, l'app dispone di tutte le variabili interne per supportare la relativa /api/v1/getcode endpoint API.