Compartilhar via


Tutorial: implantar um aplicativo Web ASP.NET usando Azure Cosmos DB for NoSQL, identidade gerenciada e AKS via Bicep

APLICA-SE A: NoSQL

Neste tutorial, você implanta um aplicativo Web ASP .NET de referência em um cluster AKS (Azure Kubernetes Service) que conecta o Azure Cosmos DB for NoSQL.

O Azure Cosmos DB é uma plataforma de banco de dados distribuída totalmente gerenciada para desenvolvimento de aplicativos modernos com NoSQL ou bancos de dados relacionais.

O AKS é um serviço de Kubernetes gerenciado que ajuda você a implantar e a gerenciar clusters rapidamente.

Importante

  • Este artigo exige a versão mais recente da CLI do Azure. Para obter mais informações, consulte Instalar a CLI do Azure. Se você está usando o Azure Cloud Shell, a última versão já está instalada.
  • Este artigo também exige a versão mais recente da CLI do Bicep na CLI do Azure. Para obter mais informações, confira Instalar as ferramentas do Bicep.
  • Se você estiver executando os comandos neste tutorial localmente, em vez de no Azure Cloud Shell, certifique-se de usar uma conta de administrador.

Pré-requisitos

As ferramentas a seguir serão necessárias para compilar o aplicativo Web ASP.NET e criar a imagem de contêiner:

Visão geral

Este tutorial usa uma abordagem de IaC (infraestrutura como código) para implantar os recursos no Azure. Você usa o Bicep, que é uma nova linguagem declarativa que oferece os mesmos recursos dos modelos do Azure Resource Manager. No entanto, o Bicep inclui uma sintaxe mais concisa e fácil de usar.

Os módulos Bicep implantam os seguintes recursos do Azure no escopo de assinatura direcionada:

Este tutorial usa as seguintes melhores práticas de segurança com o Azure Cosmos DB:

Dica

As etapas neste tutorial usam o Azure Cosmos DB for NoSQL. No entanto, você pode aplicar os mesmos conceitos ao Azure Cosmos DB for MongoDB.

Baixar os módulos do Bicep

Baixe ou clone os módulos do Bicep da pasta Bicep do repositório GitHub azure-samples/cosmos-aks-samples:

git clone https://github.com/Azure-Samples/cosmos-aks-samples.git

cd Bicep/

Conecte-se à sua assinatura do Azure

Use az sign in para se conectar à sua assinatura padrão do Azure:

az login

Opcionalmente, use az account set com o nome ou a ID de uma assinatura específica para definir a assinatura ativa, se você tiver várias assinaturas:

az account set \
  --subscription <subscription-id>

Inicializar os parâmetros de implantação

Crie um arquivo param.json usando o JSON no seguinte exemplo. Substitua os espaços reservados {resource group name}, {Azure Cosmos DB account name} e {Azure Container Registry instance name} por seus próprios valores.

Importante

Todos os nomes de recursos usados no código a seguir devem estar em conformidade com as regras de nomenclatura e as restrições para recursos do Azure. Verifique, também, se os valores de espaço reservado são substituídos consistentemente e correspondem aos valores em param.json.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "rgName": {
      "value": "{resource group name}"
    },    
    "cosmosName" :{
      "value": "{Azure Cosmos DB account name}"
    },
    "acrName" :{
      "value": "{Azure Container Registry instance name}"
    }
  }
}

Criar uma implantação do Bicep

Defina variáveis de shell usando os comandos a seguir. Substitua os espaços reservados {deployment name} e {location} pelos seus próprios valores.

deploymentName='{deployment name}'  # Name of the deployment
location='{location}' # Location for deploying the resources

Na pasta Bicep, use az deployment sub create para implantar o modelo no escopo de assinatura atual:

az deployment sub create \
  --name $deploymentName \
  --location $location \
  --template-file main.bicep \
  --parameters @param.json

Durante a implantação, o console exibe uma mensagem indicando que a implantação ainda está em execução:

 / Running ..

A implantação pode levar de 20 a 30 minutos. Após concluir o provisionamento, o console gerará JSON com Succeeded como o estado de provisionamento:

      }
    ],
    "provisioningState": "Succeeded",
    "templateHash": "0000000000000000",
    "templateLink": null,
    "timestamp": "2022-01-01T00:00:00.000000+00:00",
    "validatedResources": null
  },
  "tags": null,
  "type": "Microsoft.Resources/deployments"
}

Você também poderá ver o status de implantação no grupo de recursos:

Captura de tela do status de implantação do grupo de recursos no portal do Azure.

Observação

Quando você cria um cluster do AKS, um segundo grupo de recursos é criado automaticamente para armazenar os recursos do AKS. Para obter mais informações, confira Por que dois grupos de recursos são criados com o AKS?.

Use os comandos a seguir para vincular sua instância de Registro de Contêiner do Azure ao AKS. Substitua os espaços reservados {Azure Container Registry instance name} e {resource group name} pelos seus próprios valores.

acrName='{Azure Container Registry instance name}'
rgName='{resource group name}'
aksName=$rgName'aks'

Execute az aks update para anexar o recurso de Registro de Contêiner do Azure existente com o cluster do AKS:

az aks update \
  --resource-group $rgName \
  --name $aksName \
  --attach-acr $acrName

Conecte-se ao cluster do AKS

Para gerenciar um cluster do Kubernetes, use kubectl, o cliente de linha de comando do Kubernetes. Se você usar o Azure Cloud Shell, o kubectl já estará instalado. Para instalar kubectl localmente, use az aks install-cli:

