Implantar instâncias de contêiner do Azure em uma rede virtual

Concluído

Nesta unidade, você cria um aplicativo de exemplo em um contêiner de Instâncias de Contêiner do Azure para representar a API do cliente. O aplicativo consiste em uma API que acessa um banco de dados externo, que você implanta como um banco de dados SQL do Azure.

Você cria o aplicativo em contêiner dentro de uma rede virtual, para que o aplicativo seja acessível apenas a um cliente com acesso à rede virtual. Como o aplicativo só pode ser acessado de dentro da rede virtual, você cria uma máquina virtual (VM) de teste como um host de salto para simular o acesso do cliente e verificar se o aplicativo está funcionando.

As redes virtuais são segmentos de rede isolados onde você pode implantar cargas de trabalho para que elas só sejam acessíveis de forma privada ou, opcionalmente, também pela Internet pública. As redes virtuais normalmente hospedam VMs, mas você também pode implantar outros recursos do Azure, como instâncias de contêiner, em redes virtuais.

Um recurso do Azure implantado em uma rede virtual recebe um endereço IP privado do intervalo de rede virtual. O IP privado só pode ser acessado de dentro da rede virtual, de redes virtuais emparelhadas ou de redes locais conectadas via VPN Site a Site ou Rota Expressa do Azure.

O diagrama a seguir mostra a topologia implantada nesta unidade:

Diagram that shows an overview of the topology.

  1. Você implanta a instância de contêiner que contém a API do cliente dentro de uma rede virtual do Azure.
  2. Você implanta uma VM dentro da mesma rede virtual para usar para testar a API. Você precisa da VM porque, de acordo com os requisitos de negócios do cliente, a instância de contêiner implantada nessa rede virtual não pode ser acessada pela Internet pública.
  3. Você cria o banco de dados SQL do Azure que a API do cliente precisa para operar. Neste exemplo, a instância de contêiner alcança o banco de dados SQL do Azure pela Internet pública.

Criar o ambiente

  1. No portal do Azure, abra o Azure Cloud Shell selecionando o ícone do Cloud Shell na barra de menus superior. Verifique se a opção Bash está selecionada no Cloud Shell.

    Screenshot of the Azure portal header with the Cloud Shell icon highlighted.

  2. Insira o código a seguir no Cloud Shell para definir variáveis para esta unidade. Opcionalmente, você pode substituir o location valor por uma região do Azure mais próxima de você.

    # Variables
    rg=acilab
    location=eastus
    aci_name=learnaci
    aci_dns=${aci_name}${RANDOM}
    vnet_name=acivnet
    vnet_prefix=192.168.0.0/16
    vm_subnet_name=vm
    vm_subnet_prefix=192.168.1.0/24
    aci_subnet_name=aci
    aci_subnet_prefix=192.168.2.0/24
    
  3. Execute os seguintes comandos da CLI do Azure para criar um grupo de recursos e uma VM Linux para usar para testes. Neste exemplo, o Azure cria a rede virtual quando cria a VM.

    # Create test RG and VM
    az group create -n $rg -l $location
    az vm create -n test-vm -g $rg -l $location --image Ubuntu2204 --generate-ssh-keys \
        --public-ip-address test-vm-pip --public-ip-sku Standard --vnet-name $vnet_name \
        --vnet-address-prefix $vnet_prefix --subnet $vm_subnet_name --subnet-address-prefix $vm_subnet_prefix
    vm_pip=$(az network public-ip show -n test-vm-pip -g $rg --query ipAddress -o tsv) && echo $vm_pip
    
  4. Execute o código a seguir para verificar se você pode se conectar à VM do Azure por shell seguro (SSH):

    # Test SSH connectivity to virtual machine
    ssh $vm_pip
    [...]
    exit
    

    Importante

    Você deve instalar a CLI do Azure na VM remota. Para fazer isso, execute o seguinte comando na VM depois de se conectar:

    curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
    
  5. Execute os seguintes comandos da CLI do Azure para criar o banco de dados ao qual o aplicativo se conecta. Neste exemplo, você usa a menor SKU do Banco de Dados SQL do Azure (Basic) para reduzir custos. Esse tamanho não é recomendado para ambientes de produção.

    # Create database
    sql_server_name=sqlserver$RANDOM
    sql_db_name=mydb
    sql_username=azure
    sql_password=$(tr -dc A-Za-z0-9 </dev/urandom 2>/dev/null | head -c 15)
    az sql server create -n $sql_server_name -g $rg -l $location --admin-user $sql_username --admin-password $sql_password
    sql_server_fqdn=$(az sql server show -n $sql_server_name -g $rg -o tsv --query fullyQualifiedDomainName)
    az sql db create -n $sql_db_name -s $sql_server_name -g $rg -e Basic -c 5 --no-wait
    

