<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Luis Cruz</title>
    <description>The latest articles on DEV Community by Luis Cruz (@luiscruzcwb).</description>
    <link>https://dev.to/luiscruzcwb</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1108147%2Fb1b1fb80-5b9d-4441-87bd-b3cea79f8d8e.jpg</url>
      <title>DEV Community: Luis Cruz</title>
      <link>https://dev.to/luiscruzcwb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/luiscruzcwb"/>
    <language>en</language>
    <item>
      <title>AWS - Projeto Cloud: Implementação IAM</title>
      <dc:creator>Luis Cruz</dc:creator>
      <pubDate>Tue, 02 Jun 2026 19:30:21 +0000</pubDate>
      <link>https://dev.to/luiscruzcwb/aws-projeto-cloud-implementacao-iam-1k35</link>
      <guid>https://dev.to/luiscruzcwb/aws-projeto-cloud-implementacao-iam-1k35</guid>
      <description>&lt;p&gt;Neste projeto prático você vai implementar um ambiente IAM completo na AWS: criar grupos com permissões específicas, migrar usuários via script automatizado, configurar MFA obrigatório e aplicar uma política de senhas forte — tudo seguindo as boas práticas de segurança da AWS.&lt;/p&gt;

&lt;p&gt;O projeto está dividido em duas partes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parte 1:&lt;/strong&gt; Criação de grupos, preparação do CSV e automação da criação de usuários&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parte 2:&lt;/strong&gt; Boas práticas de segurança — MFA, política de senhas e validação de acesso&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Pré-requisitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Acesso ao &lt;strong&gt;AWS Console&lt;/strong&gt; com permissões de administrador&lt;/li&gt;
&lt;li&gt;Arquivo CSV com os dados dos usuários (formato explicado abaixo)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Parte 1 — Criação e Migração de Usuários
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Passo 1 — Criar os Grupos IAM
&lt;/h3&gt;

&lt;p&gt;No &lt;strong&gt;AWS Console&lt;/strong&gt;, acesse &lt;strong&gt;IAM → User groups → Create group&lt;/strong&gt; e crie os seguintes grupos:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Grupo&lt;/th&gt;
&lt;th&gt;Perfil&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CloudAdmin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Administradores da conta AWS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LinuxAdmin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Administradores de servidores Linux&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RedesAdmin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Administradores de rede&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DBA&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Administradores de banco de dados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Estagiarios&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Acesso limitado para estagiários&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Nomes de grupos suportam até 128 caracteres, são únicos por conta e não diferenciam maiúsculas de minúsculas.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Passo 2 — Preparar o arquivo CSV
&lt;/h3&gt;

