7.1 Exibindo o Hostname na Página
Nesta etapa, vamos fazer cada instância escrever seu próprio hostname na página HTML durante o boot.
⚡ Visão rápida: o HTML é um arquivo estático — não tem como saber em qual máquina está rodando. A solução é usar o user_data para, no momento do boot, ler o hostname da instância e injetá-lo diretamente no arquivo.
7.1.1 O hostname da instância
Cada instância EC2 tem um hostname único atribuído pela AWS no momento em que é criada. Ele fica disponível localmente em /etc/hostname — um arquivo simples que qualquer script pode ler:
cat /etc/hostname
O valor retornado tem um formato como ip-10-0-1-45.sa-east-1.compute.internal, derivado do IP privado da instância. É único por instância e suficiente para identificar qual máquina está respondendo.
7.1.2 Adicionar o marcador no index.html
No index.html, adicione um parágrafo ao final do card com o texto __INSTANCE_ID__ como marcador:
<hr class="mt-4 mb-3">
<p class="instance-tag mb-0">
Servido por: <code>__INSTANCE_ID__</code>
</p>
Adicione também o estilo para o texto no <style>:
.instance-tag {
font-size: 1rem;
letter-spacing: 0.03em;
color: #94a3b8;
}
Esse marcador é um texto literal que será substituído pelo user_data no momento do boot. O OpenTofu não precisa saber disso — para ele, é só conteúdo de arquivo.
7.1.3 Modificar o user-data.sh.tftpl
Após escrever o HTML, o script precisa:
- Ler o hostname da instância em
/etc/hostname; - Substituir o marcador
__INSTANCE_ID__pelo valor real usandosed.
#!/bin/bash
set -e
apt-get update -y
apt-get install -y apache2
cat >/var/www/html/index.html <<'HTML'
${index_html}
HTML
# Captura o hostname da instância
INSTANCE_ID=$(cat /etc/hostname)
# Substitui o marcador pelo hostname real da instância
sed -i "s/__INSTANCE_ID__/$${INSTANCE_ID}/g" /var/www/html/index.html
chown -R www-data:www-data /var/www/html
systemctl enable apache2
systemctl restart apache2
⚠️ Por que$${INSTANCE_ID}com dois cifrões?
O OpenTofu processa o arquivo.tftplcomtemplatefile()antes de enviar o script para a EC2. Qualquer${...}é interpretado como variável do template — não como variável bash. O$$é a forma de escapar: o OpenTofu renderiza$$como um único$literal, e o bash recebe${INSTANCE_ID}corretamente em tempo de execução.
O fluxo é:
- o
catescreve o HTML com o marcador literal__INSTANCE_ID__; cat /etc/hostnamelê o hostname único da instância;- o
sed -isubstitui o marcador no arquivo já escrito em disco.
7.1.4 Aplicar
Como o index.html foi modificado, o hash IndexHtmlHash da tag vai mudar. Combinado com user_data_replace_on_change = true, o OpenTofu vai recriar as três instâncias com o novo script.
Execute:
tofu apply
⏳ Aguarde o boot das instâncias
Cada instância precisa passar pelouser_datacompleto antes de servir a página. Aguarde 1 a 2 minutos após o apply.
7.1.5 Testar
Acesse o DNS do ALB várias vezes:
for i in $(seq 1 6); do
curl -s http://$(tofu output -raw alb_dns) | grep "Servido por"
done
A cada requisição, o ALB pode rotear para uma instância diferente. O ID exibido na página deve alternar entre os três IDs das instâncias.
No navegador, recarregue com Ctrl+Shift+R (sem cache) algumas vezes — o ID no rodapé da página vai mudar conforme o ALB distribui o tráfego.