Deel 6: Opstartcode van de hoofd-app

Vorige deel: Afhankelijkheden en omgevingsvariabelen

Onmiddellijk na de import instructies initialiseert de opstartcode van de app sleutelvariabelen die worden gebruikt in de aanvraagafhandelingsfuncties.

Eerst maakt de toepassing het Flask-app-object, dat fungeert als de basis voor het definiëren van routes en het verwerken van binnenkomende HTTP-aanvragen. Vervolgens wordt de API-eindpunt-URL van derden opgehaald uit een omgevingsvariabele. Met deze methode kunt u het eindpunt eenvoudig configureren zonder de codebasis te wijzigen:

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

number_url = os.environ["THIRD_PARTY_API_ENDPOINT"]

Vervolgens wordt het DefaultAzureCredential object opgehaald. Dit is de aanbevolen referentie die moet worden gebruikt bij het verifiëren met Azure-services. Zie Gehoste Azure-toepassingen verifiëren met DefaultAzureCredential.

credential = DefaultAzureCredential()

Wanneer DefaultAzureCredential lokaal wordt uitgevoerd, zoekt het naar de AZURE_TENANT_ID, AZURE_CLIENT_ID, en AZURE_CLIENT_SECRET omgevingsvariabelen die informatie bevatten voor de service-principal die u gebruikt voor lokale ontwikkeling. Wanneer deze wordt uitgevoerd in Azure, DefaultAzureCredential standaard de door het systeem toegewezen beheerde identiteit gebruikt die is ingeschakeld voor de app. U kunt het standaardgedrag overschrijven met toepassingsinstellingen, maar in dit voorbeeldscenario wordt het standaardgedrag gebruikt.

De code haalt vervolgens de toegangssleutel van de API van derden op uit Azure Key Vault. In het inrichtingsscript wordt de Key Vault gemaakt met behulp van az keyvault createen het geheim wordt opgeslagen met behulp van az keyvault secret set.

De Key Vault-resource zelf wordt geopend via een URL die wordt geladen vanuit de omgevingsvariabele KEY_VAULT_URL.

key_vault_url = os.environ["KEY_VAULT_URL"]

Als u een geheim wilt ophalen uit Azure Key Vault, moet de toepassing een clientobject maken dat communiceert met de Key Vault-service. Omdat het doel is om een geheim te lezen, gebruikt de app de SecretClient klasse uit de azure.keyvault.secrets bibliotheek. Voor deze client zijn twee invoerwaarden vereist:

  • De Key Vault-URL, meestal opgehaald uit een omgevingsvariabele
  • Een referentieobject, zoals het DefaultAzureCredential exemplaar dat u eerder hebt gemaakt, dat de identiteit vertegenwoordigt waaronder de app wordt uitgevoerd.
keyvault_client = SecretClient(vault_url=key_vault_url, credential=credential)

Als u een SecretClient object maakt, wordt de toepassing niet onmiddellijk geverifieerd. De client is gewoon een lokale constructie waarin de Key Vault-URL en het referentieobject worden opgeslagen. Verificatie en autorisatie vinden alleen plaats wanneer u een bewerking aanroept via de client, zoals get_secret, waarmee een REST API-aanroep naar de Azure-resource wordt gegenereerd.

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

Zelfs als de identiteit van een toepassing is gemachtigd voor toegang tot Azure Key Vault, moet deze ook expliciet worden geautoriseerd om specifieke bewerkingen uit te voeren, zoals het lezen van geheimen. Zonder deze machtiging mislukt een aanroep naar get_secret(), zelfs als de identiteit anders geldig is. Om deze machtiging te verhelpen, stelt het inrichtingsscript een toegangsbeleid voor het ophalen van geheimen voor de app in met behulp van de opdracht Azure CLI. az keyvault set-policy Voor meer informatie, zie Key Vault-verificatie en Uw app toegang verlenen tot Key Vault. In het laatste artikel wordt beschreven hoe u een toegangsbeleid instelt met behulp van de Azure-portal. (Het artikel is ook geschreven voor beheerde identiteiten, maar geldt ook voor een service-principal die wordt gebruikt in lokale ontwikkeling.)

Ten slotte stelt de app-code het clientobject in waarmee berichten naar een Azure Storage-wachtrij kunnen worden geschreven. De URL van de wachtrij bevindt zich in de omgevingsvariabele STORAGE_QUEUE_URL.

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

Net als bij Azure Key Vault gebruikt de toepassing een specifiek clientobject van de Azure SDK om te communiceren met Azure Queue Storage. In dit geval wordt de QueueClient klasse uit de azure-storage-queue-bibliotheek gebruikt.

Voor het initialiseren van de client gebruikt de app de from_queue_url methode, waarbij de volledig gekwalificeerde URL en een referentieobject van de wachtrij worden opgegeven. Dit referentieobject is opnieuw het DefaultAzureCredential exemplaar dat eerder is gemaakt. Dit vertegenwoordigt de identiteit waaronder de app wordt uitgevoerd.

Zoals eerder in deze handleiding is vermeld, wordt die autorisatie verleend door de rol 'Inzender voor opslagwachtrijgegevens' toe te wijzen aan de identiteit van de toepassing: een beheerde identiteit in Azure of een service-principal tijdens lokale ontwikkeling. Deze roltoewijzing wordt uitgevoerd in het inrichtingsscript met behulp van de opdracht Azure CLIaz role assignment create.

Ervan uitgaande dat al deze opstartcode slaagt, beschikt de app over alle interne variabelen ter ondersteuning van de /api/v1/getcode API-eindpunt.