Partilhar via


Parte 6: Código de inicialização do aplicativo principal

Parte anterior: Dependências e variáveis de ambiente

Imediatamente após as import instruções, o código de inicialização do aplicativo inicializa as principais variáveis usadas em todas as funções de tratamento de solicitações.

Primeiro, o aplicativo cria o objeto Flask app, que serve como base para definir rotas e lidar com solicitações HTTP recebidas. Em seguida, ele recupera a URL do endpoint da API de terceiros de uma variável de ambiente. Isso permite que o ponto de extremidade seja facilmente configurado sem modificar a base de código:

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

number_url = os.environ["THIRD_PARTY_API_ENDPOINT"]

Em seguida, ele obtém o objeto DefaultAzureCredential, que é a credencial recomendada para usar ao autenticar com os serviços do Azure. Consulte Autenticar aplicações hospedadas no Azure com DefaultAzureCredential.

credential = DefaultAzureCredential()

Quando executado localmente, o DefaultAzureCredential procura as variáveis de ambiente AZURE_TENANT_ID, AZURE_CLIENT_IDe AZURE_CLIENT_SECRET que contêm informações para o service principal que está a usar para o desenvolvimento local. Quando executado no Azure, DefaultAzureCredential usa como padrão a identidade gerenciada atribuída pelo sistema habilitada no aplicativo. É possível substituir o comportamento padrão pelas configurações do aplicativo, mas neste cenário de exemplo, usamos o comportamento padrão.

Em seguida, o código recupera a chave de acesso da API de terceiros do Cofre de Chaves do Azure. No script de provisionamento, o Cofre da Chave é criado usando az keyvault createe o segredo é armazenado com az keyvault secret set.

O recurso Key Vault em si é acessado por meio de uma URL, que é carregada a partir da variável de ambiente KEY_VAULT_URL.

key_vault_url = os.environ["KEY_VAULT_URL"]

Para recuperar um segredo do Cofre de Chaves do Azure, o aplicativo deve criar um objeto de cliente que se comunique com o serviço Cofre de Chaves. Como o objetivo é ler um segredo, o aplicativo usa a SecretClient classe da azure.keyvault.secrets biblioteca. Este cliente requer duas entradas:

  • A URL do Key Vault – normalmente obtida de uma variável de ambiente
  • Um objeto de credencial – como a DefaultAzureCredential instância criada anteriormente, que representa a identidade sob a qual o aplicativo está sendo executado.
keyvault_client = SecretClient(vault_url=key_vault_url, credential=credential)

A criação de um SecretClient objeto não autentica imediatamente o aplicativo. O cliente é simplesmente uma construção local que armazena a URL do Cofre da Chave e o objeto de credencial. A autenticação e a autorização acontecem somente quando você invoca uma operação por meio do cliente, como get_secret, que gera uma chamada de API REST para o recurso do 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

Mesmo que a identidade de um aplicativo esteja autorizada a acessar o Cofre de Chaves do Azure, ele também deve ser explicitamente autorizado a executar operações específicas, como ler segredos. Sem essa permissão, uma chamada para get_secret() falha, mesmo que a identidade seja válida. Para resolver isso, o script de provisionamento define uma política de acesso "obter segredos" para o aplicativo usando o comando da CLI do Azure, az keyvault set-policy. Para obter mais informações, consulte Autenticação do Cofre da Chave e Conceder ao seu aplicativo acesso ao Cofre da Chave . O último artigo mostra como definir uma política de acesso usando o portal do Azure. (O artigo também foi escrito para identidade gerenciada, mas se aplica igualmente a um princípio de serviço usado no desenvolvimento local.)

Finalmente, o código do aplicativo configura o objeto cliente por meio do qual ele pode gravar mensagens em uma Fila de Armazenamento do Azure. A URL da fila está na variável de ambiente STORAGE_QUEUE_URL.

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

Assim como no Azure Key Vault, o aplicativo usa um objeto de cliente específico do SDK do Azure para interagir com o Armazenamento de Filas do Azure. Nesse caso, ele usa a QueueClient classe da biblioteca azure-storage-queue.

Para inicializar o cliente, o aplicativo usa o from_queue_url método, fornecendo a URL totalmente qualificada da fila e um objeto de credencial. Esse objeto de credencial é novamente a DefaultAzureCredential instância criada anteriormente, que representa a identidade sob a qual o aplicativo está sendo executado.

Como mencionado anteriormente neste guia, essa autorização é concedida atribuindo a função "Colaborador de Dados da Fila de Armazenamento" à identidade do aplicativo - uma identidade gerenciada no Azure ou um principal de serviço durante o desenvolvimento local. Essa atribuição de função é feita no script de provisionamento usando o comando az role assignment createda CLI do Azure.

Supondo que todo o código de inicialização seja bem-sucedido, o aplicativo tem todas as suas variáveis internas para suportar seu /api/v1/getcode endpoint da API.