Criar uma instância de contêiner na rede virtual

Agora que você tem todos os componentes necessários, pode implantar a instância de contêiner do Azure. Você especifica o FQDN (Nome de Domínio Totalmente Qualificado) do Banco de Dados SQL do Azure e as credenciais em variáveis de ambiente, para que a instância de contêiner possa se conectar ao banco de dados.

  1. Execute o seguinte comando da CLI do Azure para implantar a instância de contêiner do Azure. Repita o comando se receber um erro na primeira tentativa.

    # Create container instance in a new subnet
    az network vnet subnet create -g $rg --vnet-name $vnet_name -n $aci_subnet_name --address-prefix $aci_subnet_prefix
    vnet_id=$(az network vnet show -n $vnet_name -g $rg --query id -o tsv)
    aci_subnet_id=$(az network vnet subnet show -n $aci_subnet_name --vnet-name $vnet_name -g $rg --query id -o tsv)
    az container create -n $aci_name -g $rg -e "SQL_SERVER_USERNAME=$sql_username" \
      "SQL_SERVER_PASSWORD=$sql_password" \
      "SQL_SERVER_FQDN=${sql_server_fqdn}" \
      --image erjosito/yadaapi:1.0 \
      --ip-address private --ports 8080 --vnet $vnet_id --subnet $aci_subnet_id
    
  2. Recupere o endereço IP da instância do contêiner com o az container show comando e conecte-se à VM de teste para verificar a conectividade. Você precisa estar na VM de teste para acessar o endereço IP privado. A API implantada tem um ponto de extremidade /api/healthcheck que retorna o valor OK se o contêiner estiver ativo e em execução.

    # Test container reachability
    aci_ip=$(az container show -n $aci_name -g $rg --query 'ipAddress.ip' -o tsv) && echo $aci_ip
    ssh -n -o BatchMode=yes -o StrictHostKeyChecking=no $vm_pip "curl -s http://$aci_ip:8080/api/healthcheck"
    

    Nota

    As -n -o BatchMode=yes -o StrictHostKeyChecking=no opções neste comando não são importantes para esta unidade, mas são úteis para enviar comandos em lote para uma VM remota através de SSH.

Atualizar as regras de firewall do SQL do Azure

Antes que o aplicativo possa se conectar ao banco de dados de back-end, as regras de firewall do SQL do Azure devem ser atualizadas para permitir o acesso à API. A conexão usa o endereço IP público, por isso é importante saber qual endereço IP de origem o aplicativo usa para acessar a internet.

O endereço IP de saída para uma instância de contêiner do Azure não é trivial de obter. O ponto de extremidade api/ip do aplicativo mostra alguns dos atributos de rede, incluindo o endereço IP de saída pública. Nesse caso, o próprio código da API descobre o IP de saída e o usa para atualizar as regras de firewall do Banco de Dados SQL do Azure.

O aplicativo deve então ser capaz de acessar o banco de dados SQL do Azure. Você pode verificar se o aplicativo pode acessar o banco de dados usando o ponto de extremidade do aplicativo para mostrar a versão do banco de api/sqlversion dados.

Execute o código a seguir para atualizar as regras de firewall e testar o acesso à API:

# Update Azure SQL firewall rules and test API
aci_pip=$(ssh -n -o BatchMode=yes -o StrictHostKeyChecking=no $vm_pip "curl -s http://$aci_ip:8080/api/ip" | jq -r .my_public_ip) && echo $aci_pip
az sql server firewall-rule create -g $rg -s $sql_server_name -n public_sqlapi_aci-source --start-ip-address $aci_pip --end-ip-address $aci_pip
ssh -n -o BatchMode=yes -o StrictHostKeyChecking=no $vm_pip "curl -s http://$aci_ip:8080/api/sqlversion"
ssh -n -o BatchMode=yes -o StrictHostKeyChecking=no $vm_pip "curl -s http://$aci_ip:8080/api/sqlsrcip"

O último comando do bloco de código anterior chama o ponto de extremidade api/sqlsrcipdo aplicativo, que envia uma consulta SQL para o banco de dados back-end solicitando o endereço IP de origem que o banco de dados vê. Você pode verificar se o banco de dados vê o endereço IP público do aplicativo.