EC2 na prática: User Data e IAM Role
Manual passo a passo para automatizar a configuração de uma instância EC2 no momento em que ela nasce (User Data) e para dar permissões de AWS a ela sem usar senha ou chave fixa (IAM Role).
Pré-requisito: acesso à console AWS e uma instância EC2 já criada (ver manual 01), ou disposição para lançar uma nova instância durante este manual.
Parte 1: User Data (bootstrap automático)
User Data é um script que a AWS injeta e executa como root, uma única vez, no primeiro boot da instância. É a forma de sair do "Launch instance" já com o servidor configurado, sem precisar entrar via SSH depois.
💡 Equivalente on-prem: um kickstart do Red Hat ou um script de unattended install do Windows, rodado automaticamente na primeira inicialização da VM.
1.1 Criar uma instância com User Data
- Console EC2 → Instances → Launch instances.
- Preencha Name, AMI (Ubuntu) e Instance type (
t3.micro) normalmente. - Configure o Key pair e o Security group com HTTP (80) e SSH (22) liberados, como no manual 01.
- Role até Advanced details e expanda a seção.
- No campo User data, cole:
#!/bin/bash
apt update -y
apt install -y nginx
echo "<h1>Servidor $(hostname) configurado via User Data</h1>" > /var/www/html/index.html
systemctl enable nginx
systemctl restart nginx
- Finalize o wizard e clique em Launch instance.
⚠️ A primeira linha
#!/bin/bashé obrigatória. Sem ela, a AWS não reconhece o conteúdo como um script executável.
1.2 Confirmar que rodou sozinho
- Aguarde o estado
runninge o status check2/2 checks passed. - Copie o Public IPv4 address e abra no navegador:
http://IP_PUBLICO. - A página customizada deve aparecer, mesmo sem você ter feito login na instância em nenhum momento.
1.3 Onde ficam os logs de execução
Se algo não funcionar, o script deixa rastro. Conecte via SSH e verifique:
sudo cat /var/log/cloud-init-output.log
Esse arquivo mostra a saída completa do User Data, linha a linha, como se você tivesse rodado o script na mão.
1.4 Pontos importantes sobre o User Data
- Roda como root, então não é preciso usar
sudodentro do script. - Por padrão, roda apenas uma vez, no primeiro boot. Reiniciar a instância (
reboot) não executa de novo. - Pode ser atualizado com a instância parada (
Stop→ editar em Actions → Instance settings → Edit user data →Start). O novo conteúdo só é aplicado no próximo boot a partir do estadostopped. - Serve tanto para scripts shell (
#!/bin/bash) quanto para cloud-init no formato YAML, mais avançado. - É a base de automações maiores: instalar agentes, registrar a instância em um serviço externo, baixar a aplicação do S3 ou de um repositório Git no boot.
Parte 2: IAM Role na instância
Uma instância frequentemente precisa falar com outros serviços AWS: ler um arquivo no S3, escrever uma métrica, consultar um segredo. O jeito errado é colocar Access Key e Secret Key dentro da instância. O jeito certo é uma IAM Role.
💡 IAM Role é uma identidade temporária que a AWS empresta ao recurso. Equivalente a uma conta de serviço (service account) usada por uma VM ou container, sem senha fixa e com permissões limitadas ao que ela realmente precisa fazer.
2.1 Por que não usar Access Key fixa na instância
| Prática | Problema |
|---|---|
| Colocar Access Key/Secret Key em variável de ambiente ou arquivo na instância | Credencial fica gravada em disco, em log de bash, em imagem/AMI, em backup |
| Credencial não expira sozinha | Se vazar, continua válida até alguém revogar manualmente |
| IAM Role | Credencial é temporária, renovada automaticamente pela AWS, nunca aparece em texto plano na instância |
2.2 Criar a IAM Role
- Na barra de busca superior, digite IAM e abra o serviço.
- No menu lateral, clique em Roles → Create role.
- Em Trusted entity type, selecione AWS service.
- Em Use case, selecione EC2 → Next.
- Na lista de políticas, marque AmazonS3ReadOnlyAccess (para o exercício) → Next.
- Role name:
role-ec2-leitura-s3-SEUNOME. - Revise e clique em Create role.
⚠️ Em ambiente real, nunca use políticas genéricas como
AdministratorAccessem uma instância. Crie uma política específica com só as ações necessárias (princípio do menor privilégio).
2.3 Anexar a Role a uma instância existente
- Console EC2 → Instances → selecione a instância.
- Actions → Security → Modify IAM role.
- Em IAM role, selecione
role-ec2-leitura-s3-SEUNOME→ Update IAM role.
💡 A Role também pode ser escolhida direto no wizard de criação, no campo IAM instance profile, em Advanced details. Nesse caso a instância já nasce com a permissão.
2.4 Confirmar que a instância recebeu a credencial
Conecte via SSH na instância e rode:
curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/
O nome da Role deve aparecer como resultado. Esse endereço é o IMDS (Instance Metadata Service), acessível apenas de dentro da instância, e é dali que qualquer ferramenta AWS (CLI, SDK) busca a credencial temporária sozinha.
2.5 Testar a permissão na prática
Instale o AWS CLI, se ainda não estiver presente, e liste um bucket S3, sem configurar nenhuma credencial manualmente:
sudo apt install -y awscli
aws s3 ls
O comando deve listar os buckets da conta, usando de forma transparente a credencial fornecida pela Role. Se a Role não tivesse a permissão, o erro seria Access Denied, e não credenciais não encontradas.
2.6 Trocar ou remover a Role
- Para trocar a permissão, repita o passo 2.3 escolhendo outra Role.
- Uma instância só pode ter uma IAM Role por vez (mas a Role pode ter várias políticas anexadas).
- Remover a Role (
Modify IAM role→No IAM Role) revoga o acesso na hora, sem precisar reiniciar a instância.
Resumo dos conceitos deste manual
| Conceito | O que é | Equivalente on-prem |
|---|---|---|
| User Data | Script executado como root no primeiro boot da instância | Kickstart / unattended install |
| cloud-init-output.log | Log com a saída completa da execução do User Data | Log de instalação/provisionamento |
| IAM Role | Identidade temporária emprestada a um recurso AWS | Conta de serviço sem senha fixa |
| Instance Profile | O "contêiner" que liga a IAM Role à instância EC2 | Vínculo entre VM e conta de serviço |
| IMDS (169.254.169.254) | Endereço interno onde a instância busca sua credencial temporária | Endpoint local de metadados da VM |