Skip to main content

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​

  1. Console EC2 → Instances → Launch instances.
  2. Preencha Name, AMI (Ubuntu) e Instance type (t3.micro) normalmente.
  3. Configure o Key pair e o Security group com HTTP (80) e SSH (22) liberados, como no manual 01.
  4. Role até Advanced details e expanda a seção.
  5. 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
  1. 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​

  1. Aguarde o estado running e o status check 2/2 checks passed.
  2. Copie o Public IPv4 address e abra no navegador: http://IP_PUBLICO.
  3. 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 sudo dentro 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 estado stopped.
  • 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áticaProblema
Colocar Access Key/Secret Key em variável de ambiente ou arquivo na instânciaCredencial fica gravada em disco, em log de bash, em imagem/AMI, em backup
Credencial não expira sozinhaSe vazar, continua válida até alguém revogar manualmente
IAM RoleCredencial é temporária, renovada automaticamente pela AWS, nunca aparece em texto plano na instância

2.2 Criar a IAM Role​

  1. Na barra de busca superior, digite IAM e abra o serviço.
  2. No menu lateral, clique em Roles → Create role.
  3. Em Trusted entity type, selecione AWS service.
  4. Em Use case, selecione EC2 → Next.
  5. Na lista de políticas, marque AmazonS3ReadOnlyAccess (para o exercício) → Next.
  6. Role name: role-ec2-leitura-s3-SEUNOME.
  7. Revise e clique em Create role.

⚠️ Em ambiente real, nunca use políticas genéricas como AdministratorAccess em 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​

  1. Console EC2 → Instances → selecione a instância.
  2. Actions → Security → Modify IAM role.
  3. 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​

ConceitoO que éEquivalente on-prem
User DataScript executado como root no primeiro boot da instânciaKickstart / unattended install
cloud-init-output.logLog com a saída completa da execução do User DataLog de instalação/provisionamento
IAM RoleIdentidade temporária emprestada a um recurso AWSConta de serviço sem senha fixa
Instance ProfileO "contêiner" que liga a IAM Role à instância EC2Vínculo entre VM e conta de serviço
IMDS (169.254.169.254)Endereço interno onde a instância busca sua credencial temporáriaEndpoint local de metadados da VM