Implantar instâncias de contêiner do Azure em uma rede virtual
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:
- Você implanta a instância de contêiner que contém a API do cliente dentro de uma rede virtual do Azure.
- 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.
- 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
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.
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
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
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
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.
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
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 valorOK
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/sqlsrcip
do 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.