az aks install-cli

Para configurar kubectl para conectar o cluster Kubernetes, use az aks get-credentials. Este comando baixa as credenciais e configura a CLI do Kubernetes para usá-las.

az aks get-credentials \
  --resource-group $rgName \
  --name $aksName

Conectar os pods do AKS ao Azure Key Vault

As identidades gerenciadas por pod do Microsoft Entra usam primitivos do AKS para associar identidades gerenciadas para recursos do Azure e identidades no Microsoft Entra ID aos pods. Você usa essas identidades para conceder acesso ao Provedor do Azure Key Vault para o driver CSI (Interface de Armazenamento de Contêiner) de Repositórios de Segredos.

Use o comando a seguir para localizar os valores da ID do locatário (homeTenantId):

az account show

Use o modelo YAML a seguir para criar um arquivo secretproviderclass.yml. Substitua os espaços reservados {Tenant Id} e {resource group name} pelos seus próprios valores. Verifique, também, se o valor de {resource group name} corresponde ao valor em param.json.

# This is a SecretProviderClass example that uses aad-pod-identity to access the key vault
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: azure-kvname-podid
spec:
  provider: azure
  parameters:
    usePodIdentity: "true"               
    keyvaultName: "{resource group name}kv"       # Replace resource group name. Bicep generates the key vault name.
    tenantId: "{Tenant Id}"              # The tenant ID of your account. Use the 'homeTenantId' attribute value from  the 'az account show' command output.

Aplicar o SecretProviderClass ao cluster AKS

Use kubectl apply para instalar o Driver CSI do Repositório de Segredos usando o YAML:

kubectl apply \
  --filename secretproviderclass.yml

Compilar o aplicativo Web ASP.NET

Baixe ou clone o código-fonte do aplicativo Web da pasta de Aplicativo do repositório GitHub azure-samples/cosmos-aks-samples:

git clone https://github.com/Azure-Samples/cosmos-aks-samples.git

cd Application/

Abra a pasta Aplicativo no Visual Studio Code. Execute o aplicativo usando a chave F5 ou o comando Depurar: iniciar Depuração.

Efetuar push da imagem de contêiner do Docker para o Registro de Contêiner do Azure

  1. Para criar uma imagem de contêiner na guia Explorer no Visual Studio Code, clique com o botão direito do mouse em Dockerfile e, em seguida, selecioneCompilar Imagem.

    Captura de tela do menu de contexto no Visual Studio Code com a opção Compilar imagem selecionada.

  2. No prompt que solicita o nome e a versão para marcar a imagem, insira o nome todo:latest.

  3. Use o painel do Docker para efetuar push da imagem criada para o Registro de Contêiner do Azure. Você encontrará a imagem compilada no nó Imagens. Abra o nó todo, clique com o botão direito do mouse em mais recente e, em seguida, selecione Enviar por push.

    Captura de tela do menu de contexto no Visual Studio Code com a opção Efetuar push selecionada.

  4. Nos prompts, selecione sua assinatura do Azure, o recurso Registro de Contêiner do Azure e as marcas de imagem. O formato da tag de imagem deverá ser {acrname}.azurecr.io/todo:latest.

  5. Aguarde o Visual Studio Code enviar por push a imagem de contêiner ao Registro de Contêiner do Azure.

Preparar o YAML de implantação

Use este modelo YAML a seguir para criar um arquivo akstododeploy.yml. Substitua os espaços reservados {ACR name}, {Image name}, {Version} e {resource group name} pelos seus próprios valores.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: todo
  labels:
    aadpodidbinding: "cosmostodo-apppodidentity"
    app: todo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: todo
  template:
    metadata:
      labels:
        app: todo
        aadpodidbinding: "cosmostodo-apppodidentity"
    spec:
      containers:
      - name: mycontainer
        image: "{ACR name}/{Image name}:{Version}"   # Update per your environment; for example, myacrname.azurecr.io/todo:latest. Do not add https:// in ACR Name.
        ports:
        - containerPort: 80
        env:
        - name: KeyVaultName
          value: "{resource group name}kv"       # Replace resource group name. Key Vault name is generated by Bicep.
      nodeSelector:
        kubernetes.io/os: linux
      volumes:
        - name: secrets-store01-inline
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: "azure-kvname-podid"       
---
    
kind: Service
apiVersion: v1
metadata:
  name: todo
spec:
  selector:
    app: todo
    aadpodidbinding: "cosmostodo-apppodidentity"    
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

Aplicar o YAML de implantação

Use kubectl apply novamente para implantar os pods do aplicativo e expor os pods por meio de um balanceador de carga:

kubectl apply \
  --filename akstododeploy.yml \
  --namespace 'my-app'

Testar o aplicativo

Quando o aplicativo é executado, um serviço de Kubernetes expõe o front-end do aplicativo à Internet. A conclusão desse processo pode levar alguns minutos.

Use kubectl get para exibir o IP externo que o balanceador de carga expõe:

kubectl get services \
  --namespace "my-app"

Para acessar o aplicativo, abra o endereço IP que você recebeu como saída em um navegador.

Limpar os recursos

Para evitar encargos do Azure, limpe os recursos desnecessários quando você não precisar mais do cluster. Use az group delete e az deployment sub delete para excluir o grupo de recursos e a implantação da assinatura, respectivamente:

az group delete \
  --resource-group $rgName 
  --yes

az deployment sub delete \
  --name $deploymentName