<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Bruno Lucio on Medium]]></title>
        <description><![CDATA[Stories by Bruno Lucio on Medium]]></description>
        <link>https://medium.com/@bruno.sph?source=rss-718f9fde02cb------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*FB21TSNSoX0ca5p3</url>
            <title>Stories by Bruno Lucio on Medium</title>
            <link>https://medium.com/@bruno.sph?source=rss-718f9fde02cb------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Tue, 19 May 2026 23:58:20 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@bruno.sph/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Criando um Lab de WildFly/JBoss Domain Mode: Domain Controller, Hosts Gerenciados e Autenticação]]></title>
            <link>https://medium.com/@bruno.sph/criando-um-lab-de-wildfly-jboss-domain-mode-domain-controller-hosts-gerenciados-e-autentica%C3%A7%C3%A3o-34aa59cbe8f0?source=rss-718f9fde02cb------2</link>
            <guid isPermaLink="false">https://medium.com/p/34aa59cbe8f0</guid>
            <category><![CDATA[java]]></category>
            <category><![CDATA[labs]]></category>
            <category><![CDATA[wildfly]]></category>
            <category><![CDATA[nginx]]></category>
            <category><![CDATA[jboss]]></category>
            <dc:creator><![CDATA[Bruno Lucio]]></dc:creator>
            <pubDate>Thu, 19 Feb 2026 11:51:47 GMT</pubDate>
            <atom:updated>2026-02-19T11:52:48.028Z</atom:updated>
            <content:encoded><![CDATA[<p>Aprenda a montar um laboratório completo de <strong>WildFly/JBoss em Domain Mode</strong>, com <strong>Domain Controller (DC)</strong>, <strong>Hosts Gerenciados (HC)</strong>, autenticação segura e deploy de aplicações em múltiplos nodes.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iuAbb3Q2xxLQpfd_vPYuew.png" /></figure><h3>1. Conceitos Básicos</h3><p>No <strong>Domain Mode</strong>, múltiplos servidores compartilham:</p><ul><li><strong>Domain Controller (DC):</strong> centraliza configuração, deploys e monitoramento.</li><li><strong>Host Controller (HC):</strong> aplica a configuração do DC e gerencia servidores locais.</li><li><strong>Autenticação Elytron:</strong> garante que hosts se comuniquem de forma segura.</li></ul><p>No lab, usamos:</p><p>ComponenteHost/ContainerFunçãoDomain Controllerdomain-controllerGerencia o domínioHost1host1Host gerenciadoHost2host2Host gerenciadoLoad Balancernginx-lbDistribui tráfego entre hosts</p><h3>2. Estrutura do Lab</h3><p>O lab utiliza <strong>Docker e Docker Compose</strong> para orquestrar os containers:</p><pre>JbossDomain/<br>├─ domain-controller/<br>│  ├─ app/<br>│  │  └─ hello-world-war-1.0.0/<br>│  │     ├─ WEB-INF/<br>│  │     └─ index.jsp<br>│  ├─ config/<br>│  │  └─ host-master.xml<br>│  ├─ domain/<br>│  │  └─ configuration/<br>│  │     ├─ mgmt-users.properties<br>│  │     └─ mgmt-groups.properties<br>│  └─ Dockerfile<br>├─ host1/<br>│  └─ config/<br>│     └─ host1.xml<br>├─ host2/<br>│  └─ config/<br>│     └─ host2.xml<br>├─ nginx/<br>│  └─ nginx.conf<br>└─ docker-compose.yml</pre><h3>3. Dockerfile do Domain Controller</h3><p>No <strong>domain-controller/Dockerfile</strong>, criamos os usuários necessários:</p><pre><br>FROM quay.io/wildfly/wildfly:latest<br>USER root<br># Admin do console (opcional)<br>RUN /opt/jboss/wildfly/bin/add-user.sh admin Admin#123 --silent<br># User usado pelo Host Controller para conectar no Domain Controller<br>RUN /opt/jboss/wildfly/bin/add-user.sh jboss Jboss@123 --silent<br>USER jboss</pre><blockquote><em>⚠️ O usuário </em><em>jboss será usado pelos Hosts para autenticação no Domain Controller.</em></blockquote><h3>4. Docker Compose: Configuração do Lab</h3><p>O <strong>docker-compose.yml</strong> define todos os containers e redes:</p><pre>services:<br>  domain-controller:<br>    build:<br>      context: ./domain-controller<br>    container_name: domain-controller<br>    command: &gt;<br>      /opt/jboss/wildfly/bin/domain.sh<br>      --host-config=host-master.xml -b 0.0.0.0<br>      -bmanagement 0.0.0.0<br>    ports:<br>      - &quot;9990:9990&quot;<br>      - &quot;9999:9999&quot;<br>    environment:<br>      - NODE_NAME=domain-controller<br>    volumes:<br>      - ./domain-controller/config/host-master.xml:/opt/jboss/wildfly/domain/configuration/host-master.xml:ro<br>      - ./domain-controller/domain/configuration/mgmt-users.properties:/opt/jboss/wildfly/domain/configuration/mgmt-users.properties<br>      - ./domain-controller/domain/configuration/mgmt-groups.properties:/opt/jboss/wildfly/domain/configuration/mgmt-groups.properties<br>    networks:<br>      - wildfly-net</pre><pre>  host1:<br>    image: quay.io/wildfly/wildfly:latest<br>    container_name: host1<br>    command: &gt;<br>      /opt/jboss/wildfly/bin/domain.sh<br>      --host-config=host1.xml<br>      -Djboss.domain.master.address=domain-controller<br>      -b 0.0.0.0<br>      -bmanagement 0.0.0.0<br>    volumes:<br>      - ./host1/config/host1.xml:/opt/jboss/wildfly/domain/configuration/host1.xml:ro<br>      - ./domain-controller/domain/configuration/mgmt-users.properties:/opt/jboss/wildfly/domain/configuration/mgmt-users.properties<br>      - ./domain-controller/domain/configuration/mgmt-groups.properties:/opt/jboss/wildfly/domain/configuration/mgmt-groups.properties<br>    environment:<br>      - NODE_NAME=host1<br>    depends_on:<br>      - domain-controller<br>    networks:<br>      - wildfly-net</pre><pre>  host2:<br>    image: quay.io/wildfly/wildfly:latest<br>    container_name: host2<br>    command: &gt;<br>      /opt/jboss/wildfly/bin/domain.sh<br>      --host-config=host2.xml<br>      -Djboss.domain.master.address=domain-controller<br>      -b 0.0.0.0<br>      -bmanagement 0.0.0.0<br>    volumes:<br>      - ./host2/config/host2.xml:/opt/jboss/wildfly/domain/configuration/host2.xml:ro<br>    environment:<br>      - NODE_NAME=host2<br>    depends_on:<br>      - domain-controller<br>    networks:<br>      - wildfly-net</pre><pre>  nginx:<br>    image: nginx:alpine<br>    container_name: nginx-lb<br>    ports:<br>      - &quot;80:80&quot;<br>    volumes:<br>      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro<br>    depends_on:<br>      - host1<br>      - host2<br>    networks:<br>      - wildfly-net</pre><pre>networks:<br>  wildfly-net:<br>    driver: bridge</pre><h3>5. Configuração do Domain Controller (host-master.xml)</h3><p>O <strong>host-master.xml</strong> define:</p><ul><li>&lt;local/&gt; → este host é o Domain Controller</li><li>Interfaces de management (9990 HTTP e 9999 Native)</li><li>Usuário para autenticação dos hosts</li></ul><p>Exemplo resumido:</p><pre>&lt;domain-controller&gt;<br>    &lt;local/&gt;<br>&lt;/domain-controller&gt;</pre><pre>&lt;interfaces&gt;<br>    &lt;interface name=&quot;management&quot;&gt;<br>        &lt;inet-address value=&quot;0.0.0.0&quot;/&gt;<br>    &lt;/interface&gt;<br>&lt;/interfaces&gt;</pre><pre>&lt;management&gt;<br>    &lt;management-interfaces&gt;<br>        &lt;http-interface http-authentication-factory=&quot;management-http-authentication&quot;&gt;<br>            &lt;socket interface=&quot;management&quot; port=&quot;9990&quot;/&gt;<br>        &lt;/http-interface&gt;<br>    &lt;/management-interfaces&gt;<br>&lt;/management&gt;</pre><h3>6. Configuração dos Hosts (host1.xml / host2.xml)</h3><p>Cada host precisa de:</p><ol><li>Nome único (&lt;host name=&quot;host1&quot;&gt;)</li><li>Informações do Domain Controller (&lt;domain-controller&gt;&lt;remote .../&gt;&lt;/domain-controller&gt;)</li><li>Configuração Elytron para autenticação:</li></ol><pre>&lt;subsystem xmlns=&quot;urn:wildfly:elytron:15.0&quot;&gt;<br>    &lt;authentication-client&gt;<br>        &lt;authentication-configuration name=&quot;hostAuthConfig&quot;<br>                                      authentication-name=&quot;jboss&quot;<br>                                      realm=&quot;ManagementRealm&quot;&gt;<br>            &lt;credential-reference clear-text=&quot;Jboss@123&quot;/&gt;<br>        &lt;/authentication-configuration&gt;<br>        &lt;authentication-context name=&quot;hcAuthContext&quot;&gt;<br>            &lt;match-rule authentication-configuration=&quot;hostAuthConfig&quot;/&gt;<br>        &lt;/authentication-context&gt;<br>    &lt;/authentication-client&gt;<br>&lt;/subsystem&gt;</pre><pre>&lt;domain-controller&gt;<br>    &lt;remote protocol=&quot;remote&quot;<br>            host=&quot;domain-controller&quot;<br>            port=&quot;9999&quot;<br>            authentication-context=&quot;hcAuthContext&quot;/&gt;<br>&lt;/domain-controller&gt;</pre><h3>7. Deploy de Aplicações</h3><p>Após iniciar todos os containers:</p><pre>docker-compose up -d</pre><p>Acesse o <strong>Admin Console</strong> no browser:</p><pre>http://localhost:9990</pre><p>Deploy via CLI no Domain Controller:</p><pre>/opt/jboss/wildfly/bin/jboss-cli.sh --connect<br>deploy /opt/jboss/wildfly/domain/deployments/app.war --server-groups=main-server-group</pre><p>Teste nos hosts:</p><pre>curl http://localhost/app/</pre><p>Você verá a resposta indicando <strong>qual host respondeu</strong>:</p><pre>Hello World!<br>Node: host1</pre><h3>8. Observabilidade</h3><ul><li>Verifique status dos hosts e deploys:</li></ul><pre>/host=*/server=*/:read-attribute(name=status)</pre><ul><li>Verifique boot errors:</li></ul><pre>/host=host1/server=server-one:read-boot-errors()</pre><h3>9. Próximos Passos</h3><ul><li>Experimente failover entre hosts</li><li>Adicione NGINX para load balancing (/app/)</li><li>Automatize deploys com Ansible ou scripts CLI</li><li>Explore autenticação Elytron avançada e SSL</li></ul><p>💡 <strong>Resumo:</strong><br>Com este laboratório, você aprende a configurar <strong>Domain Controller</strong>, <strong>Hosts Gerenciados</strong>, autenticação segura e deploy de aplicações centralizado no <strong>WildFly/JBoss Domain Mode</strong> usando <strong>Docker</strong>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=34aa59cbe8f0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Laboratório WildFly (JBoss) Standalone com 3 instâncias + NGINX Load Balancer no Docker]]></title>
            <link>https://medium.com/@bruno.sph/laborat%C3%B3rio-wildfly-jboss-standalone-com-3-inst%C3%A2ncias-nginx-load-balancer-no-docker-c4d29c2f2295?source=rss-718f9fde02cb------2</link>
            <guid isPermaLink="false">https://medium.com/p/c4d29c2f2295</guid>
            <category><![CDATA[labs]]></category>
            <category><![CDATA[jboss]]></category>
            <category><![CDATA[hands-on]]></category>
            <dc:creator><![CDATA[Bruno Lucio]]></dc:creator>
            <pubDate>Mon, 16 Feb 2026 10:26:03 GMT</pubDate>
            <atom:updated>2026-02-16T10:26:51.961Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UorGk_0FDLssI5lz6VwKHg.png" /></figure><p>Mesmo com o avanço de Kubernetes e plataformas gerenciadas, ainda é muito comum encontrar aplicações Java rodando em <strong>WildFly/JBoss em modo standalone</strong>, com múltiplas instâncias atrás de um load balancer.</p><p>Para estudar esse cenário de forma prática, montei um laboratório local usando <strong>Docker Compose</strong>, simulando uma arquitetura clássica e bastante realista.</p><h3>🎯 Objetivo</h3><p>Criar um ambiente com:</p><ul><li><strong>3 instâncias WildFly standalone</strong></li><li><strong>1 NGINX atuando como Load Balancer</strong></li><li>Deploy de uma aplicação .war em todas as instâncias</li><li>Acesso individual ao <strong>management console</strong> de cada nó</li><li>Operação via <strong>JBoss CLI</strong> (deploy/undeploy) dentro dos containers</li></ul><h3>🧱 Arquitetura do laboratório</h3><p>O fluxo fica assim:</p><pre>Cliente -&gt; http://localhost:8080/app/ -&gt; NGINX -&gt; wildfly1/wildfly2/wildfly3</pre><p>Cada instância WildFly expõe duas portas:</p><ul><li><strong>8080</strong> → aplicação</li><li><strong>9990</strong> → management console</li></ul><p>No host, as portas foram mapeadas assim:</p><p>Instância | App | Management<br> — — — — — — | — — | — — — — — <br>wildfly1 | 8081 | 9991<br>wildfly2 | 8082 | 9992<br>wildfly3 | 8083 | 9993<br>nginx-lb | 8080 | -</p><p>Dentro da pasta do projeto:</p><pre>docker compose up -d --build</pre><p>Verificando os containers:</p><pre>docker ps</pre><h3>🌍 Acessos</h3><h3>Aplicação via Load Balancer</h3><pre>http://localhost:8080/app/</pre><h3>Acesso direto a cada instância</h3><ul><li><a href="http://localhost:8081/app/">http://localhost:8081/app/</a></li><li><a href="http://localhost:8082/app/">http://localhost:8082/app/</a></li><li><a href="http://localhost:8083/app/">http://localhost:8083/app/</a></li></ul><h3>Management Console por instância</h3><ul><li><a href="http://localhost:9991/console">http://localhost:9991/console</a></li><li><a href="http://localhost:9992/console">http://localhost:9992/console</a></li><li><a href="http://localhost:9993/console">http://localhost:9993/console</a></li></ul><h3>📦 Deploy e Undeploy via JBoss CLI (usando Docker)</h3><p>Um dos pontos mais importantes do laboratório é operar o WildFly sem depender da UI, usando o CLI diretamente dentro do container.</p><h3>1) Entrar no container</h3><pre>docker exec -it wildfly1 bash</pre><h3>2) Acessar o JBoss CLI</h3><pre>/opt/jboss/wildfly/bin/jboss-cli.sh --connect</pre><h3>3) Listar deployments</h3><pre>deployment-info</pre><h3>4) Undeploy</h3><pre>undeploy app.war</pre><h3>5) Deploy</h3><p>Se o WAR estiver dentro do container:</p><pre>deploy /opt/jboss/wildfly/standalone/deployments/app.war --force</pre><h3>🧪 O que esse laboratório simula na prática?</h3><p>Esse lab reproduz muito bem ambientes tradicionais onde existem:</p><ul><li>múltiplas instâncias standalone</li><li>reverse proxy / load balancer na frente</li><li>deploys controlados por CLI</li><li>operação por nó (management isolado)</li></ul><p>É um cenário extremamente útil para aprender conceitos de:</p><ul><li>escalabilidade horizontal</li><li>troubleshooting de proxy</li><li>deploy e rollback</li><li>arquitetura clássica Java EE</li></ul><h3>✅ Conclusão</h3><p>Esse laboratório é simples, mas extremamente efetivo para estudar WildFly/JBoss em um cenário realista, com múltiplas instâncias e balanceamento via NGINX — tudo de forma reproduzível e portátil com Docker.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c4d29c2f2295" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ Evoluindo com Kubernetes: Como o Helm e o Princípio DRY Podem Salvar Seus Deploys]]></title>
            <link>https://medium.com/@bruno.sph/evoluindo-com-kubernetes-como-o-helm-e-o-princ%C3%ADpio-dry-podem-salvar-seus-deploys-9b3216cf6844?source=rss-718f9fde02cb------2</link>
            <guid isPermaLink="false">https://medium.com/p/9b3216cf6844</guid>
            <category><![CDATA[helm]]></category>
            <category><![CDATA[dry]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[melhores-praticas]]></category>
            <dc:creator><![CDATA[Bruno Lucio]]></dc:creator>
            <pubDate>Mon, 07 Apr 2025 01:05:15 GMT</pubDate>
            <atom:updated>2025-04-07T01:07:09.904Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/290/1*3OLcuWzNtbjUBGawlOD-OA.png" /></figure><blockquote>“Se você ainda copia e cola YAMLs, está na hora de repensar sua estratégia.”</blockquote><h3>📌 TL;DR</h3><ul><li>Repetir manifestos Kubernetes é uma armadilha comum.</li><li>Helm resolve isso com templates reutilizáveis.</li><li>Aplicar o princípio <strong>DRY</strong> (Don’t Repeat Yourself) à infraestrutura traz ganhos de escala, clareza e automação.</li><li>Menos erro humano, mais padronização e tempo ganho em deploys.</li></ul><h3>🧱 A dor da repetição: quando o YAML vira dívida técnica</h3><p>Começa com um deployment.yaml. Depois um service.yaml. Em pouco tempo, dezenas de aplicações, cada uma com sua cópia dos mesmos arquivos. Só mudam alguns nomes.</p><p>E aí você se pergunta:</p><blockquote>“Por que estou repetindo tanta coisa se só o nome do container muda?”</blockquote><p>É o que chamo de <strong>síndrome do copy/paste no DevOps</strong> — e sim, ela tem cura.</p><h3>💡 DRY: Don’t Repeat Yourself, especialmente na infraestrutura</h3><p>O princípio <strong>DRY</strong> foi criado para o desenvolvimento de software, mas cabe perfeitamente na infraestrutura:</p><blockquote><em>“</em>Cada peça de conhecimento deve ter uma representação única, inequívoca e definitiva dentro do sistema.<em>”</em></blockquote><p>No Kubernetes, isso significa parar de repetir lógica em vários arquivos YAML. <strong>Centralize, templateze, padronize.</strong></p><h3>🎯 A resposta: Helm</h3><p><a href="https://helm.sh/">Helm</a> é o que falta quando você percebe que está repetindo tudo em cada aplicação.</p><p>Ele transforma seu amontoado de YAMLs em um <strong>pacote versionável e parametrizável</strong>, chamado <strong>Chart</strong>.</p><h3>📦 Estrutura típica de um Helm Chart</h3><pre>my-app-chart/<br>├── Chart.yaml<br>├── values.yaml<br>└── templates/<br>    ├── deployment.yaml<br>    ├── service.yaml<br>    └── ingress.yaml</pre><p>Você substitui duplicações com placeholders, como:</p><pre># templates/deployment.yaml<br>spec:<br>  replicas: {{ .Values.replicaCount }}<br>  containers:<br>    - image: &quot;{{ .Values.image.repository }}:{{ .Values.image.tag }}&quot;</pre><p>E no values.yaml, define:</p><pre>replicaCount: 3<br>image:<br>  repository: minha-imagem<br>  tag: &quot;1.0.0&quot;</pre><p>✅ Pronto. Agora você só precisa mudar valores, não a estrutura inteira.</p><h3>🔁 DRY em ação: menos esforço, mais escala</h3><h3>Vantagens reais do Helm:</h3><ul><li>✅ <strong>Reutilização total</strong>: um chart, vários apps</li><li>✅ <strong>Padronização</strong>: todos seguem o mesmo formato</li><li>✅ <strong>Segurança</strong>: menos erro humano</li><li>✅ <strong>Escalabilidade</strong>: times diferentes, mesmas boas práticas</li><li>✅ <strong>Rollback facilitado</strong>: helm rollback resolve</li></ul><h3>⚙️ Helm + CI/CD = Deploy de verdade</h3><p>Integre o Helm à sua pipeline e simplifique o deploy com:</p><pre>helm upgrade --install myapp ./my-chart -f values-prod.yaml</pre><p>E se algo der ruim:</p><pre>helm rollback myapp 1</pre><p>Mais simples, mais seguro.</p><h3>✅ Conclusão</h3><p><strong>Usar Helm é aplicar DRY na infraestrutura.</strong><br> Você ganha agilidade, reduz erros e entrega com mais confiança. É o tipo de prática que eleva seu time de Kubernetes para um nível profissional.</p><h3>💬 Curtiu o conteúdo?</h3><p>Deixe um comentário contando se você já está usando Helm ou se ainda está no modo manual. Bora trocar ideia!</p><p>📲 Me encontra no <a href="https://linkedin.com/in/blcsilva">LinkedIn</a> também.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9b3216cf6844" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ Como Automatizar Impressões em Lote com Powershell e Ação de Contexto (Botão Direito) no Windows]]></title>
            <link>https://medium.com/@bruno.sph/como-automatizar-impress%C3%B5es-em-lote-com-powershell-e-a%C3%A7%C3%A3o-de-contexto-bot%C3%A3o-direito-no-windows-31dd0a2ef665?source=rss-718f9fde02cb------2</link>
            <guid isPermaLink="false">https://medium.com/p/31dd0a2ef665</guid>
            <category><![CDATA[automação]]></category>
            <category><![CDATA[powershell]]></category>
            <dc:creator><![CDATA[Bruno Lucio]]></dc:creator>
            <pubDate>Fri, 21 Mar 2025 19:45:11 GMT</pubDate>
            <atom:updated>2025-03-21T20:15:09.567Z</atom:updated>
            <content:encoded><![CDATA[<blockquote><strong><em>Automatizar tarefas repetitivas é essencial para aumentar a produtividade e reduzir erros manuais.</em></strong><em> Neste artigo, vou compartilhar um script em Powershell que desenvolvi para automatizar a impressão de arquivos PDF e TXT em lote.</em></blockquote><h3>🎯 Por que Automatizar Impressões?</h3><p>Se você já se viu precisando imprimir vários arquivos de uma só vez, sabe como o processo pode ser tedioso e repetitivo. Ter que abrir cada arquivo individualmente, selecionar a impressora e clicar em “Imprimir” consome um tempo valioso que poderia ser melhor aproveitado em outras tarefas.</p><p>A solução? <strong>Automatização com Powershell</strong>!</p><p>Este script permite:<br> ✅ Imprimir arquivos PDF e TXT de um diretório específico;<br> ✅ Selecionar uma impressora padrão ou específica;<br> ✅ Imprimir um arquivo único, um intervalo de arquivos ou todos os arquivos disponíveis;<br> ✅ Registrar os detalhes da execução em um arquivo de log;</p><h3>🛠️ O Script em Powershell</h3><p>A seguir, o código completo do script que desenvolvi. Ele foi estruturado para oferecer uma experiência clara e simples, com mensagens de erro amigáveis e registro detalhado no log.</p><pre># Diretório onde estão os arquivos para imprimir<br>$diretorio = &quot;C:\Users\Pichau\Documents&quot;</pre><pre># Arquivo de log<br>$logFile = &quot;C:\Users\Pichau\Documents\log_impressao.txt&quot;</pre><pre># Criar (ou sobrescrever) o arquivo de log<br>&quot;===== INÍCIO DO LOG - $(Get-Date) =====&quot; | Out-File -FilePath $logFile -Encoding UTF8</pre><pre># ======================== ASCII DE BOAS-VINDAS ========================<br>Clear-Host<br>Write-Host @&quot;<br>░██████╗██████╗░██╗░░░██╗  <br>██╔════╝██╔══██╗██║░░░██║  <br>╚█████╗░██████╔╝██║░░░██║  <br>░╚═══██╗██╔═══╝░██║░░░██║  <br>██████╔╝██║░░░░░╚██████╔╝  <br>╚═════╝░╚═╝░░░░░░╚═════╝░  </pre><pre>&quot;@ -ForegroundColor Green</pre><pre>Write-Host &quot;&gt;&gt;&gt; Bem-vindo ao script de impressão automatizada!&quot; -ForegroundColor Cyan<br>Write-Host &quot;&gt;&gt;&gt; Desenvolvido por Bruno Lucio da Silva&quot; -ForegroundColor White<br>Write-Host &quot;&gt;&gt;&gt; GitHub: https://github.com/blcsilva&quot; -ForegroundColor Yellow<br>Write-Host &quot;===================================================&quot; -ForegroundColor DarkGray</pre><pre># ======================== SELECIONAR IMPRESSORA ========================<br>$impressoras = Get-Printer | Select-Object -ExpandProperty Name<br>$usarImpressoraPadrao = Read-Host &quot;Usar impressora padrão? (S/N)&quot;</pre><pre>if ($usarImpressoraPadrao -eq &#39;S&#39; -or $usarImpressoraPadrao -eq &#39;s&#39;) {<br>    $impressora = (Get-Printer | Where-Object { $_.Default -eq $true }).Name<br>} else {<br>    Write-Host &quot;`n=== Impressoras Disponíveis ===&quot;<br>    for ($i = 0; $i -lt $impressoras.Count; $i++) {<br>        Write-Host &quot;$($i + 1) - $($impressoras[$i])&quot;<br>    }</pre><pre>    $indice = [int](Read-Host &quot;Digite o número da impressora desejada&quot;)<br>    $impressora = $impressoras[$indice - 1]<br>}</pre><pre># ======================== OBTER ARQUIVOS ========================<br>$arquivos = Get-ChildItem -Path $diretorio | Where-Object { <br>    $_.Extension -eq &quot;.pdf&quot; -or $_.Extension -eq &quot;.txt&quot;<br>} | Sort-Object Name</pre><pre>if ($arquivos.Count -eq 0) {<br>    Write-Host &quot;`nNenhum arquivo encontrado para impressão.&quot;<br>    exit<br>}</pre><pre>Write-Host &quot;`n=== Arquivos Disponíveis ===&quot;<br>for ($i = 0; $i -lt $arquivos.Count; $i++) {<br>    Write-Host &quot;$($i + 1) - $($arquivos[$i].Name)&quot;<br>}</pre><pre># ======================== SELECIONAR ARQUIVOS ========================<br>$selecao = Read-Host &quot;Deseja imprimir: [T]udo, [I]ntervalo ou [U]m arquivo específico?&quot;</pre><pre>if ($selecao -eq &#39;T&#39;) {<br>    $arquivosParaImprimir = $arquivos<br>} elseif ($selecao -eq &#39;I&#39;) {<br>    $inicio = [int](Read-Host &quot;Informe o número inicial&quot;)<br>    $fim = [int](Read-Host &quot;Informe o número final&quot;)<br>    $arquivosParaImprimir = $arquivos[($inicio - 1)..($fim - 1)]<br>} elseif ($selecao -eq &#39;U&#39;) {<br>    $indice = [int](Read-Host &quot;Informe o número do arquivo desejado&quot;)<br>    $arquivosParaImprimir = @($arquivos[$indice - 1])<br>}</pre><pre># ======================== IMPRIMIR ARQUIVOS ========================<br>foreach ($arquivo in $arquivosParaImprimir) {<br>    Write-Host &quot;`n🖨️ Imprimindo: $($arquivo.FullName)&quot;<br>    Start-Process -FilePath &quot;print.exe&quot; -ArgumentList &quot;`&quot;$($arquivo.FullName)`&quot;&quot; -NoNewWindow -Wait<br>}</pre><pre>Write-Host &quot;`n✅ Impressão concluída!&quot;</pre><h3>🖱️ Adicionando ao Menu de Contexto (Botão Direito)</h3><p>Agora que o script está pronto, vamos adicionar a opção de <strong>“Imprimir”</strong> diretamente no menu de contexto (botão direito) do Windows.</p><h3>🔥 Passo a Passo</h3><ol><li>Abra o <strong>Powershell como Administrador</strong>;</li><li>Execute o seguinte código para criar a entrada no menu de contexto:</li></ol><pre># Definindo o caminho da chave de registro<br>$path = &quot;Registry::HKEY_CLASSES_ROOT\*\shell\Print&quot;<br>$commandPath = &quot;$path\command&quot;</pre><pre># Cria a chave &#39;Print&#39; e define o nome exibido no menu de contexto<br>New-Item -Path $path -Force | Out-Null<br>Set-ItemProperty -Path $path -Name &quot;(Default)&quot; -Value &quot;Imprimir&quot;</pre><pre># Cria o comando associado à ação de impressão usando print.exe<br>New-Item -Path $commandPath -Force | Out-Null<br>Set-ItemProperty -Path $commandPath -Name &quot;(Default)&quot; -Value &quot;C:\Windows\System32\print.exe /d:\\%PRINTER% \&quot;%1\&quot;&quot;</pre><pre>Write-Host &quot;Opção &#39;Imprimir&#39; adicionada ao menu de contexto com sucesso!&quot; -ForegroundColor Green</pre><ol><li>Feche o Powershell.</li><li>Agora, ao clicar com o botão direito em um arquivo PDF ou TXT, você verá a opção <strong>“Imprimir”</strong> diretamente no menu de contexto!</li></ol><h3>✅ Por que essa abordagem funciona bem</h3><p>💡 O script aproveita o suporte nativo do Windows ao PowerShell para manipulação de arquivos e impressoras;<br> 💡 A integração com o menu de contexto simplifica o uso sem a necessidade de abrir o terminal;<br> 💡 Os logs detalhados permitem fácil diagnóstico em caso de falha;<br> 💡 A interface amigável e as opções de seleção tornam o processo prático para qualquer tipo de usuário.</p><h3>🔥 Conclusão</h3><p>Esse script é uma maneira eficiente de automatizar o processo de impressão em lote no Windows, economizando tempo e esforço. Com a integração ao menu de contexto, a tarefa fica ainda mais simples e rápida.</p><p>👉 O código completo está disponível no meu GitHub:<br> 🔗 <a href="https://github.com/blcsilva">https://github.com/blcsilva</a></p><p>Se você gostou desse artigo, <strong>curta, comente e compartilhe</strong>! 🚀</p><p>#Powershell #Automação #Windows #DevOps #Produtividade #ImpressãoAutomática</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=31dd0a2ef665" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Hands-on: Melhores Práticas para Deploy com Terraform]]></title>
            <link>https://medium.com/@bruno.sph/hands-on-melhores-pr%C3%A1ticas-para-deploy-com-terraform-e4d305cb213c?source=rss-718f9fde02cb------2</link>
            <guid isPermaLink="false">https://medium.com/p/e4d305cb213c</guid>
            <dc:creator><![CDATA[Bruno Lucio]]></dc:creator>
            <pubDate>Sun, 16 Mar 2025 06:17:16 GMT</pubDate>
            <atom:updated>2025-03-16T06:17:16.123Z</atom:updated>
            <content:encoded><![CDATA[<p>Este <strong>hands-on</strong> vai guiá-lo na implementação das <strong>melhores práticas para deploy com Terraform</strong>. Cada seção abordará um tópico específico, com <strong>exemplos práticos</strong> para que você possa aplicar diretamente no seu ambiente.</p><p>Para este hands-on, vamos trabalhar com o provisionamento de uma <strong>VPC (Virtual Private Cloud)</strong> e uma <strong>instância EC2</strong> na AWS como caso de uso.</p><p>✅ <strong>Pré-requisitos:</strong></p><ul><li>Conta na AWS com permissões suficientes para criar recursos.</li><li>Terraform instalado na máquina local.</li><li>AWS CLI configurado com credenciais válidas.</li></ul><h3>🏗️ 1. Criando módulos reutilizáveis</h3><p>Para manter o código organizado e reutilizável, vamos criar um módulo para provisionar uma VPC.</p><h3>🗂️ Estrutura de pastas:</h3><pre>├── modules<br>│   └── vpc<br>│       ├── main.tf<br>│       ├── outputs.tf<br>│       └── variables.tf<br>├── environments<br>│   └── dev<br>│       ├── main.tf<br>│       └── terraform.tfvars<br>└── backend.tf</pre><h3>🔹 Arquivo modules/vpc/main.tf</h3><p>Crie o módulo para provisionar uma VPC:</p><pre>resource &quot;aws_vpc&quot; &quot;main&quot; {<br>  cidr_block = var.cidr_block</pre><pre>  tags = {<br>    Name = var.vpc_name<br>  }<br>}</pre><h3>🔹 Arquivo modules/vpc/variables.tf</h3><p>Defina as variáveis esperadas:</p><pre>variable &quot;cidr_block&quot; {<br>  type = string<br>}</pre><pre>variable &quot;vpc_name&quot; {<br>  type = string<br>}</pre><h3>🔹 Arquivo modules/vpc/outputs.tf</h3><p>Defina as saídas para reutilizar os valores posteriormente:</p><pre>output &quot;vpc_id&quot; {<br>  value = aws_vpc.main.id<br>}</pre><h3>🔹 Arquivo environments/dev/main.tf</h3><p>Agora, utilize o módulo no código principal:</p><pre>module &quot;vpc&quot; {<br>  source     = &quot;../../modules/vpc&quot;<br>  cidr_block = &quot;10.0.0.0/16&quot;<br>  vpc_name   = &quot;dev-vpc&quot;<br>}</pre><p>✅ <strong>Resultado:</strong></p><ul><li>O código agora está organizado e reutilizável.</li><li>É possível replicar o mesmo módulo para diferentes ambientes, alterando apenas os valores das variáveis.</li></ul><h3>🌍 2. Separando ambientes por arquivos e estados diferentes</h3><p>Para separar ambientes, vamos criar arquivos distintos para cada um e configurar o backend remoto (S3 + DynamoDB).</p><h3>🔹 Arquivo backend.tf</h3><p>Configure o backend remoto para armazenar o estado no S3:</p><pre>terraform {<br>  backend &quot;s3&quot; {<br>    bucket         = &quot;terraform-state-bucket&quot;<br>    key            = &quot;dev/terraform.tfstate&quot;<br>    region         = &quot;us-east-1&quot;<br>    encrypt        = true<br>    dynamodb_table = &quot;terraform-lock&quot;<br>  }<br>}</pre><blockquote><strong><em>⚠️ Dica:</em></strong><em> Crie o bucket S3 e a tabela DynamoDB manualmente antes de rodar o código:</em></blockquote><pre>aws s3 mb s3://terraform-state-bucket<br>aws dynamodb create-table --table-name terraform-lock \<br>  --attribute-definitions AttributeName=LockID,AttributeType=S \<br>  --key-schema AttributeName=LockID,KeyType=HASH \<br>  --billing-mode PAY_PER_REQUEST</pre><p>✅ <strong>Resultado:</strong></p><ul><li>Os estados serão armazenados de forma isolada para cada ambiente.</li><li>Para criar ambientes diferentes, basta criar novos arquivos terraform.tfvars.</li></ul><h3>🔄 3. Executando terraform plan antes de apply</h3><p>Agora, vamos validar as mudanças com terraform plan antes de aplicar:</p><pre>terraform init<br>terraform plan -out=tfplan<br>terraform apply tfplan</pre><p>✅ <strong>Resultado:</strong></p><ul><li>terraform plan mostra as mudanças sem aplicá-las.</li><li>terraform apply só será executado após validação manual.</li></ul><h3>🛡️ 4. Configurando controle de acesso e permissões</h3><p>Para proteger os recursos, crie uma política de IAM que conceda apenas as permissões necessárias para o Terraform.</p><h3>🔹 Exemplo de política IAM:</h3><p>Crie um arquivo iam_policy.json:</p><pre>{<br>  &quot;Version&quot;: &quot;2012-10-17&quot;,<br>  &quot;Statement&quot;: [<br>    {<br>      &quot;Effect&quot;: &quot;Allow&quot;,<br>      &quot;Action&quot;: [<br>        &quot;ec2:*&quot;,<br>        &quot;s3:GetObject&quot;,<br>        &quot;s3:PutObject&quot;<br>      ],<br>      &quot;Resource&quot;: &quot;*&quot;<br>    }<br>  ]<br>}</pre><p>Crie a política usando AWS CLI:</p><pre>aws iam create-policy --policy-name TerraformPolicy --policy-document file://iam_policy.json</pre><p>✅ <strong>Resultado:</strong></p><ul><li>Apenas o Terraform terá acesso aos recursos provisionados.</li><li>O princípio de <strong>menor privilégio</strong> será aplicado.</li></ul><h3>🏆 5. Gerenciando o estado com cuidado</h3><p>Para proteger o estado:<br> ✅ Habilite versionamento no bucket S3:</p><pre>aws s3api put-bucket-versioning --bucket terraform-state-bucket --versioning-configuration Status=Enabled</pre><p>✅ Bloqueie acesso não autorizado com política S3:</p><pre>{<br>  &quot;Effect&quot;: &quot;Deny&quot;,<br>  &quot;Principal&quot;: &quot;*&quot;,<br>  &quot;Action&quot;: &quot;s3:*&quot;,<br>  &quot;Resource&quot;: &quot;arn:aws:s3:::terraform-state-bucket/*&quot;,<br>  &quot;Condition&quot;: {<br>    &quot;Bool&quot;: {<br>      &quot;aws:SecureTransport&quot;: &quot;false&quot;<br>    }<br>  }<br>}</pre><p>✅ <strong>Resultado:</strong></p><ul><li>O estado estará protegido contra alterações acidentais.</li><li>Versionamento permitirá rollback em caso de falha.</li></ul><h3>✅ 6. Automatizando deploy com CI/CD</h3><p>Vamos criar um pipeline simples com <strong>GitHub Actions</strong> para automatizar o deploy:</p><h3>🔹 Arquivo .github/workflows/terraform.yml:</h3><pre>name: Terraform Deploy</pre><pre>on:<br>  push:<br>    branches:<br>      - main</pre><pre>jobs:<br>  terraform:<br>    name: Terraform Plan and Apply<br>    runs-on: ubuntu-latest<br>    steps:<br>      - name: Checkout Code<br>        uses: actions/checkout@v2</pre><pre>      - name: Setup Terraform<br>        uses: hashicorp/setup-terraform@v2</pre><pre>      - name: Terraform Init<br>        run: terraform init</pre><pre>      - name: Terraform Plan<br>        run: terraform plan</pre><pre>      - name: Terraform Apply<br>        run: terraform apply -auto-approve</pre><p>✅ <strong>Resultado:</strong></p><ul><li>O código será provisionado automaticamente após o merge na branch main.</li><li>Permite revisão manual antes de aplicar o deploy.</li></ul><h3>📊 7. Monitorando e auditando o ambiente</h3><p>Para monitorar os recursos provisionados, configure o CloudWatch e o CloudTrail na AWS.</p><p>✅ <strong>CloudTrail:</strong></p><pre>aws cloudtrail create-trail --name terraform-trail --s3-bucket-name terraform-state-bucket</pre><p>✅ <strong>CloudWatch:</strong><br> Configure um alarme de exemplo:</p><pre>aws cloudwatch put-metric-alarm \<br>  --alarm-name &quot;CPU-High-Usage&quot; \<br>  --metric-name &quot;CPUUtilization&quot; \<br>  --namespace &quot;AWS/EC2&quot; \<br>  --statistic &quot;Average&quot; \<br>  --period 300 \<br>  --threshold 80 \<br>  --comparison-operator &quot;GreaterThanThreshold&quot; \<br>  --dimensions Name=InstanceId,Value=i-1234567890abcdef0 \<br>  --evaluation-periods 2 \<br>  --alarm-actions arn:aws:sns:us-east-1:123456789012:my-sns-topic</pre><p>✅ <strong>Resultado:</strong></p><ul><li>O CloudTrail audita alterações na infraestrutura.</li><li>O CloudWatch alerta em tempo real sobre problemas.</li></ul><h3>🎯 Conclusão</h3><p>Este hands-on cobriu as <strong>melhores práticas</strong> para deploy com Terraform, incluindo:<br> ✅ Módulos reutilizáveis<br> ✅ Separação de ambientes<br> ✅ Automação com CI/CD<br> ✅ Monitoramento contínuo</p><p>Agora você está pronto para implementar essas práticas em produção! 👊</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e4d305cb213c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Melhores Estratégias para Deploy com Terraform]]></title>
            <link>https://medium.com/@bruno.sph/melhores-estrat%C3%A9gias-para-deploy-com-terraform-f02c5027a5bc?source=rss-718f9fde02cb------2</link>
            <guid isPermaLink="false">https://medium.com/p/f02c5027a5bc</guid>
            <category><![CDATA[terraform]]></category>
            <category><![CDATA[iam-roles]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[melhores-praticas]]></category>
            <dc:creator><![CDATA[Bruno Lucio]]></dc:creator>
            <pubDate>Sun, 16 Mar 2025 06:11:58 GMT</pubDate>
            <atom:updated>2025-03-16T06:11:58.638Z</atom:updated>
            <content:encoded><![CDATA[<p>O Terraform, desenvolvido pela HashiCorp, é uma ferramenta de <strong>Infrastructure as Code (IaC)</strong> que revolucionou a maneira como gerenciamos infraestrutura em ambientes de nuvem e híbridos. Com ele, é possível definir, provisionar e gerenciar recursos de forma declarativa, garantindo consistência e escalabilidade em qualquer ambiente.</p><p>Porém, para garantir que os deploys sejam seguros, previsíveis e eficientes, é essencial adotar estratégias bem definidas. Neste artigo, vou compartilhar as <strong>melhores práticas para realizar deploys com Terraform</strong>, cobrindo desde a organização do código até a automação e monitoramento.</p><h3>🚀 1. Organize o código em módulos reutilizáveis</h3><p>Manter o código organizado é fundamental para facilitar a manutenção e garantir escalabilidade. Os módulos no Terraform permitem que você defina componentes reutilizáveis, promovendo consistência e evitando repetição de código.</p><h3>💡 Como aplicar:</h3><p>✅ Crie um repositório separado para módulos reutilizáveis.<br> ✅ Nomeie os módulos de forma clara e adote um padrão de versionamento.<br> ✅ Use o princípio <strong>DRY (Don’t Repeat Yourself)</strong> para evitar código duplicado.</p><p><strong>Exemplo de módulo:</strong></p><pre>module &quot;vpc&quot; {<br>  source = &quot;./modules/vpc&quot;<br>  cidr_block = &quot;10.0.0.0/16&quot;<br>}</pre><p>Dividir o código em módulos facilita a escalabilidade e simplifica futuras mudanças na infraestrutura.</p><h3>🌍 2. Separe ambientes por arquivos e estados diferentes</h3><p>Misturar configurações de diferentes ambientes (como dev, staging e produção) no mesmo estado pode levar a erros catastróficos. Separar ambientes por arquivos e estados distintos ajuda a evitar esse problema e garante maior controle sobre os recursos provisionados.</p><h3>💡 Como aplicar:</h3><p>✅ Crie um diretório separado para cada ambiente.<br> ✅ Use workspaces diferentes com o comando terraform workspace.<br> ✅ Armazene os estados em um backend remoto (como S3 + DynamoDB).</p><p><strong>Exemplo de estrutura de pastas:</strong></p><pre>├── environments<br>│   ├── dev<br>│   │   ├── main.tf<br>│   ├── staging<br>│   │   ├── main.tf<br>│   └── prod<br>│       ├── main.tf</pre><p><strong>Exemplo de configuração de backend remoto:</strong></p><pre>terraform {<br>  backend &quot;s3&quot; {<br>    bucket         = &quot;meu-terraform-state&quot;<br>    key            = &quot;prod/terraform.tfstate&quot;<br>    region         = &quot;us-east-1&quot;<br>    encrypt        = true<br>    dynamodb_table = &quot;terraform-lock&quot;<br>  }<br>}</pre><p>Essa estratégia evita que alterações acidentais em um ambiente afetem outro.</p><h3>🔄 3. Sempre execute terraform plan antes de apply</h3><p>O comando terraform plan permite que você visualize exatamente quais mudanças serão aplicadas na infraestrutura antes de executá-las, reduzindo o risco de erros.</p><h3>💡 Como aplicar:</h3><p>✅ Use terraform plan em pipelines de CI/CD para validação automática.<br> ✅ Defina aprovações manuais para ambientes críticos (como produção).<br> ✅ Execute terraform apply apenas após revisar o plano de execução.</p><p><strong>Exemplo:</strong></p><pre>terraform plan -out=tfplan<br>terraform apply tfplan</pre><p>Essa abordagem garante que você só aplique mudanças após revisar e validar as modificações.</p><h3>🛡️ 4. Controle de acesso e permissões</h3><p>Gerenciar acesso de forma cuidadosa é essencial para evitar alterações não autorizadas e manter a segurança da infraestrutura.</p><h3>💡 Como aplicar:</h3><p>✅ Use IAM (ou equivalente) para definir permissões específicas por ambiente e recurso.<br> ✅ Siga o princípio de menor privilégio (conceda apenas as permissões necessárias).<br> ✅ Atribua diferentes níveis de acesso para ambientes de desenvolvimento e produção.</p><p><strong>Exemplo de política IAM:</strong></p><pre>{<br>  &quot;Version&quot;: &quot;2012-10-17&quot;,<br>  &quot;Statement&quot;: [<br>    {<br>      &quot;Effect&quot;: &quot;Allow&quot;,<br>      &quot;Action&quot;: [<br>        &quot;s3:GetObject&quot;,<br>        &quot;s3:PutObject&quot;<br>      ],<br>      &quot;Resource&quot;: &quot;arn:aws:s3:::meu-terraform-state/*&quot;<br>    }<br>  ]<br>}</pre><p>Restringir o acesso ao estado é essencial para proteger informações sensíveis.</p><h3>🏆 5. Use o terraform state com cuidado</h3><p>O arquivo de estado (terraform.tfstate) é o coração do Terraform. Ele contém detalhes sensíveis sobre a infraestrutura, então qualquer corrupção ou perda pode causar sérios problemas.</p><h3>💡 Como aplicar:</h3><p>✅ Armazene o estado em um backend remoto seguro (como S3).<br> ✅ Configure controle de acesso rigoroso ao arquivo de estado.<br> ✅ Habilite versionamento para permitir rollback em caso de falha.</p><p>Evite manipular o estado diretamente, a menos que seja absolutamente necessário.</p><h3>✅ 6. Automatize o deploy com CI/CD</h3><p>Automatizar o deploy com pipelines de CI/CD garante consistência, reduz erros humanos e acelera o tempo de entrega.</p><h3>💡 Como aplicar:</h3><p>✅ Configure pipelines para executar terraform plan e terraform apply automaticamente após um merge na branch principal.<br> ✅ Use ferramentas como <strong>Jenkins</strong>, <strong>GitLab CI/CD</strong> ou <strong>GitHub Actions</strong>.<br> ✅ Defina revisões manuais para ambientes críticos.</p><p><strong>Exemplo de pipeline com GitHub Actions:</strong></p><pre>name: Terraform Deploy</pre><pre>on:<br>  push:<br>    branches:<br>      - main</pre><pre>jobs:<br>  terraform:<br>    name: Terraform Plan and Apply<br>    runs-on: ubuntu-latest<br>    steps:<br>      - name: Checkout Code<br>        uses: actions/checkout@v2</pre><pre>      - name: Setup Terraform<br>        uses: hashicorp/setup-terraform@v2</pre><pre>      - name: Terraform Init<br>        run: terraform init</pre><pre>      - name: Terraform Plan<br>        run: terraform plan</pre><pre>      - name: Terraform Apply<br>        run: terraform apply -auto-approve</pre><p>Com pipelines bem configurados, o deploy se torna rápido e previsível.</p><h3>📊 7. Monitore e audite o ambiente</h3><p>Monitorar o ambiente em tempo real é essencial para garantir que o estado real da infraestrutura esteja sempre alinhado ao código do Terraform.</p><h3>💡 Como aplicar:</h3><p>✅ Configure o <strong>Prometheus</strong> e o <strong>Grafana</strong> para monitoramento em tempo real.<br> ✅ Use o <strong>CloudTrail</strong> (AWS) para registrar todas as ações sobre a infraestrutura.<br> ✅ Configure alertas automáticos para modificações não autorizadas ou falhas de deploy.</p><p>Essa prática ajuda a reagir rapidamente em caso de falha ou comportamento inesperado.</p><h3>🔥 Resumo das melhores práticas</h3><p>Estratégia Benefício <strong>Módulos reutilizáveis</strong> Código organizado e reutilizável <strong>Separação de ambientes</strong> Maior controle e isolamento <strong>Uso de </strong><strong>terraform plan</strong> Maior segurança nas mudanças <strong>Controle de acesso</strong> Menor risco de alterações não autorizadas <strong>Gerenciamento de estado</strong> Evitar perda ou corrupção de dados <strong>Automação com CI/CD</strong> Deploys rápidos e consistentes <strong>Monitoramento e auditoria</strong> Resposta rápida a falhas</p><h3>🎯 Conclusão</h3><p>Seguir essas estratégias ao trabalhar com Terraform ajudará você a garantir uma infraestrutura escalável, segura e resiliente. Ao modularizar o código, separar ambientes, automatizar processos e monitorar continuamente, você terá um ciclo de deploy robusto, capaz de enfrentar os desafios dos ambientes modernos em nuvem.</p><p>Aplique essas práticas no seu fluxo de trabalho e eleve o nível dos seus deploys com Terraform! 👊</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f02c5027a5bc" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[️ Guia Completo de Comandos Kubectl para DevOps: Gerenciando Clusters Kubernetes com Eficiência]]></title>
            <link>https://medium.com/@bruno.sph/%EF%B8%8F-guia-completo-de-comandos-kubectl-para-devops-gerenciando-clusters-kubernetes-com-efici%C3%AAncia-c15f33ff6aa8?source=rss-718f9fde02cb------2</link>
            <guid isPermaLink="false">https://medium.com/p/c15f33ff6aa8</guid>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[kubectl]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[Bruno Lucio]]></dc:creator>
            <pubDate>Sun, 09 Mar 2025 01:31:35 GMT</pubDate>
            <atom:updated>2025-03-09T01:31:35.469Z</atom:updated>
            <content:encoded><![CDATA[<h3>🚀 Introdução</h3><p>Kubernetes (ou K8s) é uma plataforma de orquestração de containers que permite automatizar a implantação, o dimensionamento e a administração de aplicativos em containers. Ele é amplamente utilizado em ambientes de produção devido à sua capacidade de gerenciar cargas de trabalho complexas e oferecer alta disponibilidade e escalabilidade.</p><p>Se você trabalha com <strong>DevOps</strong> ou está começando a explorar Kubernetes, dominar o kubectl é fundamental para gerenciar recursos e interagir com o cluster Kubernetes de maneira eficiente.</p><p>Este guia tem como objetivo apresentar os <strong>comandos kubectl mais importantes</strong>, explicando suas funções e oferecendo exemplos práticos de aplicação para ajudar você a gerenciar <strong>Pods</strong>, <strong>Deployments</strong>, <strong>Services</strong>, <strong>ConfigMaps</strong>, <strong>Secrets</strong>, <strong>Nodes</strong>, <strong>Namespaces</strong> e <strong>Volumes Persistentes</strong> (PV e PVC).</p><h3>🔥 O que é Kubectl?</h3><p>O kubectl é a ferramenta de linha de comando oficial para interagir com o Kubernetes. Ele permite que você gerencie recursos do cluster, consulte o status de aplicações, implante novas versões e automatize processos complexos com scripts e pipelines de CI/CD.</p><p>👉 Para verificar se o kubectl está instalado corretamente, use o comando:</p><pre>kubectl version --client</pre><p>👉 Para configurar o acesso a um cluster Kubernetes, utilize o arquivo kubeconfig:</p><pre>kubectl config view</pre><p>Se tudo estiver correto, você verá as informações de configuração do cluster. Agora, vamos explorar os principais comandos!</p><h3>💠 1. Gerenciamento de Pods</h3><p><strong>Pods</strong> são a menor unidade de execução em Kubernetes. Um Pod contém um ou mais containers que compartilham armazenamento, rede e especificações de inicialização.</p><h3>➡️ Criar um Pod a partir de um arquivo YAML</h3><p>Exemplo de arquivo pod.yaml:</p><pre>apiVersion: v1<br>kind: Pod<br>metadata:<br>  name: meu-pod<br>spec:<br>  containers:<br>  - name: nginx<br>    image: nginx:latest<br>    ports:<br>    - containerPort: 80</pre><p>👉 Para criar o Pod:</p><pre>kubectl apply -f pod.yaml</pre><h3>➡️ Listar Pods em execução</h3><pre>kubectl get pods</pre><h3>➡️ Ver detalhes sobre um Pod específico</h3><pre>kubectl describe pod meu-pod</pre><h3>➡️ Ver logs de um Pod</h3><pre>kubectl logs meu-pod</pre><h3>➡️ Acessar um Pod e executar comandos diretamente</h3><pre>kubectl exec -it meu-pod -- bash</pre><h3>➡️ Excluir um Pod</h3><pre>kubectl delete pod meu-pod</pre><h3>💠 2. Gerenciamento de Deployments</h3><p><strong>Deployments</strong> permitem controlar a implantação e a atualização de aplicativos de forma declarativa, garantindo alta disponibilidade.</p><h3>➡️ Exemplo de arquivo de Deployment</h3><p>Exemplo de deployment.yaml:</p><pre>apiVersion: apps/v1<br>kind: Deployment<br>metadata:<br>  name: meu-deployment<br>spec:<br>  replicas: 3<br>  selector:<br>    matchLabels:<br>      app: nginx<br>  template:<br>    metadata:<br>      labels:<br>        app: nginx<br>    spec:<br>      containers:<br>      - name: nginx<br>        image: nginx:latest<br>        ports:<br>        - containerPort: 80</pre><p>👉 Para criar o Deployment:</p><pre>kubectl apply -f deployment.yaml</pre><h3>➡️ Ver status dos Deployments</h3><pre>kubectl get deployments</pre><h3>➡️ Detalhar um Deployment específico</h3><pre>kubectl describe deployment meu-deployment</pre><h3>➡️ Escalar réplicas de um Deployment</h3><pre>kubectl scale --replicas=5 deployment/meu-deployment</pre><h3>➡️ Verificar o status de rollout de um Deployment</h3><pre>kubectl rollout status deployment/meu-deployment</pre><h3>➡️ Excluir um Deployment</h3><pre>kubectl delete deployment meu-deployment</pre><h3>💠 3. Gerenciamento de Services</h3><p><strong>Services</strong> expõem aplicativos em execução para redes internas ou externas, permitindo que diferentes partes do sistema se comuniquem.</p><h3>➡️ Exemplo de arquivo de Service</h3><p>Exemplo de service.yaml:</p><pre>apiVersion: v1<br>kind: Service<br>metadata:<br>  name: meu-service<br>spec:<br>  selector:<br>    app: nginx<br>  ports:<br>  - protocol: TCP<br>    port: 80<br>    targetPort: 80</pre><p>👉 Para criar um Service:</p><pre>kubectl apply -f service.yaml</pre><h3>➡️ Verificar os Services ativos</h3><pre>kubectl get services</pre><h3>➡️ Ver detalhes de um Service específico</h3><pre>kubectl describe service meu-service</pre><h3>➡️ Excluir um Service</h3><pre>kubectl delete service meu-service</pre><h3>💠 4. ConfigMaps</h3><p><strong>ConfigMaps</strong> armazenam dados de configuração em formato texto para serem utilizados nos Pods.</p><p>👉 Criar um ConfigMap diretamente:</p><pre>kubectl create configmap meu-configmap --from-literal=MEU_VALOR=1234</pre><p>👉 Listar ConfigMaps:</p><pre>kubectl get configmaps</pre><p>👉 Exibir detalhes de um ConfigMap:</p><pre>kubectl describe configmap meu-configmap</pre><p>👉 Remover um ConfigMap:</p><pre>kubectl delete configmap meu-configmap</pre><h3>💠 5. Secrets</h3><p><strong>Secrets</strong> armazenam informações sensíveis como senhas e chaves de API.</p><p>👉 Criar um Secret diretamente:</p><pre>kubectl create secret generic meu-secret --from-literal=password=1234</pre><p>👉 Listar Secrets:</p><pre>kubectl get secrets</pre><p>👉 Exibir detalhes de um Secret:</p><pre>kubectl describe secret meu-secret</pre><p>👉 Remover um Secret:</p><pre>kubectl delete secret meu-secret</pre><h3>💠 6. Nodes</h3><p><strong>Nodes</strong> são os servidores físicos ou virtuais que executam os Pods.</p><p>👉 Listar Nodes:</p><pre>kubectl get nodes</pre><p>👉 Ver detalhes de um Node:</p><pre>kubectl describe node meu-node</pre><h3>💠 7. Namespaces</h3><p><strong>Namespaces</strong> permitem a separação de ambientes e recursos dentro de um cluster Kubernetes.</p><p>👉 Criar um Namespace:</p><pre>kubectl create namespace meu-namespace</pre><p>👉 Listar Namespaces:</p><pre>kubectl get namespaces</pre><p>👉 Remover um Namespace:</p><pre>kubectl delete namespace meu-namespace</pre><h3>💠 8. Persistent Volumes (PVs) e Persistent Volume Claims (PVCs)</h3><p><strong>PVs</strong> e <strong>PVCs</strong> armazenam dados persistentes para contêineres.</p><p>👉 Listar PVs e PVCs:</p><pre>kubectl get pv<br>kubectl get pvc</pre><p>👉 Exibir detalhes de um PV ou PVC:</p><pre>kubectl describe pv meu-pv<br>kubectl describe pvc meu-pvc</pre><p>👉 Remover um PV ou PVC:</p><pre>kubectl delete pv meu-pv<br>kubectl delete pvc meu-pvc</pre><h3>✅ Conclusão</h3><p>Dominar o kubectl é essencial para qualquer profissional DevOps que trabalha com Kubernetes. Este guia fornece um resumo detalhado dos principais comandos para administrar com eficiência os componentes essenciais de um cluster Kubernetes. 🚀</p><p>💬 <strong>Gostou do conteúdo? Deixe seu comentário e compartilhe com sua rede!</strong> 😎🔥</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c15f33ff6aa8" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Implementando Istio e MLOps para Multitenancy e Autoescalonamento no Kubernetes]]></title>
            <link>https://medium.com/@bruno.sph/implementando-istio-e-mlops-para-multitenancy-e-autoescalonamento-no-kubernetes-0542b0292270?source=rss-718f9fde02cb------2</link>
            <guid isPermaLink="false">https://medium.com/p/0542b0292270</guid>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[mlops]]></category>
            <category><![CDATA[autoscaling]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[istio]]></category>
            <dc:creator><![CDATA[Bruno Lucio]]></dc:creator>
            <pubDate>Thu, 27 Feb 2025 01:58:21 GMT</pubDate>
            <atom:updated>2025-02-27T01:58:21.512Z</atom:updated>
            <content:encoded><![CDATA[<p>Na era da computação em nuvem, garantir acesso seguro e isolado para múltiplos usuários dentro de um cluster Kubernetes é um desafio essencial. Com o <strong>Istio</strong>, podemos implementar uma solução robusta de <strong>multitenancy</strong>, garantindo que cada usuário tenha uma sessão única e protegida, sem compartilhamento indevido de recursos. Além disso, combinando <strong>MLOps</strong>, podemos otimizar a alocação de recursos para reduzir custos e escalar dinamicamente conforme a demanda.</p><h3>Desafios e Solução</h3><p>Imagine um ambiente onde cada <strong>licença de usuário</strong> corresponde a um <strong>pod individual</strong>, e o número de licenças pode chegar a <strong>700 simultaneamente</strong>. Para atender a esse cenário, precisamos:</p><p>✔ <strong>Isolamento de sessão e segurança</strong> — Cada acesso deve ser único e protegido.<br>✔ <strong>Escalabilidade</strong> — O cluster precisa suportar até 700 pods sem desperdício de recursos.<br>✔ <strong>Otimização de custos</strong> — Utilizando MLOps para prever picos de acesso e alocar recursos dinamicamente.</p><h3>Como o Istio Resolve Esse Problema</h3><p>O <strong>Istio</strong> permite implementar autenticação, autorização e roteamento inteligente para garantir <strong>segurança e eficiência</strong>. Com ele, podemos:</p><p>🔹 <strong>Configurar políticas de autenticação</strong> com JWT para validar usuários.<br>🔹 <strong>Definir Authorization Policies</strong> para isolar tenants e impedir acesso indevido.<br>🔹 <strong>Gerenciar tráfego</strong> com VirtualServices, garantindo que cada tenant tenha uma rota dedicada.</p><h3>MLOps e Autoescalonamento</h3><p>Além do Istio, usamos <strong>MLOps</strong> para prever picos de demanda e escalar os pods de forma automática. Com <strong>Kubeflow</strong> e <strong>KServe</strong>, podemos treinar modelos de machine learning para analisar padrões de acesso e ajustar os recursos dinamicamente.</p><h3>Ferramentas Utilizadas</h3><p>✅ <strong>Istio</strong> — Controle de tráfego, segurança e multitenancy.<br>✅ <strong>Kubernetes HPA</strong> — Autoescalonamento com base na demanda de CPU.<br>✅ <strong>Kubeflow</strong> — Machine learning para prever picos de carga.<br>✅ <strong>Prometheus &amp; Grafana</strong> — Monitoramento e análise de métricas.</p><h3>Conclusão</h3><p>Com essa solução, garantimos <strong>segurança, escalabilidade e eficiência</strong> para aplicações Kubernetes que exigem multitenancy. O <strong>Istio</strong> protege cada sessão de usuário, enquanto <strong>MLOps</strong> reduz custos ajustando os recursos automaticamente.</p><p>Quer entender o passo a passo dessa implementação? Confira o <strong>hands-on completo</strong> abaixo!</p><h3>Hands-on: Implementando uma Solução com Istio para Multitenancy e Autoescalonamento MLOps</h3><h3>1. Introdução</h3><p>Este guia aborda a implementação de uma solução utilizando Istio para garantir acesso único e protegido em um cluster Kubernetes, suportando até 700 pods (um por licença). Além disso, serão exploradas práticas de MLOps para otimizar a alocação de recursos e reduzir custos.</p><h3>2. Arquitetura da Solução</h3><h3>2.1 Configuração do Cluster Kubernetes</h3><ul><li>Crie um cluster Kubernetes com suporte a autoescalonamento.</li><li>Utilize ferramentas como <strong>kubectl</strong> e <strong>istioctl</strong> para gerenciar os recursos.</li><li>Defina <strong>ResourceQuota</strong> e <strong>LimitRange</strong> para controlar o consumo de CPU e memória.</li></ul><h3>2.2 Implementação do Istio</h3><ul><li>Instale o <strong>Istio</strong> no cluster:</li><li>istioctl install --set profile=demo -y</li><li>Habilite o sidecar para todos os pods:</li><li>kubectl label namespace default istio-injection=enabled</li></ul><h3>2.3 Autenticação e Autorização</h3><ul><li>Configure <strong>Istio Authentication Policy</strong> para autenticação JWT:</li><li>apiVersion: security.istio.io/v1beta1 kind: RequestAuthentication metadata: name: jwt-auth namespace: default spec: selector: matchLabels: app: my-app jwtRules: - issuer: &quot;https://auth.mycompany.com&quot; jwksUri: &quot;https://auth.mycompany.com/.well-known/jwks.json&quot;</li><li>Defina políticas de <strong>AuthorizationPolicy</strong> para multitenancy:</li><li>apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: tenant-access namespace: default spec: rules: - from: - source: requestPrincipals: [&quot;tenantA&quot;, &quot;tenantB&quot;]</li></ul><h3>2.4 Gerenciamento de Tráfego</h3><ul><li>Utilize o Istio Gateway para controlar o tráfego externo:</li><li>apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: my-gateway spec: selector: istio: ingressgateway servers: - port: number: 443 name: https protocol: HTTPS tls: mode: SIMPLE credentialName: my-cert hosts: - &quot;*.mycompany.com&quot;</li><li>Configure VirtualService para direcionar o tráfego baseado no tenant:</li><li>apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: tenant-routing spec: hosts: - &quot;*.mycompany.com&quot; http: - match: - headers: tenant: exact: &quot;tenantA&quot; route: - destination: host: tenant-a-service port: number: 80</li></ul><h3>3. Uso de MLOps para Otimização de Recursos</h3><h3>3.1 Provisionamento Automático com Autoescalonamento</h3><ul><li>Configure o HPA para escalar os pods com base na demanda:</li><li>apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: my-app-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: my-app minReplicas: 1 maxReplicas: 700 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70</li></ul><h3>3.2 Uso de Machine Learning para Predição de Picos</h3><ul><li>Utilize o <strong>Kubeflow</strong> para treinar modelos que prevejam a demanda e ajustem os recursos automaticamente.</li><li>Integre um modelo de machine learning para prever carga de trabalho e ajustar o número de pods com <strong>KServe</strong>.</li></ul><h3>3.3 Monitoramento e Observabilidade</h3><ul><li>Utilize <strong>Prometheus</strong> e <strong>Grafana</strong> para visualizar métricas de uso e comportamento do cluster.</li><li>Configure <strong>Kiali</strong> para visualizar o tráfego do Istio e depurar possíveis problemas.</li></ul><h3>4. Ferramentas Utilizadas</h3><ul><li><strong>Istio</strong>: Gerenciamento de tráfego, segurança e observabilidade.</li><li><strong>Kubeflow</strong>: Gerenciamento do ciclo de vida dos modelos de machine learning.</li><li><strong>Prometheus e Grafana</strong>: Monitoramento e visualização de métricas.</li><li><strong>Kubernetes</strong>: Orquestração de contêineres e autoescalonamento.</li></ul><h3>5. Conclusão</h3><p>Essa solução garante que cada pod tenha um acesso único e protegido, suportando até 700 pods. O uso de Istio proporciona segurança e isolamento necessários para multitenancy, enquanto práticas de MLOps ajudam a otimizar o uso de recursos, reduzindo custos de infraestrutura.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0542b0292270" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Benefícios do Uso de Service Mesh para Microserviços]]></title>
            <link>https://medium.com/@bruno.sph/benef%C3%ADcios-do-uso-de-service-mesh-para-microservi%C3%A7os-aa4fe5dd5418?source=rss-718f9fde02cb------2</link>
            <guid isPermaLink="false">https://medium.com/p/aa4fe5dd5418</guid>
            <category><![CDATA[service-mesh]]></category>
            <category><![CDATA[k8s]]></category>
            <category><![CDATA[istio]]></category>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[Bruno Lucio]]></dc:creator>
            <pubDate>Sun, 23 Feb 2025 15:38:44 GMT</pubDate>
            <atom:updated>2025-02-23T15:38:44.454Z</atom:updated>
            <content:encoded><![CDATA[<p>A arquitetura de microserviços trouxe inúmeras vantagens para o desenvolvimento de aplicações distribuídas, como escalabilidade, independência de deploy e resiliência. No entanto, também trouxe desafios significativos, como a complexidade de comunicação entre serviços, segurança e observabilidade.</p><p>É nesse cenário que surge o <strong>Service Mesh</strong>, uma camada de infraestrutura que gerencia a comunicação entre os serviços de forma transparente, trazendo benefícios como:</p><h3>Principais Benefícios do Service Mesh</h3><h3>1. Observabilidade</h3><p>Com o Service Mesh, é possível obter <strong>métricas detalhadas</strong>, <strong>logs estruturados</strong> e <strong>tracing distribuído</strong> da comunicação entre microserviços. Ferramentas como <strong>Jaeger</strong> e <strong>Prometheus</strong> podem ser integradas para um monitoramento mais eficiente.</p><h3>2. Segurança</h3><p>O uso de <strong>TLS mútuo (mTLS)</strong> garante que toda a comunicação entre serviços seja criptografada, aumentando a segurança e protegendo contra ataques man-in-the-middle. Além disso, políticas de autenticação e autorização são facilmente gerenciadas.</p><h3>3. Controle de Tráfego</h3><p>Com funcionalidades como <strong>balanceamento de carga</strong>, <strong>circuit breakers</strong> e <strong>retries automáticos</strong>, o Service Mesh melhora a confiabilidade dos microserviços e permite estratégias avançadas como <strong>deploys canários e blue/green deployments</strong>.</p><h3>4. Gestão Simplificada</h3><p>O Service Mesh abstrai a complexidade da comunicação entre serviços, permitindo que os desenvolvedores foquem na lógica de negócio em vez de lidar com desafios de infraestrutura.</p><h3>Principais Ferramentas de Service Mesh</h3><p>Várias ferramentas implementam Service Mesh, sendo as mais conhecidas:</p><ul><li><strong>Istio</strong>: Uma das soluções mais robustas e amplamente adotadas, integrando segurança, observabilidade e controle de tráfego.</li><li><strong>Linkerd</strong>: Leve e focado na simplicidade, sendo ideal para equipes que querem uma solução mais fácil de configurar.</li><li><strong>Consul</strong>: Desenvolvido pela HashiCorp, combina Service Mesh com descoberta de serviços e configuração distribuída.</li><li><strong>AWS App Mesh</strong>: Solução nativa da AWS que integra bem com o ecossistema da AWS.</li></ul><h3>Hands-on: Implementando Istio com um Microserviço</h3><p>Agora, vamos colocar a teoria em prática e configurar o <strong>Istio</strong> em um cluster Kubernetes, além de criar um microserviço que fará uso dos recursos do Service Mesh.</p><h3>1. Pré-requisitos</h3><p>Antes de começar, certifique-se de ter:</p><ul><li>Um cluster Kubernetes (Minikube, Kind ou AKS/EKS/GKE)</li><li><strong>kubectl</strong> instalado</li><li><strong>Istio CLI</strong> instalado</li></ul><h3>2. Instalando o Istio</h3><p>Primeiro, baixe e instale o Istio:</p><pre>curl -L https://istio.io/downloadIstio | sh -<br>cd istio-*/<br>export PATH=$PWD/bin:$PATH</pre><p>Agora, instale o Istio no cluster Kubernetes:</p><pre>istioctl install --set profile=demo -y<br>kubectl label namespace default istio-injection=enabled</pre><p>Isso ativa a <strong>injeção automática de sidecar</strong> no namespace default.</p><h3>3. Criando um Microserviço</h3><p>Vamos criar um simples serviço em Python para testar o Istio:</p><h4>app.py</h4><pre>from flask import Flask</pre><pre>app = Flask(__name__)</pre><pre>@app.route(&#39;/hello&#39;)<br>def hello():<br>    return &#39;Hello from Service Mesh!&#39;</pre><pre>if __name__ == &#39;__main__&#39;:<br>    app.run(host=&#39;0.0.0.0&#39;, port=5000)</pre><p>Criamos um Dockerfile para empacotar a aplicação:</p><pre>FROM python:3.9<br>WORKDIR /app<br>COPY requirements.txt .<br>RUN pip install -r requirements.txt<br>COPY . .<br>CMD [&quot;python&quot;, &quot;app.py&quot;]</pre><p>Crie um arquivo requirements.txt:</p><pre>flask</pre><p>Construa e publique a imagem:</p><pre>docker build -t &lt;seu_usuario&gt;/service-mesh-app .<br>docker push &lt;seu_usuario&gt;/service-mesh-app</pre><h3>4. Implantando no Kubernetes</h3><p>Criamos o manifesto de deployment:</p><pre>apiVersion: apps/v1<br>kind: Deployment<br>metadata:<br>  name: service-mesh-app<br>spec:<br>  replicas: 2<br>  selector:<br>    matchLabels:<br>      app: service-mesh-app<br>  template:<br>    metadata:<br>      labels:<br>        app: service-mesh-app<br>    spec:<br>      containers:<br>      - name: service-mesh-app<br>        image: &lt;seu_usuario&gt;/service-mesh-app<br>        ports:<br>        - containerPort: 5000</pre><p>E o serviço para expô-lo:</p><pre>apiVersion: v1<br>kind: Service<br>metadata:<br>  name: service-mesh-app<br>spec:<br>  selector:<br>    app: service-mesh-app<br>  ports:<br>  - protocol: TCP<br>    port: 80<br>    targetPort: 5000</pre><p>Aplique os recursos:</p><pre>kubectl apply -f deployment.yaml<br>kubectl apply -f service.yaml</pre><h3>5. Testando a Integração com Istio</h3><p>Agora vamos criar um Gateway para expor o serviço via Istio:</p><pre>apiVersion: networking.istio.io/v1alpha3<br>kind: Gateway<br>metadata:<br>  name: service-mesh-gateway<br>spec:<br>  selector:<br>    istio: ingressgateway<br>  servers:<br>  - port:<br>      number: 80<br>      name: http<br>      protocol: HTTP<br>    hosts:<br>    - &quot;*&quot;</pre><p>Criamos um VirtualService:</p><pre>apiVersion: networking.istio.io/v1alpha3<br>kind: VirtualService<br>metadata:<br>  name: service-mesh-app<br>spec:<br>  hosts:<br>  - &quot;*&quot;<br>  gateways:<br>  - service-mesh-gateway<br>  http:<br>  - match:<br>    - uri:<br>        prefix: &quot;/hello&quot;<br>    route:<br>    - destination:<br>        host: service-mesh-app<br>        port:<br>          number: 80</pre><p>Aplique os manifests:</p><pre>kubectl apply -f gateway.yaml<br>kubectl apply -f virtualservice.yaml</pre><p>Agora, descubra o IP do Istio Gateway:</p><pre>kubectl get svc istio-ingressgateway -n istio-system</pre><p>E teste a API:</p><pre>curl http://&lt;EXTERNAL-IP&gt;/hello</pre><h3>Conclusão</h3><p>O Service Mesh com Istio simplifica a observabilidade, segurança e controle de tráfego em arquiteturas de microserviços. Com essa implementação, conseguimos demonstrar como criar um microserviço em Python, expô-lo via Istio e monitorá-lo.</p><p>Se você quer levar sua infraestrutura para um novo nível de resiliência e gestão, vale a pena considerar o uso de Service Mesh no seu ambiente!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=aa4fe5dd5418" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Automação de Infraestrutura na AWS com Terraform, Slack, Kubernetes e Controle de Versão com Argo…]]></title>
            <link>https://medium.com/@bruno.sph/automa%C3%A7%C3%A3o-de-infraestrutura-na-aws-com-terraform-slack-kubernetes-e-controle-de-vers%C3%A3o-com-argo-fdfc364ed2b2?source=rss-718f9fde02cb------2</link>
            <guid isPermaLink="false">https://medium.com/p/fdfc364ed2b2</guid>
            <category><![CDATA[github-actions]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[slack]]></category>
            <category><![CDATA[terraform]]></category>
            <category><![CDATA[argo-cd]]></category>
            <dc:creator><![CDATA[Bruno Lucio]]></dc:creator>
            <pubDate>Tue, 18 Feb 2025 08:38:17 GMT</pubDate>
            <atom:updated>2025-02-18T08:38:17.697Z</atom:updated>
            <content:encoded><![CDATA[<h3><strong>Automação de Infraestrutura na AWS com Terraform, Slack, Kubernetes e Controle de Versão com Argo CD e GitHub Actions</strong></h3><p>Nos dias atuais, a automação da infraestrutura na nuvem é uma prática essencial para garantir agilidade, consistência e escalabilidade. Se você está interessado em aprender como automatizar a criação e o gerenciamento de recursos na AWS utilizando <strong>Terraform</strong>, <strong>Slack</strong>, <strong>Kubernetes</strong>, além de integrar com <strong>Argo CD</strong> e <strong>GitHub Actions</strong> para controle de versão, este tutorial é para você!</p><p>Neste artigo, mostro como orquestrar um fluxo completo de infraestrutura com <strong>EC2</strong>, <strong>Load Balancer</strong>, <strong>Grupos de Segurança</strong>, <strong>Certificados SSL</strong>, <strong>Subnets</strong> e <strong>Domínios</strong>. Tudo isso é configurado de maneira interativa, permitindo a personalização de cada componente através do Slack. E o melhor: toda a infraestrutura é gerenciada em tempo real com integração ao <strong>Argo CD</strong> ou <strong>GitHub Actions</strong>.</p><p>Através desse processo, podemos garantir que todas as mudanças na infraestrutura sejam controladas e versionadas, promovendo um ciclo contínuo de integração e entrega (CI/CD) para nossas configurações de infraestrutura, além de garantir uma gestão mais eficiente e segura.</p><p>Principais pontos abordados:</p><ul><li><strong>Terraform</strong> para definir e provisionar recursos na AWS.</li><li>Integração com <strong>Slack</strong> para coletar entradas interativas (como subnets, tipo de instância e domínio).</li><li><strong>Argo CD</strong> ou <strong>GitHub Actions</strong> para controle de versão e automação de deploy contínuo.</li><li>Implementação de recursos como <strong>EC2</strong>, <strong>Load Balancer</strong>, <strong>Grupos de Segurança</strong> e <strong>SSL</strong>.</li><li>Como vincular todos esses componentes, criando uma infraestrutura AWS completamente integrada.</li></ul><p>Se você quer aprimorar suas habilidades de DevOps e se aprofundar nas práticas de automação em nuvem, este tutorial é uma excelente oportunidade para colocar em prática conceitos importantes que facilitarão sua jornada na AWS!</p><p>Leia o artigo completo e experimente por conta própria!</p><h3>Hands-On: Automação de Infraestrutura AWS com Terraform, Slack, Kubernetes, Argo CD e GitHub Actions — Controle de Versão de Infraestrutura</h3><p>Este tutorial amplia a infraestrutura AWS automatizada com <strong>Terraform</strong>, <strong>Slack</strong>, <strong>EC2</strong>, <strong>Load Balancer</strong>, <strong>Grupo de Segurança</strong>, <strong>Certificado SSL</strong> e <strong>Registro de Domínio</strong>, adicionando a integração com ferramentas de <strong>controle de versão de infraestrutura</strong> como <strong>Argo CD</strong> e <strong>GitHub Actions</strong>. Você verá como essas ferramentas podem ser usadas para garantir que sua infraestrutura esteja versionada e gerenciável através de práticas de <strong>CI/CD</strong>.</p><h3>Objetivo</h3><ol><li>Criar uma infraestrutura AWS integrada com <strong>Terraform</strong> e <strong>Slack</strong>.</li><li>Implementar <strong>Argo CD</strong> ou <strong>GitHub Actions</strong> para o controle de versão da infraestrutura, proporcionando práticas de <strong>CI/CD</strong> para gerenciar mudanças de forma contínua.</li><li>Garantir que a infraestrutura gerenciada seja automática e facilmente replicável com versionamento adequado.</li></ol><h3>Pré-Requisitos</h3><ul><li><strong>Conta na AWS</strong> com permissões adequadas.</li><li><strong>AWS CLI</strong> configurada.</li><li><strong>Terraform</strong> instalado.</li><li><strong>Slack</strong> com integração de bots.</li><li><strong>Argo CD</strong> ou <strong>GitHub Actions</strong> configurados.</li><li><strong>AWS ACM</strong> para gerenciamento de certificados SSL.</li></ul><h3>Passo 1: Configuração Básica da Infraestrutura com Terraform</h3><h4>1.1. Definir o Provedor da AWS</h4><p>Em nosso arquivo main.tf, começamos configurando o provedor AWS, especificando a região.</p><pre>provider &quot;aws&quot; {<br>  region = &quot;us-east-1&quot;  # Região pode ser interativa ou definida via Slack<br>}</pre><h4>1.2. Registro de Domínio e Configuração de DNS</h4><p>A configuração do domínio e DNS com <strong>Route 53</strong> será automatizada.</p><pre>resource &quot;aws_route53_zone&quot; &quot;example&quot; {<br>  name = var.domain_name  # Valor obtido interativamente pelo Slack<br>}</pre><pre>resource &quot;aws_route53_record&quot; &quot;www&quot; {<br>  zone_id = aws_route53_zone.example.zone_id<br>  name    = &quot;www&quot;<br>  type    = &quot;A&quot;<br>  ttl     = 300<br>  records = [aws_lb.example.dns_name]<br>}</pre><h4>1.3. Certificado SSL (ACM)</h4><p>O certificado SSL será gerado com base na entrada do Slack.</p><pre>resource &quot;aws_acm_certificate&quot; &quot;example&quot; {<br>  domain_name       = var.domain_name<br>  validation_method = &quot;DNS&quot;<br>  <br>  validation_option {<br>    domain_name               = var.domain_name<br>    validation_record_fqdns   = [aws_route53_record.certificate_validation.fqdn]<br>  }<br>}</pre><h4>1.4. Instância EC2</h4><p>A configuração do EC2 irá permitir que o usuário forneça informações sobre <strong>tipo de instância</strong>, <strong>AMI</strong>, <strong>key pair</strong>, e <strong>subnet</strong> via Slack.</p><pre>resource &quot;aws_instance&quot; &quot;example&quot; {<br>  ami           = var.ami_id  # Obtido do Slack<br>  instance_type = var.instance_type  # Obtido do Slack<br>  key_name      = var.key_name  # Obtido do Slack<br>  subnet_id     = var.subnet_id  # Obtido do Slack</pre><pre>  security_group = aws_security_group.example_sg.id</pre><pre>  tags = {<br>    Name = &quot;EC2 Example&quot;<br>  }<br>}</pre><h4>1.5. Load Balancer</h4><p>A configuração do Load Balancer também será interativa, solicitando <strong>subnets</strong> e <strong>grupo de segurança</strong>.</p><pre>resource &quot;aws_lb&quot; &quot;example&quot; {<br>  name               = &quot;example-lb&quot;<br>  internal           = false<br>  load_balancer_type = &quot;application&quot;<br>  security_groups    = [aws_security_group.example_sg.id]<br>  subnets            = var.subnets  # Obtido interativamente pelo Slack</pre><pre>  enable_deletion_protection = false<br>  idle_timeout              = 60<br>}</pre><pre>resource &quot;aws_lb_listener&quot; &quot;https&quot; {<br>  load_balancer_arn = aws_lb.example.arn<br>  port              = 443<br>  protocol          = &quot;HTTPS&quot;<br>  ssl_policy        = &quot;ELBSecurityPolicy-2016-08&quot;</pre><pre>  certificate {<br>    certificate_arn = aws_acm_certificate.example.arn<br>  }</pre><pre>  default_action {<br>    type             = &quot;forward&quot;<br>    target_group_arn = aws_lb_target_group.example.arn<br>  }<br>}</pre><h4>1.6. Grupo de Segurança</h4><p>O <strong>grupo de segurança</strong> será configurado para permitir o tráfego <strong>HTTPS</strong> para as instâncias EC2.</p><pre>resource &quot;aws_security_group&quot; &quot;example_sg&quot; {<br>  name        = &quot;example_sg&quot;<br>  description = &quot;Security group for EC2 and Load Balancer&quot;</pre><pre>  ingress {<br>    from_port   = 443<br>    to_port     = 443<br>    protocol    = &quot;tcp&quot;<br>    cidr_blocks = [&quot;0.0.0.0/0&quot;]<br>  }</pre><pre>  # Permitir tráfego de Load Balancer para o EC2<br>  egress {<br>    from_port   = 0<br>    to_port     = 0<br>    protocol    = &quot;tcp&quot;<br>    cidr_blocks = [&quot;0.0.0.0/0&quot;]<br>  }<br>}</pre><h3>Passo 2: Integração com Slack para Coleta de Dados Interativos</h3><p>Utilizando o <strong>Slack</strong> como interface, o bot coleta dados para gerar a infraestrutura de forma interativa, perguntando sobre o <strong>domínio</strong>, <strong>subnets</strong>, <strong>AMI</strong>, <strong>tipo de instância</strong>, etc.</p><h3>Passo 3: Integração com Argo CD para Controle de Versão da Infraestrutura</h3><h4>3.1. O que é o Argo CD?</h4><p><strong>Argo CD</strong> é uma ferramenta de entrega contínua (CD) baseada em Kubernetes que facilita a gestão de aplicações Kubernetes. Usando Argo CD, podemos versionar a infraestrutura Terraform em um repositório Git e implantar essas mudanças automaticamente.</p><h4>3.2. Criando o Repositório Git para o Terraform</h4><p>Crie um repositório Git onde todos os arquivos de configuração do Terraform serão armazenados. Este repositório será usado para controle de versão e integração contínua com o Argo CD.</p><ul><li><strong>Passo 1:</strong> Crie um repositório no <strong>GitHub</strong> ou <strong>GitLab</strong>.</li><li><strong>Passo 2:</strong> Adicione os arquivos main.tf, variables.tf e outputs.tf ao repositório.</li><li><strong>Passo 3:</strong> No Argo CD, adicione o repositório Git para que ele possa acessar e sincronizar a infraestrutura.</li></ul><h4>3.3. Configurando o Argo CD</h4><ol><li>Instale o <strong>Argo CD</strong> em seu cluster Kubernetes.</li><li>No painel do <strong>Argo CD</strong>, adicione seu repositório Git, que contém as configurações do Terraform.</li><li>Crie uma aplicação no Argo CD para monitorar as alterações no repositório Git.</li><li>Toda vez que o código no repositório Git for alterado (como mudanças em main.tf), o Argo CD automaticamente aplicará essas mudanças.</li></ol><h4>3.4. Sincronizando as Configurações do Terraform com Argo CD</h4><p>No painel do Argo CD, crie uma nova aplicação com as seguintes configurações:</p><ul><li><strong>Source:</strong> Repositório Git contendo os arquivos do Terraform.</li><li><strong>Destination:</strong> Cluster Kubernetes onde as configurações serão aplicadas.</li><li><strong>Path:</strong> O diretório dentro do repositório Git onde o Terraform está localizado.</li></ul><p>Ao sincronizar o Argo CD, as mudanças serão aplicadas automaticamente ao seu ambiente AWS, conforme definido nas configurações do Terraform.</p><h3>Passo 4: Integração com GitHub Actions para CI/CD</h3><h4>4.1. O que são GitHub Actions?</h4><p><strong>GitHub Actions</strong> é uma plataforma para automação de workflows de CI/CD diretamente no GitHub. Podemos usá-lo para automatizar a execução do Terraform sempre que houver uma alteração no repositório.</p><h4>4.2. Configuração do GitHub Actions</h4><p>Crie um arquivo de workflow no diretório .github/workflows/terraform.yml dentro do seu repositório Git.</p><pre>name: Terraform CI/CD</pre><pre>on:<br>  push:<br>    branches:<br>      - main  # Ou a branch desejada</pre><pre>jobs:<br>  terraform:<br>    runs-on: ubuntu-latest</pre><pre>    steps:<br>    - name: Checkout repository<br>      uses: actions/checkout@v2</pre><pre>    - name: Set up AWS credentials<br>      uses: aws-actions/configure-aws-credentials@v1<br>      with:<br>        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}<br>        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}<br>        aws-region: us-east-1</pre><pre>    - name: Install Terraform<br>      run: |<br>        curl -LO <a href="https://github.com/hashicorp/terraform/releases/download/v1.0.0/terraform_1.0.0_linux_amd64.zip">https://github.com/hashicorp/terraform/releases/download/v1.0.0/terraform_1.0.0_linux_amd64.zip</a><br>        unzip terraform_1.0.0_linux_amd64.zip<br>        sudo mv terraform /usr/local/bin/</pre><pre>    - name: Terraform Init<br>      run: terraform init</pre><pre>    - name: Terraform Plan<br>      run: terraform plan</pre><pre>    - name: Terraform Apply<br>      run: terraform apply -auto-approve</pre><h4>4.3. Configurando Secrets no GitHub</h4><p>Para usar o <strong>GitHub Actions</strong> com AWS, você precisará configurar suas credenciais AWS como <strong>secrets</strong> no GitHub:</p><ol><li>Vá até o repositório GitHub e clique em <strong>Settings</strong>.</li><li>Na seção <strong>Secrets</strong>, adicione suas credenciais AWS (AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY).</li></ol><h4>4.4. Automatizando o Deploy com GitHub Actions</h4><p>Sempre que um push for feito para a branch main, o workflow do GitHub Actions será acionado. Isso executará os comandos terraform init, terraform plan e terraform apply, gerenciando sua infraestrutura automaticamente na AWS.</p><h3>Conclusão</h3><p>Neste tutorial, você aprendeu a integrar ferramentas de automação de infraestrutura como <strong>Terraform</strong>, <strong>Slack</strong>, <strong>Argo CD</strong> e <strong>GitHub Actions</strong> para criar uma infraestrutura na AWS com controle de versão contínuo. Agora você pode gerenciar sua infraestrutura de forma interativa via Slack e automatizada com práticas de <strong>CI/CD</strong>, seja utilizando <strong>Argo CD</strong> para integração contínua em Kubernetes ou <strong>GitHub Actions</strong> para automação de workflows diretamente no GitHub.</p><p>Essas ferramentas combinadas oferecem um processo robusto de gerenciamento, versionamento e implantação de infraestrutura em nuvem.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=fdfc364ed2b2" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>