&lt;p&gt;O script espera um arquivo CSV com exatamente três colunas: &lt;code&gt;usuarios&lt;/code&gt;, &lt;code&gt;grupo&lt;/code&gt; e &lt;code&gt;senha&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Se você tiver uma planilha Excel com os dados dos usuários, faça os seguintes ajustes antes de exportar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Renomeie a coluna de e-mails para &lt;code&gt;usuarios&lt;/code&gt; e remova o domínio (ex: remova &lt;code&gt;@empresa.com&lt;/code&gt; usando &lt;strong&gt;Localizar e Substituir&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Renomeie a coluna de equipes para &lt;code&gt;grupo&lt;/code&gt; e ajuste os valores para bater exatamente com os nomes dos grupos criados na AWS&lt;/li&gt;
&lt;li&gt;Adicione a coluna &lt;code&gt;senha&lt;/code&gt; com uma senha padrão inicial (ex: &lt;code&gt;AlterarSenha@123!&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Salve como &lt;strong&gt;CSV separado por vírgula (UTF-8)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O arquivo final deve ter este formato:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csvs"&gt;&lt;code&gt;&lt;span class="k"&gt;usuarios&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;grupo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;senha&lt;/span&gt;
&lt;span class="k"&gt;joao&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;silva&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;LinuxAdmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;AlterarSenha&lt;/span&gt;&lt;span class="kp"&gt;@123&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;span class="k"&gt;maria&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;souza&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;DBA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;AlterarSenha&lt;/span&gt;&lt;span class="kp"&gt;@123&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;span class="k"&gt;pedro&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;lima&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Estagiarios&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;AlterarSenha&lt;/span&gt;&lt;span class="kp"&gt;@123&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;span class="k"&gt;ana&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;costa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;RedesAdmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;AlterarSenha&lt;/span&gt;&lt;span class="kp"&gt;@123&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;span class="k"&gt;carlos&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;melo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;CloudAdmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;AlterarSenha&lt;/span&gt;&lt;span class="kp"&gt;@123&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Dica:&lt;/strong&gt; Para validar o processo, comece com 4 ou 5 usuários antes de rodar o arquivo completo.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Passo 3 — O script de criação de usuários
&lt;/h3&gt;

&lt;p&gt;Salve o conteúdo abaixo como &lt;code&gt;aws-iam-cria-usuario.sh&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# Propósito:   Automatiza a criação de usuários na AWS&lt;/span&gt;
&lt;span class="c"&gt;# Utilização:  ./aws-iam-cria-usuario.sh &amp;lt;arquivo.csv&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;# Formato CSV: usuarios,grupo,senha&lt;/span&gt;
&lt;span class="c"&gt;# Autor:       Luis Cruz&lt;/span&gt;
&lt;span class="c"&gt;# ------------------------------------------&lt;/span&gt;

&lt;span class="nv"&gt;INPUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;span class="nv"&gt;OLDIFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$IFS&lt;/span&gt;
&lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;',;'&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$INPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$INPUT&lt;/span&gt;&lt;span class="s2"&gt; arquivo não encontrado"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;99&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; dos2unix &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Utilitário dos2unix não encontrado. Instale com: sudo yum install dos2unix -y"&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="o"&gt;}&lt;/span&gt;

dos2unix &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$INPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; usuario grupo senha &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"usuarios"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"──────────────────────────────────────"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Criando: &lt;/span&gt;&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="s2"&gt; | Grupo: &lt;/span&gt;&lt;span class="nv"&gt;$grupo&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    aws iam create-user &lt;span class="nt"&gt;--user-name&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    aws iam create-login-profile &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--password-reset-required&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--user-name&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--password&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$senha&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    aws iam add-user-to-group &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--group-name&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$grupo&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--user-name&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"✓ &lt;/span&gt;&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="s2"&gt; criado com sucesso"&lt;/span&gt;
  &lt;span class="k"&gt;fi
done&lt;/span&gt; &amp;lt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$INPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$OLDIFS&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Migração concluída."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O script:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Valida se o arquivo CSV foi informado e existe&lt;/li&gt;
&lt;li&gt;Converte o arquivo com &lt;code&gt;dos2unix&lt;/code&gt; (necessário se criado no Windows)&lt;/li&gt;
&lt;li&gt;Lê cada linha ignorando o cabeçalho&lt;/li&gt;
&lt;li&gt;Cria o usuário IAM, define a senha inicial com troca obrigatória no primeiro acesso e adiciona ao grupo&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Passo 4 — Executar no AWS CloudShell
&lt;/h3&gt;

&lt;p&gt;O &lt;strong&gt;AWS CloudShell&lt;/strong&gt; é um terminal no próprio console da AWS com AWS CLI já configurada. Acesse pelo ícone de terminal no menu superior do console.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instalar o dos2unix:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;yum &lt;span class="nb"&gt;install &lt;/span&gt;dos2unix &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fazer upload dos arquivos&lt;/strong&gt; via &lt;strong&gt;Actions → Upload file&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;aws-iam-cria-usuario.sh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;usuarios.csv&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Preparar e executar:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# verificar os arquivos enviados&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;

&lt;span class="c"&gt;# tornar o script executável&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x aws-iam-cria-usuario.sh

&lt;span class="c"&gt;# verificar o conteúdo do CSV&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;usuarios.csv

&lt;span class="c"&gt;# executar&lt;/span&gt;
./aws-iam-cria-usuario.sh usuarios.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Passo 5 — Validar os usuários criados
&lt;/h3&gt;

&lt;p&gt;No console, acesse &lt;strong&gt;IAM → Users&lt;/strong&gt; e confirme que os usuários foram criados e estão nos grupos corretos.&lt;/p&gt;

&lt;p&gt;Ou via CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# listar todos os usuários&lt;/span&gt;
aws iam list-users &lt;span class="nt"&gt;--output&lt;/span&gt; table

&lt;span class="c"&gt;# verificar grupos de um usuário&lt;/span&gt;
aws iam list-groups-for-user &lt;span class="nt"&gt;--user-name&lt;/span&gt; joao.silva

&lt;span class="c"&gt;# listar usuários de um grupo&lt;/span&gt;
aws iam get-group &lt;span class="nt"&gt;--group-name&lt;/span&gt; DBA &lt;span class="nt"&gt;--output&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Passo 6 — Permitir troca de senha no primeiro acesso
&lt;/h3&gt;

&lt;p&gt;Antes de testar o login com os usuários criados, anexe a política &lt;code&gt;IAMUserChangePassword&lt;/code&gt; a todos os grupos.&lt;/p&gt;

&lt;p&gt;Acesse &lt;strong&gt;IAM → User groups → [grupo] → Permissions → Add permissions → Attach policies&lt;/strong&gt;, filtre por &lt;code&gt;IAM&lt;/code&gt; e adicione &lt;code&gt;IAMUserChangePassword&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Repita para todos os grupos.&lt;/p&gt;




&lt;h3&gt;
  
  
  Testando o acesso (Passo a passo)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Acesse &lt;strong&gt;IAM → Dashboard&lt;/strong&gt; e copie a &lt;strong&gt;URL de login da conta&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Abra uma aba anônima no navegador e acesse com a URL copiada&lt;/li&gt;
&lt;li&gt;Faça login com um dos usuários criados (ex: &lt;code&gt;adolfo.carlos&lt;/code&gt;, grupo &lt;code&gt;DBA&lt;/code&gt;, senha &lt;code&gt;AlterarSenha@123!&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Troque a senha quando solicitado&lt;/li&gt;
&lt;li&gt;Tente acessar o &lt;strong&gt;DynamoDB&lt;/strong&gt; e criar uma tabela → o acesso deve ser negado, pois o grupo &lt;code&gt;DBA&lt;/code&gt; tem apenas &lt;code&gt;AmazonRDSFullAccess&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esse teste confirma que o princípio do &lt;strong&gt;mínimo privilégio&lt;/strong&gt; está funcionando corretamente.&lt;/p&gt;




&lt;h2&gt;
  
  
  Parte 2 — Boas Práticas de Segurança
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Passo 1 — Habilitar MFA no usuário Root
&lt;/h3&gt;

&lt;p&gt;O usuário root é a identidade mais poderosa da conta AWS. Proteja-o primeiro.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Acesse o console com o usuário root&lt;/li&gt;
&lt;li&gt;Clique no nome da conta → &lt;strong&gt;Security Credentials&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Em &lt;strong&gt;Multi-factor authentication (MFA)&lt;/strong&gt; → &lt;strong&gt;Assign MFA device&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Escolha &lt;strong&gt;Authenticator app&lt;/strong&gt; (ex: Google Authenticator ou Authy)&lt;/li&gt;
&lt;li&gt;Escaneie o QR Code com o aplicativo&lt;/li&gt;
&lt;li&gt;Informe dois tokens consecutivos para confirmar&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A partir de agora, além de usuário e senha, o login do root exigirá o token do autenticador.&lt;/p&gt;




&lt;h3&gt;
  
  
  Passo 2 — Criar e aplicar a política EnforceMFAPolicy
&lt;/h3&gt;

&lt;p&gt;Esta política bloqueia qualquer acesso a recursos da AWS enquanto o usuário não tiver o MFA ativo.&lt;/p&gt;

&lt;p&gt;Acesse &lt;strong&gt;IAM → Policies → Create policy → JSON&lt;/strong&gt;, remova o conteúdo existente e cole:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Statement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AllowViewAccountInfo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:GetAccountPasswordPolicy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ListVirtualMFADevices"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AllowManageOwnVirtualMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:CreateVirtualMFADevice"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:iam::*:mfa/*"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AllowManageOwnUserMFA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:DeactivateMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:EnableMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:GetUser"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ListMFADevices"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ResyncMFADevice"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:iam::*:user/${aws:username}"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DenyAllExceptListedIfNoMFA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Deny"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"NotAction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:CreateVirtualMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:EnableMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:GetUser"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ListMFADevices"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ListVirtualMFADevices"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ResyncMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"sts:GetSessionToken"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Condition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"BoolIfExists"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"aws:MultiFactorAuthPresent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"false"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clique em &lt;strong&gt;Next → Next&lt;/strong&gt; e defina o nome como &lt;code&gt;EnforceMFAPolicy&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anexar a política em todos os grupos de uma vez:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Acesse &lt;strong&gt;IAM → Policies → EnforceMFAPolicy → Entities attached → Attach → Filter: User groups&lt;/strong&gt; → selecione todos os grupos → &lt;strong&gt;Attach policy&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Passo 3 — Configurar política de senhas da conta
&lt;/h3&gt;

&lt;p&gt;Acesse &lt;strong&gt;IAM → Account settings → Password policy → Edit → Custom&lt;/strong&gt; e ative:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Configuração&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Letra maiúscula (A-Z)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Letra minúscula (a-z)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Número (0-9)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caractere especial &lt;code&gt;! @ # $ % ...&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permitir que usuários troquem a própria senha&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impedir reutilização de senhas&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Clique em &lt;strong&gt;Save changes&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Passo 4 — Testar o bloqueio por MFA
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Acesse &lt;strong&gt;IAM → Dashboard&lt;/strong&gt; e copie a URL de login&lt;/li&gt;
&lt;li&gt;Abra uma aba anônima e faça login com um usuário que &lt;strong&gt;não tem MFA configurado&lt;/strong&gt; (ex: &lt;code&gt;alda.lage&lt;/code&gt;, grupo &lt;code&gt;CloudAdmin&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Tente acessar o &lt;strong&gt;IAM&lt;/strong&gt; → o acesso será negado com erro de permissão&lt;/li&gt;
&lt;li&gt;Isso confirma que a &lt;code&gt;EnforceMFAPolicy&lt;/code&gt; está funcionando&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Ativando o MFA como usuário:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clique no nome do usuário no canto superior direito → &lt;strong&gt;Security Credentials&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Em &lt;strong&gt;MFA device&lt;/strong&gt; → &lt;strong&gt;Assign MFA device → Authenticator app&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Escaneie o QR Code e informe dois tokens consecutivos&lt;/li&gt;
&lt;li&gt;Faça &lt;strong&gt;Logoff → Login&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Teste novamente o acesso — agora deve funcionar normalmente&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Resumo do que foi implementado
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Configuração&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Grupos IAM com permissões específicas&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usuários criados via script automatizado&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Troca de senha obrigatória no primeiro acesso&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MFA habilitado no usuário root&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EnforceMFAPolicy aplicada em todos os grupos&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Política de senhas forte na conta&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/pt_br/IAM/latest/UserGuide/best-practices.html" rel="noopener noreferrer"&gt;Boas práticas de segurança no IAM – AWS Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-services-iam-new-user-group.html" rel="noopener noreferrer"&gt;Gerenciar usuários e grupos com AWS CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_users-self-manage-mfa-and-creds.html" rel="noopener noreferrer"&gt;Tutorial: MFA obrigatório com política IAM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_passwords_account-policy.html" rel="noopener noreferrer"&gt;Configurar política de senhas da conta&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See you later 🤘🏻&lt;/p&gt;

</description>
      <category>aws</category>
      <category>iam</category>
      <category>devops</category>
      <category>security</category>
    </item>
    <item>
      <title>Automatizando a Migração de Usuários e o Gerenciamento de IAM na AWS</title>
      <dc:creator>Luis Cruz</dc:creator>
      <pubDate>Tue, 02 Jun 2026 18:51:49 +0000</pubDate>
      <link>https://dev.to/luiscruzcwb/automatizando-a-migracao-de-usuarios-e-otimizando-o-gerenciamento-de-iam-na-aws-1d0l</link>
      <guid>https://dev.to/luiscruzcwb/automatizando-a-migracao-de-usuarios-e-otimizando-o-gerenciamento-de-iam-na-aws-1d0l</guid>
      <description>&lt;p&gt;Migrar 100 usuários manualmente no console da AWS é lento, suscetível a erros e impossível de auditar com precisão. Neste artigo você vai ver como automatizar esse processo usando &lt;strong&gt;AWS CLI&lt;/strong&gt; e &lt;strong&gt;Shell Script&lt;/strong&gt; direto no &lt;strong&gt;AWS CloudShell&lt;/strong&gt; — sem instalar nada localmente.&lt;/p&gt;

&lt;p&gt;O resultado final: usuários criados, alocados nos grupos corretos e com MFA obrigatório, tudo em minutos.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é o IAM?
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;AWS Identity and Access Management (IAM)&lt;/strong&gt; é o serviço que controla quem pode acessar os recursos da sua conta AWS e o que cada pessoa ou serviço pode fazer.&lt;/p&gt;

&lt;p&gt;Com o IAM você gerencia:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Conceito&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Usuário&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Identidade individual com credenciais próprias&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Grupo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Conjunto de usuários que compartilham as mesmas permissões&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Política&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Documento JSON que define o que é permitido ou negado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Role&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Identidade temporária assumida por serviços ou usuários&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A boa prática é nunca conceder permissões diretamente a um usuário — sempre use grupos.&lt;/p&gt;




&lt;h2&gt;
  
  
  Visão geral da solução
&lt;/h2&gt;

&lt;p&gt;O fluxo é simples:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Criar os &lt;strong&gt;grupos IAM&lt;/strong&gt; no console&lt;/li&gt;
&lt;li&gt;Montar um &lt;strong&gt;arquivo CSV&lt;/strong&gt; com os dados dos usuários&lt;/li&gt;
&lt;li&gt;Rodar um &lt;strong&gt;shell script&lt;/strong&gt; no CloudShell que lê o CSV e cria tudo automaticamente&lt;/li&gt;
&lt;li&gt;Aplicar a &lt;strong&gt;política de MFA obrigatório&lt;/strong&gt; nos grupos&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Passo 1 — Criar os Grupos IAM
&lt;/h2&gt;

&lt;p&gt;Antes de importar os usuários, os grupos precisam existir.&lt;/p&gt;

&lt;p&gt;No &lt;strong&gt;AWS Console&lt;/strong&gt;, acesse &lt;strong&gt;IAM → User groups → Create group&lt;/strong&gt; e crie um grupo para cada perfil do seu ambiente. Neste exemplo usaremos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;RedesAdmin&lt;/code&gt; — administradores de rede&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;LinuxAdmin&lt;/code&gt; — administradores de servidores Linux&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DBA&lt;/code&gt; — administradores de banco de dados&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Estagiarios&lt;/code&gt; — acesso limitado para estagiários&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Nomes de grupos suportam até 128 caracteres (letras, números e &lt;code&gt;+ = , . @ _ -&lt;/code&gt;), são únicos por conta e não diferenciam maiúsculas de minúsculas.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Passo 2 — Montar o arquivo CSV
&lt;/h2&gt;

&lt;p&gt;Crie uma planilha com os dados dos usuários e salve como &lt;strong&gt;CSV separado por vírgula (UTF-8)&lt;/strong&gt;. O arquivo deve ter exatamente três colunas: &lt;code&gt;Username&lt;/code&gt;, &lt;code&gt;Group&lt;/code&gt; e &lt;code&gt;Password&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csvs"&gt;&lt;code&gt;&lt;span class="k"&gt;Username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Group&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Password&lt;/span&gt;
&lt;span class="k"&gt;joao&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;silva&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;LinuxAdmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Senha&lt;/span&gt;&lt;span class="kp"&gt;@2024&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;span class="k"&gt;maria&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;souza&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;DBA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Senha&lt;/span&gt;&lt;span class="kp"&gt;@2024&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;span class="k"&gt;pedro&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;lima&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Estagiarios&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Senha&lt;/span&gt;&lt;span class="kp"&gt;@2024&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;span class="k"&gt;ana&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;costa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;RedesAdmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Senha&lt;/span&gt;&lt;span class="kp"&gt;@2024&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;span class="k"&gt;carlos&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;melo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;LinuxAdmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Senha&lt;/span&gt;&lt;span class="kp"&gt;@2024&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Algumas observações importantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O valor em &lt;code&gt;Group&lt;/code&gt; deve corresponder exatamente ao nome do grupo criado no Passo 1&lt;/li&gt;
&lt;li&gt;Use senhas que atendam à política da conta AWS (mínimo 8 caracteres, maiúsculas, minúsculas, números e símbolos)&lt;/li&gt;
&lt;li&gt;Se o arquivo foi criado no Excel (Windows), salve como &lt;strong&gt;CSV UTF-8&lt;/strong&gt; — o script vai precisar do &lt;code&gt;dos2unix&lt;/code&gt; para converter os caracteres de fim de linha&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Passo 3 — O script de criação de usuários
&lt;/h2&gt;

&lt;p&gt;Este é o script que lê o CSV e cria cada usuário no IAM. Salve-o como &lt;code&gt;criar-usuarios-iam.sh&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="c"&gt;# Valida se o arquivo CSV foi informado&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Uso: &lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt; &amp;lt;arquivo.csv&amp;gt;"&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nv"&gt;CSV_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Ignora o cabeçalho e lê linha por linha&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; +2 &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CSV_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; USERNAME GROUP PASSWORD&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;

  &lt;span class="c"&gt;# Remove espaços e caracteres de retorno de carro (Windows)&lt;/span&gt;
  &lt;span class="nv"&gt;USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$USERNAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'[:space:]\r'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="nv"&gt;GROUP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GROUP&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;       | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'[:space:]\r'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="nv"&gt;PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PASSWORD&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'\r'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"──────────────────────────────────────"&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Criando usuário: &lt;/span&gt;&lt;span class="nv"&gt;$USERNAME&lt;/span&gt;&lt;span class="s2"&gt; | Grupo: &lt;/span&gt;&lt;span class="nv"&gt;$GROUP&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

  &lt;span class="c"&gt;# Cria o usuário com acesso ao console&lt;/span&gt;
  aws iam create-user &lt;span class="nt"&gt;--user-name&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$USERNAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

  &lt;span class="c"&gt;# Define a senha inicial e exige troca no primeiro login&lt;/span&gt;
  aws iam create-login-profile &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--user-name&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$USERNAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--password&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PASSWORD&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--password-reset-required&lt;/span&gt;

  &lt;span class="c"&gt;# Adiciona ao grupo&lt;/span&gt;
  aws iam add-user-to-group &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--user-name&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$USERNAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--group-name&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GROUP&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"✓ &lt;/span&gt;&lt;span class="nv"&gt;$USERNAME&lt;/span&gt;&lt;span class="s2"&gt; criado e adicionado ao grupo &lt;/span&gt;&lt;span class="nv"&gt;$GROUP&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;done

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Migração concluída."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Passo 4 — Executar no AWS CloudShell
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;AWS CloudShell&lt;/strong&gt; é um terminal no próprio console da AWS com AWS CLI já configurada e autenticada. Não é necessário instalar nada localmente.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1 Instalar o dos2unix
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;yum &lt;span class="nb"&gt;install &lt;/span&gt;dos2unix &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.2 Fazer upload dos arquivos
&lt;/h3&gt;

&lt;p&gt;No CloudShell, clique em &lt;strong&gt;Actions → Upload file&lt;/strong&gt; e envie:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;criar-usuarios-iam.sh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ListaDeUsuarios.csv&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.3 Preparar e executar
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# converter o CSV (necessário se o arquivo foi criado no Windows)&lt;/span&gt;
dos2unix ListaDeUsuarios.csv

&lt;span class="c"&gt;# tornar o script executável&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x criar-usuarios-iam.sh

&lt;span class="c"&gt;# executar&lt;/span&gt;
./criar-usuarios-iam.sh ListaDeUsuarios.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A saída esperada é uma linha de confirmação para cada usuário criado.&lt;/p&gt;




&lt;h2&gt;
  
  
  Passo 5 — Validar os usuários criados
&lt;/h2&gt;

&lt;p&gt;Verifique os usuários no console em &lt;strong&gt;IAM → Users&lt;/strong&gt;, ou via CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# listar todos os usuários da conta&lt;/span&gt;
aws iam list-users &lt;span class="nt"&gt;--output&lt;/span&gt; table

&lt;span class="c"&gt;# verificar os grupos de um usuário específico&lt;/span&gt;
aws iam list-groups-for-user &lt;span class="nt"&gt;--user-name&lt;/span&gt; joao.silva

&lt;span class="c"&gt;# verificar todos os usuários de um grupo&lt;/span&gt;
aws iam get-group &lt;span class="nt"&gt;--group-name&lt;/span&gt; LinuxAdmin &lt;span class="nt"&gt;--output&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Passo 6 — Aplicar política de MFA obrigatório
&lt;/h2&gt;

&lt;p&gt;Sem essa etapa, os usuários conseguem acessar recursos da AWS sem configurar autenticação multifator. A política abaixo bloqueia qualquer ação enquanto o MFA não estiver ativo.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.1 Criar a política
&lt;/h3&gt;

&lt;p&gt;Acesse &lt;strong&gt;IAM → Policies → Create policy → JSON&lt;/strong&gt; e cole o conteúdo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Statement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AllowViewAccountInfo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:GetAccountPasswordPolicy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ListVirtualMFADevices"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AllowManageOwnVirtualMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:CreateVirtualMFADevice"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:iam::*:mfa/*"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AllowManageOwnUserMFA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:DeactivateMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:EnableMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:GetUser"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ListMFADevices"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ResyncMFADevice"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:iam::*:user/${aws:username}"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DenyAllExceptListedIfNoMFA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Deny"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"NotAction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:CreateVirtualMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:EnableMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:GetUser"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ListMFADevices"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ListVirtualMFADevices"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ResyncMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"sts:GetSessionToken"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Condition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"BoolIfExists"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"aws:MultiFactorAuthPresent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"false"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dê o nome &lt;code&gt;EnforceMFAPolicy&lt;/code&gt; e salve.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.2 Anexar as políticas aos grupos
&lt;/h3&gt;

&lt;p&gt;Para cada grupo, adicione as duas políticas abaixo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;IAMUserChangePassword&lt;/code&gt; — permite que o usuário troque sua própria senha no primeiro acesso&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;EnforceMFAPolicy&lt;/code&gt; — bloqueia acesso a qualquer recurso enquanto o MFA não estiver configurado&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Acesse &lt;strong&gt;IAM → User groups → [nome do grupo] → Permissions → Add permissions → Attach policies&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para aplicar em todos os grupos de uma vez, use a política diretamente:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IAM → Policies → EnforceMFAPolicy → Entities attached → Attach → selecione todos os grupos → Attach&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Boas práticas aplicadas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mínimo privilégio&lt;/strong&gt; — cada grupo tem apenas as permissões necessárias para sua função&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MFA obrigatório&lt;/strong&gt; — nenhum usuário acessa recursos sem segundo fator ativo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Troca de senha no primeiro acesso&lt;/strong&gt; — o parâmetro &lt;code&gt;--password-reset-required&lt;/code&gt; garante que o usuário defina sua própria senha&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automação auditável&lt;/strong&gt; — o script e o CSV podem ser versionados e revisados&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nunca usar o usuário root&lt;/strong&gt; — toda operação deve ser feita com usuários IAM com permissões adequadas&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Considerações finais
&lt;/h2&gt;

&lt;p&gt;O mesmo processo funciona para qualquer escala — 10 ou 10.000 usuários. Para ambientes maiores, o próximo passo natural é evoluir para &lt;strong&gt;AWS SSO (IAM Identity Center)&lt;/strong&gt; com integração a um provedor de identidade como Azure AD ou Okta, eliminando a necessidade de gerenciar senhas individuais no IAM.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html" rel="noopener noreferrer"&gt;Introdução ao IAM – AWS Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/pt_br/IAM/latest/UserGuide/best-practices.html" rel="noopener noreferrer"&gt;Boas práticas de segurança no IAM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html" rel="noopener noreferrer"&gt;Gerenciar usuários IAM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/pt_br/IAM/latest/UserGuide/id_groups.html" rel="noopener noreferrer"&gt;Gerenciar grupos IAM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/pt_br/IAM/latest/UserGuide/access_policies.html" rel="noopener noreferrer"&gt;Políticas e permissões no IAM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_users-self-manage-mfa-and-creds.html" rel="noopener noreferrer"&gt;Tutorial: MFA obrigatório com política IAM&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See you later 🤘🏻&lt;/p&gt;

</description>
      <category>aws</category>
      <category>iam</category>
      <category>devops</category>
      <category>security</category>
    </item>
    <item>
      <title>Bicep: A Linguagem Moderna de IaC para Azure</title>
      <dc:creator>Luis Cruz</dc:creator>
      <pubDate>Tue, 02 Jun 2026 17:46:37 +0000</pubDate>
      <link>https://dev.to/luiscruzcwb/bicep-a-linguagem-moderna-de-iac-para-azure-5h0</link>
      <guid>https://dev.to/luiscruzcwb/bicep-a-linguagem-moderna-de-iac-para-azure-5h0</guid>
      <description>&lt;p&gt;Se você já trabalhou com &lt;strong&gt;ARM Templates&lt;/strong&gt; na Azure, sabe bem o quanto pode ser frustrante: arquivos JSON verbosos, difíceis de ler e ainda mais difíceis de manter. O &lt;strong&gt;Bicep&lt;/strong&gt; chegou para resolver exatamente isso, uma linguagem de domínio específico (DSL) criada pela &lt;strong&gt;Microsoft&lt;/strong&gt; para declarar infraestrutura no Azure de forma limpa, simples e poderosa.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o Bicep?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bicep&lt;/strong&gt; é uma linguagem de IaC (Infrastructure as Code) desenvolvida pela Microsoft que compila diretamente para ARM Templates. Ou seja, por baixo dos panos, a Azure ainda usa ARM, mas você escreve um código muito mais legível e produtivo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Bicep é o ARM Template que você sempre quis escrever."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lançado em 2021 como GA (Generally Available), o Bicep é hoje a forma &lt;strong&gt;recomendada pela Microsoft&lt;/strong&gt; para definir recursos Azure via código.&lt;/p&gt;




&lt;h2&gt;
  
  
  Por que usar Bicep e não ARM Templates puro?
&lt;/h2&gt;

&lt;p&gt;Veja a diferença para criar um simples Storage Account:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ARM Template (JSON):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contentVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"storageAccountName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resources"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Microsoft.Storage/storageAccounts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"apiVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2022-09-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('storageAccountName')]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[resourceGroup().location]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sku"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Standard_LRS"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"StorageV2"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Bicep (equivalente):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;param storageAccountName string

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: storageAccountName
  location: resourceGroup().location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Muito mais limpo, não é? Menos linhas, sem JSON aninhado e sem aquelas funções &lt;code&gt;[parameters(...)]&lt;/code&gt; espalhadas por todo lado.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bicep vs ARM vs Terraform: qual escolher?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Característica&lt;/th&gt;
&lt;th&gt;Bicep&lt;/th&gt;
&lt;th&gt;ARM Template&lt;/th&gt;
&lt;th&gt;Terraform&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sintaxe&lt;/td&gt;
&lt;td&gt;Limpa, DSL própria&lt;/td&gt;
&lt;td&gt;JSON verboso&lt;/td&gt;
&lt;td&gt;HCL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-cloud&lt;/td&gt;
&lt;td&gt;❌ Apenas Azure&lt;/td&gt;
&lt;td&gt;❌ Apenas Azure&lt;/td&gt;
&lt;td&gt;✅ Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Suporte a recursos Azure&lt;/td&gt;
&lt;td&gt;✅ Primeiro dia&lt;/td&gt;
&lt;td&gt;✅ Primeiro dia&lt;/td&gt;
&lt;td&gt;⚠️ Depende do provider&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Curva de aprendizado&lt;/td&gt;
&lt;td&gt;Baixa&lt;/td&gt;
&lt;td&gt;Alta&lt;/td&gt;
&lt;td&gt;Média&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State file&lt;/td&gt;
&lt;td&gt;❌ Não precisa&lt;/td&gt;
&lt;td&gt;❌ Não precisa&lt;/td&gt;
&lt;td&gt;✅ Necessário&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Módulos&lt;/td&gt;
&lt;td&gt;✅ Sim&lt;/td&gt;
&lt;td&gt;⚠️ Linked templates&lt;/td&gt;
&lt;td&gt;✅ Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integração nativa Azure DevOps/GitHub&lt;/td&gt;
&lt;td&gt;✅ Nativa&lt;/td&gt;
&lt;td&gt;✅ Nativa&lt;/td&gt;
&lt;td&gt;Requer setup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Resumo prático:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se você trabalha &lt;strong&gt;exclusivamente com Azure&lt;/strong&gt; → Bicep é a melhor escolha&lt;/li&gt;
&lt;li&gt;Se precisa de &lt;strong&gt;multi-cloud&lt;/strong&gt; → Terraform&lt;/li&gt;
&lt;li&gt;Se está &lt;strong&gt;migrando ARM existente&lt;/strong&gt; → Bicep (tem conversor automático!)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Instalação
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pré-requisitos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://learn.microsoft.com/pt-br/cli/azure/install-azure-cli" rel="noopener noreferrer"&gt;Azure CLI&lt;/a&gt; instalado&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Instalar o Bicep CLI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Via Azure CLI (recomendado)&lt;/span&gt;
az bicep &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Verificar versão&lt;/span&gt;
az bicep version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Extensão para VS Code
&lt;/h3&gt;

&lt;p&gt;Instale a extensão oficial &lt;strong&gt;Bicep&lt;/strong&gt; da Microsoft no VS Code. Ela oferece:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IntelliSense completo&lt;/li&gt;
&lt;li&gt;Validação em tempo real&lt;/li&gt;
&lt;li&gt;Autocompletar de tipos de recursos e propriedades&lt;/li&gt;
&lt;li&gt;Visualização do diagrama de dependências&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conceitos Fundamentais
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Parâmetros (&lt;code&gt;param&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@description('Nome do ambiente')
@allowed(['dev', 'staging', 'prod'])
param environment string = 'dev'

@minLength(3)
@maxLength(24)
param storageAccountName string
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Os &lt;strong&gt;decorators&lt;/strong&gt; (&lt;code&gt;@description&lt;/code&gt;, &lt;code&gt;@allowed&lt;/code&gt;, &lt;code&gt;@minLength&lt;/code&gt;) substituem as validações que no ARM eram feitas dentro do JSON.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Variáveis (&lt;code&gt;var&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var location = resourceGroup().location
var tags = {
  environment: environment
  project: 'meu-projeto'
  managedBy: 'bicep'
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Recursos (&lt;code&gt;resource&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource appServicePlan 'Microsoft.Web/serverfarms@2022-03-01' = {
  name: 'plan-${environment}'
  location: location
  tags: tags
  sku: {
    name: 'B1'
    tier: 'Basic'
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Outputs (&lt;code&gt;output&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;output appServicePlanId string = appServicePlan.id
output storageAccountEndpoint string = storageAccount.properties.primaryEndpoints.blob
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Exemplo Prático: Web App com Storage
&lt;/h2&gt;

&lt;p&gt;Vamos criar um arquivo Bicep que provisiona um &lt;strong&gt;App Service + Storage Account&lt;/strong&gt; completo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// main.bicep

@description('Prefixo para os recursos')
param prefix string

@description('Ambiente de deploy')
@allowed(['dev', 'staging', 'prod'])
param environment string = 'dev'

var location = resourceGroup().location
var tags = {
  environment: environment
  managedBy: 'bicep'
}

// Storage Account
resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: '${prefix}${environment}st'
  location: location
  tags: tags
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  properties: {
    accessTier: 'Hot'
    supportsHttpsTrafficOnly: true
    minimumTlsVersion: 'TLS1_2'
  }
}

// App Service Plan
resource appServicePlan 'Microsoft.Web/serverfarms@2022-03-01' = {
  name: '${prefix}-${environment}-plan'
  location: location
  tags: tags
  sku: {
    name: environment == 'prod' ? 'S1' : 'B1'
  }
}

// Web App
resource webApp 'Microsoft.Web/sites@2022-03-01' = {
  name: '${prefix}-${environment}-app'
  location: location
  tags: tags
  properties: {
    serverFarmId: appServicePlan.id
    httpsOnly: true
    siteConfig: {
      appSettings: [
        {
          name: 'STORAGE_CONNECTION'
          value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccount.name};AccountKey=${storageAccount.listKeys().keys[0].value}'
        }
      ]
    }
  }
}

output webAppUrl string = 'https://${webApp.properties.defaultHostName}'
output storageAccountName string = storageAccount.name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Deploy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Criar Resource Group&lt;/span&gt;
az group create &lt;span class="nt"&gt;--name&lt;/span&gt; rg-meu-projeto-dev &lt;span class="nt"&gt;--location&lt;/span&gt; brazilsouth

&lt;span class="c"&gt;# Preview do que será criado (What-If)&lt;/span&gt;
az deployment group what-if &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--resource-group&lt;/span&gt; rg-meu-projeto-dev &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--template-file&lt;/span&gt; main.bicep &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--parameters&lt;/span&gt; &lt;span class="nv"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;meuprojeto &lt;span class="nv"&gt;environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dev

&lt;span class="c"&gt;# Deploy&lt;/span&gt;
az deployment group create &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--resource-group&lt;/span&gt; rg-meu-projeto-dev &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--template-file&lt;/span&gt; main.bicep &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--parameters&lt;/span&gt; &lt;span class="nv"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;meuprojeto &lt;span class="nv"&gt;environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Módulos: reutilizando código
&lt;/h2&gt;

&lt;p&gt;Uma das funcionalidades mais poderosas do Bicep são os &lt;strong&gt;módulos&lt;/strong&gt;, que permitem quebrar a infraestrutura em partes reutilizáveis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// modules/storage.bicep
param name string
param location string = resourceGroup().location

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: name
  location: location
  sku: { name: 'Standard_LRS' }
  kind: 'StorageV2'
}

output id string = storageAccount.id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// main.bicep — usando o módulo
module storage './modules/storage.bicep' = {
  name: 'storageDeployment'
  params: {
    name: 'mystorageaccount'
  }
}

output storageId string = storage.outputs.id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você também pode referenciar módulos diretamente de um &lt;strong&gt;Bicep Registry&lt;/strong&gt; (ACR) para compartilhar entre times:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module storage 'br:meuregistry.azurecr.io/bicep/storage:v1.0' = {
  name: 'storageDeployment'
  params: {
    name: 'mystorageaccount'
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Convertendo ARM Templates existentes para Bicep
&lt;/h2&gt;

&lt;p&gt;Se você já tem ARM Templates, a migração é simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Decompila ARM Template para Bicep&lt;/span&gt;
az bicep decompile &lt;span class="nt"&gt;--file&lt;/span&gt; template.json

&lt;span class="c"&gt;# Converte Bicep de volta para ARM (útil para debug)&lt;/span&gt;
az bicep build &lt;span class="nt"&gt;--file&lt;/span&gt; main.bicep
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Dicas e Boas Práticas
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use parâmetros com defaults&lt;/strong&gt; para ambientes distintos (&lt;code&gt;dev&lt;/code&gt;, &lt;code&gt;staging&lt;/code&gt;, &lt;code&gt;prod&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adicione tags&lt;/strong&gt; em todos os recursos para facilitar o custo e governança&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use &lt;code&gt;what-if&lt;/code&gt;&lt;/strong&gt; antes de todo deploy em produção&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Organize em módulos&lt;/strong&gt; desde o início evita refatorações grandes depois&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Versione no Git&lt;/strong&gt; junto ao código da aplicação (mesmo repositório)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use o Bicep Registry&lt;/strong&gt; (Azure Container Registry) para compartilhar módulos entre projetos e times&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Próximos passos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/pt-br/azure/azure-resource-manager/bicep/" rel="noopener noreferrer"&gt;Documentação oficial do Bicep&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aka.ms/bicepdemo" rel="noopener noreferrer"&gt;Bicep Playground&lt;/a&gt; — teste Bicep no browser&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://azure.github.io/Azure-Verified-Modules/" rel="noopener noreferrer"&gt;Azure Verified Modules&lt;/a&gt; — módulos Bicep oficiais e auditados pela Microsoft&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O Bicep é, sem dúvida, a evolução natural para quem trabalha com IaC na Azure. Se você ainda usa ARM Templates puros, vale muito a pena considerar a migração, pois a curva de aprendizado é baixa e os ganhos em produtividade e manutenibilidade são imediatos.&lt;/p&gt;

&lt;p&gt;E você, já está usando Bicep nos seus projetos? Deixa nos comentários!&lt;/p&gt;

</description>
      <category>azure</category>
      <category>bicep</category>
      <category>iac</category>
      <category>devops</category>
    </item>
    <item>
      <title>Automação GitOps com Terraform e Proxmox</title>
      <dc:creator>Luis Cruz</dc:creator>
      <pubDate>Fri, 30 Jan 2026 14:45:43 +0000</pubDate>
      <link>https://dev.to/luiscruzcwb/automacao-gitops-com-terraform-e-proxmox-12m7</link>
      <guid>https://dev.to/luiscruzcwb/automacao-gitops-com-terraform-e-proxmox-12m7</guid>
      <description>&lt;p&gt;Há alguns meses, adquiri um &lt;strong&gt;M910q Desktop (ThinkCentre)&lt;/strong&gt; para utilizá-lo no meu homelab, permitindo que o WSL do meu Lenovo S145 tivesse um pouco de descanso.&lt;/p&gt;

&lt;p&gt;Essa iniciativa faz parte da minha busca contínua por evolução técnica, criando ambientes de teste e homologação que me permitam experimentar novas ferramentas e abordagens com mais liberdade.&lt;/p&gt;

&lt;p&gt;Na criação das VMs, sempre utilizei o Terraform para o provisionamento. No entanto, recentemente realizei alguns ajustes importantes, integrando o GitHub e o &lt;a href="https://developer.hashicorp.com/terraform/cloud-docs" rel="noopener noreferrer"&gt;HCP Terraform&lt;/a&gt; ao fluxo de trabalho.&lt;/p&gt;

&lt;p&gt;Após dedicar algumas horas a esse processo, concluí um projeto que mudou completamente a forma como gerencio minha infraestrutura de homelab, e decidi compartilhar essa jornada com vocês.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O problema inicial&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sempre que eu precisava criar uma VM no Proxmox, o processo se repetia: abrir a interface web, preencher formulários, configurar rede manualmente, aguardar a criação da VM, acessar via SSH e configurar o ambiente. &lt;/p&gt;

&lt;p&gt;Além disso, era necessário torcer para lembrar exatamente quais passos haviam sido executados caso fosse preciso replicar o processo no futuro. &lt;/p&gt;

&lt;p&gt;Não havia histórico de mudanças, automação consistente ou rastreabilidade.&lt;/p&gt;

&lt;p&gt;Mesmo utilizando scripts ou o próprio Terraform, ainda existiam etapas manuais, tornando o processo mais demorado do que deveria e com pontos claros de melhoria.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A solução: GitOps + Terraform + GitHub Actions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Implementei um fluxo completo de GitOps, no qual toda a infraestrutura passou a ser gerenciada exclusivamente por código versionado em Git.&lt;/p&gt;

&lt;p&gt;O resultado foi bastante expressivo.&lt;/p&gt;

&lt;p&gt;Hoje, consigo criar, modificar ou remover VMs simplesmente realizando um commit e um push. Em cerca de dois a três minutos, a alteração é automaticamente aplicada no ambiente Proxmox.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que aprendi no caminho&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nem tudo é simples, especialmente para quem está começando do zero.&lt;/p&gt;

&lt;p&gt;Como já possuo uma boa experiência com essas ferramentas, configurar corretamente as permissões no Proxmox, implementar um self-hosted runner na rede local, já que o Proxmox não é acessível diretamente da nuvem, e estruturar o código de forma escalável e reutilizável não foi algo particularmente difícil.&lt;/p&gt;

&lt;p&gt;Ainda assim, cada etapa se mostrou uma oportunidade de aprendizado e de refinamento dos processos relacionados a Infrastructure as Code, CI/CD e boas práticas de automação.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Observação: para quem nunca fez algo semelhante, deixei um passo a passo detalhado, além de uma FAQ, para facilitar a reprodução do ambiente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Tecnologias utilizadas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A stack é 100% open source e gratuita. &lt;/p&gt;

&lt;p&gt;Utilizei Terraform para IaC, GitHub Actions para automação, Terraform Cloud para gerenciamento remoto de estado e Proxmox como hypervisor. Tudo isso rodando em um ambiente self-hosted, garantindo controle total sobre os dados e a infraestrutura.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O impacto real&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Antes: entre 15 e 20 minutos para criar cada VM, com um processo manual, sujeito a erros e sem histórico de alterações.&lt;/p&gt;

&lt;p&gt;Agora: cerca de 30 segundos para definir a VM em código, seguido de commit e push automáticos, com rastreabilidade completa via Git.&lt;/p&gt;

&lt;p&gt;Mais importante do que o tempo economizado foi o ganho em confiabilidade.&lt;/p&gt;

&lt;p&gt;Cada mudança passa por revisão, fica registrada no histórico do Git e pode ser revertida facilmente com um simples git revert. Isso é especialmente valioso em ambientes de experimentação, onde a possibilidade de voltar atrás com segurança faz toda a diferença.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lições aprendidas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Automação não é sobre eliminar o trabalho manual, mas sim reduzir tarefas repetitivas e propensas a erros.&lt;/p&gt;

&lt;p&gt;Infrastructure as Code não é exclusiva de grandes empresas. Homelabs são ambientes ideais para experimentação.&lt;/p&gt;

&lt;p&gt;Documentação é tão importante quanto o código. Dediquei tempo a documentar cada etapa pensando no meu “eu do futuro”.&lt;/p&gt;

&lt;p&gt;Self-hosted runners ampliam significativamente as possibilidades de automação em ambientes locais.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp19lnc9a36u6i7zvurl5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp19lnc9a36u6i7zvurl5.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Próximos passos / Melhorias&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Pretendo evoluir esse projeto integrando o Ansible, já que atualmente utilizo o &lt;a href="https://semaphoreui.com/" rel="noopener noreferrer"&gt;Semaphore UI&lt;/a&gt; para a configuração pós-criação das VMs, além de adicionar testes automatizados antes do deploy.&lt;/p&gt;

&lt;p&gt;Para quem se interessou pelos detalhes técnicos da implementação, e quiser fazer a implementação, o passo a passo, incluindo troubleshooting de todos os problemas enfrentados: &lt;a href="https://github.com/luiscruzcwb/homelab-infrastructure-template.git" rel="noopener noreferrer"&gt;homelab-infrastructure-template&lt;br&gt;
Public&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Trabalhar com infraestrutura é uma jornada contínua de aprendizado.&lt;/p&gt;

&lt;p&gt;Compartilhar conhecimento e aprender com a comunidade faz toda a diferença.&lt;/p&gt;




</description>
      <category>devops</category>
      <category>gitops</category>
      <category>terraform</category>
      <category>proxmox</category>
    </item>
    <item>
      <title>Windows - Instalando o WSL 2 e o Docker</title>
      <dc:creator>Luis Cruz</dc:creator>
      <pubDate>Wed, 10 Dec 2025 02:12:55 +0000</pubDate>
      <link>https://dev.to/luiscruzcwb/windows-instalando-o-wsl-e-o-docker-1bi2</link>
      <guid>https://dev.to/luiscruzcwb/windows-instalando-o-wsl-e-o-docker-1bi2</guid>
      <description>&lt;p&gt;Se você usa Windows e precisa trabalhar com Docker, Terraform, scripts Bash ou qualquer ferramenta nativa de Linux, o &lt;strong&gt;WSL 2 (Windows Subsystem for Linux)&lt;/strong&gt; é o caminho certo. Ele roda um kernel Linux real dentro do Windows — sem dual boot, sem máquina virtual pesada — e se integra perfeitamente com o Docker.&lt;/p&gt;

&lt;p&gt;Neste artigo você vai instalar o WSL 2 com Ubuntu e configurar o Docker, com duas opções: via &lt;strong&gt;Docker Desktop&lt;/strong&gt; (mais simples) ou via &lt;strong&gt;Docker Engine&lt;/strong&gt; direto no Linux (mais leve).&lt;/p&gt;




&lt;h2&gt;
  
  
  Pré-requisitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Windows 11 ou Windows 10 (build 19041 ou superior)&lt;/li&gt;
&lt;li&gt;Virtualização por hardware habilitada na BIOS/UEFI&lt;/li&gt;
&lt;li&gt;Conexão à internet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para verificar se a virtualização está ativa, abra o Gerenciador de Tarefas → aba &lt;strong&gt;Desempenho&lt;/strong&gt; → CPU → confirme que "Virtualização: Habilitado" aparece.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Instalar o WSL 2
&lt;/h2&gt;

&lt;p&gt;Abra o &lt;strong&gt;PowerShell como Administrador&lt;/strong&gt; e execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--install&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este comando habilita os componentes necessários, instala o WSL 2 e baixa o &lt;strong&gt;Ubuntu&lt;/strong&gt; como distribuição padrão. Ao final, reinicie o computador quando solicitado.&lt;/p&gt;

&lt;p&gt;Para instalar uma distribuição diferente, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# listar distribuições disponíveis&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--online&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# instalar uma específica&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Debian&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verificar a instalação
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--version&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-l&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-v&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A coluna &lt;strong&gt;VERSION&lt;/strong&gt; deve mostrar &lt;code&gt;2&lt;/code&gt; para confirmar que está usando WSL 2. Novas instalações com &lt;code&gt;wsl --install&lt;/code&gt; já são configuradas para WSL 2 por padrão.&lt;/p&gt;

&lt;p&gt;Para instruções detalhadas, consulte a &lt;a href="https://learn.microsoft.com/pt-br/windows/wsl/install" rel="noopener noreferrer"&gt;documentação oficial da Microsoft&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Instalar o Docker
&lt;/h2&gt;

&lt;p&gt;Você tem duas opções. Escolha a que melhor se encaixa no seu uso:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Docker Desktop&lt;/th&gt;
&lt;th&gt;Docker Engine no WSL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface gráfica&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Sim&lt;/td&gt;
&lt;td&gt;❌ Não&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Facilidade&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Alta&lt;/td&gt;
&lt;td&gt;Média&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Consumo de recursos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Maior&lt;/td&gt;
&lt;td&gt;Menor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Licença&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gratuito para uso pessoal&lt;/td&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Recomendado para&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Iniciantes e uso geral&lt;/td&gt;
&lt;td&gt;Devs que preferem CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Opção A: Docker Desktop com integração WSL 2
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Baixe o &lt;a href="https://www.docker.com/products/docker-desktop/" rel="noopener noreferrer"&gt;Docker Desktop para Windows&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Durante a instalação, mantenha marcada a opção &lt;strong&gt;Use WSL 2 instead of Hyper-V&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Após instalar, abra o Docker Desktop e vá em &lt;strong&gt;Settings → General&lt;/strong&gt; → ative &lt;strong&gt;Use the WSL 2 based engine&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Em &lt;strong&gt;Settings → Resources → WSL Integration&lt;/strong&gt;, habilite a distro que você usa (ex: Ubuntu)&lt;/li&gt;
&lt;li&gt;Abra o terminal do WSL — os comandos &lt;code&gt;docker&lt;/code&gt; e &lt;code&gt;docker compose&lt;/code&gt; já estarão disponíveis
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nt"&gt;--version&lt;/span&gt;
docker compose version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Opção B: Docker Engine dentro do Ubuntu (WSL 2)
&lt;/h3&gt;

&lt;p&gt;Abra o terminal do Ubuntu no WSL e execute os passos abaixo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adicionar o repositório oficial do Docker:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; ca-certificates curl gnupg lsb-release

curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://download.docker.com/linux/ubuntu/gpg | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sudo &lt;/span&gt;gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /usr/share/keyrings/docker-archive-keyring.gpg

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"deb [arch=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;dpkg &lt;span class="nt"&gt;--print-architecture&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  https://download.docker.com/linux/ubuntu &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;lsb_release &lt;span class="nt"&gt;-cs&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; stable"&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/docker.list &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Instalar o Docker Engine e o Compose:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; docker-ce docker-ce-cli containerd.io docker-compose-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Adicionar seu usuário ao grupo docker&lt;/strong&gt; (evita usar &lt;code&gt;sudo&lt;/code&gt; a cada comando):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker &lt;span class="nv"&gt;$USER&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Reiniciar o WSL&lt;/strong&gt; para aplicar as permissões. No PowerShell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--shutdown&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reabra o terminal do Ubuntu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Iniciar o daemon do Docker:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;service docker start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Se quiser que o Docker inicie automaticamente, ative o systemd no WSL adicionando ao &lt;code&gt;/etc/wsl.conf&lt;/code&gt;:&lt;/p&gt;


&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[boot]&lt;/span&gt;
&lt;span class="py"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Após salvar, execute &lt;code&gt;wsl --shutdown&lt;/code&gt; no PowerShell e reabra o WSL.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Verificar a instalação:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; hello-world
docker compose version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Consulte o &lt;a href="https://docs.docker.com/engine/install/ubuntu/" rel="noopener noreferrer"&gt;guia oficial de instalação no Ubuntu&lt;/a&gt; para mais detalhes.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Exemplos práticos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Subir um NGINX
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--name&lt;/span&gt; exemplo-nginx &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 &lt;span class="nt"&gt;-d&lt;/span&gt; nginx:stable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Acesse &lt;code&gt;http://localhost:8080&lt;/code&gt; no navegador do Windows, o Docker no WSL expõe as portas automaticamente para o host.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usar Docker Compose
&lt;/h3&gt;

&lt;p&gt;Crie um arquivo &lt;code&gt;compose.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx:stable&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:80"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# subir os serviços&lt;/span&gt;
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;

&lt;span class="c"&gt;# verificar status&lt;/span&gt;
docker compose ps

&lt;span class="c"&gt;# ver logs em tempo real&lt;/span&gt;
docker compose logs &lt;span class="nt"&gt;-f&lt;/span&gt;

&lt;span class="c"&gt;# encerrar e remover os containers&lt;/span&gt;
docker compose down
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/pt-br/windows/wsl/install" rel="noopener noreferrer"&gt;Como instalar o WSL – Microsoft (pt-BR)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/pt-br/windows/wsl/wsl-config" rel="noopener noreferrer"&gt;Configuração do WSL (wsl.conf / systemd)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/desktop/wsl/" rel="noopener noreferrer"&gt;Docker Desktop: integração com WSL 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/engine/install/ubuntu/" rel="noopener noreferrer"&gt;Instalar Docker Engine no Ubuntu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/compose/" rel="noopener noreferrer"&gt;Documentação do Docker Compose&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>docker</category>
      <category>wsl</category>
      <category>windows</category>
      <category>linux</category>
    </item>
    <item>
      <title>O que é Gemba? E como aplicar em times de DevOps remotos</title>
      <dc:creator>Luis Cruz</dc:creator>
      <pubDate>Fri, 24 Oct 2025 19:13:53 +0000</pubDate>
      <link>https://dev.to/luiscruzcwb/o-que-e-gemba-211d</link>
      <guid>https://dev.to/luiscruzcwb/o-que-e-gemba-211d</guid>
      <description>&lt;p&gt;&lt;strong&gt;Gemba&lt;/strong&gt; (現場) é um termo japonês que significa, literalmente, &lt;em&gt;"o lugar real"&lt;/em&gt; ou &lt;em&gt;"onde as coisas acontecem"&lt;/em&gt;. Popularizado pelo Lean Manufacturing, o conceito é simples: para entender um problema de verdade, você precisa ir até onde ele acontece, não confiar apenas em relatórios ou reuniões.&lt;/p&gt;

&lt;p&gt;Mas o que isso tem a ver com times de DevOps, engenharia de software e ambientes remotos? Muito mais do que parece.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é Lean?
&lt;/h2&gt;

&lt;p&gt;Antes de aprofundar no Gemba, vale contextualizar: o &lt;strong&gt;Lean&lt;/strong&gt; (também chamado de Lean Thinking ou Mentalidade Enxuta) é uma filosofia de gestão originada na Toyota que busca maximizar valor e eliminar desperdícios em processos. Nos últimos anos, seus princípios migraram da manufatura para times de tecnologia — e se tornaram base de frameworks como DevOps, Agile e SRE.&lt;/p&gt;

&lt;p&gt;O Gemba é um dos pilares práticos do Lean.&lt;/p&gt;




&lt;h2&gt;
  
  
  O conceito de Gemba
&lt;/h2&gt;

&lt;p&gt;No contexto empresarial, o Gemba é o local onde o valor é criado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Em uma fábrica → o chão de produção&lt;/li&gt;
&lt;li&gt;Em uma empresa de software → onde os desenvolvedores codificam e operam sistemas&lt;/li&gt;
&lt;li&gt;Em uma loja de varejo → o piso de atendimento ao cliente&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A filosofia incentiva líderes e gestores a irem até esse local para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Observar os processos diretamente&lt;/li&gt;
&lt;li&gt;Identificar problemas reais, não apenas dados em relatórios&lt;/li&gt;
&lt;li&gt;Ouvir os colaboradores que estão na linha de frente&lt;/li&gt;
&lt;li&gt;Tomar decisões baseadas em fatos, não em suposições&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Gemba Walk
&lt;/h2&gt;

&lt;p&gt;O conceito associado mais conhecido é o &lt;strong&gt;Gemba Walk&lt;/strong&gt; — uma visita estruturada ao local de trabalho com o objetivo de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entender o fluxo de trabalho real&lt;/li&gt;
&lt;li&gt;Detectar desperdícios ou gargalos&lt;/li&gt;
&lt;li&gt;Promover a melhoria contínua (Kaizen)&lt;/li&gt;
&lt;li&gt;Fortalecer o relacionamento entre gestão e equipe&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Importante:&lt;/strong&gt; o Gemba Walk não é uma auditoria ou fiscalização. É uma oportunidade de aprendizado mútuo — a ideia é entender, não julgar.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Princípios de uma boa prática de Gemba
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Princípio&lt;/th&gt;
&lt;th&gt;Como aplicar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ir ao Gemba&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Visite o local real com frequência, sem intermediários&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Observar com propósito&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Veja como o trabalho realmente é feito, não como deveria ser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fazer perguntas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Entenda os "porquês" por trás dos processos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ouvir os colaboradores&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Eles conhecem os desafios diários melhor que qualquer relatório&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agir com respeito&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A ideia é aprender, nunca expor ou pressionar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Promover melhorias&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Use os insights para implementar melhorias sustentáveis&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Benefícios do Gemba
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Aumento da eficiência operacional&lt;/li&gt;
&lt;li&gt;Redução de desperdícios no fluxo de trabalho&lt;/li&gt;
&lt;li&gt;Maior engajamento e confiança da equipe&lt;/li&gt;
&lt;li&gt;Tomada de decisão mais assertiva e baseada em fatos&lt;/li&gt;
&lt;li&gt;Cultura de melhoria contínua enraizada no dia a dia&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Como aplicar Gemba e Lean com trabalho remoto e times distribuídos
&lt;/h2&gt;

&lt;p&gt;Essa é a pergunta prática: como ir ao "lugar real" quando o time está espalhado em fusos diferentes?&lt;/p&gt;

&lt;p&gt;A resposta é que o Gemba não precisa ser físico — ele precisa ser &lt;strong&gt;real&lt;/strong&gt;. Em times remotos, o Gemba é o espaço digital onde o trabalho acontece.&lt;/p&gt;

&lt;h3&gt;
  
  
  Redefinindo o Gemba no remoto
&lt;/h3&gt;

&lt;p&gt;O "lugar real" de um time de tecnologia remoto está em:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Repositórios de código&lt;/strong&gt; — GitHub, GitLab (onde o trabalho é registrado)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sistemas de tickets&lt;/strong&gt; — Jira, Linear, ServiceNow (onde o fluxo é visível)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboards de observabilidade&lt;/strong&gt; — Grafana, Prometheus, Datadog (onde os problemas aparecem)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ferramentas de colaboração&lt;/strong&gt; — Slack, Teams, Confluence (onde as decisões acontecem)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pipelines de CI/CD&lt;/strong&gt; — onde o valor chega ao cliente&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Fazendo Gemba Walks digitais
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ação&lt;/th&gt;
&lt;th&gt;Como adaptar no remoto&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Observar o trabalho em tempo real&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sessões de pair programming, compartilhamento de tela, gravações de Loom&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fazer perguntas abertas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Check-ins por vídeo ou threads assíncronas no Slack/Teams&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Identificar desperdícios&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Analisar tempo de espera em PRs, filas de aprovação, lead time no Jira&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Documentar aprendizados&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Logs de Gemba Walks no Confluence ou Notion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Aplicando Lean no remoto
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mapeie o fluxo de valor digital (Value Stream Mapping)
&lt;/h3&gt;

&lt;p&gt;Entenda todas as etapas entre a demanda e a entrega. Exemplo em infraestrutura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Solicitação → Escrita do Terraform → Code Review → CI/CD → Validação → Deploy → Monitoramento
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada etapa pode ter desperdícios escondidos — tempo de espera, retrabalho, falta de clareza.&lt;/p&gt;

&lt;h3&gt;
  
  
  Identifique desperdícios remotos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Espera por aprovações manuais&lt;/li&gt;
&lt;li&gt;Retrabalho por requisitos mal definidos&lt;/li&gt;
&lt;li&gt;Sobrecarga por excesso de reuniões&lt;/li&gt;
&lt;li&gt;Falta de visibilidade do progresso para o time&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Estimule o Kaizen remoto
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Faça retrospectivas Lean curtas e frequentes (não apenas no fim do sprint)&lt;/li&gt;
&lt;li&gt;Capture ideias de melhoria em murais colaborativos (Miro, FigJam)&lt;/li&gt;
&lt;li&gt;Implemente pequenas melhorias rápidas e meça os resultados antes de escalar&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Ferramentas para suportar Lean + Gemba em times remotos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Categoria&lt;/th&gt;
&lt;th&gt;Ferramentas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gestão visual (Kanban)&lt;/td&gt;
&lt;td&gt;Trello, Jira, Linear, Asana&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automação e fluxo&lt;/td&gt;
&lt;td&gt;GitHub Actions, GitLab CI/CD, Jenkins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observabilidade&lt;/td&gt;
&lt;td&gt;Grafana, Prometheus, Datadog, New Relic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Colaboração&lt;/td&gt;
&lt;td&gt;Slack, Zoom, Teams&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Documentação de Gemba Walks&lt;/td&gt;
&lt;td&gt;Confluence, Notion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Exemplo prático: Gemba em uma equipe de DevOps remota
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problema identificado&lt;/th&gt;
&lt;th&gt;Gemba Walk digital&lt;/th&gt;
&lt;th&gt;Ação Lean&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Demora no provisionamento de VMs&lt;/td&gt;
&lt;td&gt;Acompanhar fluxo no Terraform + GitLab CI com a equipe&lt;/td&gt;
&lt;td&gt;Automatizar aprovações com policy as code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incidentes frequentes em produção&lt;/td&gt;
&lt;td&gt;Analisar logs no Grafana + entrevistar o on-call&lt;/td&gt;
&lt;td&gt;Criar runbooks e alertas mais precisos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backlog sem clareza&lt;/td&gt;
&lt;td&gt;Revisitar o Jira ao vivo com o time&lt;/td&gt;
&lt;td&gt;Definir Definition of Ready para cada ticket&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O Gemba não é um conceito preso em fábricas japonesas dos anos 1950. É uma mentalidade que permanece relevante em qualquer contexto onde haja trabalho real acontecendo — incluindo times de DevOps, engenharia de plataforma e operações em nuvem.&lt;/p&gt;

&lt;p&gt;A chave está em fazer a pergunta certa: &lt;em&gt;onde, de fato, o trabalho acontece no nosso time?&lt;/em&gt; E depois ir lá — seja fisicamente ou digitalmente — para observar, ouvir e melhorar de forma contínua.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Em inglês:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kaizen.com/insights/gemba/" rel="noopener noreferrer"&gt;Gemba and Its Meaning – The Heart of Lean Management (Kaizen Institute)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.processexcellencenetwork.com/lean-six-sigma-business-performance/articles/what-is-lean" rel="noopener noreferrer"&gt;What is Lean? (Process Excellence Network)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://leanconstruction.org/" rel="noopener noreferrer"&gt;Gemba Walks in Lean Construction (LeanConstruction.org)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Em português:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://voitto.com.br/blog/artigo/gemba" rel="noopener noreferrer"&gt;Gemba: entenda o conceito que faz parte do Lean (Voitto)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.sydle.com/br/blog/lean-ti" rel="noopener noreferrer"&gt;Lean TI: como otimizar processos de TI (Sydle)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.manageengine.com/br/itil/metodologia-lean.html" rel="noopener noreferrer"&gt;Metodologia Lean aplicada à TI (ManageEngine Brasil)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>lean</category>
      <category>agile</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Instalando o Terraform no Debian 12 (Bookworm)</title>
      <dc:creator>Luis Cruz</dc:creator>
      <pubDate>Tue, 27 Feb 2024 00:34:15 +0000</pubDate>
      <link>https://dev.to/luiscruzcwb/instalando-o-terraform-no-debian-12-bookworm-2edl</link>
      <guid>https://dev.to/luiscruzcwb/instalando-o-terraform-no-debian-12-bookworm-2edl</guid>
      <description>&lt;p&gt;O &lt;strong&gt;Terraform&lt;/strong&gt; é a principal ferramenta de infraestrutura como código (IaC) do mercado, desenvolvida pela HashiCorp. Com ele você descreve sua infraestrutura em arquivos &lt;code&gt;.tf&lt;/code&gt; e aplica mudanças de forma previsível e rastreável em dezenas de providers — AWS, Azure, GCP, Docker e muito mais.&lt;/p&gt;

&lt;p&gt;Neste artigo você vai instalar o Terraform no &lt;strong&gt;Debian 12 (Bookworm)&lt;/strong&gt; a partir do repositório oficial da HashiCorp e validar a instalação com um exemplo prático: subir um container NGINX com Docker gerenciado pelo Terraform.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Segurança:&lt;/strong&gt; sempre verifique a impressão digital (fingerprint) da chave GPG antes de adicionar repositórios externos. O passo de verificação está incluído abaixo.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Pré-requisitos
&lt;/h2&gt;

&lt;p&gt;Atualize o sistema e instale as dependências necessárias:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; gnupg ca-certificates lsb-release wget curl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gnupg&lt;/code&gt; e &lt;code&gt;ca-certificates&lt;/code&gt; — verificação de assinaturas GPG&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lsb-release&lt;/code&gt; — obtém o codinome da distribuição de forma confiável&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Adicionar o repositório oficial da HashiCorp
&lt;/h2&gt;

&lt;p&gt;Baixe e registre a chave GPG no formato esperado pelo APT:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget &lt;span class="nt"&gt;-O-&lt;/span&gt; https://apt.releases.hashicorp.com/gpg | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sudo &lt;/span&gt;gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /usr/share/keyrings/hashicorp-archive-keyring.gpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicione o repositório usando o codinome da sua distro e a arquitetura detectadas automaticamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;CODENAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;lsb_release &lt;span class="nt"&gt;-cs&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-oP&lt;/span&gt; &lt;span class="s1"&gt;'(?&amp;lt;=VERSION_CODENAME=).*'&lt;/span&gt; /etc/os-release&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;dpkg &lt;span class="nt"&gt;--print-architecture&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb [arch=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  https://apt.releases.hashicorp.com &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CODENAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; main"&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/hashicorp.list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;O &lt;code&gt;lsb_release -cs&lt;/code&gt; é a fonte principal; o &lt;code&gt;grep&lt;/code&gt; no &lt;code&gt;/etc/os-release&lt;/code&gt; é o fallback caso &lt;code&gt;lsb-release&lt;/code&gt; não esteja disponível.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. Instalar o Terraform
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; terraform
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confirme a versão instalada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform &lt;span class="nt"&gt;-version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saída esperada (versão pode variar):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Terraform v1.10.x
on linux_amd64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Para instalar uma versão específica, use &lt;code&gt;sudo apt-get install -y terraform=1.9.8-1&lt;/code&gt; ou baixe o binário diretamente em &lt;a href="https://releases.hashicorp.com/terraform/" rel="noopener noreferrer"&gt;releases.hashicorp.com&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3. Verificar a chave GPG (fingerprint)
&lt;/h2&gt;

&lt;p&gt;Confirme que a chave instalada corresponde à publicada pela HashiCorp:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gpg &lt;span class="nt"&gt;--no-default-keyring&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--keyring&lt;/span&gt; /usr/share/keyrings/hashicorp-archive-keyring.gpg &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--fingerprint&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compare o fingerprint retornado com o valor oficial publicado em &lt;a href="https://www.hashicorp.com/security" rel="noopener noreferrer"&gt;hashicorp.com/security&lt;/a&gt;. Se não bater, remova o keyring e refaça o processo.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Exemplo prático: Terraform + Docker + NGINX
&lt;/h2&gt;

&lt;p&gt;Vamos provisionar um container NGINX via Terraform para validar a instalação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pré-requisitos do exemplo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Docker instalado e em execução&lt;/li&gt;
&lt;li&gt;Usuário com permissão no socket Docker: &lt;code&gt;sudo usermod -aG docker $USER&lt;/code&gt; (relogin necessário)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Estrutura do projeto
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/learn-terraform-docker-container
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/learn-terraform-docker-container
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crie o arquivo &lt;code&gt;main.tf&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano main.tf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Arquivo main.tf
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;terraform&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;required_version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&amp;gt;= 1.5.0"&lt;/span&gt;
  &lt;span class="nx"&gt;required_providers&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;docker&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;source&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"kreuzwerker/docker"&lt;/span&gt;
      &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"~&amp;gt; 3.6"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;provider&lt;/span&gt; &lt;span class="s2"&gt;"docker"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;host&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"unix:///var/run/docker.sock"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"docker_image"&lt;/span&gt; &lt;span class="s2"&gt;"nginx"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;         &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"nginx:latest"&lt;/span&gt;
  &lt;span class="nx"&gt;keep_locally&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"docker_container"&lt;/span&gt; &lt;span class="s2"&gt;"nginx"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;docker_image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nginx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;image_id&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tutorial-nginx"&lt;/span&gt;

  &lt;span class="nx"&gt;ports&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;internal&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;
    &lt;span class="nx"&gt;external&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8000&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fluxo de execução
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Inicializar&lt;/strong&gt; — baixa o provider Docker e cria o &lt;code&gt;terraform.lock.hcl&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Formatar e validar&lt;/strong&gt; — garante que o código está correto antes de aplicar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform &lt;span class="nb"&gt;fmt
&lt;/span&gt;terraform validate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Planejar&lt;/strong&gt; — visualize o que será criado sem aplicar nada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform plan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Aplicar&lt;/strong&gt; — cria os recursos. Confirme digitando &lt;code&gt;yes&lt;/code&gt; quando solicitado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verificar
&lt;/h3&gt;

&lt;p&gt;Acesse &lt;code&gt;http://localhost:8000&lt;/code&gt; no navegador ou via curl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"%{http_code}"&lt;/span&gt; http://localhost:8000
&lt;span class="c"&gt;# esperado: 200&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Liste o container criado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps &lt;span class="nt"&gt;--filter&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tutorial-nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Destruir os recursos
&lt;/h3&gt;

&lt;p&gt;Quando terminar, remova tudo o que o Terraform criou:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform destroy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confirme com &lt;code&gt;yes&lt;/code&gt;. Em pipelines automatizados, use &lt;code&gt;--auto-approve&lt;/code&gt; com cautela, nunca em produção sem controles adicionais.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referência rápida dos comandos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Comando&lt;/th&gt;
&lt;th&gt;O que faz&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;terraform init&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inicializa o projeto e baixa providers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;terraform fmt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Formata os arquivos &lt;code&gt;.tf&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;terraform validate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Valida sintaxe e configurações&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;terraform plan&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mostra o que será criado/alterado/destruído&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;terraform apply&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Aplica as mudanças&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;terraform destroy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Remove todos os recursos gerenciados&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Boas práticas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trave versões:&lt;/strong&gt; use &lt;code&gt;required_version&lt;/code&gt; e &lt;code&gt;version&lt;/code&gt; nos &lt;code&gt;required_providers&lt;/code&gt; para evitar quebras por atualização automática&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commit do lock file:&lt;/strong&gt; versione o &lt;code&gt;terraform.lock.hcl&lt;/code&gt; para garantir builds reproduzíveis no time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nunca suba segredos em &lt;code&gt;.tf&lt;/code&gt;:&lt;/strong&gt; use variáveis de ambiente, &lt;code&gt;terraform.tfvars&lt;/code&gt; (fora do git) ou HashiCorp Vault&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Planeje antes de aplicar:&lt;/strong&gt; em produção, sempre use &lt;code&gt;terraform plan -out=tfplan&lt;/code&gt; e revise antes de &lt;code&gt;terraform apply tfplan&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verifique fingerprints GPG&lt;/strong&gt; ao adicionar novos repositórios&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.hashicorp.com/terraform/install" rel="noopener noreferrer"&gt;Documentação oficial de instalação&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hashicorp.com/en/official-packaging-guide" rel="noopener noreferrer"&gt;Guia oficial de packaging HashiCorp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.hashicorp.com/terraform/tutorials/docker-get-started" rel="noopener noreferrer"&gt;Tutorial: Terraform + Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://registry.terraform.io/providers/kreuzwerker/docker/latest" rel="noopener noreferrer"&gt;Provider Docker no Registry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kreuzwerker/terraform-provider-docker" rel="noopener noreferrer"&gt;Repositório do provider Docker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>terraform</category>
      <category>linux</category>
      <category>iac</category>
      <category>devops</category>
    </item>
    <item>
      <title>Monitorando Windows com Prometheus e Windows Exporter</title>
      <dc:creator>Luis Cruz</dc:creator>
      <pubDate>Tue, 11 Jul 2023 01:25:41 +0000</pubDate>
      <link>https://dev.to/luiscruzcwb/monitorando-os-windows-com-o-prometheus-e-windows-exporter-b5m</link>
      <guid>https://dev.to/luiscruzcwb/monitorando-os-windows-com-o-prometheus-e-windows-exporter-b5m</guid>
      <description>&lt;p&gt;Saber o que está acontecendo nos seus servidores e máquinas Windows em tempo real é essencial para manter a saúde do ambiente. Com o &lt;strong&gt;Prometheus&lt;/strong&gt; e o &lt;strong&gt;Windows Exporter&lt;/strong&gt;, você coleta métricas de CPU, memória, disco, rede e muito mais, visualizando tudo em dashboards profissionais no &lt;strong&gt;Grafana&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Neste artigo você vai configurar toda essa stack em minutos usando Docker.&lt;/p&gt;




&lt;h2&gt;
  
  
  Arquitetura da solução
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7d878xt4jpwyp8237b0g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7d878xt4jpwyp8237b0g.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;Windows Exporter&lt;/strong&gt; roda diretamente no host Windows e expõe as métricas em &lt;code&gt;/metrics&lt;/code&gt;. O &lt;strong&gt;Prometheus&lt;/strong&gt; faz o scrape dessas métricas em intervalos configuráveis. O &lt;strong&gt;Grafana&lt;/strong&gt; consulta o Prometheus e exibe os dados em dashboards.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pré-requisitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Docker com Compose V2 instalado (&lt;code&gt;docker compose version&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Acesso de administrador na máquina Windows a monitorar&lt;/li&gt;
&lt;li&gt;Porta &lt;strong&gt;9182&lt;/strong&gt; liberada no firewall do Windows&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Clonar o repositório
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/luiscruzcwb/prometheus-windows-exporter
&lt;span class="nb"&gt;cd &lt;/span&gt;prometheus-windows-exporter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Configurar o Prometheus
&lt;/h2&gt;

&lt;p&gt;Navegue até a pasta &lt;code&gt;prometheus&lt;/code&gt; e edite o arquivo &lt;code&gt;prometheus.yml&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Atenção com a indentação:&lt;/strong&gt; o YAML é sensível a espaços. Use sempre espaços, nunca tabs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Adicione uma entrada para cada host Windows na seção de jobs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;scrape_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;windows-server-01'&lt;/span&gt;
    &lt;span class="na"&gt;scrape_interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;15s&lt;/span&gt;
    &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;IP-DO-HOST:9182'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
        &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;windows-server-01'&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;windows-server-02'&lt;/span&gt;
    &lt;span class="na"&gt;scrape_interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;15s&lt;/span&gt;
    &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;IP-DO-HOST-2:9182'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
        &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;windows-server-02'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Recomende criar uma entrada por host para facilitar a identificação nos dashboards.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Instalar o Windows Exporter no Host
&lt;/h2&gt;

&lt;p&gt;Acesse a &lt;a href="https://github.com/prometheus-community/windows_exporter/releases" rel="noopener noreferrer"&gt;página de releases do Windows Exporter no GitHub&lt;/a&gt; e baixe a versão mais recente do arquivo &lt;code&gt;.msi&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;64 bits:&lt;/strong&gt; &lt;code&gt;windows_exporter-X.X.X-amd64.msi&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;32 bits:&lt;/strong&gt; &lt;code&gt;windows_exporter-X.X.X-386.msi&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após o download, abra o terminal como &lt;strong&gt;Administrador&lt;/strong&gt; e execute (ajuste o nome do arquivo para a versão baixada):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;msiexec /i windows_exporter-0.29.2-amd64.msi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O instalador registra o Windows Exporter como serviço do Windows e o inicia automaticamente na porta &lt;strong&gt;9182&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para confirmar que está funcionando, abra o navegador e acesse:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:9182/metrics
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você ver uma saída com centenas de linhas de métricas, está tudo certo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Firewall:&lt;/strong&gt; caso não consiga acessar a porta de outro host, libere a porta 9182 no Windows Defender Firewall:&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;netsh advfirewall firewall add rule &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Windows Exporter"&lt;/span&gt; &lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;TCP &lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;in &lt;/span&gt;&lt;span class="nv"&gt;localport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;9182 &lt;span class="nv"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;allow
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4. Subir o ambiente com Docker
&lt;/h2&gt;

&lt;p&gt;Na raiz do repositório, execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aguarde o download das imagens e verifique se os containers estão saudáveis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Acesse os serviços:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Serviço&lt;/th&gt;
&lt;th&gt;Endereço&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Grafana&lt;/td&gt;
&lt;td&gt;&lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prometheus&lt;/td&gt;
&lt;td&gt;&lt;a href="http://localhost:9090" rel="noopener noreferrer"&gt;http://localhost:9090&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  5. Acessar o Grafana
&lt;/h2&gt;

&lt;p&gt;Abra &lt;code&gt;http://localhost:3000&lt;/code&gt; no navegador.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="err"&gt;Usuá&lt;/span&gt;&lt;span class="py"&gt;rio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;admin&lt;/span&gt;
&lt;span class="py"&gt;Senha&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="s"&gt;grafana&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Segurança:&lt;/strong&gt; troque a senha imediatamente após o primeiro acesso em &lt;strong&gt;Profile → Change password&lt;/strong&gt;. Nunca use as credenciais padrão em ambientes de produção ou expostos à rede.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No menu lateral, acesse &lt;strong&gt;Dashboards&lt;/strong&gt; e abra o dashboard &lt;strong&gt;Windows Exporter for Prometheus&lt;/strong&gt;. Você verá os dados do seu host sendo coletados em tempo real.&lt;/p&gt;




&lt;h2&gt;
  
  
  Principais métricas coletadas
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Métrica&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;windows_cpu_time_total&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Uso de CPU por estado (idle, user, privileged)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;windows_memory_available_bytes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Memória RAM disponível&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;windows_logical_disk_free_bytes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Espaço livre em disco por volume&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;windows_net_bytes_received_total&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tráfego de rede recebido&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;windows_net_bytes_sent_total&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tráfego de rede enviado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;windows_os_info&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Informações do SO (versão, build)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;windows_service_state&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Estado dos serviços do Windows&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Prometheus não coleta métricas do host&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verifique se a porta 9182 está acessível: &lt;code&gt;telnet IP-DO-HOST 9182&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Confirme se o serviço &lt;code&gt;windows_exporter&lt;/code&gt; está rodando: &lt;code&gt;Get-Service windows_exporter&lt;/code&gt; no PowerShell&lt;/li&gt;
&lt;li&gt;Cheque o firewall conforme o passo 3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Grafana não exibe dados&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Acesse &lt;code&gt;http://localhost:9090/targets&lt;/code&gt; no Prometheus e confirme que o target está com status &lt;code&gt;UP&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Verifique se o IP no &lt;code&gt;prometheus.yml&lt;/code&gt; está correto e acessível a partir do container&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Erro ao subir os containers&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Certifique-se de usar o Docker Compose V2: &lt;code&gt;docker compose version&lt;/code&gt; (sem hífen)&lt;/li&gt;
&lt;li&gt;Verifique se as portas 3000 e 9090 não estão em uso: &lt;code&gt;netstat -tulnp | grep -E '3000|9090'&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Para mais informações
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://prometheus.io/docs/introduction/overview/" rel="noopener noreferrer"&gt;Documentação oficial do Prometheus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/prometheus-community/windows_exporter/releases" rel="noopener noreferrer"&gt;Releases do Windows Exporter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/grafana/latest/administration/provisioning/" rel="noopener noreferrer"&gt;Grafana Provisioning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://samber.github.io/awesome-prometheus-alerts/rules#windows-server" rel="noopener noreferrer"&gt;Awesome Prometheus Alerts - Windows&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Dúvidas ou sugestões? Deixa nos comentários! 🤘🏻&lt;/p&gt;

</description>
      <category>prometheus</category>
      <category>grafana</category>
      <category>monitoring</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
