<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Rafael Ferreira | Artigos e Posts</title>
    <link>https://www.orafaelferreira.com</link>
    <description>Artigos técnicos e posts sobre Azure, DevOps, FinOps, Terraform, Kubernetes, Platform Engineering, palestras e comunidade.</description>
    <language>pt-BR</language>
    <copyright>© 2026 Rafael Martin Alves Ferreira</copyright>
    <pubDate>Sun, 27 Sep 2026 12:00:00 GMT</pubDate>
    <lastBuildDate>Sun, 27 Sep 2026 12:00:00 GMT</lastBuildDate>
    <generator>orafaelferreira.com build (scripts/generate-rss.mjs)</generator>
    <ttl>60</ttl>
    <image>
      <url>https://www.orafaelferreira.com/icon-512.png</url>
      <title>Rafael Ferreira | Artigos e Posts</title>
      <link>https://www.orafaelferreira.com</link>
    </image>
    <atom:link href="https://www.orafaelferreira.com/rss.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Notificações no Claude Code: hooks Notification e Stop no WSL com VS Code</title>
      <link>https://www.orafaelferreira.com/artigos/claude-code-notificacoes-wsl</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/claude-code-notificacoes-wsl</guid>
      <pubDate>Sun, 27 Sep 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Como fazer o Claude Code avisar quando precisa de aprovação ou termina, no WSL dentro do VS Code, com hooks e um alerta que sobrevive ao Não Perturbe.</description>
      <category>Artigos</category>
      <category>IA</category>
      <category>DevOps</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2026/claude-notif/capa.png" length="0" type="image/png" />
      <content:encoded><![CDATA[

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2026/claude-notif/capa.png" alt="Infográfico de capa: linha do tempo de um turno do agente, com o agente parando às 14h02 para pedir aprovação e o humano só percebendo às 14h21, marcando dezenove minutos perdidos; coluna à esquerda com preferredNotifChannel, escopo de usuário, hooks Notification e Stop, FlashWindowEx e kill-switch; ao centro o fluxo do hook indo do JSON no stdin para o roteador em bash e daí para o piscar da barra de tarefas do Windows" />

<h2 id="o-problema">O problema</h2>

<p>Você pede uma tarefa longa para o agente, troca de janela para fazer outra coisa e volta vinte minutos</p>
<p>depois. O agente trabalhou por um minuto, parou para pedir aprovação de um comando e ficou os outros</p>
<p>dezenove esperando você olhar para a tela.</p>

<p>Escrevi sobre <a href="https://www.orafaelferreira.com/artigos/loop-engineering-na-pratica">como eu opero agentes no dia a dia</a>, e o ponto central</p>
<p>lá é que o objetivo é deixar de ser a peça que dá o próximo passo. Só que existe um ponto do ciclo em que</p>
<p>o humano é obrigatório: aprovar uma operação destrutiva, responder uma pergunta, decidir entre dois</p>
<p>caminhos. Esse ponto não dá para automatizar, mas dá para encurtar. Se o agente para às 14h02 e você</p>
<p>descobre às 14h21, dezenove minutos foram embora por um motivo bobo: ninguém te avisou.</p>

<p>Este artigo é o passo a passo de como resolver isso no ambiente que eu uso, que é provavelmente o mais</p>
<p>comum entre quem trabalha com plataforma no Windows: <em></em>Claude Code via CLI, rodando no WSL, dentro do</p>
<p>terminal integrado do VS Code<em></em>.</p>

<h2 id="o-caminho-nativo-preferrednotifchannel">O caminho nativo: <code>preferredNotifChannel</code></h2>

<p>O Claude Code tem uma configuração própria de notificação. Ela vive no <code>settings.json</code> e aceita estes</p>
<p>valores:</p>
<div><table><thead><tr><th>Valor</th><th>O que faz</th></tr></thead><tbody><tr><td><code>auto</code></td><td>Padrão. Detecta o terminal e usa a notificação nativa dele</td></tr><tr><td><code>terminal_bell</code></td><td>Emite o caractere de bell (<code>\a</code>)</td></tr><tr><td><code>iterm2</code> / <code>iterm2_with_bell</code></td><td>Notificação nativa do iTerm2 (macOS)</td></tr><tr><td><code>kitty</code> / <code>ghostty</code></td><td>Notificação nativa desses terminais</td></tr><tr><td><code>notifications_disabled</code></td><td>Desliga tudo</td></tr></tbody></table></div>
<p>O detalhe que importa: <strong><code>auto</code> não entrega nada no terminal integrado do VS Code</strong>. A detecção procura</p>
<p>iTerm2, Kitty ou Ghostty. Não achando nenhum, ela não tem para onde mandar e silenciosamente não faz nada.</p>
<p>Como o padrão é <code>auto</code>, a conclusão natural de quem roda no VS Code é que "o Claude Code não notifica",</p>
<p>quando na verdade ele está notificando para um canal que não existe ali.</p>

<p>O que funciona nesse terminal é o bell:</p>

<div data-lang="json"><pre><code>// ~/.claude/settings.json
{
  "preferredNotifChannel": "terminal_bell"
}</code></pre></div>

<p>E, do lado do VS Code:</p>

<div data-lang="json"><pre><code>// settings.json do VS Code
{
  "terminal.integrated.enableBell": true
}</code></pre></div>

<p>Com os dois ligados, a aba do terminal ganha um ícone de sino quando o agente pede atenção. É barato e vale</p>
<p>a pena ligar. Mas resolve pouco: só te ajuda se você já estiver com o VS Code na tela. Se você trocou de</p>
<p>janela — que é exatamente o caso do problema — um marcador dentro da janela que você não está vendo não</p>
<p>serve de nada.</p>

<p>Para isso a gente precisa de hooks.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2026/claude-notif/1.png" alt="Infográfico com os cinco valores de preferredNotifChannel em cartões: auto marcado como padrão, terminal_bell, iterm2 e iterm2_with_bell, kitty e ghostty, e notifications_disabled. O cartão auto está destacado em violeta com a anotação de que a detecção procura iTerm2, Kitty e Ghostty e, não achando nenhum, não manda nada. Abaixo, duas caixas de configuração lado a lado, preferredNotifChannel terminal_bell no settings.json do Claude Code e terminal.integrated.enableBell true no settings.json do VS Code, ligadas a um ícone de sino na aba do terminal" />

<h2 id="a-pegadinha-do-escopo-usuario-ou-projeto">A pegadinha do escopo: usuário ou projeto?</h2>

<p>Antes do código, o erro que faz um hook correto nunca rodar.</p>

<p>O Claude Code tem dois lugares para declarar hooks: o <code>settings.json</code> <strong>do projeto</strong></p>
<p>(<code>.claude/settings.json</code> no repositório) e o <strong>do usuário</strong> (<code>~/.claude/settings.json</code>). A diferença é</p>
<p>sutil e cara: o <code>settings.json</code> de projeto só é lido quando a sessão <strong>abre naquele diretório</strong>.</p>

<p>Eu tinha um hook de notificação declarado no <code>.claude/settings.json</code> da raiz do meu workspace. Só que eu</p>
<p>quase nunca abro o Claude Code na raiz: eu abro dentro de um repositório específico, um nível abaixo. E,</p>
<p>aberta lá, a sessão carrega as skills e rules herdadas, mas <strong>não carrega aquele bloco de hooks</strong>. Ou seja:</p>
<p>o hook existia, estava correto, e não rodava praticamente nunca. Nenhum erro, nenhum aviso. Só silêncio.</p>

<p>A regra que eu tiro disso é simples. <strong>Hook de domínio vai no projeto; hook transversal vai no usuário.</strong></p>
<p>Um guardrail que valida manifesto de Kubernetes só faz sentido no repositório que tem manifesto. Já</p>
<p>notificação não tem nada a ver com o repositório: eu quero ser avisado em qualquer sessão, em qualquer</p>
<p>diretório. Então ela vai no escopo de usuário:</p>

<div data-lang="json"><pre><code>// ~/.claude/settings.json
{
  "preferredNotifChannel": "terminal_bell",
  "hooks": {
    "Notification": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "bash $HOME/.claude/hooks/notify-desktop.sh",
            "timeout": 10
          }
        ]
      }
    ],
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "bash $HOME/.claude/hooks/notify-desktop.sh",
            "timeout": 10
          }
        ]
      }
    ]
  }
}</code></pre></div>

<p>Dois detalhes desse bloco:</p>

<strong>Use caminho absoluto.</strong> Em hook de projeto é comum escrever <code>$CLAUDE_PROJECT_DIR/.claude/hooks/...</code>.
<p>Aqui isso não serve: essa variável aponta para o repositório da sessão atual, que muda a cada vez. Como o</p>
<p>script é único e global, ele precisa de um caminho fixo.</p>

<strong>Os settings somam, não substituem.</strong> Se o mesmo evento estiver declarado no escopo de usuário e no de
<p>projeto, os dois rodam. É ótimo quando são coisas diferentes: no meu caso, o <code>Stop</code> de usuário notifica e</p>
<p>o <code>Stop</code> do projeto imprime um resumo dos arquivos de infra tocados na sessão, e um não atrapalha o outro.</p>
<p>Vira problema quando é o mesmo hook nos dois lugares: aí você recebe a notificação duas vezes. Ao mover um</p>
<p>hook para o escopo de usuário, lembre de tirar do projeto.</p>

<h2 id="o-notificador-por-que-piscar-a-barra-de-tarefas">O notificador: por que piscar a barra de tarefas</h2>

<p>A escolha óbvia no Windows é o toast, aquele balão no canto inferior direito. Eu comecei por ele e ele não</p>
<p>resolveu, por um motivo que provavelmente vale para muita gente.</p>

<strong>O toast morre com o "Não perturbe" ligado.</strong> Ele não some: ele entra mudo e direto na Central de
<p>Notificações, onde só aparece se você abrir (Win+N). Como o "Não perturbe" é justamente o que a gente liga</p>
<p>para conseguir trabalhar, o canal que deveria te chamar é o primeiro a ser silenciado. E o som, que seria o</p>
<p>plano B, morre junto se o volume estiver em zero, o que num notebook em reunião é o normal.</p>

<p>O que sobrevive aos dois é a API mais velha da lista: <strong><code>FlashWindowEx</code></strong>, que pisca o botão da janela na</p>
<p>barra de tarefas. Ela não passa pelo subsistema de notificações do Windows, então "Não perturbe" não a</p>
<p>afeta; não emite som, então volume zero não a afeta. E, com a combinação certa de flags, ela pisca <em></em>até a</p>
<p>janela receber foco<em></em>: se você voltar dez minutos depois, o ícone ainda está laranja te esperando.</p>

<p>De brinde, ela se autossuprime: chamar <code>FlashWindowEx</code> numa janela que já está em foco não faz nada. Isso</p>
<p>é exatamente o comportamento que a gente quer, porque se o VS Code está em foco você já está olhando.</p>

<p>O script abaixo faz as duas coisas: pisca (canal principal) e dispara o toast (que serve como histórico na</p>
<p>Central de Notificações, mesmo entrando mudo).</p>

<div data-lang="powershell"><pre><code># ~/.claude/hooks/notify-desktop.ps1
param(
  [string]$Title = 'Claude Code',
  [string]$Body  = 'Precisa da sua atencao'
)

$SkipWhenFocused = $true

$ErrorActionPreference = 'SilentlyContinue'

Add-Type @'
using System;
using System.Runtime.InteropServices;
public class ClaudeNotify {
  [StructLayout(LayoutKind.Sequential)]
  public struct FLASHWINFO {
    public uint cbSize; public IntPtr hwnd; public uint dwFlags; public uint uCount; public uint dwTimeout;
  }
  [DllImport("user32.dll")] static extern bool FlashWindowEx(ref FLASHWINFO pwfi);
  [DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow();

  const uint FLASHW_ALL = 3;        // titulo + botao na barra de tarefas
  const uint FLASHW_TIMERNOFG = 12; // pisca ate a janela receber foco

  public static void FlashUntilFocused(IntPtr hwnd) {
    FLASHWINFO f = new FLASHWINFO();
    f.cbSize = (uint)Marshal.SizeOf(f);
    f.hwnd = hwnd;
    f.dwFlags = FLASHW_ALL | FLASHW_TIMERNOFG;
    f.uCount = 0;
    f.dwTimeout = 0;
    FlashWindowEx(ref f);
  }
}
'@

$window = Get-Process -Name Code -ErrorAction SilentlyContinue |
          Where-Object { $_.MainWindowHandle -ne 0 } |
          Select-Object -First 1

if ($window) {
  if ($SkipWhenFocused -and [ClaudeNotify]::GetForegroundWindow() -eq $window.MainWindowHandle) {
    exit 0
  }
  [ClaudeNotify]::FlashUntilFocused($window.MainWindowHandle)
}

try {
  [Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType=WindowsRuntime] | Out-Null
  $template = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent(
    [Windows.UI.Notifications.ToastTemplateType]::ToastText02)
  $nodes = $template.GetElementsByTagName('text')
  $nodes.Item(0).AppendChild($template.CreateTextNode($Title)) | Out-Null
  $nodes.Item(1).AppendChild($template.CreateTextNode($Body))  | Out-Null
  [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier('Microsoft.VisualStudioCode').Show(
    [Windows.UI.Notifications.ToastNotification]::new($template))
} catch { }

exit 0</code></pre></div>

<p>Uma observação sobre o AppId <code>Microsoft.VisualStudioCode</code> na chamada do toast: o Windows 11 descarta em</p>
<p>silêncio toasts de AppIds que não estão registrados na máquina. O AppId do PowerShell normalmente não está,</p>
<p>e é por isso que muito exemplo de internet "funciona" (a API retorna sucesso) sem nunca mostrar nada.</p>
<p>Usar o AppId de um aplicativo que já é registrado resolve, e de quebra o toast sai com o ícone dele.</p>

<p>Se você quiser o toast furando o "Não perturbe", dá: Configurações → Sistema → Notificações → Não perturbe</p>
<p>→ <em>Definir notificações prioritárias</em>, e adicione o Visual Studio Code. É opcional: o canal principal aqui</p>
<p>não depende disso.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2026/claude-notif/2.png" alt="Infográfico dividido em dois painéis. À esquerda, TOAST: o balão do Windows saindo do canto inferior direito, com duas linhas vermelhas marcando que ele entra mudo na Central de Notificações quando o Não Perturbe está ligado e que o som morre com o volume em zero. À direita, FLASHWINDOWEX: o botão do VS Code piscando em laranja na barra de tarefas, com três linhas em ciano marcando que não passa pelo subsistema de notificações, que não emite som e que pisca até a janela receber foco graças às flags FLASHW_ALL e FLASHW_TIMERNOFG. Barra de rodapé com a frase de que o canal que deveria te chamar é o primeiro a ser silenciado" />

<h2 id="o-roteador-o-que-o-hook-recebe-e-como-decidir">O roteador: o que o hook recebe e como decidir</h2>

<p>O script PowerShell sabe <em>como</em> avisar. Falta decidir <em>quando</em> avisar e <em>o quê</em> dizer, e isso vem do JSON</p>
<p>que o Claude Code entrega no stdin do hook.</p>

<p>O evento <code>Notification</code> traz <code>message</code>, <code>title</code> (opcional) e, o campo que interessa,</p>
<code>notification_type</code>:
<div><table><thead><tr><th><code>notification_type</code></th><th>Quando dispara</th><th>No script abaixo</th></tr></thead><tbody><tr><td><code>permission_prompt</code></td><td>O agente está pedindo aprovação para uma ferramenta</td><td>Notifica</td></tr><tr><td><code>agent_needs_input</code></td><td>Um subagente está esperando entrada</td><td>Notifica</td></tr><tr><td><code>idle_prompt</code></td><td>O agente terminou e você não digitou nada desde então</td><td>Notifica</td></tr><tr><td><code>agent_completed</code></td><td>Um subagente terminou</td><td>Ignorado: o <code>Stop</code> já cobre o fim do turno</td></tr><tr><td><code>auth_success</code> e outros</td><td>Autenticação, quota, avisos internos</td><td>Ignorado</td></tr></tbody></table></div>
<p>Já o evento <code>Stop</code>, que dispara no fim de cada turno, traz <code>last_assistant_message</code>, a última mensagem</p>
<p>do agente. Dá para usar a primeira linha dela como corpo da notificação, o que é bem melhor do que um</p>
<p>genérico "terminei": você lê o que aconteceu direto do toast, sem voltar para a janela.</p>

<p>Tratar esses tipos de forma diferente é o que separa uma notificação útil de um incômodo. Aprovação é</p>
<p>urgente; <code>auth_success</code> é ruído e não deveria te interromper nunca.</p>

<p>Antes do script, uma dependência: ele usa <code>jq</code> para ler o JSON, e o Ubuntu do WSL não vem com ele. Como</p>
<p>o script sai em silêncio quando o <code>jq</code> falta (é o comportamento correto para um hook, mas é indistinguível</p>
<p>de "não funcionou"), instale primeiro:</p>

<div data-lang="bash"><pre><code>sudo apt install -y jq</code></pre></div>

<div data-lang="bash"><pre><code>#!/usr/bin/env bash
# ~/.claude/hooks/notify-desktop.sh
set +e

# Kill-switches: um geral (se voce ja tiver um para seus hooks) e um so da notificacao.
if [ "${HOOKS_ENABLED}" = "false" ]; then exit 0; fi
if [ "${CLAUDE_NOTIFY}" = "off" ]; then exit 0; fi
command -v powershell.exe &gt;/dev/null 2&gt;&amp;1 || exit 0

raw_input="$(cat 2&gt;/dev/null)"
[ -z "$raw_input" ] &amp;&amp; exit 0
command -v jq &gt;/dev/null 2&gt;&amp;1 || exit 0

event="$(printf '%s' "$raw_input" | jq -r '.hook_event_name // ""' 2&gt;/dev/null)"

case "$event" in
  Notification)
    ntype="$(printf '%s' "$raw_input" | jq -r '.notification_type // ""' 2&gt;/dev/null)"
    case "$ntype" in
      permission_prompt|agent_needs_input) body="Precisa da sua aprovacao" ;;
      idle_prompt)                         body="Esperando sua resposta" ;;
      *)                                   exit 0 ;;   # auth_success, quota: ruido
    esac
    ;;
  Stop)
    last="$(printf '%s' "$raw_input" \
      | jq -r '(.last_assistant_message // "") | split("\n")[0] | .[0:120]' 2&gt;/dev/null)"
    if [ -n "$last" ]; then body="Terminei: ${last}"; else body="Terminei"; fi
    ;;
  *)
    exit 0
    ;;
esac

# powershell.exe nao enxerga caminho WSL; converter para o caminho Windows.
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" &amp;&amp; pwd)"
ps1_win="$(wslpath -w "${script_dir}/notify-desktop.ps1" 2&gt;/dev/null)"
[ -z "$ps1_win" ] &amp;&amp; exit 0

body="${body//\'/}"
body="${body//\"/}"

powershell.exe -NoProfile -ExecutionPolicy Bypass -File "$ps1_win" \
  -Title "Claude Code" -Body "$body" &gt;/dev/null 2&gt;&amp;1 &amp;

exit 0</code></pre></div>

<p>Três decisões nesse script que valem explicação:</p>

<strong><code>wslpath -w</code>.</strong> O <code>powershell.exe</code> é um binário Windows: ele não entende <code>/home/voce/.claude/...</code>.
<p>Sem a conversão para o caminho Windows, ele simplesmente não acha o arquivo. Vale saber o que sai dessa</p>
<p>conversão, porque não é o que a gente espera: como o script mora no filesystem do WSL, o caminho é UNC</p>
<p>(<code>\\wsl.localhost\Ubuntu\home\voce\...</code>), não <code>C:\...</code>. Só o que está em <code>/mnt/c/</code> vira letra</p>
<p>de unidade. Para a chamada tanto faz, o PowerShell abre os dois, mas se você for depurar à mão é bom não</p>
<p>estranhar.</p>

<strong>O <code>&</code> no fim.</strong> Subir um <code>powershell.exe</code> do WSL custa perto de um segundo, e o <code>Add-Type</code> compila
<p>C# em tempo de execução. O hook tem <code>timeout</code>, e segurar o agente por um segundo a cada notificação é um</p>
<p>imposto que não faz sentido pagar. Jogando para background, o hook retorna em milissegundos.</p>

<strong>Sair cedo quando falta dependência.</strong> Sem <code>jq</code>, sem <code>powershell.exe</code>, sem stdin: <code>exit 0</code>. Hook de
<p>notificação nunca deve quebrar a sessão por causa de si mesmo. O preço desse desenho é o da seção anterior:</p>
<p>falta de dependência e funcionamento normal têm exatamente a mesma cara, então instale o <code>jq</code> antes de</p>
<p>concluir que a receita não funciona.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2026/claude-notif/3.png" alt="Infográfico do roteamento: no topo, um cartão com o JSON que chega no stdin do hook. Abaixo, um nó divisor que separa por hook_event_name em dois caminhos, Notification e Stop. O caminho Notification abre em cinco cartões de notification_type, com permission_prompt, agent_needs_input e idle_prompt em ciano levando a corpos de notificação, e agent_completed e auth_success em cinza levando a um cartão exit 0 marcado como ruído. O caminho Stop mostra last_assistant_message sendo cortada na primeira linha e nos 120 caracteres. Barra de rodapé com a frase de que tratar esses tipos de forma diferente é o que separa uma notificação útil de um incômodo" />

<h2 id="testando-e-por-que-meus-dois-primeiros-testes-nao-valeram-nada">Testando — e por que meus dois primeiros testes não valeram nada</h2>

<p>Essa parte é a que eu mais quero que fique, porque eu errei aqui.</p>

<p>Escrevi o script, rodei à mão para testar e não vi nada. Rodei de novo, nada. A primeira reação foi achar</p>
<p>que o script estava quebrado. Só que não estava: <strong>o teste é que era inválido</strong>.</p>

<p>Os dois primeiros testes rodaram com o VS Code em foco. Nessa condição, o script sai antes de piscar (é o</p>
<code>$SkipWhenFocused</code>), e mesmo sem ele a <code>FlashWindowEx</code> não faria nada, porque piscar janela em foco não
<p>é uma operação que existe. Eu tinha testado, com capricho, exatamente a condição em que o comportamento</p>
<p>correto é não acontecer nada.</p>

<p>A segunda tentativa foi disparar com atraso fixo: "dispara em 12 segundos, troque de janela". Também não</p>
<p>valeu: aos 12 segundos eu ainda estava no VS Code, lendo a mensagem que mandava eu sair dele.</p>

<p>O teste que presta tira o tempo da equação. Em vez de contar segundos, ele <strong>espera o foco sair</strong> e dispara</p>
<p>no instante em que sai:</p>

<div data-lang="powershell"><pre><code># espera o VS Code perder o foco e so entao dispara
$code = Get-Process -Name Code | Where-Object { $_.MainWindowHandle -ne 0 } | Select-Object -First 1
$deadline = (Get-Date).AddSeconds(90)
while ((Get-Date) -lt $deadline) {
  if ([ClaudeNotify]::GetForegroundWindow() -ne $code.MainWindowHandle) {
    [ClaudeNotify]::FlashUntilFocused($code.MainWindowHandle)
    'Disparado.'
    break
  }
  Start-Sleep -Milliseconds 800
}</code></pre></div>

<p>E os caminhos do hook em si, com o VS Code minimizado ou em outra tela:</p>

<div data-lang="bash"><pre><code># pedido de aprovacao
echo '{"hook_event_name":"Notification","notification_type":"permission_prompt"}' \
  | bash ~/.claude/hooks/notify-desktop.sh

# fim de turno, com a mensagem real no corpo
echo '{"hook_event_name":"Stop","last_assistant_message":"Terminei o refactor."}' \
  | bash ~/.claude/hooks/notify-desktop.sh

# tipo de ruido: nao deve notificar nada
echo '{"hook_event_name":"Notification","notification_type":"auth_success"}' \
  | bash ~/.claude/hooks/notify-desktop.sh</code></pre></div>

<p>A lição que sobra é maior que o script: <strong>a API retornar sucesso não é verificação</strong>. No caminho do toast,</p>
<p>o Windows aceitou a notificação quatro vezes seguidas e devolveu <code>OK</code> nas quatro, e eu não vi nenhuma</p>
<p>delas, porque o "Não perturbe" mandava todas, mudas, direto para a Central de Notificações. "O sistema</p>
<p>aceitou" e "a pessoa foi avisada" são duas afirmações diferentes, e só a segunda é o objetivo. Vale para</p>
<p>notificação e vale para praticamente tudo em infraestrutura: o <code>Succeeded</code> do control plane não prova que</p>
<p>a coisa funciona, prova que o pedido foi aceito.</p>

<h2 id="kill-switch-e-detalhes-finais">Kill-switch e detalhes finais</h2>

<p>Duas coisas para fechar.</p>

<strong>O kill-switch.</strong> Em dia de foco absoluto, <code>export CLAUDE_NOTIFY=off</code> silencia só a notificação, sem
<p>derrubar os hooks de guardrail. Separar os dois interruptores importa: você nunca quer estar numa situação</p>
<p>em que a única forma de calar a notificação é desligar as travas de segurança junto.</p>

<strong>Reabra o Claude Code.</strong> O <code>settings.json</code> é lido na abertura da sessão. Depois de mexer nos hooks, a
<p>sessão que já está aberta continua com a configuração antiga, o que gera aquele minuto de confusão</p>
<p>achando que nada funcionou.</p>

<p>E se um dia parar de funcionar sem motivo aparente, o suspeito é a barra de tarefas com ocultação</p>
<p>automática: piscar um botão que não está na tela não avisa ninguém.</p>

<p>No fim, o que essa configuração faz é pequeno: um ícone que pisca. Mas ela devolve os dezenove minutos do</p>
<p>começo do artigo, e faz isso sem depender de som, sem depender de notificação ligada e sem exigir que você</p>
<p>fique de olho na janela. Para um ciclo em que o humano só entra nos pontos onde ele é obrigatório, o que</p>
<p>importa é que esses pontos sejam curtos.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Dois anos de Docker: o que mudou de 2024 para cá</title>
      <link>https://www.orafaelferreira.com/artigos/dois-anos-de-docker</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/dois-anos-de-docker</guid>
      <pubDate>Sat, 19 Sep 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>De setembro de 2024 a 2026: do Engine 27 ao 29, a quebra de rede do 28.0, o recuo do Docker Hub nos limites de pull, Hardened Images, segurança e a chegada dos agentes.</description>
      <category>Artigos</category>
      <category>DevOps</category>
      <category>Kubernetes</category>
      <category>Open Source</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/docker/capa.png" length="0" type="image/png" />
      <content:encoded><![CDATA[

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/docker/capa.png" alt="Infográfico de capa: linha do tempo do Docker Engine de 27.2.1 (set/2024) a 29.8.1 (15/09/2026), com o 28.0.0 marcado como rede endurecida e o 29.0.0 como troca de defaults; coluna à esquerda com Engine 28.0, Engine 29.0, Docker Hub, Hardened Images e Agentes" />

<p>Entre setembro de 2024 e setembro de 2026 o <a href="https://docs.docker.com/engine/" target="_blank" rel="noopener noreferrer">Docker Engine</a> saiu da série 27 e chegou na 29.8.1. No caminho teve um release que derrubou acesso a container em produção, uma troca do armazenamento de imagem por padrão, a remoção de um subsistema inteiro de assinatura e a depreciação do cgroup v1.</p>

<p>Fora do Engine, o período teve um anúncio de cobrança no <a href="https://docs.docker.com/docker-hub/" target="_blank" rel="noopener noreferrer">Docker Hub</a> que foi revertido publicamente, um catálogo de imagens endurecidas que começou pago e virou open source, e uma linha de produto inteira voltada a agentes de IA.</p>

<p>Este artigo é o levantamento do que mudou, com a fonte oficial de cada ponto. Não é guia de migração, é mapa: o que aconteceu, quando, e o que morde na prática.</p>
<div><table><thead><tr><th>Item</th><th>Situação</th></tr></thead><tbody><tr><td>Janela coberta</td><td>setembro de 2024 a setembro de 2026</td></tr><tr><td>Engine no início da janela</td><td>27.2.1</td></tr><tr><td>Engine hoje</td><td>29.8.1</td></tr><tr><td>Séries major no período</td><td>3 (27, 28 e 29)</td></tr></tbody></table></div>
<h2 id="o-que-sobrou-de-2024-a-serie-27">O que sobrou de 2024: a série 27</h2>

<p>O fim da linha 27 foi de ajuste fino, quase todo em rede. As notas completas estão nas <a href="https://docs.docker.com/engine/release-notes/27/" target="_blank" rel="noopener noreferrer">release notes do Engine 27</a>.</p>

<ul>
<li><strong>27.2.1 (09/09/2024):</strong> atualização do <a href="https://github.com/opencontainers/runc" target="_blank" rel="noopener noreferrer">runc</a> para a v1.1.14, corrigindo a CVE-2024-45310. Corrigiu também o <code>docker login</code> gravando credencial sob a chave errada.</li>
<li><strong>27.3.0 (19/09/2024):</strong> chega a flag <code>--feature</code> no daemon, que passa a ser o mecanismo padrão de ligar e desligar comportamento novo sem esperar release major.</li>
<li><strong>27.4.0 (09/12/2024):</strong> portas publicadas passam a ser acessíveis entre bridge networks diferentes quando o <code>br_netfilter</code> está carregado e o userland-proxy está desligado. Detecção de endereço duplicado (DAD) de IPv6 foi desabilitada no bridge.</li>
<li><strong>27.4.1 (18/12/2024):</strong> limpeza da chain <code>DOCKER FILTER</code> e correção de carregamento de módulo de kernel em Docker in Docker.</li>
<li><strong>27.5.1 (22/01/2025):</strong> aparece o <code>DOCKER_IGNORE_BR_NETFILTER_ERROR</code>, sintoma de que o terreno de rede já estava sendo preparado para o que viria em seguida.</li>
</ul>

<h2 id="engine-2800-o-release-que-quebrou-rede">Engine 28.0.0, o release que quebrou rede</h2>

<p>Publicado em <strong>19/02/2025</strong>, é o release mais importante da janela e o que mais gerou chamado de suporte.</p>

<p>Até o 27.x, em Linux com iptables, qualquer host com rota até a máquina do Docker conseguia falar direto com o IP interno de um container, mesmo em porta que nunca foi publicada. Bastava saber o endereço na rede bridge, tipicamente algo em <code>172.17.0.0/16</code>. Na prática, subir um banco com <code>docker run</code> sem <code>-p</code> não deixava ele isolado da rede local, deixava ele apenas sem NAT.</p>

<p>O 28.0.0 fecha isso. Tráfego inbound não solicitado para o IP do container passa a ser descartado na chain <code>DOCKER</code>, salvo se a porta foi publicada com <code>-p</code> ou <code>--publish</code>. O anúncio oficial está em <a href="https://www.docker.com/blog/docker-engine-28-hardening-container-networking-by-default/" target="_blank" rel="noopener noreferrer">Hardening Container Networking by Default</a>.</p>

<p>Três detalhes que pegam gente de surpresa:</p>

<ul>
<li>Vale só para <strong>Linux com iptables</strong>. Docker Desktop não é afetado.</li>
<li>Passa a exigir os módulos de kernel de <code>ipset</code> (<code>ip_set</code>, <code>ip_set_hash_net</code> e <code>netfilter_xt_set</code>). Em host enxuto ou kernel customizado, o daemon reclama na subida.</li>
<li>O binário <code>docker-proxy</code> mudou e não é compatível com <code>dockerd</code> antigo, então atualizar os pacotes pela metade não funciona. O <code>rootlesskit-docker-proxy</code> foi removido.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/docker/1.png" alt="Duas faixas comparando o acesso a um container postgres em 172.17.0.5:5432 subido sem -p: antes (27.x) o host da rede local passa pela chain DOCKER aberta; depois (28.0) o tráfego é descartado e só passa com -p 5432:5432. Ao lado, três detalhes: só Linux com iptables, exige módulos ipset e docker-proxy novo não fala com dockerd antigo" />

<h3 id="as-saidas-de-emergencia">As saídas de emergência</h3>

<p>Se alguma coisa no ambiente dependia do comportamento antigo, existem escapes documentados. Em ordem, do mais cirúrgico para o mais amplo:</p>
<div><table><thead><tr><th>Opção</th><th>Escopo</th><th>Efeito</th></tr></thead><tbody><tr><td><code>com.docker.network.bridge.trusted_host_interfaces</code></td><td>por rede</td><td>libera acesso direto vindo de interfaces específicas do host</td></tr><tr><td><code>com.docker.network.bridge.gateway_mode_ipv4</code> ou <code>_ipv6</code> com valor <code>nat-unprotected</code></td><td>por rede</td><td>devolve o comportamento antigo naquela rede</td></tr><tr><td><code>allow-direct-routing</code></td><td>daemon inteiro</td><td>libera acesso roteado direto em tudo</td></tr></tbody></table></div>
<div data-lang="json"><pre><code>{
  "allow-direct-routing": true
}</code></pre></div>

<p>A recomendação prática é não começar pelo <code>allow-direct-routing</code>, porque ele desfaz o ganho de segurança do release inteiro. Se só um host de monitoração precisa alcançar o container, <code>trusted_host_interfaces</code> resolve com escopo bem menor.</p>

<p>O 28.0 também trouxe o modo <code>isolated</code> para redes <code>internal</code>, o <code>gw-priority</code>, a definição de nome de interface do container via <code>com.docker.network.endpoint.ifname</code>, a flag <code>--ipv4</code> no <code>docker network create</code> e IPv6 sem precisar de <code>fixed-cidr-v6</code>.</p>

<h3 id="o-que-o-280-removeu">O que o 28.0 removeu</h3>

<ul>
<li>O driver de log <code>logentries</code>.</li>
<li>Plugins externos de graph-driver.</li>
<li>A flag <code>--api-cors-header</code>.</li>
<li>A flag <code>--time</code> em <code>docker stop</code> e <code>docker restart</code>, que virou <code>--timeout</code>.</li>
<li>Suporte a imagens no schema 1 legado. A variável <code>DOCKER_ENABLE_DEPRECATED_PULL_SCHEMA_1_IMAGE</code> deixou de funcionar.</li>
</ul>

<h2 id="a-serie-28-depois-do-280">A série 28 depois do 28.0</h2>

<p>As <a href="https://docs.docker.com/engine/release-notes/28/" target="_blank" rel="noopener noreferrer">release notes do Engine 28</a> trazem o resto da linha:</p>

<ul>
<li><strong>28.1.0 (17/04/2025):</strong> <code>docker bake</code> vira comando de topo, como alias de <code>docker buildx bake</code>. Entra o <code>--use-api-socket</code> em modo experimental.</li>
<li><strong>28.2.0 (28/05/2025):</strong> mudança de default silenciosa e relevante, o <strong>CDI (Container Device Interface) passa a vir habilitado</strong>. Bind mount com caminho relativo passa a funcionar.</li>
<li><strong>28.3.0 (24/06/2025):</strong> suporte a GPU AMD e uso do <code>DOCKER_AUTH_CONFIG</code> como credential store.</li>
<li><strong>28.3.3 (29/07/2025):</strong> corrige a <strong>CVE-2025-54388</strong>, em que um reload do firewalld reabria portas publicadas. É o contraponto irônico do 28.0: o release que fechou a rede tinha um caminho para reabrir sozinho.</li>
<li><strong>28.4.0 (03/09/2025):</strong> <code>GODEBUG</code> configurável via docker context.</li>
<li><strong>28.5.0 (02/10/2025):</strong> anúncio da depreciação do Raspberry Pi OS 32 bits após a série 28.</li>
</ul>

<h2 id="engine-2900-a-troca-de-defaults">Engine 29.0.0, a troca de defaults</h2>

<p>Publicado em <strong>10/11/2025</strong>, o 29.0.0 é menos barulhento que o 28.0 mas mexe em mais coisa de uma vez. As <a href="https://docs.docker.com/engine/release-notes/29/" target="_blank" rel="noopener noreferrer">release notes do Engine 29</a> listam tudo.</p>

<strong>Mudanças de comportamento padrão:</strong>

<ul>
<li>O <strong>containerd image store passa a ser o padrão em instalação nova</strong>.</li>
<li><code>docker image ls</code> ganha uma visão nova, em árvore colapsada, e <strong>deixa de mostrar imagem sem tag</strong> a menos que você passe <code>--all</code>.</li>
<li>O backend experimental de firewall em nftables fica disponível via <code>firewall-backend: nftables</code>. Vale reforçar, porque circula informação errada sobre isso: <strong>nftables não chegou no 28.x</strong>, toda a série 28 é iptables.</li>
</ul>

<strong>Quebras:</strong>

<ul>
<li><strong>cgroup v1 depreciado.</strong> O suporte segue até maio de 2029, então não é urgência, mas é o aviso formal.</li>
<li><strong>Docker Content Trust removido do CLI.</strong> A Docker publicou depois um <a href="https://www.docker.com/blog/docker-content-trust-retirement-and-migration-guidance/" target="_blank" rel="noopener noreferrer">guia de aposentadoria e migração</a> em 16/06/2026.</li>
<li>O daemon passa a exigir API v1.44 ou superior, ou seja, cliente de Docker v25.0 para cima.</li>
<li>As chains <code>DOCKER-ISOLATION-STAGE-1</code> e <code>DOCKER-ISOLATION-STAGE-2</code> do iptables foram removidas. Se você tem automação que escreve regra apoiada nesses nomes, ela quebra em silêncio.</li>
<li>O módulo Go <code>github.com/docker/docker</code> foi depreciado em favor de <code>github.com/moby/moby/client</code> e <code>github.com/moby/moby/api</code>.</li>
<li>Pacotes Debian armhf passam a mirar ARMv7 e os pacotes de Raspbian 32 bits foram descontinuados.</li>
</ul>

<strong>Novidades:</strong> <code>docker image load</code> e <code>save</code> com múltiplas plataformas via <code>--platform</code>, <code>--runtime</code> no Windows, campo <code>Health</code> em <code>GET /containers/json</code> e a entitlement <code>device</code> no builder.

<h2 id="traduzindo-o-containerd-image-store-como-padrao">Traduzindo: o containerd image store como padrão</h2>

<p>Historicamente o Docker guardava imagem num store próprio, baseado em graph drivers como o overlay2. O <a href="https://docs.docker.com/engine/storage/containerd/" target="_blank" rel="noopener noreferrer">containerd image store</a> substitui essa camada pelo mesmo mecanismo que o containerd já usa, e ser padrão a partir do 29.0 muda três coisas no dia a dia.</p>

<strong>Uma imagem, várias plataformas, de verdade.</strong> No store antigo, a máquina guardava só a variante da arquitetura local. Com o containerd store, a mesma tag mantém os manifestos das várias plataformas, o que faz <code>docker image save --platform</code> e build multi-arquitetura local funcionarem sem malabarismo.

<strong>Attestations e proveniência viram cidadão de primeira classe.</strong> O 29.6.0 (18/06/2026) inclusive adicionou o endpoint <code>GET /images/{name}/attestations</code>, que devolve as declarações in-toto da imagem.

<strong>Scripts que liam o store antigo quebram.</strong> Qualquer automação que inspecionava diretório de graph driver, ou que contava com <code>docker image ls</code> listando imagem sem tag por padrão, precisa ser revista. Essa combinação é a que mais aparece: o comando não falha, ele só devolve menos linha do que antes, e o script segue adiante achando que não tem imagem órfã para limpar.

<p>A migração não é automática em host que já existia. Instalação nova nasce com o store novo, host antigo continua no store anterior até a troca ser feita de forma explícita, o que é bom, porque a troca não preserva as imagens já baixadas.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/docker/2.png" alt="Comparativo entre o graph driver overlay2, com uma só variante amd64 e docker image ls listando imagem sem tag, e o containerd image store, padrão em instalação nova no 29.0, com uma tag nginx:1.27 apontando para amd64, arm64 e arm/v7, endpoint GET /images/{name}/attestations e aviso de que host antigo não migra sozinho" />

<h2 id="traduzindo-cgroup-v1-depreciado-e-o-rootless-novo">Traduzindo: cgroup v1 depreciado e o rootless novo</h2>

<p>Duas mudanças que valem checagem antes de subir para o 29.</p>

<strong>cgroup v1.</strong> É o mecanismo do kernel Linux que limita e contabiliza CPU, memória e IO de cada container. A v2 unificou a hierarquia e é o padrão em distribuição moderna há anos, mas host antigo, e principalmente kernel customizado ou imagem de node gerenciada mais conservadora, ainda pode estar em v1. O 29.0 depreciou a v1 com suporte até maio de 2029. Checar é uma linha:

<div data-lang="bash"><pre><code>stat -fc %T /sys/fs/cgroup/
# cgroup2fs  = v2, tudo certo
# tmpfs      = v1, entra na fila de migração</code></pre></div>

<strong>Rootless com driver novo.</strong> No 29.5.0 (14/05/2026) o <code>gvisor-tap-vsock</code> virou o driver de rede padrão do modo rootless, no lugar do slirp4netns. É breaking change para quem roda <a href="https://docs.docker.com/engine/security/rootless/" target="_blank" rel="noopener noreferrer">Docker rootless</a> com ajuste fino de rede, porque características de performance e comportamento de port forwarding mudam. O mesmo release passou a habilitar time namespace privado por padrão nos kernels que suportam.

<h2 id="a-serie-29-ao-longo-de-2026">A série 29 ao longo de 2026</h2>

<ul>
<li><strong>29.2.0 (26/01/2026):</strong> suporte experimental a NRI (Node Resource Interface) e campo <code>Identity</code> no inspect.</li>
<li><strong>29.3.0 (05/03/2026):</strong> a versão mínima de API volta de v1.44 para <strong>v1.40</strong>, recuando parcialmente a quebra do 29.0. Entra o <code>bind-create-src</code> no <code>--mount</code>.</li>
<li><strong>29.3.1 (25/03/2026):</strong> corrige a CVE-2026-34040, bypass de autorização em plugin AuthZ, mais três CVEs de BuildKit.</li>
<li><strong>29.4.2 (01/05/2026):</strong> o perfil seccomp padrão passa a bloquear sockets <code>AF_ALG</code> e a syscall <code>socketcall(2)</code>. O efeito colateral foi conhecido e documentado: <strong>quebra programa 32 bits e imagem i386</strong>, com workaround via perfil seccomp v0.2.1.</li>
<li><strong>29.5.0 (14/05/2026):</strong> driver rootless novo e time namespace privado, já citados.</li>
<li><strong>29.5.1 (18/05/2026):</strong> trio de correções no <code>docker cp</code>, incluindo duas TOCTOU que permitiam criar arquivo arbitrário e redirecionar bind mount para caminho arbitrário do host.</li>
<li><strong>29.6.0 (18/06/2026):</strong> endpoint de attestations e correção do <code>COPY --chmod</code> sendo filtrado pelo umask do daemon.</li>
<li><strong>29.7.0 (30/07/2026):</strong> <code>mount type=image</code> deixa de ser experimental, entra o <code>embedded-containerd</code> experimental rodando containerd dentro do processo do daemon, e o <code>default-stop-timeout</code>.</li>
<li><strong>29.8.0 (03/09/2026):</strong> flag <code>--umask</code> no <code>docker run</code> e <code>create</code>, templates de perfil AppArmor configuráveis no daemon.</li>
<li><strong>29.8.1 (15/09/2026):</strong> versão corrente na data deste artigo.</li>
</ul>

<h2 id="docker-hub-o-anuncio-que-foi-revertido">Docker Hub: o anúncio que foi revertido</h2>

<p>Essa é a parte do período com mais informação errada circulando, então vale reconstituir a linha do tempo com calma.</p>

<p>No fim de 2024 a Docker anunciou uma revisão de planos que incluía <strong>cobrança por consumo</strong>, tanto de pull quanto de storage, com limites de pull por hora previstos para 1 de março de 2025. O anúncio está em <a href="https://www.docker.com/blog/november-2024-updated-plans-announcement/" target="_blank" rel="noopener noreferrer">Announcing Upgraded Docker Plans</a>, e os planos novos entraram à venda em 10/12/2024.</p>

<p>Em <strong>21/02/2025</strong>, poucos dias antes da data prevista, a empresa voltou atrás em <a href="https://www.docker.com/blog/revisiting-docker-hub-policies-prioritizing-developer-experience/" target="_blank" rel="noopener noreferrer">Revisiting Docker Hub Policies</a>:</p>

<ul>
<li>a cobrança por consumo de pull foi <strong>cancelada de vez</strong>;</li>
<li>a cobrança por storage foi adiada por tempo indeterminado;</li>
<li>o aumento de rate limit previsto <strong>não foi aplicado</strong>;</li>
<li>a Docker se comprometeu a anunciar qualquer mudança futura com seis meses de antecedência.</li>
</ul>

<p>Ou seja, os números de "10 pulls por hora para anônimo" e "40 por hora para conta Personal" que ainda aparecem em post de blog e em thread de fórum são de <strong>um plano que nunca entrou em vigor</strong>. Citar eles hoje é citar documento revogado.</p>

<p>Os limites que valem de fato, segundo a <a href="https://docs.docker.com/docker-hub/usage/pulls/" target="_blank" rel="noopener noreferrer">documentação oficial de uso do Docker Hub</a>, são contados numa janela de <strong>seis horas</strong>, não por hora:</p>
<div><table><thead><tr><th>Conta</th><th>Limite de pull</th></tr></thead><tbody><tr><td>Anônimo</td><td>100 a cada 6 horas, por endereço IPv4 ou sub-rede IPv6 /64</td></tr><tr><td>Personal autenticado</td><td>200 a cada 6 horas</td></tr><tr><td>Pro, Team e Business</td><td>sem limite</td></tr></tbody></table></div>
<p>O detalhe do IPv4 compartilhado é o que costuma doer. Um cluster inteiro atrás de um NAT, ou um runner de CI numa faixa compartilhada, consome a cota como se fosse um único usuário. É exatamente o cenário que motiva colocar um cache de registry na frente do Hub, assunto que já tratei em <a href="https://www.orafaelferreira.com/artigos/azure-container-registry-artifact-cache">ACR Artifact Cache</a>.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/docker/3.png" alt="Linha do tempo do Docker Hub: anúncio de cobrança por consumo em nov/2024, planos novos à venda em 10/12/2024 (Pro de 5 para 9, Team de 9 para 15 dólares), recuo público em 21/02/2025 e os limites por hora de 01/03/2025 carimbados como nunca entrou em vigor; ao lado, tabela do que vale hoje: 100 pulls a cada 6 horas para anônimo, 200 para Personal, sem limite para Pro, Team e Business" />

<h2 id="planos-o-reajuste-do-fim-de-2024">Planos: o reajuste do fim de 2024</h2>

<p>O que de fato mudou de preço na janela foi a tabela de planos, em 10/12/2024:</p>
<div><table><thead><tr><th>Plano</th><th>Antes</th><th>Depois</th></tr></thead><tbody><tr><td>Personal</td><td>gratuito</td><td>gratuito</td></tr><tr><td>Pro</td><td>5 dólares/mês</td><td>9 dólares/mês</td></tr><tr><td>Team</td><td>9 dólares/usuário/mês</td><td>15 dólares/usuário/mês</td></tr><tr><td>Business</td><td>24 dólares/usuário/mês</td><td>24 dólares/usuário/mês</td></tr></tbody></table></div>
<p>A contrapartida foi deixar de vender Docker Build Cloud e Testcontainers Cloud como licença por assento separada, passando a incluí-los nos planos pagos, com Docker Scout ilimitado em Team e Business.</p>

<h2 id="imagens-endurecidas-dhi-o-fim-da-minimus-e-o-els">Imagens endurecidas: DHI, o fim da Minimus e o ELS</h2>

<p>Em <strong>19/05/2025</strong> a Docker lançou as <a href="https://www.docker.com/blog/introducing-docker-hardened-images/" target="_blank" rel="noopener noreferrer">Docker Hardened Images</a>, um catálogo curado de imagens mínimas, sem shell e sem package manager, rodando como usuário não root, com base Alpine ou Debian. O argumento de venda era redução de superfície de ataque na casa de 95%. O modelo, no lançamento, era pago.</p>

<p>Em <strong>17/12/2025</strong> o modelo virou: mais de mil imagens passaram a ser <a href="https://www.docker.com/press-release/docker-makes-hardened-images-free-open-and-transparent-for-everyone/" target="_blank" rel="noopener noreferrer">gratuitas e open source sob Apache 2.0</a>, com SBOM completo, dado de CVE transparente e proveniência SLSA Build Level 3. O pago ficou restrito ao DHI Enterprise, com SLA de remediação de CVE crítico em menos de sete dias, imagens FIPS e STIG e customização.</p>

<p>Em <strong>2026</strong> o catálogo seguiu crescendo: <a href="https://www.docker.com/blog/announcing-docker-hardened-system-packages/" target="_blank" rel="noopener noreferrer">Hardened System Packages</a> em 03/03/2026 e, no <a href="https://www.docker.com/blog/why-we-chose-the-harder-path-docker-hardened-images-one-year-later/" target="_blank" rel="noopener noreferrer">balanço de um ano</a> publicado em 14/04/2026, 500 mil pulls por dia e mais de 2 mil imagens.</p>

<strong>O fim da Minimus.</strong> Em 25/08/2026 a Docker publicou um <a href="https://www.docker.com/blog/moving-from-minimus-to-docker-hardened-images/" target="_blank" rel="noopener noreferrer">guia de migração da Minimus para o DHI</a>. Vale ser preciso aqui, porque é fácil ler errado: <strong>não houve aquisição</strong>. A Minimus encerrou operações e o registry dela sai do ar em <strong>22/10/2026</strong>. Imagem já baixada continua rodando, mas sem receber patch de CVE. Quem dependia daquelas bases precisa trocar a linha <code>FROM</code> antes dessa data.

<strong>ELS (Extended Lifecycle Support).</strong> É o add-on pago do DHI para software que já passou do fim de vida upstream, com patch por até cinco anos após o EOL, SLA de 14 dias para CVE crítica ou alta, imagens buildadas do fonte e assinadas, com SBOM, VEX e SLSA Build Level 3. O exemplo que a Docker usou para explicar o produto foi o <a href="https://www.docker.com/blog/minio-end-of-life-how-to-stay-patched-and-audit-ready-with-docker-els/" target="_blank" rel="noopener noreferrer">fim de vida do MinIO</a>, em 24/08/2026.

<p>Se o assunto é reduzir imagem sem comprar catálogo, a abordagem de imagem mínima construída na mão está em <a href="https://www.orafaelferreira.com/artigos/docker-python-distroless-kubernetes">Imagens de contêiners Python no Kubernetes com Distroless</a>.</p>

<h2 id="build-e-compose">Build e Compose</h2>

<strong>Docker Bake virou GA</strong> em 05/02/2025, junto com o Docker Desktop 4.38. O <a href="https://www.docker.com/blog/ga-launch-docker-bake/" target="_blank" rel="noopener noreferrer">anúncio oficial</a> descreve o que ele resolve: orquestração declarativa de build em HCL, YAML ou JSON, com paralelização e deduplicação de transferência de contexto. Em 28.1 ele deixou de ser subcomando do buildx e virou <code>docker bake</code> direto.

<strong>Compose entrou na era dos agentes</strong> em 10/07/2025. O <a href="https://www.docker.com/blog/build-ai-agents-with-docker-compose/" target="_blank" rel="noopener noreferrer">anúncio</a> mostra modelos abertos, agentes e ferramentas MCP declarados no mesmo <code>compose.yaml</code> e subindo com um <code>docker compose up</code>, integrando Model Runner, MCP Gateway e Offload. A documentação está no <a href="https://docs.docker.com/guides/agentic-ai/" target="_blank" rel="noopener noreferrer">guia de agentic AI</a>. Veio junto deploy direto para Google Cloud Run via <code>gcloud run compose up</code>.

<p>Vale uma ressalva de precisão: o <code>docker compose watch</code>, da seção <code>develop</code>, não teve anúncio de GA nessa janela. Ele amadureceu no período, mas já existia antes.</p>

<h2 id="seguranca-do-periodo">Segurança do período</h2>

<p>Além dos CVEs já citados por release, quatro eventos merecem registro.</p>

<strong>O trio de escape do runc (novembro de 2025).</strong> Corrigido no Engine 28.5.2, em 05/11/2025, e no runc 1.2.8 e 1.3.3. São três falhas que juntas permitem escapar do container: CVE-2025-31133 (condição de corrida em <code>maskedPaths</code>), CVE-2025-52565 (<code>/dev/console</code> via symlink) e CVE-2025-52881 (escritas redirecionadas para <code>/proc</code>). É o item mais grave da janela em severidade.

<strong>A CVE-2025-54388 (julho de 2025).</strong> Um reload do firewalld reabria portas publicadas que o 28.0 tinha fechado. Bom lembrete de que endurecimento de default só vale se sobreviver ao ciclo de vida do host.

<strong>O comprometimento da supply chain do Trivy (março de 2026).</strong> Entre 19 e 23/03/2026 o CI/CD da Aqua foi invadido e as imagens <code>aquasec/trivy</code> nas tags <code>0.69.4</code>, <code>0.69.5</code>, <code>0.69.6</code> e <code>latest</code> foram publicadas no Docker Hub com um infostealer que roubava <code>~/.docker/config.json</code>, credenciais de AWS, GCP e Azure, chaves SSH e token de Kubernetes. A última tag limpa é a <code>0.69.3</code>. A Docker publicou <a href="https://www.docker.com/blog/trivy-supply-chain-compromise-what-docker-hub-users-should-know/" target="_blank" rel="noopener noreferrer">o que usuários do Hub precisavam saber</a> e confirmou que a infraestrutura dela e o DHI não foram comprometidos. A ironia é difícil de ignorar: a ferramenta de escanear vulnerabilidade virou o vetor.

<strong>A redução de escopo do NVD (maio de 2026).</strong> O NIST estreitou o que entra no National Vulnerability Database, o que afeta qualquer programa de scanning que trata o NVD como fonte única. A Docker escreveu sobre <a href="https://www.docker.com/blog/nist-narrows-the-nvd-what-container-security-programs-should-reassess/" target="_blank" rel="noopener noreferrer">o que reavaliar</a> em 13/05/2026.

<h2 id="a-virada-para-agentes">A virada para agentes</h2>

<p>Boa parte do investimento da Docker nos últimos dois anos foi para IA. Em ordem:</p>

<ul>
<li><strong>Model Runner</strong> ficou <a href="https://www.docker.com/blog/announcing-docker-model-runner-ga/" target="_blank" rel="noopener noreferrer">GA em 18/09/2025</a>. Roda LLM local, puxa modelo do Docker Hub em formato OCI ou do HuggingFace em GGUF, expõe <strong>API compatível com a da OpenAI</strong> e usa GPU em macOS com Apple Silicon, Windows com NVIDIA ou Qualcomm e Linux. É construído sobre o llama.cpp e é open source. Em 26/02/2026 ganhou vLLM no Apple Silicon.</li>
<li><strong>MCP Catalog e MCP Toolkit</strong> foram anunciados em 22/04/2025 e ficaram <a href="https://www.docker.com/blog/announcing-docker-mcp-catalog-and-toolkit-beta/" target="_blank" rel="noopener noreferrer">disponíveis em beta em 05/05/2025</a>, com mais de 100 servidores MCP conteinerizados no Hub e gestão de credenciais com isolamento por container.</li>
<li><strong>MCP Gateway</strong> saiu em 09/07/2025 como <a href="https://www.docker.com/blog/docker-mcp-gateway-secure-infrastructure-for-agentic-ai/" target="_blank" rel="noopener noreferrer">projeto open source</a>, disponível em <a href="https://github.com/docker/mcp-gateway" target="_blank" rel="noopener noreferrer">github.com/docker/mcp-gateway</a>. É um ponto único de enforcement entre agente e servidores MCP, com <code>--verify-signatures</code>, <code>--log-calls</code> e <code>--block-secrets</code>. Se MCP com Docker é o assunto, escrevi sobre o uso prático em <a href="https://www.orafaelferreira.com/artigos/terraform-mcp-server-docker">MCP Server com Docker e Terraform</a>.</li>
<li><strong>cagent</strong> é o runtime de agentes declarado em YAML, distribuível como artefato OCI pelo Docker Hub, <a href="https://www.docker.com/blog/cagent-build-and-distribute-ai-agents-and-workflows/" target="_blank" rel="noopener noreferrer">apresentado em 2025</a> e depois integrado ao Docker Desktop, com suporte a Agent Client Protocol.</li>
<li><strong>Docker Offload</strong> entrou em beta em 10/07/2025 e ficou <a href="https://www.docker.com/blog/docker-offload-now-generally-available/" target="_blank" rel="noopener noreferrer">GA em 02/04/2026</a>, como add-on de Docker Business. Manda build e execução para infraestrutura na nuvem da Docker, com GPU opcional.</li>
<li><strong>Gordon</strong>, o agente de IA integrado ao fluxo de container, ficou <a href="https://www.docker.com/blog/meet-gordon-dockers-ai-agent-for-your-entire-container-workflow/" target="_blank" rel="noopener noreferrer">GA em 19/05/2026</a>, gratuito em qualquer conta, com um tier Gordon Plus a 20 dólares por mês.</li>
<li><strong>Docker Sandboxes</strong> é o movimento mais recente, anunciado em 30/01/2026 e detalhado em <a href="https://www.docker.com/blog/docker-sandboxes-run-agents-in-yolo-mode-safely/" target="_blank" rel="noopener noreferrer">Run Agents in YOLO Mode, Safely</a> em 31/03/2026. Roda agente de código em <strong>microVM</strong>, cada sandbox com daemon Docker, filesystem e rede próprios, via CLI <code>sbx</code>. A <a href="https://docs.docker.com/ai/sandboxes/" target="_blank" rel="noopener noreferrer">documentação</a> diz que o CLI é gratuito inclusive para uso comercial, e que só os recursos de governança organizacional exigem assinatura. Em 16/04/2026 a Docker explicou <a href="https://www.docker.com/blog/why-microvms-the-architecture-behind-docker-sandboxes/" target="_blank" rel="noopener noreferrer">por que microVM e não container</a>: o VMM é proprietário justamente para funcionar em macOS e Windows.</li>
</ul>

<p>O fio comum é o mesmo que já discuti em <a href="https://www.orafaelferreira.com/artigos/loop-engineering-na-pratica">Loop Engineering na prática</a>: a pergunta deixou de ser se o agente escreve código e passou a ser onde ele executa, com qual credencial e sob qual limite.</p>

<h2 id="de-relance">De relance</h2>

<ul>
<li><strong>Docker VMM</strong> entrou em <a href="https://www.docker.com/blog/docker-vmm-public-beta-a-complete-overhaul-built-for-performance/" target="_blank" rel="noopener noreferrer">public beta em 12/08/2026</a>, reescrito para performance.</li>
<li><strong>Verified Publisher</strong> virou self-serve em 20/08/2026.</li>
<li><strong>OIDC para GitHub Actions</strong> em organizações Docker saiu em 31/07/2026, o que elimina secret de longa duração no pipeline.</li>
<li><strong>Docker Desktop</strong> passou por 4.40 (Model Runner), 4.43 (MCP Catalog remodelado e Compose Bridge, que gera configuração de Kubernetes) e 4.50 (ferramentas de debug gratuitas).</li>
<li><strong>Não há anúncio oficial</strong> de mudança de preço ou de limite do Docker Hub em 2026. O que circula em site de terceiros sobre "allowance com overage" não tem fonte primária, então não tratei como fato.</li>
</ul>

<h2 id="o-que-eu-tiro-disso">O que eu tiro disso</h2>

<p>Olhando os dois anos inteiros, três coisas entram na minha lista de atenção.</p>

<strong>A primeira é o 28.0.</strong> É a única mudança do período que quebra ambiente em produção de forma silenciosa e difícil de diagnosticar, porque o sintoma aparece longe da causa: alguém perde acesso a um serviço que "sempre funcionou" e ninguém associa a um upgrade de Engine. Vale saber que os escapes existem e, mais importante, resistir a usar o <code>allow-direct-routing</code> como primeiro reflexo.

<strong>A segunda é o 29 como pacote.</strong> containerd image store por padrão, cgroup v1 depreciado, Content Trust removido e chains de iptables renomeadas são quatro coisas independentes que chegam no mesmo release. Nenhuma é urgente sozinha, e é justamente por isso que elas acumulam até virar um upgrade grande e arriscado lá na frente.

<strong>A terceira é a virada de eixo do produto.</strong> Em dois anos a Docker foi de "empresa de container" para "empresa de container e de infraestrutura para agente". Sandboxes, Offload, Gordon e cagent não são feature isolada, é uma aposta de portfólio. Para quem trabalha com plataforma, a pergunta prática é se isso vira dependência nova ou se fica como opção, e a resposta ainda não está dada.

<p>O resto, imagem, build, Compose e registry, continua sendo o mesmo Docker de sempre, o que é uma boa notícia sobre a estabilidade da base.</p>

<h2 id="referencias">Referências</h2>

<ul>
<li><a href="https://docs.docker.com/engine/release-notes/27/" target="_blank" rel="noopener noreferrer">Docker Engine release notes 27</a></li>
<li><a href="https://docs.docker.com/engine/release-notes/28/" target="_blank" rel="noopener noreferrer">Docker Engine release notes 28</a></li>
<li><a href="https://docs.docker.com/engine/release-notes/29/" target="_blank" rel="noopener noreferrer">Docker Engine release notes 29</a></li>
<li><a href="https://www.docker.com/blog/docker-engine-28-hardening-container-networking-by-default/" target="_blank" rel="noopener noreferrer">Hardening Container Networking by Default</a></li>
<li><a href="https://docs.docker.com/docker-hub/usage/pulls/" target="_blank" rel="noopener noreferrer">Docker Hub: uso e limites de pull</a></li>
<li><a href="https://www.docker.com/blog/revisiting-docker-hub-policies-prioritizing-developer-experience/" target="_blank" rel="noopener noreferrer">Revisiting Docker Hub Policies</a></li>
<li><a href="https://www.docker.com/blog/november-2024-updated-plans-announcement/" target="_blank" rel="noopener noreferrer">Announcing Upgraded Docker Plans</a></li>
<li><a href="https://www.docker.com/blog/introducing-docker-hardened-images/" target="_blank" rel="noopener noreferrer">Introducing Docker Hardened Images</a></li>
<li><a href="https://www.docker.com/press-release/docker-makes-hardened-images-free-open-and-transparent-for-everyone/" target="_blank" rel="noopener noreferrer">Docker Hardened Images grátis e open source</a></li>
<li><a href="https://www.docker.com/blog/moving-from-minimus-to-docker-hardened-images/" target="_blank" rel="noopener noreferrer">Migração da Minimus para Docker Hardened Images</a></li>
<li><a href="https://www.docker.com/blog/minio-end-of-life-how-to-stay-patched-and-audit-ready-with-docker-els/" target="_blank" rel="noopener noreferrer">Docker ELS e o fim de vida do MinIO</a></li>
<li><a href="https://www.docker.com/blog/ga-launch-docker-bake/" target="_blank" rel="noopener noreferrer">GA do Docker Bake</a></li>
<li><a href="https://www.docker.com/blog/build-ai-agents-with-docker-compose/" target="_blank" rel="noopener noreferrer">Build AI Agents with Docker Compose</a></li>
<li><a href="https://www.docker.com/blog/announcing-docker-model-runner-ga/" target="_blank" rel="noopener noreferrer">GA do Docker Model Runner</a></li>
<li><a href="https://www.docker.com/blog/announcing-docker-mcp-catalog-and-toolkit-beta/" target="_blank" rel="noopener noreferrer">Docker MCP Catalog e Toolkit</a></li>
<li><a href="https://www.docker.com/blog/docker-mcp-gateway-secure-infrastructure-for-agentic-ai/" target="_blank" rel="noopener noreferrer">Docker MCP Gateway</a></li>
<li><a href="https://www.docker.com/blog/docker-offload-now-generally-available/" target="_blank" rel="noopener noreferrer">GA do Docker Offload</a></li>
<li><a href="https://docs.docker.com/ai/sandboxes/" target="_blank" rel="noopener noreferrer">Docker Sandboxes</a></li>
<li><a href="https://www.docker.com/blog/trivy-supply-chain-compromise-what-docker-hub-users-should-know/" target="_blank" rel="noopener noreferrer">Comprometimento da supply chain do Trivy</a></li>
<li><a href="https://www.docker.com/blog/docker-content-trust-retirement-and-migration-guidance/" target="_blank" rel="noopener noreferrer">Aposentadoria do Docker Content Trust</a></li>
<li><a href="https://github.com/opencontainers/runc/releases" target="_blank" rel="noopener noreferrer">runc releases e advisories</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>9 meses de Kubernetes: o que mudou depois da minha CKA</title>
      <link>https://www.orafaelferreira.com/artigos/cka-o-que-mudou-no-kubernetes</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/cka-o-que-mudou-no-kubernetes</guid>
      <pubDate>Fri, 18 Sep 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Certifiquei na CKA em dezembro de 2025. Nove meses e três releases depois, um raio-x do que mudou no Kubernetes: Mutating Admission Policies, a família DRA e o fim do Ingress NGINX.</description>
      <category>Artigos</category>
      <category>Kubernetes</category>
      <category>Certificações</category>
      <category>DevOps</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/cka-news/capa.png" length="0" type="image/png" />
      <content:encoded><![CDATA[

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/cka-news/capa.png" alt="Infográfico de capa: linha do tempo do Kubernetes de v1.34 a v1.37, com o marcador da CKA em 23/12/2025, os releases Timbernetes, Haru e Garhwal com suas datas e contagem de enhancements, e o arquivamento do Ingress NGINX em 24/03/2026; coluna à esquerda com in-place resize, Mutating Admission Policies, família DRA, KYAML e fim do Ingress NGINX" />

<p>Passei na <strong>CKA (Certified Kubernetes Administrator)</strong> em <strong>23/12/2025</strong>. Contei como foi a preparação em <a href="https://www.orafaelferreira.com/artigos/jornada-certificacao-cka">Como foi minha jornada para a certificação CKA</a>, este artigo é o capítulo seguinte: o que aconteceu com o Kubernetes <strong>depois</strong> disso.</p>

<p>Fui atrás, release por release, do que mudou desde então. Foram três releases do Core (v1.35, v1.36 e v1.37) em nove meses, mais uma mudança grande no ecossistema de Ingress que pesa direto no dia a dia de quem administra cluster.</p>
<div><table><thead><tr><th>Item</th><th>Situação</th></tr></thead><tbody><tr><td>Certificação emitida</td><td>23/12/2025</td></tr><tr><td>Válida até</td><td>23/12/2027</td></tr><tr><td>Releases do Core desde então</td><td>3 (v1.35, v1.36, v1.37)</td></tr></tbody></table></div>
<h2 id="tres-releases-135-136-e-137">Três releases: 1.35, 1.36 e 1.37</h2>

<h3 id="v135-timbernetes-17122025">v1.35 "Timbernetes" — 17/12/2025</h3>

<p>60 enhancements (17 stable, 19 beta, 22 alpha). O destaque prático:</p>

<ul>
<li><strong>In-place Pod resource updates</strong> chega a GA, permitindo ajustar CPU e memória de um Pod <strong>sem recriá-lo</strong>. Quem já teve que reiniciar um StatefulSet inteiro para subir o limite de memória de um container sabe o tamanho disso.</li>
<li><code>Job.spec.managedBy</code> e supplemental groups de granularidade fina, ambos GA.</li>
<li>Diretório <code>drop-in</code> para configuração modular do kubelet, GA.</li>
<li>Em beta: certificados de identidade nativos por Pod, reconciliação de rotas via watch no Cloud Controller Manager, scheduling sensível à carga do workload, tolerations com operadores numéricos e node affinity mutável em PV.</li>
</ul>

<h3 id="v136-haru-22042026">v1.36 "Haru" — 22/04/2026</h3>

<p>70 enhancements (18 stable, 25 beta, 25 alpha), o maior salto do período.</p>

<ul>
<li><strong>User Namespaces</strong> e <strong>Mutating Admission Policies</strong> chegam a GA.</li>
<li>Também GA: autorização granular da API HTTPS do kubelet, SELinux labeling em mount-time, Declarative Validation e Volume Group Snapshots.</li>
<li>Em beta: toda a família nova de DRA (Partitionable Devices, Consumable Capacity, Device Taints/Tolerations), Gang Scheduling API, Memory QoS via cgroup v2 e resize vertical in-place.</li>
<li><strong>Removidos de vez</strong>: o plugin de volume <code>gitRepo</code> (avisado desde a 1.11), o suporte a flex-volume no kubeadm e o driver in-tree do Portworx.</li>
</ul>

<h3 id="v137-garhwal-26082026">v1.37 "Garhwal" — 26/08/2026</h3>

<p>67 enhancements (16 stable, 23 beta, 27 alpha, 1 remoção). Essa saiu <strong>depois</strong> de eu começar este levantamento, então vale o registro do que de fato entrou, e não do que o sneak peek prometia.</p>

<ul>
<li><strong>KYAML</strong> estável na saída do <code>kubectl</code>: <code>kubectl get -o kyaml</code> sai do feature gate e passa a vir ligado por padrão em todo comando que aceita <code>--output</code>. Todo arquivo KYAML continua sendo YAML válido, então nada na pipeline precisa mudar, o ganho é não depender mais de indentação sensível.</li>
<li><strong>Device taints e tolerations do DRA</strong> chegam a stable, com o objeto <code>DeviceTaintRule</code>. Falo disso em detalhe mais abaixo.</li>
<li>Também GA: <strong>Metrics API</strong>, <strong>Storage Version Migration</strong> (ligado por padrão) e <strong>Pod Certificates + ClusterTrustBundles</strong>.</li>
<li>Em beta: pod-level resource managers (recursos compartilhados entre containers de um Pod, que o sneak peek anunciava como GA e acabou ficando em beta), Memory QoS, native histograms, kubelet rootless (<code>KubeletInUserNamespace</code>) e <strong>HPA com scale-to-zero</strong>.</li>
</ul>

<strong>Vale a atenção:</strong> começou formalmente a fase de saída do modo <strong>IPVS</strong> do kube-proxy. Ainda não é urgente, o plano público é desabilitar por padrão na 1.40 e remover de vez na 1.43, mas o relógio começou a contar.

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/cka-news/1.png" alt="Dois painéis: à esquerda, o webhook mutador com o API server chamando por TLS um serviço HTTP seu fora do cluster, com os custos de manter o serviço no ar, TLS e failurePolicy; à direita, a MutatingAdmissionPolicy (v1.36 GA) com a expressão CEL avaliada dentro do API server e o Pod recebendo o label time: plataforma sem processo externo" />

<h2 id="traduzindo-mutating-admission-policies">Traduzindo: Mutating Admission Policies</h2>

<p>Se você quer alterar um objeto automaticamente no momento em que ele é criado (injetar um sidecar, forçar um label, setar um default), a forma nativa até a v1.36 era escrever e hospedar um <strong>webhook</strong>: um serviço HTTP seu que o API server chama a cada request, com toda a complexidade de TLS, disponibilidade e latência que isso implica. Se o webhook cai, dependendo do <code>failurePolicy</code>, o cluster para de aceitar Pod.</p>

<p>A v1.36 transforma essa lógica de mutação em um <strong>objeto Kubernetes declarado em CEL</strong>, sem nenhum serviço próprio no ar:</p>

<div data-lang="yaml"><pre><code>apiVersion: admissionregistration.k8s.io/v1
kind: MutatingAdmissionPolicy
metadata:
  name: injeta-label-de-time
spec:
  matchConstraints:
    resourceRules:
      - apiGroups: [""]
        apiVersions: ["v1"]
        resources: ["pods"]
  mutations:
    - patchType: ApplyConfiguration
      applyConfiguration:
        expression: &gt;-
          Object{ metadata: Object.metadata{ labels: {"time": "plataforma"} } }</code></pre></div>

<p>É o mesmo raciocínio que a <strong>ValidatingAdmissionPolicy</strong> já tinha trazido para validação, agora estendido para mutação. Na prática, onde hoje existe um webhook mutador em produção (injeção de sidecar de service mesh é o caso clássico), passa a existir uma alternativa nativa sem processo externo para manter no ar.</p>

<h2 id="traduzindo-a-familia-dra">Traduzindo: a família DRA</h2>

<p>A <strong>Dynamic Resource Allocation</strong> já era GA na v1.34, o mecanismo por trás de scheduling de GPU e TPU deixou de ser experimental exatamente ali. O que chegou depois foram as peças que faltavam para ela ser útil em produção de verdade.</p>

<p>O problema do modelo antigo de device plugin: ele trata dispositivos como <strong>inteiros opacos</strong>. O nó diz "tenho 2 GPUs disponíveis" e acabou. Não dava para pedir metade de uma GPU, nem dizer quais GPUs precisam estar conectadas entre si por NVLink, nem reagir quando uma delas apresenta falha.</p>

<ul>
<li><strong>Partitionable Devices</strong> (beta na 1.36) permite fatiar um acelerador em pedaços menores que "a placa inteira".</li>
<li><strong>Consumable Capacity</strong> (beta na 1.36) modela capacidade que se consome, em vez de um contador de unidades.</li>
<li><strong>Device Taints e Tolerations</strong> (beta na 1.36, <strong>stable na 1.37</strong>) aplica em dispositivos individuais o mesmo padrão de <code>taint</code>/<code>toleration</code> que hoje só existe para nós. Um driver DRA pode marcar um device como tainted para que ele seja pulado no scheduling, e o admin pode aplicar o mesmo taint no cluster inteiro via <code>DeviceTaintRule</code>, sem reconfigurar driver nenhum. Pods que já usam o device podem ser despejados automaticamente, a menos que o <code>ResourceClaim</code> tolere o taint explicitamente.</li>
</ul>

<p>O ganho operacional é direto: uma GPU com falha de hardware pode ser marcada <code>NoSchedule</code> <strong>sem tirar o nó inteiro de circulação</strong>.</p>

<h2 id="networking-o-fim-do-ingress-nginx">Networking: o fim do Ingress NGINX</h2>

<p>De tudo que mudou no período, essa é a que mais pesa para quem administra cluster, não porque uma regra específica mudou, mas porque o controller que praticamente todo mundo usava para praticar Ingress <strong>deixou de existir como projeto ativo</strong>.</p>
<div><table><thead><tr><th>Data</th><th>O que aconteceu</th></tr></thead><tbody><tr><td>12/11/2025</td><td>SIG Network e o Security Response Committee anunciam a intenção de retirar o Ingress NGINX</td></tr><tr><td>29/01/2026</td><td>Comunicado oficial conjunto do Steering Committee e do Security Response Committee confirma o plano e o cronograma</td></tr><tr><td>24/03/2026</td><td>Retirada efetiva, o repositório <code>kubernetes/ingress-nginx</code> é arquivado, fica read-only e não recebe mais patch de segurança</td></tr></tbody></table></div>
<h3 id="o-que-foi-retirado-e-o-que-nao-foi">O que foi retirado — e o que não foi</h3>

<p>O projeto retirado é o <code>kubernetes/ingress-nginx</code>, mantido pela comunidade sob a SIG Network, que a estimativa oficial aponta como presente em cerca de metade de todos os clusters Kubernetes do mundo.</p>

<p>Duas confusões que vale desfazer:</p>

<ul>
<li><strong>Não é o mesmo projeto</strong> que o NGINX Ingress Controller da F5 (<code>nginxinc/kubernetes-ingress</code>). Código diferente, mantenedor diferente, não afetado pela decisão.</li>
<li><strong>A API <code>Ingress</code> continua existindo</strong> no Kubernetes, sem plano de remoção. O que não existe mais é o controller de referência que a implementava.</li>
</ul>

<p>Na prática, quem monta um cluster hoje já não tem mais a rota mais óbvia disponível, e a <strong>Gateway API virou a primeira opção</strong>, não mais a alternativa.</p>

<h3 id="gateway-api-na-pratica">Gateway API na prática</h3>

<p>Onde antes um único objeto <code>Ingress</code> concentrava regra de host, path e o nome da <code>IngressClass</code>, a Gateway API separa a coisa em papéis: quem administra a infraestrutura de entrada cria um <code>Gateway</code> (a porta de entrada, ligada a uma <code>GatewayClass</code> que aponta para o controller de fato); quem é dono da aplicação cria um <code>HTTPRoute</code> apontando para esse Gateway, sem precisar saber nada sobre o load balancer por trás.</p>

<div data-lang="yaml"><pre><code># Antes: um Ingress só, misturando infraestrutura e regra de aplicação
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: api
spec:
  ingressClassName: nginx
  rules:
    - host: api.exemplo.com.br
      http:
        paths:
          - path: /v1
            pathType: Prefix
            backend:
              service:
                name: api-v1
                port:
                  number: 80</code></pre></div>

<div data-lang="yaml"><pre><code># Depois: Gateway (time de infra) e HTTPRoute (time de aplicação), separados
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: api
spec:
  parentRefs:
    - name: gateway-publico
  hostnames:
    - "api.exemplo.com.br"
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /v1
      backendRefs:
        - name: api-v1
          port: 80</code></pre></div>

<p>Essa migração eu já fiz na prática, com conversão automatizada e auditoria do que não dava para converter, está contada em <a href="https://www.orafaelferreira.com/artigos/nginx-envoy-gateway">De NGINX Ingress para Envoy Gateway</a>. Aqui fica só o contexto de por que ela virou obrigatória.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/cka-news/2.png" alt="Antes e depois: à esquerda, um único Ingress com host api.exemplo.com.br, path /v1 e ingressClassName nginx, marcado como infraestrutura e aplicação misturadas e controller de referência retirado em 24/03/2026; à direita, um Gateway do time de infra chamado gateway-publico apontando para a classe envoy e um HTTPRoute do time de aplicação ligado por parentRefs com o mesmo hostname, PathPrefix /v1 e backendRefs api-v1:80" />

<h2 id="para-onde-o-kubernetes-esta-indo">Para onde o Kubernetes está indo</h2>

<p>Quatro movimentos do período que ainda não viraram feature estável, mas dizem para onde o projeto está indo.</p>
<div><table><thead><tr><th>Movimento</th><th>Data</th><th>Por que importa</th></tr></thead><tbody><tr><td>Spotlight do WG Device Management</td><td>24/06/2026</td><td>O grupo por trás da DRA. A citação central é que o modelo antigo de device plugin "trata dispositivos como inteiros opacos". A família de extensões da 1.36 e 1.37 é onde isso vira utilizável com hardware real de IA</td></tr><tr><td>Formação do AI Gateway Working Group</td><td>09/03/2026</td><td>Novo WG para tráfego de IA sobre a Gateway API, políticas como rate limiting por token, e não por request, pensadas para o padrão de consumo de LLM. Ainda sem objeto estável no Core</td></tr><tr><td>Formação do Checkpoint/Restore WG</td><td>21/01/2026</td><td>Formaliza o trabalho de tirar snapshot de um container em execução e restaurá-lo depois. Casos citados: acelerar workloads de boot pesado (Java, inferência de LLM) e checkpoint periódico para fault-tolerance em jobs longos</td></tr><tr><td>Fim da replicação de assinatura de imagem</td><td>05/06/2026</td><td>O <code>registry.k8s.io</code> parou de copiar a assinatura cosign de cada imagem para as 22 regiões. O roteador <code>archeio</code> agora manda todo pedido de assinatura para um único upstream canônico. Supply chain, detalhe do tipo que some do radar até quebrar algo</td></tr></tbody></table></div>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/cka-news/3.png" alt="Mapa em dois cards a partir do levantamento v1.35 a v1.37: família DRA, com Partitionable Devices, Consumable Capacity e Device Taints e Tolerations, uma GPU marcada NoSchedule por DeviceTaintRule e um Pod tolerando via ResourceClaim; e Gateway API, com GatewayClass, Gateway e HTTPRoute e o Ingress NGINX arquivado. Faixa inferior: continua igual troubleshooting, kubeadm, RBAC, NetworkPolicy e storage" />

<h2 id="o-que-eu-vou-praticar">O que eu vou praticar</h2>

<p>A CKA vale até <strong>23/12/2027</strong> e nada aqui invalida o certificado, recertificar não é necessário por causa de nenhuma dessas mudanças. Mas se o objetivo é continuar afiado, o levantamento aponta dois pontos:</p>

<ul>
<li><strong>A família DRA</strong>. Device management para GPU e cargas de IA é onde o projeto está concentrando esforço de verdade. Vale montar um cenário com <code>DeviceTaintRule</code> e entender o ciclo de <code>ResourceClaim</code>.</li>
<li><strong>A migração definitiva de Ingress para Gateway API</strong>. O que mudou foi qual dos dois ainda existe como implementação de referência para praticar.</li>
</ul>

<p>Todo o resto (troubleshooting, kubeadm, RBAC, NetworkPolicy, storage) continua exatamente como estava.</p>

<h2 id="referencias">Referências</h2>

<ul>
<li><a href="https://kubernetes.io/blog/2025/12/17/kubernetes-v1-35-release/" target="_blank" rel="noopener noreferrer">Kubernetes v1.35: Timbernetes</a></li>
<li><a href="https://www.infoq.com/news/2026/05/kubernetes-1-36-released/" target="_blank" rel="noopener noreferrer">Kubernetes v1.36 released — InfoQ</a></li>
<li><a href="https://kubernetes.io/blog/2026/08/26/kubernetes-v1-37-release/" target="_blank" rel="noopener noreferrer">Kubernetes v1.37: Garhwal</a></li>
<li><a href="https://kubernetes.io/blog/2026/09/03/kubernetes-v1-37-dra-updates/" target="_blank" rel="noopener noreferrer">Kubernetes v1.37: DRA Updates</a></li>
<li><a href="https://kubernetes.io/docs/concepts/resource-management/dynamic-resource-allocation/device-taints/" target="_blank" rel="noopener noreferrer">Device Taints and Tolerations — documentação oficial</a></li>
<li><a href="https://kubernetes.io/blog/2026/01/29/ingress-nginx-statement/" target="_blank" rel="noopener noreferrer">Comunicado oficial de retirada do Ingress NGINX</a></li>
<li><a href="https://opensource.googleblog.com/2026/02/the-end-of-an-era-transitioning-away-from-ingress-nginx.html" target="_blank" rel="noopener noreferrer">The end of an era: transitioning away from Ingress NGINX — Google Open Source Blog</a></li>
<li><a href="https://www.kubernetes.dev/blog/2026/06/24/wg-device-management-spotlight-2026/" target="_blank" rel="noopener noreferrer">Spotlight do WG Device Management</a></li>
<li><a href="https://kubernetes.io/blog/2026/03/09/announcing-ai-gateway-wg/" target="_blank" rel="noopener noreferrer">Anúncio do AI Gateway Working Group</a></li>
<li><a href="https://www.kubernetes.dev/blog/2026/01/21/introducing-checkpoint-restore-wg/" target="_blank" rel="noopener noreferrer">Anúncio do Checkpoint/Restore Working Group</a></li>
<li><a href="https://github.com/cncf/curriculum" target="_blank" rel="noopener noreferrer">cncf/curriculum — PDFs oficiais do currículo da CKA</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>14 meses de Terraform: o que mudou depois da minha Associate 003</title>
      <link>https://www.orafaelferreira.com/artigos/terraform-o-que-mudou-desde-a-associate</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/terraform-o-que-mudou-desde-a-associate</guid>
      <pubDate>Fri, 18 Sep 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Certifiquei na Terraform Associate 003 em julho de 2025. De lá para cá: quatro releases do Core, azurerm 5.0, Stacks em GA e tfpolicy.</description>
      <category>Artigos</category>
      <category>Terraform</category>
      <category>Azure</category>
      <category>Certificações</category>
      <category>DevOps</category>
      <category>Platform Engineering</category>
      <category>Governança</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/tf-news/capa.png" length="0" type="image/png" />
      <content:encoded><![CDATA[

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/tf-news/capa.png" alt="Infográfico de capa: linha do tempo do Terraform de v1.12 a v1.16 (hoje v1.16.3), com o marcador da Associate 003 em 26/07/2025, HashiCorp vira IBM em 27/02/2025, Stacks GA em set/2025 e azurerm 5.0 em 27/07/2026; coluna à esquerda com ephemeral values, write-only arguments, Stacks em GA, azurerm 5.0 e tfpolicy" />

<p>Passei na <strong>HashiCorp Certified: Terraform Associate (003)</strong> em <strong>26/07/2025</strong>. Escrevi na época sobre a estrutura da prova e a preparação em <a href="https://www.orafaelferreira.com/artigos/terraform-associate-artigo">Certificação HashiCorp Terraform Associate 003</a>. Este artigo é a continuação: o que mudou no Terraform <strong>depois</strong> disso.</p>

<p>E mudou muita coisa. Em pouco mais de quatorze meses o Core saltou de <code>v1.12</code> para <code>v1.16</code>, o provider <code>azurerm</code> teve uma major version com quebra real, o Stacks saiu de beta, a HashiCorp virou parte da IBM, e apareceu uma linguagem nova de governança.</p>

<p>Nada disso invalida o certificado, que vale até <strong>26/07/2027</strong>. Mas é tudo conteúdo novo para quem quer continuar afiado com Terraform.</p>
<div><table><thead><tr><th>Item</th><th>Situação</th></tr></thead><tbody><tr><td>Certificação emitida</td><td>26/07/2025</td></tr><tr><td>Válida até</td><td>26/07/2027</td></tr><tr><td>Core na data da certificação</td><td>~v1.12</td></tr><tr><td>Core hoje</td><td>v1.16.3</td></tr><tr><td>Releases do Core desde então</td><td>4 (1.13, 1.14, 1.15, 1.16)</td></tr></tbody></table></div>
<h2 id="o-core-release-a-release">O Core, release a release</h2>

<h3 id="v113-20082025">v1.13 — 20/08/2025</h3>

<ul>
<li>O comando <code>terraform stacks</code> entra no CLI principal.</li>
<li>A <strong>RPC interface</strong> para integradores atinge GA.</li>
<li>Correções de <strong>resource identity</strong> perdida em módulos aninhados.</li>
<li><code>init</code> ficou mais tolerante com constraints de provider.</li>
</ul>

<strong>Traduzindo: RPC interface.</strong> Isso é para quem <strong>constrói ferramenta em cima do Terraform</strong> (Atlantis, Spacelift, Terragrunt, automação própria), não para quem escreve <code>.tf</code>. Até aqui, essas ferramentas rodavam o binário <code>terraform</code> como subprocesso e liam a saída de texto ou JSON do stdout para saber o que tinha acontecido, um screen scraping de CLI, frágil porque essa saída é pensada para humano ler e muda de formato entre versões, quebrando o parser sem aviso. A RPC interface é o Terraform expondo um contrato programático estável no lugar disso. "Atingir GA" quer dizer que esse contrato já é confiável o bastante para essas plataformas dependerem dele em produção.

<strong>Traduzindo: resource identity.</strong> É um identificador que o provider usa para reconhecer "esse recurso na nuvem é o mesmo que este bloco no meu código", separado do ID normal que você vê. Na AWS, por exemplo, o formato do ARN pode mudar e a identity continua igual. Antes da 1.13, módulos aninhados às vezes perdiam essa referência no meio do caminho e o Terraform concluía que o recurso tinha sumido, e tentava recriar algo que já existia.

<h3 id="v114-19112025">v1.14 — 19/11/2025</h3>

<ul>
<li><strong>List Resources</strong>: arquivos <code>.tfquery.hcl</code> e o comando <code>terraform query</code>, para descobrir e filtrar recursos que existem fora do código. É a base para import em lote.</li>
<li><strong>Actions block</strong>: a primeira operação fora do CRUD tradicional, via lifecycle hooks ou <code>-invoke</code>.</li>
<li><code>import</code> passa a herdar variáveis de variable sets.</li>
</ul>

<strong>Traduzindo: <code>terraform query</code>.</strong> O problema que isso resolve é conhecido: para importar um recurso, seja com <code>terraform import</code> ou com um bloco <code>import</code>, você precisa <strong>já saber o ID exato</strong> dele na nuvem. Se você tem uma centena de bancos órfãos num levantamento de custo, isso significa ir um por um. O <code>terraform query</code> inverte a lógica, você escreve um arquivo perguntando "existe algo assim aí fora?" e o Terraform lista o que encontrar, para você gerar os imports em lote:

<div data-lang="hcl"><pre><code># arquivo: databases.tfquery.hcl
list "azurerm_mssql_database" "encontrados" {
  provider = azurerm

  config {
    # filtro de busca, específico do provider
    resource_group_name = "rg-plataforma-prod"
  }
}

# roda com: terraform query</code></pre></div>

<strong>Traduzindo: Actions block.</strong> Até aqui, o Terraform só sabia fazer quatro coisas com um recurso: criar, ler, atualizar e destruir. Mas nem toda operação de infraestrutura é CRUD, invalidar um cache de CDN depois de um deploy, ou disparar uma função de migração, não é "criar um recurso", é uma <strong>ação pontual</strong>. A gambiarra histórica era <code>null_resource</code> com <code>local-exec</code>. O Actions block torna isso nativo do provider:

<div data-lang="hcl"><pre><code>action "aws_lambda_invoke" "run_migration" {
  config {
    function_name = aws_lambda_function.migrate.function_name
  }
}

# dispara automaticamente quando o recurso muda
resource "aws_db_instance" "main" {
  # ...
  lifecycle {
    action_trigger {
      events  = [after_update]
      actions = [action.aws_lambda_invoke.run_migration]
    }
  }
}</code></pre></div>

<h3 id="v115-a-linha-estavel-de-2026">v1.15 — a linha estável de 2026</h3>

<ul>
<li><strong>Dynamic module sources</strong>: variáveis dentro de <code>source</code> e <code>version</code> de um bloco <code>module</code>, com o atributo <code>const</code>.</li>
<li><strong>Deprecation</strong> de variables e outputs via <code>deprecated =</code>, encadeável entre módulos.</li>
<li>Função <code>convert()</code> para conversão explícita de tipo, e type constraints em <code>output</code>.</li>
<li><code>validate</code> passa a validar o bloco <code>backend</code>. Build nativo para Windows ARM64.</li>
</ul>

<strong>Traduzindo: dynamic module sources.</strong> Antes da 1.15, o <code>source</code> e a <code>version</code> de um bloco <code>module</code> tinham que ser texto fixo, não dava para usar variável ali, porque o Terraform precisa resolver de onde vem o módulo <strong>antes</strong> de sequer processar as variáveis dele. Agora dá, o que evita duplicar o mesmo módulo só para trocar a origem por ambiente:

<div data-lang="hcl"><pre><code>module "network" {
  source  = var.usar_espelho_privado ? "git::${var.mirror_url}" : "app.terraform.io/acme/network/azurerm"
  version = var.module_version
}</code></pre></div>

<strong>Traduzindo: deprecation de variables e outputs.</strong> Para quem mantém módulos reutilizáveis, agora dá para avisar quem usa uma <code>variable</code> ou <code>output</code> antiga sem quebrar o <code>plan</code> dessa pessoa. Sai um <strong>warning</strong>, não um erro, e o aviso atravessa vários níveis de módulo até chegar em quem precisa vê-lo:

<div data-lang="hcl"><pre><code>variable "instance_size" {
  type       = string
  deprecated = "use 'sku_name', será removido na v3.0 do módulo"
}</code></pre></div>

<h3 id="v116-26082026-agora-ga">v1.16 — 26/08/2026, agora GA</h3>

<p>Quando comecei este levantamento a 1.16 ainda estava em beta. Ela saiu em <strong>26/08/2026</strong>, com a 1.16.1 em 02/09 e a <strong>1.16.3</strong> como versão atual.</p>

<ul>
<li><code>terraform_data</code> ganha um bloco <strong><code>store</code></strong> para guardar valores ephemeral ou sensitive entre <code>plan</code> e <code>apply</code>.</li>
<li><code>graph -format</code> passa a incluir saída <strong>Mermaid</strong>.</li>
<li><code>workspace list -json</code> e <code>state show -json</code>.</li>
<li>Blocos <code>import</code> dentro de módulos.</li>
<li><code>lifecycle { destroy = false }</code>.</li>
<li>Builds para Linux s390x.</li>
</ul>

<strong>Traduzindo: <code>terraform_data</code> com <code>store</code>.</strong> O <code>terraform_data</code> é aquele recurso "vazio" que muita gente usa para guardar um valor auxiliar ou forçar um trigger, sem representar nada real na nuvem. O novo bloco <code>store</code> deixa o provider guardar um dado privado ali dentro, marcado como ephemeral ou sensitive, útil para passar informação entre etapas sem que ela apareça no state.

<strong>Sobre deferred actions:</strong> a flag experimental <code>-allow-deferral</code>, que permitiria <code>count</code> e <code>for_each</code> resolverem com valores unknown, apareceu nas betas da 1.16 mas <strong>não consta nas notas do release GA</strong>. Continua sendo algo para acompanhar, não para depender em produção.

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/tf-news/1.png" alt="Comparativo em dois painéis: à esquerda, administrator_login_password gravado em texto plano como Senha123! dentro do terraform.tfstate; à direita, administrator_login_password_wo aplicado no Azure e o state guardando só _wo_version igual a 1, com a tabela dos três applies mostrando que a senha só é reenviada quando o version muda" />

<h2 id="traduzindo-ephemeral-values-e-write-only-arguments">Traduzindo: ephemeral values e write-only arguments</h2>

<p>Esse é o conceito mais importante do período inteiro. A base nasceu na 1.10 e amadureceu na 1.11.</p>

<p>O problema: qualquer valor que passa por um <code>resource</code> ou <code>output</code> fica gravado <strong>em texto plano</strong> dentro do <code>terraform.tfstate</code>, inclusive senha, token e connection string. Quem tem acesso de leitura ao state lê esse valor para sempre, mesmo que a senha já tenha sido trocada depois.</p>

<p>Um <strong>ephemeral value</strong> é um valor que só existe durante aquele <code>plan</code> ou <code>apply</code>: nunca vai para o state, nunca vai para o arquivo de plan, e some da memória assim que a operação termina.</p>

<div data-lang="hcl"><pre><code>variable "db_password" {
  type      = string
  ephemeral = true
  sensitive = true
}</code></pre></div>

<p>Um <strong>write-only attribute</strong> é a mesma ideia aplicada a um campo específico de um recurso: você manda a senha nova para o provider, ela é aplicada, e o Terraform <strong>nem tenta lembrar</strong> o que mandou.</p>

<div data-lang="hcl"><pre><code>resource "azurerm_mssql_server" "sql" {
  administrator_login_password_wo         = var.db_password
  administrator_login_password_wo_version = 1 # sobe para forçar rotação
}</code></pre></div>

<p>O pulo do gato é o <code>_wo_version</code>. Como a senha nunca vai para o state, o Terraform precisa de <strong>outra coisa</strong> para comparar e decidir se manda a senha de novo para o Azure, e essa outra coisa é um número comum, não secreto, que <strong>fica</strong> gravado no state. Ele só reenvia a senha quando esse número muda:</p>
<div><table><thead><tr><th>Apply</th><th>var.db_password</th><th>_wo_version no código</th><th>_wo_version no state</th><th>O que acontece</th></tr></thead><tbody><tr><td>1º</td><td>"Senha123!"</td><td>1</td><td>recurso novo</td><td>manda a senha para o Azure e grava só version=1</td></tr><tr><td>2º, nada mudou</td><td>"Senha123!"</td><td>1</td><td>1</td><td>version igual, então não toca na senha</td></tr><tr><td>3º, rotação</td><td>"NovaSenha456!"</td><td>2</td><td>1</td><td>version mudou de 1 para 2, então manda a senha nova e grava version=2</td></tr></tbody></table></div>
<strong>A armadilha:</strong> se você trocar só a senha e <strong>esquecer de subir o <code>_wo_version</code></strong>, o Terraform não percebe nada, ele não está olhando para a senha, só para o número. É exatamente por isso que o version existe: ele é o gatilho manual que substitui o diff que não pode mais existir.

<h2 id="o-provider-azurerm-a-mudanca-que-se-sente-todo-dia">O provider azurerm: a mudança que se sente todo dia</h2>

<p>O Core é o motor. O <code>azurerm</code> é o que a gente escreve toda hora. Na data da minha certificação o provider estava na <strong>v4.37.0</strong>. De lá até hoje foram dezenas de minors na linha 4.x, depois a 5.0, e hoje a linha corrente é a <strong>5.6.0</strong> (17/09/2026).</p>

<h3 id="ago2025-a-mai2026-a-preparacao-silenciosa">ago/2025 a mai/2026: a preparação silenciosa</h3>

<p>Sem quebra de versão major nesse trecho, mas é aqui que o terreno da 5.0 foi preparado, recurso por recurso:</p>

<ul>
<li><strong>A onda de deprecation de storage ID começou aqui.</strong> O <code>azurerm_storage_queue</code> ganhou <code>storage_account_id</code>, depreciando <code>storage_account_name</code>, na v4.46.0 (25/09/2025). Blob, table e container seguiram com <code>storage_container_id</code> e <code>storage_account_id</code> na v4.77.0 (11/06/2026). É a mesma história por nove meses, e essa migração de campo é exatamente o que ficou com <code>id</code> malformado na subida de 4.x para 5.x.</li>
<li><strong>Actions e List Resources começaram antes do que parece.</strong> A primeira Action do azurerm foi <code>azurerm_virtual_machine_power</code> e os primeiros List Resources foram <code>azurerm_storage_account</code> e <code>azurerm_virtual_network</code>, todos na v4.45.0 (18/09/2025), antes mesmo do Core 1.14. Não foi um pacote fechado, foi rollout gradual por quase um ano: no total da janela, 36 novos resources, 46 novos List Resources e 6 novas Actions.</li>
<li><strong>AKS recebeu reforço incremental</strong>, sem um salto único: suporte a <code>AzureLinux3</code> e <code>Ubuntu2204</code> e <code>ai_toolchain_operator_enabled</code> na v4.47.0, integração de VNet via <code>api_server_access_profile</code> na v4.46.0, e a mesma linha chegando no <code>KataVmIsolation</code> em junho de 2026.</li>
<li><strong>Dois recursos inteiros sumiram por fim de serviço no Azure</strong>, não por decisão do provider: <code>azurerm_mobile_network*</code> (v4.57.0) e <code>azurerm_spatial_anchors_account</code> (v4.52.0).</li>
<li><strong>A migração para o <code>go-azure-sdk</code> é contínua, não um evento</strong>: 24 bumps de dependência em cerca de 34 releases.</li>
</ul>

<p>Vale o registro: <strong>não houve outra major version entre a 4.0 (agosto de 2024) e a 5.0</strong>. A linha 4.x foi inteira em minors.</p>

<h3 id="azurerm-500-as-cinco-quebras-reais">azurerm 5.0.0 — as cinco quebras reais</h3>

<p>Publicado em 27/07/2026. "Major" aqui não é número de marketing: campo e recurso deprecated foram <strong>removidos de vez</strong>, não só avisados.</p>

<ul>
<li><strong>Auto-registro de Resource Provider virou <code>none</code> por padrão.</strong> No 4.x, o provider registrava sozinho cerca de 60 Resource Providers do Azure na inicialização (<code>resource_provider_registrations = "legacy"</code>). No 5.0 o padrão é <code>"none"</code>: se o RP nunca foi registrado na assinatura, o <code>apply</code> falha na hora de criar o recurso. Para manter o comportamento antigo, sete <code>resource_provider_registrations = "legacy"</code> explicitamente; para ser mais enxuto, use <code>resource_providers_to_register</code> listando só o que o workspace usa de fato. Isso morde forte em subscriptions novas ou pouco usadas.</li>
<li><strong>Enhanced validation desligada por padrão.</strong> A validação de <code>location</code> e de Resource Provider usando o cache de metadata do Azure saiu do padrão e foi para o bloco <code>features</code>. Sem reativar, um nome de região errado só é pego no <code>apply</code>, como erro da API, e não mais no <code>plan</code>. Reativa com <code>features { enhanced_validation { locations = true } }</code>.</li>
<li><strong>Preflight validation só em seis recursos</strong>: <code>azurerm_app_service_environment_v3</code>, <code>azurerm_service_plan</code>, <code>azurerm_dashboard_grafana</code>, <code>azurerm_eventgrid_namespace</code>, <code>azurerm_managed_redis</code> e <code>azurerm_nginx_deployment</code>. Todo o resto passa reto, um <code>plan</code> limpo deixou de ser garantia para esses tipos.</li>
<li><strong><code>azurerm_app_service</code> e <code>azurerm_function_app</code> foram deletados.</strong> Não é deprecation, é remoção. Quem ainda usa precisa migrar para <code>azurerm_linux_web_app</code>/<code>azurerm_windows_web_app</code> e <code>azurerm_linux_function_app</code>/<code>azurerm_windows_function_app</code>, com <code>terraform state mv</code> para não recriar o recurso do zero.</li>
<li><strong><code>skip_provider_registration</code> não existe mais</strong> no schema do provider, consequência direta do primeiro ponto.</li>
</ul>

<strong>Se for migrar de 4.x para 5.x:</strong> vá direto para a <strong>5.1.0 ou superior</strong>, não pare na 5.0.0 pura. A 5.0.0 e a 5.0.1 tiveram bugs reais de state migration em <code>azurerm_storage_container</code>, <code>azurerm_storage_queue</code>, <code>azurerm_storage_share</code> e <code>azurerm_storage_table_entity</code>, o campo <code>id</code> ficava malformado na subida. Só ficou tudo corrigido na 5.1.0, de 13/08/2026. Hoje a linha já está na 5.6.0, então o ponto é histórico, mas importa para quem congelou a versão.

<p>O 5.0 também trouxe <strong>write-only nativo para o azurerm</strong>: <code>azurerm_subnet</code> ganhou <code>network_security_group_id_wo</code> e <code>route_table_id_wo</code>, com os respectivos <code>_wo_version</code>. É o mesmo padrão explicado lá em cima, agora num recurso Azure de verdade.</p>

<h3 id="azuread-34-para-39-sem-major-version">azuread: 3.4 para 3.9, sem major version</h3>

<p>Andamento bem mais tranquilo. Os destaques: o novo resource <code>azuread_flexible_federated_identity_credential</code> (3.7), suporte a filtro em <code>azuread_conditional_access_policy</code> (3.9) e uma sequência de correções para <strong>eventual consistency</strong>, a Microsoft Graph API demora para propagar depois de um <code>create</code>, o que fazia o Terraform reportar <code>not found</code> num recurso recém-criado. Corrigido progressivamente entre a 3.6 e a 3.9.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/tf-news/2.png" alt="Diagrama de Terraform Stacks: um component network definido uma vez em network.tfstack.hcl, fanning para três deployments em deployments.tfdeploy.hcl, dev, qa e prod, cada um com cidr e state próprio, encadeados por depende de, com um cadeado indicando que prod só aplica depois que qa passar limpo" />

<h2 id="mudancas-que-nao-sao-so-do-cli">Mudanças que não são só do CLI</h2>

<p>Quatro coisas que mudaram no produto e na empresa. Nenhuma aparece em <code>terraform --version</code>, mas todas mudam como um time de plataforma trabalha.</p>

<h3 id="stacks-saiu-de-beta-e-virou-ga">Stacks saiu de beta e virou GA</h3>

<strong>O problema que resolve:</strong> para ter dev, qa e prod, às vezes multiplicado por tenant e por região, a saída costuma ser root module com <code>tfvars</code> por ambiente, ou um wrapper tipo Terragrunt. Funciona, mas o Terraform em si não sabe que esses ambientes são "a mesma coisa em estágios diferentes". Não dá para dizer nativamente "só aplica em prod depois que qa passar".

<strong>Como o Stacks modela isso:</strong> um <strong>component</strong> é a definição reutilizável da infraestrutura (rede, AKS, banco). Um <strong>deployment</strong> é uma instância daquele component para um ambiente específico, cada um com seu próprio state, mas todos descritos a partir da mesma definição raiz, com grafo de dependência nativo entre deployments.

<div data-lang="hcl"><pre><code># network.tfstack.hcl — a definição, uma vez só
component "network" {
  source = "./modules/network"
  inputs = {
    cidr = var.cidr
  }
}</code></pre></div>

<div data-lang="hcl"><pre><code># deployments.tfdeploy.hcl — uma entrada por ambiente
deployment "prod" {
  inputs = {
    cidr = "10.10.0.0/16"
  }
}

deployment "qa" {
  inputs = {
    cidr = "10.11.0.0/16"
  }
}</code></pre></div>

<p>A diferença para root module com tfvars: aqui as duas deployments entram no <strong>mesmo grafo</strong> de dependência do Terraform. Dá para declarar "não aplica <code>prod</code> antes de <code>qa</code> terminar limpo" nativamente, em vez de isso morar espalhado numa pipeline por fora.</p>

<p>GA anunciada na HashiConf de setembro de 2025, para todos os planos de HCP Terraform baseados em RUM. O <code>terraform-stacks-cli</code> separado foi descontinuado, tudo entrou no CLI principal como <code>terraform stacks</code>. Configurações da beta pública <strong>não migram sozinhas</strong>, e o histórico de state se perde. Em 2026 ganhou suporte a monorepo e a "stack component configurations" via registry privado.</p>

<h3 id="hcp-terraform-e-o-infragraph">HCP Terraform e o Infragraph</h3>

<p>O nome "Terraform Cloud" já tinha virado "HCP Terraform" antes da minha certificação. O que é novo: em setembro de 2025 entrou em preview público o <strong>HCP Terraform powered by Infragraph</strong>, um grafo de infraestrutura em tempo real dentro do HCP, a base declarada para automação agêntica, com agentes observando e agindo sobre o ciclo de vida do recurso.</p>

<h3 id="a-hashicorp-agora-e-ibm">A HashiCorp agora é IBM</h3>

<p>Aquisição fechada em 27/02/2025, por US$ 6,4 bilhões. A licença <strong>continua BSL</strong>, não houve volta para open source sob MPL. Em setembro de 2025, IBM e HashiCorp anunciaram o <strong>Project Infragraph</strong>, em private beta desde dezembro de 2025, com plano de conectar Ansible, OpenShift e watsonx Orchestrate ao mesmo grafo.</p>

<h3 id="tfpolicy-governanca-sai-do-sentinel-e-entra-no-hcl">tfpolicy: governança sai do Sentinel e entra no HCL</h3>

<p>Lançado em beta público em julho de 2026, dentro do HCP Terraform, exigindo Terraform 1.16 ou superior. Resolve o mesmo problema que Sentinel e OPA sempre resolveram, barrar um <code>plan</code> que viola uma regra de governança, mas <strong>sem trocar de linguagem</strong>: a política é escrita em HCL, a mesma que já se usa para escrever a infraestrutura.</p>

<p>O que ele faz que Sentinel e OPA não faziam nativamente:</p>

<ul>
<li><strong>Enxerga relação entre recursos.</strong> Por exemplo: "toda IAM role precisa ter pelo menos uma policy anexada". O Sentinel avalia um recurso isolado; o tfpolicy enxerga o grafo inteiro.</li>
<li><strong>Puxa dado externo durante a avaliação.</strong> Por exemplo: "só permite AMI aprovada", batendo num data source de verdade, e não numa lista fixa dentro da política.</li>
<li><strong>Bloqueia provider ou módulo não aprovado antes do download</strong>, barrando na origem.</li>
<li><strong>Avalia depois do deploy</strong>, contra o estado real na nuvem, pega drift e valor computado pelo provider que só existe depois do apply.</li>
</ul>

<div data-lang="hcl"><pre><code>module_policy "git::github.com/acme/terraform-aws-vpc" "versao_minima" {
  enforce {
    condition     = core::semverconstraint(meta.version, "&gt;= 2.0.0")
    error_message = "O módulo VPC oficial precisa estar na versão 2.0.0 ou superior."
    info_message  = "Versão do módulo VPC: ${meta.version}."
  }
}</code></pre></div>

<p>Existe o mesmo padrão para <code>resource_policy</code>, aplicado a um tipo de recurso específico, e para <code>provider_policy</code>, ambos com o mesmo bloco <code>enforce</code>, e os atributos do recurso acessados pelo prefixo <code>attrs.</code> (por exemplo <code>attrs.tags.environment</code>). Se você já trabalha com policy as code, vale comparar com a abordagem que descrevi em <a href="https://www.orafaelferreira.com/artigos/platform-engineering-policy-as-code">Platform Engineering e Policy as Code</a>.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/tf-news/3.png" alt="Dois painéis: à esquerda, custom conditions com terraform plan passando por validation, precondition e postcondition e parando com um erro escrito por você antes de chegar na API do provider; à direita, um project rede no HCP Terraform agrupando os workspaces rede-tenant-a-prod, rede-tenant-a-qa e rede-tenant-b-prod, com permissão dada por project" />

<h2 id="duas-coisas-novas-que-vale-entender">Duas coisas novas que vale entender</h2>

<p>Além de ephemeral values e write-only arguments, dois outros conceitos ganharam peso no período:</p>

<strong>Custom conditions.</strong> É uma forma de fazer o Terraform recusar um <code>plan</code> ou <code>apply</code> <strong>antes</strong> de bater na API do provider, com uma mensagem de erro escrita por você em vez do erro genérico da cloud. O <code>validation</code> vive dentro de uma <code>variable</code>; <code>precondition</code> e <code>postcondition</code> vivem dentro de um bloco <code>lifecycle</code> de resource, data source ou output:

<div data-lang="hcl"><pre><code>variable "storage_tier" {
  type = string

  validation {
    condition     = contains(["Hot", "Cool", "Cold"], var.storage_tier)
    error_message = "storage_tier precisa ser Hot, Cool ou Cold, não '${var.storage_tier}'"
  }
}</code></pre></div>

<strong>Workspaces e projects no HCP Terraform, como estrutura de governança.</strong> No HCP Terraform, um <strong>workspace</strong> é uma instância de configuração, state e variáveis rodando lá, o equivalente a um ambiente. Um <strong>project</strong> é uma pasta que agrupa vários workspaces, por exemplo todos os workspaces de rede de todos os tenants, e serve para dar permissão por grupo em vez de workspace por workspace.

<h2 id="de-relance">De relance</h2>

<ul>
<li><strong><code>terraform test</code> amadureceu.</strong> <code>-junit-xml</code> virou GA na 1.11, <code>-parallelism</code> na 1.12, <code>state_key</code> e <code>override_during</code> na 1.11. Um <code>test cleanup</code> experimental apareceu no ciclo da 1.16 e 1.17 para lidar com state órfão de teste que falhou.</li>
<li><strong>State encryption continua exclusivo do OpenTofu.</strong> Vale a distinção: um Azure Storage Account com SSE criptografa o <strong>arquivo</strong> do state em repouso, mas quem tem <code>Storage Blob Data Reader</code> naquele container abre o JSON e lê tudo em texto plano, senha incluída. É exatamente por isso que ephemeral values e write-only existem. "State encryption" é outra coisa: criptografa o <strong>conteúdo</strong> do state com uma chave separada (KMS, Key Vault, OpenBao), de modo que nem quem tem acesso de leitura ao blob lê nada sem a chave. Isso segue sendo do OpenTofu, desde a v1.7 dele. Se isso importa para o seu time, é o maior motivo concreto para olhar o fork.</li>
</ul>

<h2 id="o-que-eu-tiro-disso">O que eu tiro disso</h2>

<p>O esqueleto do Terraform que eu estudei continua de pé, mas três coisas mudaram o suficiente para entrar na minha lista de prática:</p>

<ul>
<li><strong>Ephemeral values e write-only arguments</strong>, porque mudam como segredo trafega.</li>
<li><strong>Stacks e tfpolicy</strong>, que juntos cobrem o espaço que hoje é preenchido por wrapper e por linguagem de política separada.</li>
</ul>

<p>O resto (backend, módulo, state, import, workspace) é o mesmo Terraform que eu estudei.</p>

<h2 id="referencias">Referências</h2>

<ul>
<li><a href="https://www.hashicorp.com/en/blog/terraform-1-11-ephemeral-values-managed-resources-write-only-arguments" target="_blank" rel="noopener noreferrer">Terraform 1.11: ephemeral values e write-only arguments — HashiCorp</a></li>
<li><a href="https://www.hashicorp.com/en/blog/new-in-terraform-115-dynamic-sources-variable-deprecation-and-more" target="_blank" rel="noopener noreferrer">Novidades do Terraform 1.15 — HashiCorp</a></li>
<li><a href="https://github.com/hashicorp/terraform/releases" target="_blank" rel="noopener noreferrer">Releases do hashicorp/terraform no GitHub</a></li>
<li><a href="https://developer.hashicorp.com/terraform/language/stacks/update-GA" target="_blank" rel="noopener noreferrer">Terraform Stacks: atualização de GA — HashiCorp Developer</a></li>
<li><a href="https://www.hashicorp.com/en/blog/introducing-tfpolicy-a-declarative-policy-workflow-built-for-terraform" target="_blank" rel="noopener noreferrer">Introducing tfpolicy — HashiCorp</a></li>
<li><a href="https://developer.hashicorp.com/terraform/policy/reference/policy" target="_blank" rel="noopener noreferrer">Referência de política do tfpolicy — HashiCorp Developer</a></li>
<li><a href="https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/5.0-upgrade-guide" target="_blank" rel="noopener noreferrer">Guia de upgrade do azurerm 5.0 — Terraform Registry</a></li>
<li><a href="https://github.com/hashicorp/terraform-provider-azurerm/blob/main/CHANGELOG-v4.md" target="_blank" rel="noopener noreferrer">CHANGELOG-v4.md do terraform-provider-azurerm</a></li>
<li><a href="https://learn.microsoft.com/en-us/azure/developer/terraform/provider-version-history-azurerm-4-0-0-to-current" target="_blank" rel="noopener noreferrer">Histórico de versões do azurerm — Microsoft Learn</a></li>
<li><a href="https://github.com/hashicorp/terraform-provider-azuread/releases" target="_blank" rel="noopener noreferrer">Releases do terraform-provider-azuread no GitHub</a></li>
<li><a href="https://developer.hashicorp.com/terraform/tutorials/certification-004/associate-review-004" target="_blank" rel="noopener noreferrer">Conteúdo oficial do exame 004 — HashiCorp Developer</a></li>
<li><a href="https://techcrunch.com/2025/02/27/ibm-closes-6-4b-hashicorp-acquisition/" target="_blank" rel="noopener noreferrer">IBM conclui a aquisição da HashiCorp — TechCrunch</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>De NGINX Ingress para Envoy Gateway: a migração que a IA liderou</title>
      <link>https://www.orafaelferreira.com/artigos/nginx-envoy-gateway</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/nginx-envoy-gateway</guid>
      <pubDate>Sat, 05 Sep 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Como um controller próprio migrou Ingress NGINX para Gateway API sobre Envoy Gateway em Kubernetes multi-tenant, com a IA liderando testes e auditoria.</description>
      <category>Artigos</category>
      <category>IA</category>
      <category>DevOps</category>
      <category>Docker</category>
      <category>Kubernetes</category>
      <category>Redes</category>
      <category>Open Source</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/nginx-envoy-gateway/capa.png" length="0" type="image/png" />
      <content:encoded><![CDATA[

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/nginx-envoy-gateway/capa.png" alt="Capa" />

<p>Quase todo texto sobre trocar de ingress controller fala da arquitetura de destino: por que <a href="https://gateway-api.sigs.k8s.io/" target="_blank" rel="noopener noreferrer">Gateway API</a>, por que <a href="https://gateway.envoyproxy.io/" target="_blank" rel="noopener noreferrer">Envoy</a>, como fica o novo modelo de recursos. Esse aqui fala de outra coisa, menos explorada: <strong>como a migração foi de fato executada</strong>, com um agente de IA operando num loop estruturado em vez de uma pessoa dirigindo cada passo na mão.</p>

<h2 id="resumo-rapido">Resumo rápido</h2>

<ul>
<li>Plataforma Kubernetes multi-tenant sob NDA. Nada de nome de empresa, cluster, tenant ou repositório. O que generaliza é o formato do problema.</li>
<li>Existe um <strong>controller próprio</strong> que converte continuamente Ingress de classe <code>nginx</code> em <code>HTTPRoute</code>, <code>GRPCRoute</code> e <code>TLSRoute</code> ligados a um Envoy Gateway compartilhado.</li>
<li>A decisão mais importante veio <strong>antes do código</strong>: para toda annotation nginx em uso, o time decidiu o que aconteceria com ela, convertida, redundante, sem efeito, ou marcada para trabalho manual, nunca deixada para trás em silêncio.</li>
<li>Snippet de nginx é traduzido em regime <strong>tudo ou nada</strong>. Tradução parcial é modo de falha pior que tradução nenhuma.</li>
<li>O achado que salvou o dia 1 não tem nada a ver com Envoy: dezenas de serviços montavam URL de redirect de OAuth a partir de um header não-padrão que <strong>nunca existiu</strong> naquele ambiente.</li>
<li>O mecanismo do loop em si, hooks, skills, subagentes verificadores, escada de verificação, eu já detalhei em <a href="https://www.orafaelferreira.com/artigos/loop-engineering-na-pratica">Loop Engineering na prática</a>. Aqui ele aparece em recap curto, e só desce ao detalhe onde a aplicação é específica desta migração.</li>
</ul>

<h2 id="o-problema-da-migracao">O problema da migração</h2>

<p>O ambiente é uma plataforma Kubernetes multi-tenant sob NDA. O que interessa e generaliza para qualquer time fazendo essa migração é a forma do problema, não os nomes.</p>

<p>Existe um controller que converte, de forma contínua, Ingress de classe <code>nginx</code> em recursos de Gateway API ligados a um Envoy Gateway compartilhado. Ele envolve o projeto open source <a href="https://github.com/kubernetes-sigs/ingress2gateway" target="_blank" rel="noopener noreferrer">kubernetes-sigs/ingress2gateway</a> e acrescenta quatro camadas em cima:</p>

<ul>
<li><strong>Rebind de <code>parentRef</code></strong>, para que a rota gerada aponte para o Gateway compartilhado certo em vez do que a conversão padrão inferiria.</li>
<li><strong>Parsing de snippet nginx</strong>, o config livre embutido em annotation.</li>
<li><strong>Derivação de policy</strong>, quando o comportamento não cabe na rota e precisa virar objeto de política no nível do Gateway. É a mesma ideia que eu defendi em <a href="https://www.orafaelferreira.com/artigos/platform-engineering-policy-as-code">Platform Engineering e Policy-as-Code que aceleram times</a>, só que aqui a política não é escrita à mão, ela é derivada de uma annotation legada.</li>
<li><strong>Cobertura total de annotation</strong>, que é o assunto da próxima seção e a decisão mais importante do projeto inteiro.</li>
</ul>

<p>Vale dizer o óbvio que às vezes se perde: a conversão não é um script que roda uma vez. É um controller em reconciliação, porque os times donos das aplicações continuam criando e editando Ingress nginx enquanto a migração acontece. Migração de verdade não tem freeze.</p>

<h2 id="o-primeiro-passo-um-assessment-da-frota-inteira">O primeiro passo: um assessment da frota inteira</h2>

<p>Antes de desenhar qualquer contrato, tinha uma pergunta mais básica: <strong>o que a frota realmente usa?</strong> Não a lista de annotations que a documentação do nginx descreve, a lista real, encontrada em produção, com toda variação que cada time introduziu ao longo do tempo.</p>

<p>Foi o primeiro passo do projeto, e não teve nada de manual nele. Um agente varreu todos os Ingress de todos os workloads da frota, um a um, e extraiu cada annotation encontrada, onde ela aparecia, em qual workload, em qual namespace. O resultado saiu num <code>.csv</code>, não num documento, porque o próximo passo era justamente decidir, entrada por entrada, para onde cada annotation ia na tradução para Gateway API.</p>

<p>Esse <code>.csv</code> é o que faz o contrato da próxima seção ser honesto. Sem ele, a lista de annotations a cobrir teria sido "as que a gente lembrou", montada de memória por quem já trabalhou com o ambiente. Com ele, é "as que existem de verdade", incluindo a annotation rara que um time usou uma vez, dois anos atrás, e que ninguém mais tinha em mente. É o mesmo problema, na escala do assessment inteiro, que o contrato resolve annotation por annotation: o que não é visto, desaparece calado.</p>

<h2 id="o-contrato-de-cobertura-cinco-categorias-e-nada-fora-delas">O contrato de cobertura: cinco categorias e nada fora delas</h2>

<p>Antes de escrever qualquer código de conversão, a pergunta que precisava de resposta era: <strong>o que acontece com uma annotation que o conversor não conhece?</strong></p>

<p>A resposta preguiçosa é ignorar e seguir. É também a resposta que faz a migração parecer um sucesso até alguém descobrir, três semanas depois, que o rate limit sumiu.</p>

<p>A saída foi fechar essa lacuna antes de escrever código: para toda annotation <code>nginx.ingress.kubernetes.io/*</code>, o time definiu de antemão qual das cinco categorias abaixo ela ocupa, <strong>sempre uma, nunca zero</strong>.</p>
<div><table><thead><tr><th>Categoria</th><th>O que significa</th><th>Quem resolve</th></tr></thead><tbody><tr><td>Convertida</td><td>Virou campo de um recurso real de Gateway API</td><td>O conversor</td></tr><tr><td>Coberta por policy</td><td>Não cabe na rota, virou objeto de política no Gateway</td><td>O conversor</td></tr><tr><td>Coberta por borda upstream</td><td>O comportamento já é entregue por uma camada antes do cluster</td><td>Ninguém, é redundância</td></tr><tr><td>No-op comprovável</td><td>Não faz nada naquele contexto, e dá para provar</td><td>Ninguém, com evidência</td></tr><tr><td><code>Unconvertible</code></td><td>Precisa mesmo de trabalho manual</td><td>Uma pessoa, avisada</td></tr></tbody></table></div>
<p>A quinta categoria é o que faz o contrato valer. <strong>Sem uma categoria explícita para "isso não dá", tudo que não dá vira silêncio.</strong> <code>Unconvertible</code> não é derrota, é o mecanismo que transforma um desconhecido em item de trabalho com nome.</p>

<p>O ganho prático de escrever isso antes: o agente não tem espaço para inventar uma quarta via. A instrução não é "converta o que der", é "coloque cada entrada numa categoria e não sobre nada". Objetivo verificável em vez de objetivo simpático.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/nginx-envoy-gateway/1.png" alt="Diagrama em linhas neon azuis mostrando uma annotation de Ingress sendo classificada em exatamente um de cinco destinos: rota convertida, política no Gateway, borda upstream, item sem efeito e item que exige trabalho manual" />

<h2 id="snippet-e-tudo-ou-nada">Snippet é tudo ou nada</h2>

<p>Snippet de nginx é o caso mais desagradável, porque não é uma annotation com valor conhecido, é um pedaço de configuração livre embutido numa string.</p>

<p>A regra que vale a pena copiar: <strong>um snippet só é traduzido quando todos os diretivos dentro dele são reconhecidos.</strong> Nunca nove décimos.</p>

<p>O motivo é o modo de falha, não a pureza. Um snippet traduzido pela metade <strong>parece funcionar</strong>, e continua parecendo funcionar até o dia em que o diretivo que ninguém portou se revela a checagem de autenticação. Um snippet não traduzido, marcado <code>Unconvertible</code>, é um problema visível numa lista. É a diferença entre uma pendência e uma armadilha.</p>

<p>A mesma lógica vale para regra de rewrite e qualquer coisa baseada em diretivo. <strong>Tradução parcial é modo de falha pior que tradução nenhuma</strong>, porque destrói o sinal que te avisaria.</p>

<h2 id="o-que-o-loop-virou-neste-projeto">O que o loop virou neste projeto</h2>

<h3 id="o-hook-que-protege-o-rbac-gerado">O hook que protege o RBAC gerado</h3>

<p>O hook genérico eu já expliquei no artigo anterior. O que muda aqui é o alvo: o RBAC do operator é gerado a partir de marcadores <code>+kubebuilder:rbac</code> no código, e editar o arquivo gerado à mão é trabalho que o gerador apaga em silêncio na próxima execução.</p>

<div data-lang="bash"><pre><code>#!/usr/bin/env bash
# PostToolUse — pega edição manual num arquivo de RBAC gerado, antes que ele seja sobrescrito.
set +e
payload="$(cat)"; [ -z "$payload" ] &amp;&amp; exit 0
file="$(printf '%s' "$payload" | jq -r '.tool_input.file_path // empty')"
case "$file" in *config/rbac/role.yaml) ;; *) echo '{"continue":true}'; exit 0 ;; esac

if git diff --quiet -- "$file" 2&gt;/dev/null; then
  echo '{"continue":true}'; exit 0
fi

printf 'Guardrail: %s e gerado a partir dos marcadores +kubebuilder:rbac.\n' "$file" &gt;&amp;2
printf 'Rode `make manifests` em vez de editar a mao, o gerador sobrescreve isso na proxima execucao.\n' &gt;&amp;2
exit 2   # o stderr volta para o contexto do agente</code></pre></div>

<p>Duas coisas que só a prática ensina, e que valem para qualquer hook desse tipo. Primeira: ele <strong>estreita o escopo antes de opinar</strong>, dispara num arquivo só, não em todo YAML do repositório. Segunda: a mensagem diz <strong>o que fazer</strong>, não só o que está errado. Feedback acionável fecha o loop numa iteração; feedback vago gasta três.</p>

<h3 id="a-skill-do-converter-isto-nao-e-um-operator-generico">A skill do converter: "isto NÃO é um operator genérico"</h3>

<p>A skill deste projeto tem uma linha que eu considero a mais valiosa dela, e não é um passo de procedimento, é uma negação:</p>

<div data-lang="markdown"><pre><code>---
name: ingress-converter-operator
description: &gt;
  Convenções de trabalho do conversor nginx para Gateway API: regras de git,
  build/test/deploy, e decisões de arquitetura já resolvidas por investigação
  anterior. Use ao editar internal/converter/* ou internal/controller/*.
  Este NÃO é um operator de CRD genérico feito com kubebuilder,
  não use `kubebuilder create api` aqui.
---

## Quando usar
## Build e teste
## Limitações conhecidas (leia antes de reinvestigar)</code></pre></div>

<p>Sem a linha de desambiguação, o agente alcança o padrão genérico de scaffolding de Kubebuilder num projeto que deliberadamente arrancou tudo aquilo fora. Ele não está errado por burrice, está errado porque o padrão mais provável do mundo, dado o formato do repositório, é exatamente o que este projeto não é. Dizer o que a coisa <strong>não</strong> é custa uma linha e economiza um dia.</p>

<p>E a última seção importa tanto quanto o procedimento. <strong>"Limitações conhecidas" existe para o agente não reinvestigar "será que dá pra consertar?"</strong> em algo que uma sessão anterior já resolveu que não dá. Sem ela, cada sessão nova paga de novo o custo da mesma investigação, e chega na mesma conclusão, e não deixa registro. O agente esquece, o repositório não.</p>

<h2 id="onde-a-escada-encosta-na-realidade-o-degrau-que-precisa-de-data-plane">Onde a escada encosta na realidade: o degrau que precisa de data plane</h2>

<p>Os cinco degraus da escada de verificação estão no artigo anterior. O que esta migração acrescenta é o motivo de o degrau 4 existir, e ele é bem concreto.</p>

<p>O <code>envtest</code> sobe um <code>kube-apiserver</code> e um <code>etcd</code> de verdade, com os CRDs de Gateway API e de Envoy Gateway vendorizados, não com mocks. Isso prova que a lógica de reconciliação funciona. <strong>E não prova absolutamente nada sobre tráfego</strong>, porque o <code>envtest</code> não sobe o data plane do Envoy. Ele não move pacote.</p>

<p>Ou seja: tudo que depende de como um header é de fato reescrito <strong>passa no envtest e falha no mundo</strong>. É o tipo de verde que dá confiança errada.</p>

<p>A correção é um degrau a mais, e o detalhe que faz ele valer é chato de propósito: Envoy Gateway instalado localmente, no Kubernetes que vem no Docker Desktop, com <strong>exatamente os mesmos values de Helm do módulo que provisiona o ambiente real</strong>. Não é o chart com defaults, não é um cluster de brinquedo. É o ambiente de destino em miniatura, porque o que você está testando é justamente a configuração, não o Envoy.</p>

<p>Ao lado dele, um backend que só ecoa os headers que recebeu, e um <code>curl</code>. É assim que se confirma que um request HTTP simples atravessando o Envoy chega do outro lado com <code>X-Forwarded-Proto: https</code>. Não por leitura de código, não por asserção de unidade. Por observação.</p>

<p>Esse mesmo cluster local também roda o <strong>Gateway API</strong> (os CRDs), não só o Envoy. Motivo: simular o Envoy sozinho prova o rewrite de header, mas não prova que o operator chega até lá do jeito que chegaria em produção. O cluster local simula o operator <strong>rodando</strong>, não só existindo.</p>

<p>Isso é o ponto que vale enfatizar: quanto mais o ambiente local imita o real, Helm values, Gateway API incluído, menos surpresa sobra para o cluster de produção. Teste local que só sobe a aplicação não testa o caminho pelo qual a aplicação chega lá, e esse caminho tem tanta chance de esconder bug quanto o código em si.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/nginx-envoy-gateway/2.png" alt="Diagrama em linhas neon azuis comparando um servidor de API do Kubernetes, que aceita os objetos mas não move tráfego, com um proxy Envoy por onde a requisição passa de fato e sai com um header a mais preenchido" />

<p>Vale registrar também que a imagem do operator <strong>não faz parte do ciclo de iteração</strong>. Editar arquivo, reiniciar o pod com a árvore de código montada por hostPath, ver o efeito em segundos. A imagem é construída pelo serviço de build do registry, depois que o comportamento já está validado. A imagem é o resultado do loop, não uma etapa dentro dele.</p>

<h2 id="a-virada-de-trafego-e-uma-operacao-destrutiva">A virada de tráfego é uma operação destrutiva</h2>

<p>Remover ou rebaixar um Ingress nginx antigo depois que o equivalente em Gateway API está saudável é, tecnicamente, apagar um recurso de produção. Então ela passa pela mesma trava que qualquer outra operação destrutiva do meu setup: para, pede autorização explícita, e não importa o modo de automação em que eu esteja.</p>

<p>Não repito aqui como a trava é construída, <a href="https://www.orafaelferreira.com/artigos/loop-engineering-na-pratica">está detalhada no artigo anterior</a>, incluindo a brecha do modo sem prompt que quase me custou caro. O ponto específico da migração é outro: <strong>a palavra que importa é "sempre"</strong>.</p>

<p>Um cutover é exatamente o momento em que a confiança anda mais rápido que a verificação. O loop vem funcionando bem há semanas, as rotas vêm saindo certas, e a tentação de aprovar no piloto automático é máxima justo quando o custo de errar também é. Esse guardrail não protege contra o agente errar, protege contra <strong>o operador aprovando rápido demais</strong>. Falso positivo aí é preço, não defeito.</p>

<h2 id="o-que-a-auditoria-em-fan-out-achou-antes-da-virada">O que a auditoria em fan-out achou antes da virada</h2>

<p>Rodar a descoberta com agentes em vez de na mão teve um efeito colateral que sozinho pagou o esforço.</p>

<p>A sweep foi em fan-out, um agente por área da frota, seguida de uma segunda rodada com a instrução <strong>invertida</strong>: não confirme o que já foi achado, tente refutar. E o resultado foi desconfortável.</p>

<p>Dezenas de serviços montavam a URL de redirect de OAuth a partir do header não-padrão <code>X-Forwarded-Scheme</code>, com fallback para <code>X-Scheme</code>, em vez do padrão <code>X-Forwarded-Proto</code>.</p>

<p>Repare no que isso significa. <strong>Nem o nginx nem a borda anterior mandavam esses headers.</strong> Ou seja, aquelas aplicações vinham confiando num header ausente e caindo no default <code>http</code> na URL entregue ao provedor de identidade. Funcionava porque nada dependia do valor até o momento em que dependeria.</p>

<p>Mover o tráfego para o Envoy sem tocar nisso teria produzido uma onda de callbacks de OAuth quebrados no dia 1, com root cause que não tem nada a ver com Envoy, num dia em que todo mundo estaria olhando para o Envoy. É o pior formato possível de incidente: sintoma novo, causa velha.</p>

<strong>A rodada de refutação é o que torna esse achado confiável.</strong> O primeiro fan-out voltou com cara de completo, e isso por si só foi suspeito para um ambiente que eu sei que é bagunçado. A passada adversarial achou um item que não existia, um atribuído ao lugar errado, e um marcado como desativado que estava vivo em produção. Nenhum dos três aparece se você pedir para o mesmo agente reler o próprio trabalho, ele vai confirmar o que já acredita.

<p>O fix, uma vez achado, foi pequeno: o controller injeta os dois headers não-padrão, <strong>add-if-absent</strong>, na mesma camada onde já reescreve outros headers de request. Add-if-absent importa, porque quem já manda o header certo não pode ser sobrescrito por compatibilidade retroativa.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/nginx-envoy-gateway/3.png" alt="Diagrama do controller injetando headers OAuth add-if-absent no Envoy Gateway" />

<h2 id="o-que-o-processo-nao-pegou-referencegrant-no-namespace-errado">O que o processo não pegou: ReferenceGrant no namespace errado</h2>

<p>No interesse de não vender o peixe maior do que ele é: <strong>o processo pega classes de falha, ele não é infalível.</strong> E o caso que escapou é instrutivo justamente porque os testes ficaram verdes o tempo todo.</p>

<p>Backend cross-namespace precisa de um objeto <code>ReferenceGrant</code> no namespace de destino para autorizar a rota. O teste de unidade provava, corretamente, que o conversor calculava o namespace de destino certo. E isso <strong>não prova que o controller aplica o objeto lá</strong>.</p>

<p>Um passo de carimbo de namespace em outro ponto do loop de reconciliação sobrescrevia aquele destino em um caso específico, deixando o objeto de autorização válido e inútil, no namespace errado. Unidade verde, comportamento quebrado.</p>

<p>A correção é um teste de integração cobrindo conversor e controller <strong>juntos</strong>, que é exatamente o degrau que a suíte original pulava. Ela está escrita na seção de limitações conhecidas da skill, com nome, não esquecida numa conversa. <strong>Um loop com agente é tão honesto quanto o backlog que ele deixa para trás.</strong></p>

<h2 id="para-quem-vai-fazer-essa-migracao">Para quem vai fazer essa migração</h2>

<p>As recomendações genéricas de loop estão no <a href="https://www.orafaelferreira.com/artigos/loop-engineering-na-pratica">outro artigo</a>. Estas são específicas desta migração:</p>

<ul>
<li><strong>Escreva o contrato de cobertura de annotations antes do primeiro código de conversão.</strong> Decida de antemão o que acontece com cada entrada possível, para que nada que você não previu desapareça em silêncio. E tenha uma categoria explícita para "não dá".</li>
<li><strong>Trate feature baseada em diretivo como tradução tudo ou nada.</strong> Snippet, rewrite, qualquer config livre. Meia tradução é pior que nenhuma, porque parece que funcionou.</li>
<li><strong>Verificação local precisa de data plane de verdade.</strong> Uma API do Kubernetes falsa prova sua lógica de reconciliação; só um cluster rodando a mesma implementação de Gateway com os mesmos values de Helm da produção prova que seu rewrite de header acontece.</li>
<li><strong>Audite os headers que suas aplicações consomem antes de virar a borda.</strong> Não os que a documentação delas diz que elas consomem, os que o código realmente lê. E rode uma passada adversarial em cima do resultado, porque a primeira volta sempre parece completa demais.</li>
<li><strong>Diga na skill o que o projeto NÃO é.</strong> Se o formato do repositório sugere um padrão comum que não se aplica, escrever a negação custa uma linha e evita que o agente reconstrua o que você arrancou fora de propósito.</li>
<li><strong>Trate o cutover como operação destrutiva com autorização explícita.</strong> É o momento em que a confiança está mais alta e o custo de errar também.</li>
</ul>

<h2 id="conclusao">Conclusão</h2>

<p>O que me deixou confortável nessa migração não foi a velocidade da conversão. Foi que os pontos onde ela poderia ter falhado em silêncio, annotation ignorada, snippet meio traduzido, header ausente, autorização no namespace errado, viraram itens com nome, seja numa categoria, seja numa lista de limitações conhecidas, seja num teste que ainda falta escrever.</p>

<p>O agente acelerou o trabalho. O que decidiu se ele foi confiável foi o contrato escrito antes dele começar, e a disciplina de tratar todo verde não observado como suspeito.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Vibe Coding com DevOps: usei IA pra criar meu site, mas quem fez o deploy fui EU</title>
      <link>https://www.orafaelferreira.com/artigos/dod-ctrb26</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/dod-ctrb26</guid>
      <pubDate>Sat, 22 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Relato da palestra Vibe Coding com DevOps no DevOpsDays Curitiba 2026, com Jéssica Mello: IA para criar o site, Terraform e GitHub Actions para o deploy.</description>
      <category>Palestras</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/dod-ctrb/00.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<h2 id="devopsdays-curitiba-2026">DevOpsDays Curitiba 2026</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/dod-ctrb/1.png" alt="Rafael Ferreira e Jéssica Mello no DevOpsDays Curitiba 2026" />


<p>No dia <strong>22 de agosto de 2026</strong>, ao lado de <a href="https://www.linkedin.com/in/jessica-tmello/" target="_blank" rel="noopener noreferrer"><strong>Jéssica Mello</strong></a> (LowOps Consultoria), palestrei no <a href="https://devopsdays.org/events/2026-curitiba/welcome/" target="_blank" rel="noopener noreferrer"><strong>DevOpsDays Curitiba</strong></a>, um dos eventos mais tradicionais da comunidade DevOps no Brasil, realizado no <strong>Auditório Eny Caldeira do Campus Rebouças da UFPR</strong>.</p>

<h2 id="agenda">Agenda</h2>

<strong>Sessão:</strong> Vibe Coding com DevOps: usei IA pra criar meu site, mas quem fez o deploy fui EU

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/dod-ctrb/00.png" alt="Palestra Vibe Coding com DevOps no palco do DevOpsDays Curitiba" />

<p>Um estudo de caso sobre como usei IA generativa para criar meu portfólio pessoal do zero, com Terraform, GitHub Actions e boas práticas de DevOps garantiram que o deploy em produção, fosse feito com controle humano.</p>

<h2 id="a-jornada-do-prompt-ao-deploy">A Jornada: Do Prompt ao Deploy</h2>

<h3 id="o-problema">O Problema</h3>

<p>Meu portfólio pessoal (orafaelferreira.com) estava desatualizado. Eu precisava de um site moderno, minimalista e rápido, mas sem tempo para desenhar e codar tudo do zero.</p>

<h3 id="tudo-comecou-com-um-prompt">Tudo Começou com um Prompt</h3>

<p>Estruturei um prompt detalhado, seções para Home, Sobre, Blog, Palestras, Mentoria e Contato, guidelines de estilo (tema escuro, tipografia moderna, ícones lineares) e requisitos técnicos (SEO, performance, Markdown), e usei o <a href="https://lovable.dev/" target="_blank" rel="noopener noreferrer"><strong>Lovable</strong></a> para gerar <strong>100% via IA generativa</strong> a primeira versão.</p>

<p>O resultado: um site one-page, com design moderno e performance ótima. Só que sair de uma one-page para um blog completo era o próximo desafio.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/dod-ctrb/2.jpg" alt="Slide mostrando a primeira versão one-page do site gerada por IA" />

<h3 id="quando-a-vibe-encontra-a-producao">Quando a "Vibe" Encontra a Produção</h3>

<p>A modularização começou com refinamento contínuo, via prompts refinados e edição manual estratégica, transformando o one-page em páginas de fato (Home, Sobre, Blog, Palestras, Recomendações).</p>

<p>Mas dois problemas clássicos apareceram: <strong>vendor lock-in</strong> (dependência total da plataforma que gerou o código) e <strong>custos de hospedagem</strong>.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/dod-ctrb/3.jpg" alt="Slide sobre vendor lock-in e custos de hospedagem" />

<h3 id="assumindo-o-controle-do-prompt-ao-repositorio">Assumindo o Controle: Do Prompt ao Repositório</h3>

<p>A solução: exportar o código do Lovable, versionar no <a href="https://github.com/orafaelferreiraa/orafaelferreira-com" target="_blank" rel="noopener noreferrer"><strong>GitHub</strong></a>, refatorar com <a href="https://github.com/features/copilot" target="_blank" rel="noopener noreferrer"><strong>GitHub Copilot</strong></a> e adotar <strong>GitFlow</strong> e versionamento profissional.</p>

<code>git commit -m 'taking back control'</code>

<h3 id="hospedagem-e-migracao-para-azure">Hospedagem e Migração para Azure</h3>

<p>Com o código sob controle, migrei a hospedagem para a <strong>Microsoft Azure</strong>: escrevo o código → GitHub guarda e testa (CI/CD) → publica no Azure → o domínio (www.orafaelferreira.com) responde. Isso envolveu migração de conteúdo (posts, palestras, projetos), adaptação estratégica de layout e configuração de DNS com downtime mínimo.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/dod-ctrb/4.jpg" alt="Slide com o fluxo de deploy do GitHub para o Azure" />

<h3 id="infraestrutura-como-codigo-com-terraform">Infraestrutura como Código com Terraform</h3>

<p>Toda a infraestrutura é provisionada 100% via código com <a href="https://www.terraform.io/" target="_blank" rel="noopener noreferrer"><strong>Terraform</strong></a>: criação do Azure Static Web App, configuração automatizada de DNS e domínio, e execução automatizada via GitHub Actions, garantindo consistência e replicabilidade, no lugar do clássico ClickOps manual e propenso a erros.</p>

<p>A arquitetura final: um Resource Group (<code>rg-site</code>) com Azure Blob Storage guardando o state do Terraform, um Azure Static Web App (free tier, <code>eastus2</code>) e um domínio customizado (<code>www.orafaelferreira.com</code>) com TLS automático e validação DNS via TXT record.</p>

<h3 id="o-motor-de-entrega-github-actions">O Motor de Entrega: GitHub Actions</h3>

<p>O pipeline de CI/CD roda em <strong>push to main</strong>: build → test → deploy to Azure, com autenticação via Service Principal (secrets nunca hardcoded). Zero intervenção manual, 100% automatizado, incluindo validação de infraestrutura (<code>tflint</code>, <code>trivy</code>, <code>checkov</code>) antes de qualquer <code>terraform apply</code>.</p>

<h3 id="a-base-do-frontend-moderno">A Base do Frontend Moderno</h3>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/dod-ctrb/5.jpg" alt="Slide com a stack do frontend: TypeScript, React, Vite e Tailwind" />

<p>No frontend: <strong>TypeScript</strong>, <strong>React</strong>, <strong>Vite</strong>, <strong>TailwindCSS</strong> e <strong>shadcn/ui</strong>, com arquitetura orientada a componentes, cobertura completa de testes (unit com Vitest, componentes com React Testing Library, E2E com Playwright), suporte a i18n (PT-BR/EN) e foco em acessibilidade e SEO.</p>

<h3 id="geo-a-evolucao-da-busca">GEO: A Evolução da Busca</h3>

<p>Também trouxe um recorte sobre <strong>Generative Engine Optimization (GEO)</strong>, a evolução do SEO tradicional (palavras-chave, cliques, backlinks) para um mundo onde o foco está em intenção e contexto, citações por LLMs e dados estruturados e semânticos.</p>

<h2 id="licoes-aprendidas">Lições Aprendidas</h2>

<p>1. <strong>Um prompt bem estruturado vale mais que 100 tentativas aleatórias.</strong></p>
<p>2. <strong>Unir IA, automação e cloud não é o futuro, é o presente</strong>, mas exige profissionais em "T": generalistas na velocidade (vibe coding, prototipagem rápida) e especialistas em profundidade (DevOps, Terraform, Azure, Security).</p>
<p>3. <strong>UX é tão importante quanto o produto.</strong></p>
<p>4. A inteligência artificial acelera exponencialmente, mas o poder humano de decisão, a criatividade e o objetivo continuam sendo intangíveis.</p>

<p>> "A IA é o Acelerador. Você é o Piloto." A IA não vai roubar seu emprego, ela vai impulsionar quem sabe usá-la.</p>

<p>E um recado final, direto: você não é pago pra escrever código, você é pago pra resolver problemas. Se você não está gostando do seu trabalho atual, ou você não está usando a IA do jeito certo, ou você está no emprego errado.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/dod-ctrb/6.jpg" alt="Público do DevOpsDays Curitiba 2026 durante as lições aprendidas" />

<h2 id="slides-da-apresentacao">Slides da Apresentação</h2>

<i></i> <strong>Slides da Apresentação:</strong> <a href="https://stoblobcertificados011.blob.core.windows.net/palestras/Site.IA-DOD-CRTB.pdf" target="_blank" rel="noopener noreferrer">Vibe Coding com DevOps: usei IA pra criar meu site no Azure, mas quem fez o deploy fui EU</a>

<h2 id="repositorios">Repositórios</h2>

<ul>
<li><a href="https://github.com/orafaelferreiraa/orafaelferreira-com" target="_blank" rel="noopener noreferrer">Repositório do Site</a>, código-fonte, Terraform e pipeline completa.</li>
</ul>

<p>Obrigado ao DevOpsDays Curitiba pela oportunidade e a todos que estiveram na sessão!</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/dod-ctrb/certificado.png" alt="" />
]]></content:encoded>
    </item>
    <item>
      <title>Platform Engineering na Prática - Construindo Plataformas Serverless Self-Service</title>
      <link>https://www.orafaelferreira.com/artigos/mvp-conf-regional-curitiba-2026</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/mvp-conf-regional-curitiba-2026</guid>
      <pubDate>Sat, 22 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>MVP Conf Regional Curitiba 2026: como Platform Engineering combate o Shadow Ops com uma plataforma serverless self-service em Terraform e GitHub Actions.</description>
      <category>Palestras</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/mvp-ctba/0.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<h2 id="mvp-conf-regional-curitiba-2026">MVP Conf Regional Curitiba 2026</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/mvp-ctba/0.png" alt="Rafael Ferreira no MVP Conf Regional Curitiba 2026 na PUC PR" />

<p>No dia <strong>22 de agosto de 2026</strong>, palestrei no <a href="https://www.mvpconf.com.br/regional/curitiba/agosto-2026" target="_blank" rel="noopener noreferrer"><strong>MVP Conf Regional Curitiba 2026</strong></a>, realizado na <strong>PUC PR</strong>, com a sessão <strong>"Platform Engineering na Prática - Construindo Plataformas Serverless Self-Service"</strong>.</p>

<p>Uma imersão prática em Platform Engineering:qu o que é um Internal Developer Platform (IDP) de verdade, e como construí, com Terraform, GitHub Actions e uma arquitetura em três pilares, uma plataforma serverless self-service na Azure.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/mvp-ctba/1.jpg" alt="Slide de abertura da palestra Platform Engineering na Prática" />

<h2 id="o-anti-padrao-do-shadow-ops">O Anti-Padrão do Shadow Ops</h2>

<p>A promessa "you build it, you run it" quebrou sob o peso da complexidade cloud-native. Exigir que desenvolvedores dominem toda a stack de infraestrutura (Kubernetes, Helm, Terraform, RBAC, CI/CD, networking) atrasa entregas e gera configurações inconsistentes, o chamado <strong>Shadow Ops</strong>. <strong>44% das organizações de baixo desempenho</strong> sofrem com desenvolvedores assumindo tarefas de infraestrutura e desviando o foco do produto.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/mvp-ctba/2.jpg" alt="Slide sobre o anti-padrão do Shadow Ops" />

<h2 id="o-que-e-platform-engineering">O Que É Platform Engineering?</h2>

<p>Platform Engineering é construir uma plataforma interna que simplifica, padroniza e acelera o trabalho dos times de desenvolvimento. <strong>Não é uma ferramenta. É um produto.</strong></p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/mvp-ctba/5.jpg" alt="Slide explicando Platform Engineering como produto interno" />

<ul>
<li><strong>O core da plataforma:</strong> infraestrutura padronizada, pipelines automatizados e governança clara, processos que os devs realmente querem usar. O objetivo é tornar o caminho certo o caminho mais fácil.</li>
<li><strong>Reduz carga cognitiva:</strong> devs conseguem provisionar, deployar e monitorar sem precisar ser especialistas em cloud, Kubernetes ou networking. A plataforma "esconde" complexidade sem esconder poder.</li>
<li><strong>Resultado:</strong> velocity aumenta, erros humanos caem drasticamente e ciclos de release passam de meses para dias.</li>
</ul>

<h3 id="devops-tradicional-vs-engenharia-de-plataforma">DevOps Tradicional vs. Engenharia de Plataforma</h3>
<div><table><thead><tr><th>DevOps Tradicional</th><th>Engenharia de Plataforma</th></tr></thead><tbody><tr><td>Foco em atender tickets (Ticket Ops)</td><td>Foco em criar produtos de autoatendimento</td></tr><tr><td>Engenheiros operacionais como gargalo humano</td><td>Operações automatizadas através de Golden Paths</td></tr><tr><td>Devs lidam com Shadow Ops e configs complexas</td><td>Devs focam exclusivamente em lógica de negócio</td></tr><tr><td>Relação transacional e frequentemente tóxica</td><td>Relação baseada em pesquisa de usuário e feedback contínuo</td></tr></tbody></table></div>
<p>O mercado reconhece essa mudança: Platform Engineers ganham, em média, <strong>até 20% a mais</strong> do que profissionais de DevOps tradicionais.</p>

<h2 id="a-anatomia-de-um-idp-os-5-planos">A Anatomia de um IDP: os 5 Planos</h2>

<p>Um Internal Developer Platform (IDP) de verdade se organiza em cinco planos:</p>

<p>1. <strong>Developer Control Plane</strong>, a interface de entrada (portais, CLI, API, workload specifications). Onde o desenvolvedor interage.</p>
<p>2. <strong>Integration & Delivery Plane</strong>, o motor lógico (CI/CD, orquestradores de plataforma). Cria configurações dinamicamente a cada <code>git push</code>.</p>
<p>3. <strong>Resource Plane</strong>, os recursos reais subjacentes (compute, DNS, bancos de dados, nuvem).</p>
<p>4. <strong>Security Plane</strong>, governança contínua (gerenciamento de segredos, políticas de acesso).</p>
<p>5. <strong>Observability Plane</strong>, visibilidade padronizada (logs, APM, métricas).</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/mvp-ctba/6.jpg" alt="Slide com os cinco planos da anatomia de um IDP" />

<h2 id="o-perfil-do-engenheiro-de-plataforma">O Perfil do Engenheiro de Plataforma</h2>

<p>Um bom engenheiro de plataforma vive na intersecção de três habilidades: <strong>habilidades técnicas profundas</strong> (Cloud Native, Kubernetes, CI/CD, GitOps, Infraestrutura como Código), <strong>mentalidade de produto</strong> (visão de ciclo de vida, foco no cliente/dev, MVPs e métricas de uso) e <strong>comunicação e empatia</strong> (vender a solução pra liderança técnica e ouvir criticamente o desenvolvedor).</p>

<h2 id="erros-fatais-ao-adotar-platform-engineering">Erros Fatais ao Adotar Platform Engineering</h2>

<p>1. <strong>Mudança apenas de nome</strong>, renomear a equipe de SysAdmins para "Plataforma", mas continuar afogado em Ticket Ops.</p>
<p>2. <strong>Foco em Ops, não em Devs</strong>, construir ferramentas baseadas no que os operadores acham importante, ignorando a experiência do usuário (dev).</p>
<p>3. <strong>Sem mentalidade de produto</strong>, atender requisições ad-hoc de todos os times sem construir fluxos de trabalho escaláveis.</p>
<p>4. <strong>Tecnologia pela tecnologia</strong>, trocar ferramentas sem um motivo estratégico atrelado à produtividade.</p>

<h2 id="o-valor-real-a-experiencia-do-desenvolvedor-devex">O Valor Real: A Experiência do Desenvolvedor (DevEx)</h2>

<p>O objetivo final é resumir meses de configuração de infraestrutura a parâmetros essenciais. Da visão do desenvolvedor, o esforço é <code>imagem = 'meu-app:v1'</code>. Por trás, a engenharia oculta cuida de tudo: Container Apps Environment configurado, rede spoke <code>/27</code> delegada, Managed Identity vinculada nativamente, comunicação criptografada com o Azure Container Registry, e logs fluindo automaticamente pra Application Insights.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/mvp-ctba/7.jpg" alt="Slide sobre a experiência do desenvolvedor em uma plataforma interna" />

<h2 id="como-construi-uma-arquitetura-em-tres-pilares">Como Construí: Uma Arquitetura em Três Pilares</h2>

<p>Na prática, estruturei o ecossistema em três repositórios que se conectam:</p>

<p>1. <strong>Pipeline-as-a-Service</strong>, centraliza validação e segurança, valida o código.</p>
<p>2. <strong>TFse Modules-as-a-Service</strong>, blocos de construção reutilizáveis (ex: um módulo de Azure Container Registry já com RBAC embutido). Fornece as peças.</p>
<p>3. <strong>Platform-as-a-Service</strong>, o produto final: ambientes completos via feature flags, monta a solução.</p>

<p>Módulos não criam apenas o recurso, eles encapsulam governança, monitoramento e acesso, escondendo a complexidade do consumidor.</p>

<h3 id="pipeline-as-a-service-um-reusable-workflow">Pipeline-as-a-Service: Um Reusable Workflow</h3>

<p>Um único <strong>reusable workflow</strong> de GitHub Actions elimina mais de <strong>70 linhas de código de validação duplicadas por projeto</strong> entre os três repositórios. Atualizações são feitas em um único lugar e se propagam pra todos os consumidores.</p>

<p>O fluxo sequencial de validação de infraestrutura roda em cinco etapas (com <code>continue-on-error: true</code>, executando todas as checagens mesmo se uma falhar):</p>

<code>terraform fmt</code> (sempre ativo) → <strong>TFLint</strong> (boas práticas) → <strong>Trivy</strong> (vulnerabilidades) → <strong>Checkov</strong> (compliance) → <strong>terraform-docs</strong> (detecção de drift).

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/mvp-ctba/8.jpg" alt="Slide do reusable workflow com terraform fmt, TFLint, Trivy e Checkov" />

<h3 id="feature-flags-e-matriz-de-dependencias">Feature Flags e Matriz de Dependências</h3>

<p>A plataforma final é montada por feature flags que respeitam uma matriz de dependências, por exemplo, <code>enable_container_apps = true</code> dispara automaticamente <code>enable_observability</code>, <code>enable_managed_identity</code> (o hub central de RBAC que conecta Storage, Service Bus, SQL e ACR) e <code>enable_key_vault</code>, que por sua vez depende do <code>enable_sql</code> pra gerenciar senhas.</p>

<p>A arquitetura final segue quatro camadas, com dependência obrigatória de baixo pra cima: <strong>Base</strong> (Resource Group, Virtual Network) → <strong>Fundação</strong> (Managed Identity, Key Vault) → <strong>Serviços</strong> (Storage, Service Bus, SQL, ACR) → <strong>Workloads</strong> (Azure Container Apps Environment).</p>

<h2 id="slides-da-apresentacao">Slides da Apresentação</h2>

<i></i> <strong>Slides da Apresentação:</strong> <a href="https://stoblobcertificados011.blob.core.windows.net/palestras/Platform_Engineering-MVP-CRTB.pdf" target="_blank" rel="noopener noreferrer">Platform Engineering: Construindo uma Plataforma Serverless Self-Service</a>

<h2 id="repositorios-da-apresentacao">Repositórios da apresentação</h2>

<ul>
<li><strong>Platform Stack:</strong></li>
</ul>
<a href="https://github.com/orafaelferreiraa/platform-as-a-service-stack" target="_blank" rel="noopener noreferrer">platform-as-a-service-stack</a>

<ul>
<li><strong>Pipeline Stack:</strong></li>
</ul>
<a href="https://github.com/orafaelferreiraa/pipeline-as-a-service-stack" target="_blank" rel="noopener noreferrer">pipeline-as-a-service-stack</a>

<ul>
<li><strong>TF Modules Stack:</strong></li>
</ul>
<a href="https://github.com/orafaelferreiraa/tfmodules-as-a-service-stack" target="_blank" rel="noopener noreferrer">tfmodules-as-a-service-stack</a>

<p>Obrigado ao MVP Conf Regional Curitiba pela oportunidade e a todos que estiveram na sessão!</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/mvp-ctba/9.jpg" alt="Rafael Ferreira palestrando no MVP Conf Regional Curitiba 2026" />
]]></content:encoded>
    </item>
    <item>
      <title>Menções e Publicações Externas</title>
      <link>https://www.orafaelferreira.com/artigos/mencoes-publicacoes-externas</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/mencoes-publicacoes-externas</guid>
      <pubDate>Sun, 16 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Olá, pessoal! Reuni neste post publicações em que compartilhei insights em sites externos.</description>
      <category>Colaborações Externas</category>
      <category>Carreira</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/participa%C3%A7%C3%B5es/2.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<p>Olá, pessoal!</p>

<p>Quero deixar o registro com vocês um novo post onde destaco minhas participações em publicações, escrevendo sobre DevOps, Cloud e Platform Engineering. Espero que este post possa inspirar outros a buscar desenvolvimento profissional contínuo. Bora lá!</p>

<h2 id="minhas-participacoes">Minhas Participações</h2>

<h3 id="accelerate-teams-with-platform-engineering-and-policy-as-code">Accelerate Teams with Platform Engineering and Policy-as-Code</h3>
<a href="https://platformengineering.org/blog/accelerate-teams-with-platform-engineering-and-policy-as-code" target="_blank" rel="noopener noreferrer"><strong>Accelerate Teams with Platform Engineering and Policy-as-Code</strong></a>


<h3 id="how-i-use-ai-loop-engineering-building-safer-ai-agent-workflows-for-high-stakes-">How I Use AI — Loop Engineering: Building Safer AI Agent Workflows for High-Stakes Infrastructure</h3>
<a href="https://techcommunity.microsoft.com/blog/mvp-blog/how-mvps-use-ai---loop-engineering-building-safer-ai-agent-workflows-for-high-st/4545646" target="_blank" rel="noopener noreferrer"><strong>How I Use AI, Loop Engineering: Building Safer AI Agent Workflows for High-Stakes Infrastructure</strong></a>

<strong>#PlatformEngineering #PolicyAsCode #IA #DevOps #Comunidade</strong>
]]></content:encoded>
    </item>
    <item>
      <title>Loop Engineering na prática: como eu opero agentes no dia a dia</title>
      <link>https://www.orafaelferreira.com/artigos/loop-engineering-na-pratica</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/loop-engineering-na-pratica</guid>
      <pubDate>Sun, 26 Jul 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>O que é Loop Engineering e como monto meu loop com skills, rules, subagents, hooks e MCP no Docker, incluindo os pontos em que discordo da definição canônica.</description>
      <category>Artigos</category>
      <category>IA</category>
      <category>Platform Engineering</category>
      <category>DevOps</category>
      <category>Docker</category>
      <category>CI/CD</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2026/Loop.Engineering/capa.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<p>Usando LLMs e agentes há mais ou menos dois anos, desde a época em que eu ainda estava <a href="https://www.orafaelferreira.com/artigos/ia-gen">explorando o que a IA generativa mudava na prática</a>, o <strong>GitHub Copilot</strong> desde então, e o <strong>Claude Code</strong> há uns três meses. O que vem abaixo é um resumo de como isso entrou no meu dia a dia de verdade.</p>

<h2 id="resumo-rapido">Resumo rápido</h2>

<ul>
<li><strong>Loop Engineering</strong> é técnica de o sistema que dá o prompt no agente, em vez de você dar o prompt a cada passo. O termo foi sistematizado em junho de 2026.</li>
<li>O conceito original de um loop de verdade tem cinco peças: <strong>objetivo</strong>, <strong>verificador</strong>, <strong>caminho de feedback</strong>, <strong>regra de parada</strong> e <strong>teto de iteração/custo</strong>. Sem verificador, não é loop, é um gerador de texto com autoconfiança.</li>
<li>Meu setup implementa quatro dos cinco componentes canônicos. O quinto, <strong>worktree</strong>, eu tirei de propósito, e explico por quê.</li>
<li>A peça mais útil do meu loop não é uma IA: é um <strong>hook em shell que sai com código 2</strong>. É assim que a correção volta para o contexto do modelo.</li>
<li>A divisão que faz o resto funcionar: <strong>hook aplica, skill instrui, MCP executa.</strong> Nenhuma das três invade o papel da outra.</li>
<li>Trabalho com plataforma sob NDA, então aqui não tem nome de empresa, cluster, tenant ou repositório. O que interessa é o mecanismo, e o mecanismo é público.</li>
</ul>

<h2 id="de-prompt-para-loop">De prompt para loop</h2>

<p>Nos últimos dois anos a alavanca foi migrando para fora. Primeiro era a <strong>palavra que você digita</strong>, prompt engineering. Depois virou <strong>a informação que o modelo vê</strong>, context engineering. Depois <strong>o ambiente em que ele roda</strong>, harness engineering. Agora é <strong>o ciclo que dirige tudo isso</strong>.</p>

<p>O <a href="https://addyo.substack.com/p/loop-engineering" target="_blank" rel="noopener noreferrer">Peter Steinberger resumiu de um jeito que provoca</a>: <em>"You shouldn't be prompting coding agents anymore. You should be designing loops that prompt your agents."</em></p>

<p>Isso provoca, porque é verdade. Se o seu trabalho com agente ainda é abrir o terminal, descrever a tarefa, ler a resposta, corrigir, repetir, você é o loop. Você é a peça que não escala.</p>

<p>Eu passei os últimos meses construindo o meu, num contexto que é bem menos glamouroso que os exemplos de blog: infraestrutura multi-tenant, Terraform, AKS, pipelines. Domínio onde o custo de errar não é um teste vermelho, é um ambiente fora do ar. E foi justamente esse contexto que me fez questionar e estudar cada vez mais para não usar a receita padrão.</p>

<h2 id="o-que-e-loop-engineering">O que é Loop Engineering</h2>

<p>Vamos ao que o povão está dizendo</p>

<p>O termo foi sistematizado pelo <strong>Addy Osmani</strong> em junho de 2026, <a href="https://addyo.substack.com/p/loop-engineering" target="_blank" rel="noopener noreferrer">no artigo que virou referência</a> (também <a href="https://www.oreilly.com/radar/loop-engineering/" target="_blank" rel="noopener noreferrer">publicado no O'Reilly Radar</a>). A definição dele é direta: <em>"Loop engineering is replacing yourself as the person who prompts the agent. You design the system that does it instead."</em></p>

<p>A <a href="https://www.ibm.com/think/topics/loop-engineering" target="_blank" rel="noopener noreferrer">IBM descreve como</a> a prática de projetar, especificar e manter loops agênticos, sistemas que se auto-instruem e avaliam o próprio trabalho até atingir um objetivo declarado. O <a href="https://www.augmentcode.com/guides/what-is-loop-engineering" target="_blank" rel="noopener noreferrer">Augment Code detalha a anatomia</a>: um loop pareia um agente de código com um <strong>verificador</strong>, um <strong>caminho de feedback</strong>, uma <strong>condição de saída</strong>, um <strong>teto de iterações</strong> e um <strong>teto de orçamento</strong>, para que ele possa rodar sem supervisão sob regras de parada explícitas.</p>

<p>Repare no que essa lista tem de mais importante: quatro dos cinco itens são <strong>freios</strong>. Só um é acelerador.</p>

<h3 id="os-cinco-componentes">Os cinco componentes</h3>

<p>O Osmani lista cinco peças que transformam execução avulsa em loop:</p>

<ul>
<li><strong>Automations</strong>, <em>"Automations are what make a loop an actual loop and not just one run you did once."</em> Tarefas agendadas que descobrem trabalho sozinhas.</li>
<li><strong>Worktrees</strong>, diretórios de trabalho isolados, para vários agentes mexerem no mesmo repo sem colidir.</li>
<li><strong>Skills</strong>, conhecimento de projeto codificado em arquivos <code>SKILL.md</code>: convenções, passos de build, o contexto que você reexplicaria a cada sessão.</li>
<li><strong>Plugins e connectors</strong>, integrações via <a href="https://modelcontextprotocol.io" target="_blank" rel="noopener noreferrer">MCP</a>, para o loop alcançar sistemas reais e não só o filesystem.</li>
<li><strong>Subagents</strong>, separar quem escreve de quem confere. Nas palavras dele: <em>"The most useful structural thing in a loop, by far, is splitting the one who writes from the one who checks."</em></li>
</ul>

<p>E uma sexta peça, que na verdade é a fundação: <strong>estado externo</strong>. O modelo esquece tudo entre execuções, então a memória tem que viver fora dele. O jeito mais curto de dizer isso: <strong>o agente esquece, o repo não.</strong></p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2026/Loop.Engineering/1.png" alt="Ilustração de um núcleo de estado externo brilhando no centro, orbitado por cinco satélites de energia que representam automations, worktrees, skills, plugins/MCP e subagents" />

<h3 id="a-tensao-que-ninguem-resolveu">A tensão que ninguém resolveu</h3>

<p>Existe um problema estrutural no meio disso, e vale nomear antes de qualquer entusiasmo: <strong>a capacidade de gerar ultrapassou a capacidade de verificar.</strong> Agentes produzem código rápido; checagens confiáveis continuam sendo artefato escasso, feito por gente.</p>

<p>Daí vêm as falhas clássicas, todas documentadas: <strong>reward hacking</strong> (o agente reescreve o teste em vez de consertar o código), <strong>tool-call hacking</strong> (ele chuta a saída em vez de usar o resultado da ferramenta), o exit <em>"parece pronto"</em> (declara conclusão sem evidência) e a <strong>iteração infinita</strong> (loop sem condição de parada).</p>

<p>Um <a href="https://arxiv.org/abs/2607.00038" target="_blank" rel="noopener noreferrer">paper de julho deste ano no arXiv</a> argumenta na mesma direção: o problema não é o modelo ser fraco, é o loop ser mal projetado. E a própria Anthropic, <a href="https://www.anthropic.com/engineering/building-effective-agents" target="_blank" rel="noopener noreferrer">na engenharia de agentes eficazes</a>, coloca o requisito de forma seca, o agente precisa obter <em>ground truth</em> do ambiente a cada passo. Não da própria opinião. Do ambiente.</p>


<h2 id="os-quatro-pontos-onde-meu-loop-e-diferente">Os quatro pontos onde meu loop é diferente</h2>

<p>Eu implemento quatro dos cinco componentes acima. São decisões que o eu determinei.</p>

<h3 id="1-loop-sem-worktree">1. Loop sem worktree</h3>

<p>O worktree é um dos cinco componentes canônicos. Eu tirei o meu, e tenho uma regra explícita proibindo o agente de criar um por iniciativa própria.</p>

<p>O raciocínio é este: em repositório de infraestrutura, <strong>o isolamento que importa não é de arquivo, é de estado</strong>. O que colide de verdade quando dois agentes trabalham em paralelo não é o diretório, é o <em>state</em> remoto do Terraform, é o lock de um apply em andamento, é o contexto de cluster ativo no <code>kubectl</code>, é o registro de um recurso que só existe uma vez na nuvem. Worktree não resolve nenhum desses. Ele te dá dois checkouts que disputam exatamente o mesmo recurso, com a sensação agradável de que estão isolados.</p>

<p>Então eu troco por outra coisa: <strong>branch, e o PR como gate.</strong> O isolamento vem do branch. A verificação vem da revisão. E o PR ainda me dá o que worktree nenhum dá, trilha de auditoria com diff, comentário e aprovação nominal. Em infra, "quem aprovou isso" é uma pergunta que aparece.</p>

<h3 id="2-guardrail-antes-da-geracao-nao-depois">2. Guardrail antes da geração, não depois</h3>

<p>O padrão da literatura é gerar e depois verificar. Meu loop inverte parte disso. As <strong>rules</strong> carregam antes de qualquer código existir, e várias delas são proibições: validar versão de provider e schema do recurso via MCP <strong>antes</strong> de escrever a primeira linha; nunca escrever segredo em arquivo; nunca abrir endpoint público em serviço de dados de produção; menor privilégio por padrão.</p>

<p>A ideia é simples e pouco glamourosa: <strong>o verificador mais barato do mundo é a regra que impede o erro de existir.</strong> Um teste que pega credencial hardcoded é bom. Uma regra que faz o agente nunca escrever uma é melhor, porque custa zero iteração.</p>

<p>É o mesmo raciocínio que eu já defendi em <a href="https://www.orafaelferreira.com/artigos/platform-engineering-policy-as-code">Platform Engineering e Policy-as-Code que aceleram times</a>, só deslocado uma camada para trás. Lá a política barra o recurso errado na hora de admitir; aqui a regra impede o agente de escrever o recurso errado. Política é guardrail para o que já existe; rule é guardrail para o que ainda vai nascer.</p>

<h3 id="3-em-infra-o-verificador-nao-e-a-suite-de-testes">3. Em infra, o verificador não é a suíte de testes</h3>

<p>Aquela tensão de gerar-versus-verificar é ruim em desenvolvimento de aplicação. Em plataforma é pior, por um motivo bobo: <strong>verificar custa tocar em ambiente.</strong></p>

<p>Não existe <code>npm test</code> que me diga se uma regra de rede vai funcionar. O verificador honesto é outro conjunto de coisas, e elas têm preços muito diferentes:</p>
<div><table><thead><tr><th>Gate</th><th>O que ele responde</th><th>Custo</th></tr></thead><tbody><tr><td>Lint e format</td><td>O código é sintaticamente válido?</td><td>Segundos, zero risco</td></tr><tr><td>Validate e schema</td><td>Os campos existem nessa versão do provider?</td><td>Segundos, zero risco</td></tr><tr><td>Plan / diff</td><td>O que exatamente vai mudar?</td><td>Minutos, leitura remota</td></tr><tr><td>Health e reconciliação</td><td>O ambiente aceitou e está saudável?</td><td>Depois do apply, risco real</td></tr></tbody></table></div>
<p>A regra que eu sigo é ordenar do mais barato ao mais caro, e nunca deixar o agente pular etapa. O <a href="https://www.augmentcode.com/guides/what-is-loop-engineering" target="_blank" rel="noopener noreferrer">Augment recomenda a mesma ordenação</a> de forma genérica, portas determinísticas primeiro, raciocínio depois, teste dinâmico por último. Em infra isso não é otimização de custo, é gestão de blast radius.</p>

<p>E o corolário desconfortável: <strong>o último gate da minha lista não é automatizável hoje.</strong> "O ambiente está saudável" envolve olhar coisa que só existe depois de aplicar. É exatamente por isso que a próxima tese existe.</p>

<h3 id="4-o-outer-loop-e-meu">4. O outer loop é meu</h3>

<p>O Osmani tem uma frase: <em>"Delegating the inner loop is leverage; delegating the outer loop is abdication."</em></p>

<p>Delegar o <strong>inner loop</strong>, escrever, rodar o gate, corrigir, rodar de novo, é alavancagem pura. É trabalho que eu não quero fazer à mão.</p>

<p>Delegar o <strong>outer loop</strong>, decidir o que é o objetivo, julgar se o resultado presta, assumir o resultado, é abdicação. Não é uma questão de confiança no modelo. É que a responsabilidade não é transferível: quando algo cai, ninguém aceita "o agente decidiu".</p>

<p>No meu setup isso está codificado, não é boa intenção:</p>

<ul>
<li>O <strong>objetivo</strong> vem de um card do Jira.</li>
<li>O <strong>ID da tarefa</strong> vive no nome da branch, não na conversa. Qualquer sessão nova recupera o objetivo com um comando de git.</li>
<li>O <strong>fim do ciclo</strong> é um PR, com um comentário de volta no card. Não um deploy.</li>
<li>O <strong>estado</strong> persiste fora do modelo, em memória entre sessões e no próprio histórico do repo.</li>
<li>O <strong>merge é meu.</strong> O agente nunca faz merge. Nenhuma exceção.</li>
</ul>

<p>Repare que só o primeiro e o último item são sobre mim. Os três do meio são automação, e é justamente por serem automatizados que eu consigo manter as pontas na mão sem virar gargalo. Autonomia no meio, autoridade nas bordas.</p>

<p>Isso torna meu loop menos autônomo do que os exemplos que circulam por aí. É de propósito. Autonomia é meio, não é métrica.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2026/Loop.Engineering/3.png" alt="Ilustração conceitual separando o inner loop automatizado, em ciclo rápido, do outer loop humano, representado por uma mão segurando firme um volante, símbolo de quem decide o objetivo e aprova o resultado" />

<h2 id="como-o-loop-esta-montado">Como o loop está montado</h2>

<p>Agora a mecânica. A tese organizadora, e o que eu levaria para qualquer outro setup: <strong>hook aplica, skill instrui, MCP executa.</strong></p>

<p>Três camadas, três papéis, e a disciplina de nenhuma invadir a outra. Hook é determinístico , ele detecta e aplica. Skill é procedimento versionado, ela ensina. MCP é quem busca atualidade na internet. Quando eu misturei os papéis, quebrou. Quando separei, ficou previsível.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2026/Loop.Engineering/2.png" alt="Ilustração de um raio de energia atravessando três camadas empilhadas, hook determinístico, skill com o procedimento e MCP como executor autenticado, com um arco elétrico de retorno representando o feedback do exit code 2" />

<h3 id="exit-2-e-a-primitiva-do-loop"><code>exit 2</code> é a primitiva do loop</h3>

<p>Se eu pudesse levar uma coisa só deste artigo, seria esta.</p>

<a href="https://code.claude.com/docs/en/hooks" target="_blank" rel="noopener noreferrer">Hooks no Claude Code</a> são comandos disparados por evento do ciclo de vida, antes de uma ferramenta rodar, depois que ela roda, no início da sessão, no fim. E eles têm um comportamento de código de saída que é a coisa mais subestimada da ferramenta: <strong>quando um hook sai com código 2, o que ele escreveu no stderr volta para o contexto do modelo como mensagem de erro.</strong>

<p>Leia de novo. Isso significa que um script de shell de trinta linhas consegue <strong>injetar correção no loop</strong>. Não é sugestão em documentação que o modelo talvez leia. É feedback que chega no momento exato do erro, com o texto que eu escrevi.</p>

<p>Esse é o <em>caminho de feedback</em> da definição de loop, implementado em bash. Cinco hooks meus usam isso: três para o modelo se autocorrigir, um para entregar uma tarefa de follow-up, um para travar de verdade.</p>

<p>Um exemplo genérico, que é a forma de todos eles:</p>

<div data-lang="bash"><pre><code>#!/usr/bin/env bash
# PostToolUse — avisa quando um manifesto sai sem limite de recurso.
set +e
[ -t 0 ] &amp;&amp; exit 0                    # sem stdin, nada a fazer
payload="$(cat)"; [ -z "$payload" ] &amp;&amp; exit 0

file="$(printf '%s' "$payload" | jq -r '.tool_input.file_path // empty')"
case "$file" in *.yaml|*.yml) ;; *) echo '{"continue":true}'; exit 0 ;; esac

# só olha workload de verdade, não Application/CRD/kustomization
grep -qE "^kind: (Deployment|StatefulSet|DaemonSet|Job|CronJob|Pod)$" "$file" || {
  echo '{"continue":true}'; exit 0; }

if ! grep -q 'resources:' "$file"; then
  printf 'Guardrail: %s define workload sem resources/limits. Adicione requests e limits antes de seguir.\n' "$file" &gt;&amp;2
  exit 2                              # &lt;- stderr volta para o contexto do modelo
fi
echo '{"continue":true}'</code></pre></div>

<p>Note duas coisas que aprendi na prática. Primeira: o hook <strong>estreita o escopo antes de opinar</strong>, se ele disparasse em todo YAML, ia gritar em manifesto de GitOps que legitimamente não tem <code>resources</code>, e guardrail que grita errado é guardrail que a gente desliga. Segunda: a mensagem diz <strong>o que fazer</strong>, não só o que está errado. Feedback acionável fecha o loop numa iteração; feedback vago gasta três.</p>

<h3 id="o-card-e-o-objetivo-e-o-loop-comeca-nele">O card é o objetivo, e o loop começa nele</h3>

<p>Um loop precisa de objetivo que o modelo não inventou. No meu setup ele vem de um card do Jira, e o ciclo toca o card em três momentos: <strong>descobrir qual é</strong>, <strong>criar a branch</strong> e <strong>comentar de volta no fim</strong>.</p>

<strong>Descoberta do card.</strong> Eu não digito o número da tarefa. Uma skill consulta o Jira via MCP com um JQL fechado no meu projeto, atribuído a mim, em andamento, ordenado pelo mais recentemente atualizado:

<div data-lang="text"><pre><code>project = &lt;PROJ&gt; AND assignee = currentUser() AND status = "In Progress"
ORDER BY updated DESC</code></pre></div>

<p>E aqui está a decisão de design IRADA que decidi criar: <strong>ele pega o primeiro resultado e não pergunta.</strong> Diz em uma linha qual card assumiu, "usando o card X, tal resumo", e segue trabalhando. Se estiver errado, eu corrijo na mensagem seguinte.</p>

<p>Um loop que para para perguntar "qual desses três cards?" não é um loop, é um formulário. Pergunta bloqueante no início de toda tarefa é exatamente o atrito de humano-no-meio que Loop Engineering existe para remover. O padrão certo é <strong>default otimista com correção barata</strong>: escolha o mais provável, diga em voz alta o que escolheu, continue. Errar custa uma mensagem; perguntar custa todas as vezes.</p>

<p>As saídas de emergência são explícitas, e isso importa mais que a regra: se eu já dei a chave na mensagem, não busca nada. Se a busca voltar vazia, ela avisa e pede a chave, <strong>nunca inventa uma</strong>. Se eu citar outro projeto, usa aquele. Loop bom tem default; loop confiável tem default <em>e</em> as três exceções escritas.</p>

<strong>Criação da branch.</strong> O nome é sempre <code>feature/{CHAVE-DA-ISSUE}</code>, independente do tipo, Bug, Task e Story todos entram como <code>feature/</code>. Taxonomia única, zero decisão a cada tarefa. Nome de branch é metadado, não é lugar de criatividade.

<p>E tem um detalhe de arquitetura aí que eu considero mais importante que a convenção: <strong>a sequência do git não está na skill.</strong> Dar pull na base, sair dela para uma branch nova, nunca commitar na base, isso vive numa <em>rule</em>, e a skill do Jira diz explicitamente para não repetir esses passos. É a disciplina anti-duplicação. Se eu copiar a sequência do git em toda skill que mexe com git, mudar a sequência significa editar cinco arquivos e esquecer dois.</p>

<p>Tem também um ritual de limpeza antes de começar a próxima tarefa: voltar para a base, <code>git pull --prune</code> para derrubar as referências de rastreamento que já morreram no remoto, e apagar a branch local que já virou PR. Parece detalhe bobo, mas um loop que cria uma branch por tarefa e nunca limpa te deixa com quarenta branches órfãs em três meses.</p>

<strong>A chave mora na branch.</strong> Esse é o ponto estrutural que faz o loop ser fechável, e é o que eu levaria para qualquer outro rastreador de tarefas. O modelo não precisa lembrar qual era o card, o próprio git conta:

<div data-lang="bash"><pre><code>git branch --show-current | grep -oE 'feature/[A-Z][A-Z0-9_]+-[0-9]+'</code></pre></div>

<em>"O agente esquece, o repo não"</em> deixa de ser abstração e vira um regex. O estado do ciclo está no nome da branch, não na conversa, então qualquer sessão nova, qualquer hook, qualquer subagente consegue recuperar o objetivo sem contexto anterior. É a peça de estado externo mais barata que eu tenho, e não custou nada além de escolher uma convenção e respeitá-la.

<h3 id="o-ciclo-que-se-fecha-sozinho">O ciclo que se fecha sozinho</h3>

<p>O melhor exemplo de loop no meu setup é o que fecha esse ciclo: liga o PR de volta ao card. Ele mostra as três camadas trabalhando sem se atropelar.</p>

<p>O <strong>hook</strong> roda em <code>PostToolUse</code>, casando tanto com o comando de CLI que abre PR quanto com a tool MCP equivalente. E aí vem a parte que eu errei na primeira versão: ele <strong>confirma que uma URL de PR realmente voltou na resposta</strong> antes de fazer qualquer coisa. Sem isso, ele disparava quando o comando falhava ou era negado, anunciando um PR que não existia.</p>

<div data-lang="bash"><pre><code>pr_url="$(printf '%s' "$response_blob" \
  | grep -oE 'https://github\.com/[^"[:space:]]+/pull/[0-9]+' | head -1)"
[ -z "$pr_url" ] &amp;&amp; { echo '{"continue":true}'; exit 0; }</code></pre></div>

<p>E o passo decisivo: <strong>o hook não escreve no rastreador.</strong> Ele não tem credencial, não conhece a API, não sabe formatar o comentário. Ele sai com código 2 e devolve ao modelo um ponteiro, vá na seção tal da skill tal, extraia a chave da branch atual, resuma o que foi feito, comente no card com o link.</p>

<p>A <strong>skill</strong> é quem sabe o procedimento, e ela é específica de um jeito que só a prática ensina: o resumo sai em inglês mesmo quando a conversa é em português, porque o card é lido por outros times; o link do PR vai como link markdown com texto descritivo, nunca URL crua, porque URL crua vira uma string gigante que arrebenta a leitura do parágrafo; e se a branch não seguir o padrão esperado, <strong>não faz nada e fica calado</strong>, não todo PR está ligado a um card.</p>

<p>O <strong>MCP</strong> tem o token e escreve o comentário.</p>

<p>Trigger determinístico, procedimento versionado, efetor autenticado. Nenhuma das camadas sabe fazer o trabalho da outra, e é por isso que dá para mexer numa sem quebrar as demais.</p>

<h3 id="minha-trava-preferida-nada-e-destruido-sem-eu-olhar">Minha trava preferida: nada é destruído sem eu olhar</h3>

<p>De tudo que eu construí nesse setup, esse é o hook de que eu mais gosto, e é o que eu recomendaria escrever primeiro se alguém me perguntasse por onde começar. A regra dele é uma frase: <strong>toda operação destrutiva para e pede autorização, sempre, independente do modo em que eu esteja.</strong></p>

<p>Ele roda em <code>PreToolUse</code>, antes de qualquer coisa acontecer, e a cobertura é deliberadamente ampla. São dez regras rotuladas, testadas em ordem, e o rótulo importa porque é ele que vai para o log:</p>

<ul>
<li><strong>Remoção de arquivo</strong>, <code>rm</code>, <code>rmdir</code>, <code>unlink</code>, <code>shred</code>, <code>del</code>, com ou sem <code>sudo</code>, inclusive quando aparecem depois de um <code>;</code>, de um <code>&&</code> ou dentro de um subshell.</li>
<li><strong>Subcomando destrutivo depois de uma CLI conhecida</strong>, a rede mais larga de todas: <code>delete</code>, <code>destroy</code>, <code>uninstall</code>, <code>purge</code>, <code>prune</code>, <code>remove</code>, <code>drop</code> precedidos de <code>az</code>, <code>kubectl</code>, <code>helm</code>, <code>docker</code>, <code>terraform</code>, <code>tofu</code>, <code>gh</code>, <code>argocd</code>, <code>flux</code>, <code>aws</code>, <code>gcloud</code>, <code>npm</code>, <code>apt</code> e companhia.</li>
<li><strong><code>terraform destroy</code></strong>, e também o <code>apply</code> disfarçado com a flag de destruição, que é o jeito silencioso de fazer a mesma coisa.</li>
<li><strong>Git destrutivo</strong>, <code>push --force</code>, <code>reset --hard</code>, <code>clean -f</code>, <code>branch -D</code>, <code>tag -d</code>, <code>stash drop</code> e <code>stash clear</code>. Perder trabalho local não é menos grave que perder recurso na nuvem, é só mais silencioso.</li>
<li><strong>Docker</strong>, <code>system prune</code>, <code>volume rm</code>, <code>network rm</code>, e o <code>compose down -v</code> que leva os volumes junto.</li>
<li><strong>Kubernetes</strong>, <code>kubectl delete</code> e <code>kubectl drain</code>, <code>helm uninstall</code>.</li>
<li><strong><code>find</code> com <code>-delete</code> ou <code>-exec rm</code></strong>, que é como um comando de busca se transforma em remoção em massa.</li>
<li><strong>SQL</strong>, <code>DROP TABLE</code>, <code>DROP DATABASE</code>, <code>DELETE FROM</code>, <code>TRUNCATE</code>.</li>
<li><strong>Verbo destrutivo genérico</strong>, a rede de segurança para o que eu não previ: pega uma tool de MCP chamada <code>delete_algumacoisa</code> ou um campo <code>"destroy"</code> no payload.</li>
</ul>

<p>E tem um detalhe de escopo que faz esse último item funcionar. O hook não olha só linha de comando: <strong>quando a ferramenta não é o shell, ele varre o <code>tool_input</code> inteiro.</strong> Isso é o que faz uma tool de MCP que apaga recurso na nuvem cair na mesma rede que um <code>rm -rf</code>. Ferramentas que não destroem nada (ler, escrever, buscar arquivo) saem na primeira linha, sem custo.</p>

<strong>Por que "sempre" é a palavra que importa.</strong> O modo que aceita edição automaticamente existe justamente para eu não aprovar cada passo, e é ótimo para isso. Só que ele não distingue "criar arquivo" de "apagar cluster". Esse hook devolve <code>permissionDecision: "ask"</code>, que <strong>sobrevive ao auto mode</strong>: mesmo com tudo liberado, remoção volta a exigir um sim explícito meu.

<p>Repare no que isso significa: <strong>é o único guardrail meu que não confia em mim.</strong> Os outros protegem contra o agente errar. Esse protege contra eu estar no automático e aprovar sem ler, que é o modo de falha mais provável depois que o loop começa a funcionar bem. É o freio contra a rendição cognitiva, escrito em shell.</p>

<p>Ele também é o único que <strong>ignora o kill-switch global</strong>. Todos os meus outros hooks respeitam uma variável de ambiente que os desliga de uma vez; esse não olha para ela. Guardrail que desliga junto com o resto não é guardrail, é enfeite.</p>

<strong>Está funcionando?</strong> O log diz que sim, e mais do que eu esperava. Em vinte dias, <strong>100 detecções</strong>, cerca de cinco por dia:
<div><table><thead><tr><th>Regra que disparou</th><th>Vezes</th></tr></thead><tbody><tr><td>Subcomando destrutivo depois de CLI</td><td>54</td></tr><tr><td>Remoção de arquivo</td><td>32</td></tr><tr><td>Git destrutivo</td><td>12</td></tr><tr><td>SQL e verbo genérico</td><td>2</td></tr></tbody></table></div>
<strong>E o detalhe de engenharia que quase me custou caro.</strong> O jeito elegante de um hook barrar algo é devolver um JSON pedindo confirmação:

<div data-lang="json"><pre><code>{ "hookSpecificOutput": {
    "hookEventName": "PreToolUse",
    "permissionDecision": "ask",
    "permissionDecisionReason": "Operação destrutiva, confirme antes de seguir." } }</code></pre></div>

<p>Só que existe um modo de permissão em que os prompts estão desligados. Nele, pedir confirmação é <strong>pedir para o vazio</strong>, a decisão é simplesmente ignorada e o comando passa. Descobri isso do pior jeito possível: o guardrail existia, parecia certo, e não protegia nada exatamente no modo em que eu mais precisava dele.</p>

<p>A correção é ser consciente do modo:</p>

<div data-lang="bash"><pre><code>case "$perm_mode" in
  bypassPermissions) printf 'BLOQUEADO: %s\n' "$reason" &gt;&amp;2; exit 2 ;;
  *) jq -n --arg r "$reason" '{"hookSpecificOutput":{
       "hookEventName":"PreToolUse","permissionDecision":"ask",
       "permissionDecisionReason":$r}}' ;;
esac</code></pre></div>

<p>Onde tem prompt, pede. Onde não tem, usa <code>exit 2</code>, que é o único mecanismo que bloqueia em qualquer modo, e a mensagem diz para sair do modo bypass e reexecutar se a intenção era real. Isso fecha a única brecha que restava.</p>

<p>E o log de auditoria é escrito <strong>antes</strong> da decisão, nunca depois. Se eu aprovar no automático, quero pelo menos ter o registro de que fui eu que aprovei, com data, sessão, regra e o comando inteiro. Auditoria que só grava o que foi bloqueado conta metade da história.</p>

<h3 id="verificador-separado-com-dentes">Verificador separado, com dentes</h3>

<p>O componente que o Osmani chama de mais útil é separar quem escreve de quem confere. <a href="https://code.claude.com/docs/en/sub-agents" target="_blank" rel="noopener noreferrer">Subagentes</a> são o mecanismo.</p>

<p>O que eu acrescentaria é: <strong>separe por restrição de ferramenta, não por instrução.</strong> Dizer no prompt "você é read-only" é pedir cortesia. Não entregar as ferramentas de escrita é garantir.</p>

<p>Meus dois verificadores, um que planeja antes de mexer, um que revisa depois, não têm <code>Edit</code> nem <code>Write</code>. Também não têm a ferramenta de spawnar outros agentes, então são folhas da árvore: não conseguem delegar o próprio julgamento para um terceiro que teria escrita. O agente que implementa tem escrita, e não é o mesmo que aprova.</p>

<p>E tem um teto explícito no orquestrador: se a revisão não convergir em <strong>três rodadas</strong>, ele para e me reporta em vez de continuar tentando. Escrevi isso meses antes de ler qualquer coisa sobre Loop Engineering, por um motivo prosaico, vi um ciclo revisar e reescrever a mesma coisa sem convergir. É o "iteration cap" da literatura, aprendido na marra.</p>

<p>Um detalhe que economiza contexto: meus verificadores têm <strong>formato de saída fixo</strong>, e uma das seções obrigatórias é <em>"obstáculos encontrados"</em>, problema de ambiente, comando que precisou de flag especial, dependência que atrapalhou. Isso impede que quem chamou redescubra o mesmo tropeço. É estado externo em escala de subagente.</p>

<h3 id="a-escada-de-verificacao-na-pratica-escrevendo-um-operator">A escada de verificação, na prática: escrevendo um operator</h3>

<p>A tese 3 disse que em infra o verificador não é a suíte de testes. Mas isso não significa que não exista suíte. Significa que ela é <strong>um degrau, não o topo</strong>. O caso onde eu montei essa escada por inteiro foi escrevendo um operator Kubernetes em Go, com <a href="https://book.kubebuilder.io/" target="_blank" rel="noopener noreferrer">Kubebuilder</a>, e a ordem importa mais que cada peça.</p>

<strong>Degrau 1, compilar e passar o vet.</strong> <code>go build</code> e <code>go vet</code>. Custa segundos, pega erro de digitação e de tipo. Óbvio, e ainda assim é o degrau que o agente mais tenta pular quando está confiante.

<strong>Degrau 2, testes de unidade.</strong> A lógica de tradução do operator concentra a maior parte deles, tabela-driven, dezenas de casos. É onde uma mudança de comportamento fica cravada em asserção.

<p>E aqui está a regra que eu considero a mais valiosa deste artigo depois do <code>exit 2</code>, porque é a defesa direta contra reward hacking:</p>

<strong>Sempre que o agente adiciona um teste de regressão, ele tem que provar que o teste FALHA se você reverter a correção que ele guarda.</strong> Um teste que passa igual com e sem a correção não está exercitando nada, é decoração que dá sensação de cobertura.

<p>Isso é mutation testing manual, e resolve o problema central do loop autônomo. O agente é ótimo em escrever teste que passa. Pedir "escreva um teste", não. Digite "escreva um teste e me prove que ele pega o bug". É a diferença entre verificar e parecer que verificou.</p>

<strong>Degrau 3, testes de integração contra uma API real.</strong> O reconciler roda contra <code>envtest</code>, que sobe um <code>kube-apiserver</code> e um <code>etcd</code> de verdade. Detalhe que virou nota na skill porque me custou uma sessão inteira de diagnóstico errado: esses binários <strong>não vêm no repo</strong>, precisam ser baixados uma vez por um passo de setup. Sem ele a suíte falha de um jeito que parece bug do código. Não era gap conhecido, era só um passo faltando, e eu quase "consertei" código que estava certo.

<p>Essa é uma falha de loop clássica e vale nomear: <strong>erro de ambiente que se disfarça de erro de código.</strong> O agente lê o stack trace, acredita nele, e começa a consertar a coisa errada com muita confiança. O antídoto é o mesmo do resto: registrar o obstáculo por escrito na primeira vez que ele aparece, para a próxima sessão não repetir o diagnóstico.</p>

<strong>Degrau 4, o cluster local que imita o ambiente real.</strong> E aqui está o limite duro do degrau anterior: <code>envtest</code> sobe a API do Kubernetes, mas <strong>não sobe o data plane</strong>. Ele não tem proxy de verdade, não move pacote. Qualquer coisa que dependa de comportamento real de rede, como um header sendo reescrito ou uma política aplicada no caminho do tráfego, passa no envtest e falha no mundo.

<p>Então existe um degrau a mais: o Kubernetes que vem no Docker Desktop, rodando na minha máquina, configurado com <strong>os mesmos valores de Helm do módulo que provisiona o ambiente real</strong>. Não é um cluster de brinquedo com o default do chart; é o ambiente de produção em miniatura, e é isso que faz o teste valer. Ao lado dele, um backend que só ecoa os headers que recebeu, e um <code>curl</code>. Aí eu vejo o que realmente chegou.</p>

<p>Esse degrau também é onde mora um dos meus guardrails favoritos, e ele é de permissão, não de código: <strong>os clusters reais são read-only para o agente</strong>, só <code>get</code>, <code>list</code>, <code>watch</code>, <code>logs</code> e <code>events</code>, mais nada. O cluster local é a única exceção com acesso de escrita. A assimetria é o guardrail. O agente pode quebrar o quanto quiser onde quebrar é grátis, e não alcança onde não é.</p>

<p>E uma armadilha bem específica de quem roda WSL com Docker Desktop, que me custou um bom tempo: rodar o operator com <code>go run</code> no WSL e tentar alcançá-lo do cluster via <code>host.docker.internal</code> <strong>não funciona</strong>. WSL e a VM do Kubernetes do Docker Desktop são máquinas virtuais separadas. O DNS resolve, o que faz parecer que está tudo certo, e a conexão TCP simplesmente não completa. Diagnóstico enganoso do início ao fim.</p>

<strong>Não tem build de imagem no ciclo de iteração.</strong> Editar arquivo, reiniciar o pod, ver o efeito, o loop interno fica em segundos em vez de minutos, e a imagem só é construída quando o comportamento já está validado. Que é exatamente o ponto: a imagem é o <em>resultado</em> do loop, não uma etapa dele.

<strong>Degrau 5: A imagem. E só então,</strong> quando os quatro degraus passam, aí sai a imagem, construída pelo serviço de build do registry, nunca na minha máquina.

<p>Tem um sexto verificador nessa história que eu gosto de citar porque é um teste guardando <strong>consistência entre duas fontes de verdade</strong>, não comportamento. O RBAC do operator existe em dois lugares: um arquivo gerado a partir de marcadores no código, que <strong>não pode ser editado à mão</strong>, porque o gerador sobrescreve silenciosamente na próxima execução, e uma cópia de referência no manifesto. Um teste falha o build se os dois divergirem. Sem ele, alguém edita o gerado à mão, o gerador apaga na semana seguinte, e o operator perde permissão em produção sem ninguém ter tocado em permissão.</p>

<h3 id="quando-o-ci-e-o-verificador-ler-a-pipeline-de-volta">Quando o CI é o verificador: ler a pipeline de volta</h3>

<p>Os cinco degraus acima rodam antes do push. Depois do push existe outro verificador, que é o único que enxerga o ambiente de CI de verdade: a pipeline.</p>

<p>E é aqui que o loop se fecha de um jeito que eu não esperava que funcionasse tão bem. O agente não precisa que eu traduza o erro do CI para ele. Ele lê direto, pelo <code>gh</code> CLI ou pela tool de MCP do GitHub, pega o log do que falhou, corrige e empurra de novo.</p>

<p>O detalhe de eficiência que faz diferença é pedir <strong>só o que falhou</strong>:</p>

<div data-lang="bash"><pre><code>gh run list --branch "$(git branch --show-current)" --limit 1
gh run view &lt;run-id&gt; --log-failed</code></pre></div>

<code>--log-failed</code> traz apenas os passos que quebraram. Jogar o log inteiro de um workflow no contexto é desperdício e, pior, enterra o erro real em milhares de linhas de saída de build bem-sucedida. Contexto é orçamento; log de CI é o item mais fácil de estourar.

<p>Isso é <em>ground truth</em> do ambiente, no sentido exato que a Anthropic descreve, o agente não está julgando o próprio trabalho, está lendo o veredito de um sistema que ele não controla. Que é a definição de verificador honesto.</p>

<strong>E aqui vem a parte honesta:</strong> esse é o pedaço <strong>menos codificado</strong> do meu setup. Os cinco degraus locais estão escritos numa skill; a leitura de CI ainda é convenção que vive na minha cabeça e se repete a cada sessão por hábito, não por procedimento. Não existe hook que dispare no push, não existe regra que force ler <code>--log-failed</code> em vez do log todo, não existe teto de quantas vezes tentar antes de me chamar.

<h3 id="skills-a-descricao-e-o-que-decide">Skills: a descrição é o que decide</h3>

<a href="https://code.claude.com/docs/en/skills" target="_blank" rel="noopener noreferrer">Skills</a> são arquivos <code>SKILL.md</code> com procedimento escrito. Elas seguem o <a href="https://agentskills.io" target="_blank" rel="noopener noreferrer">padrão aberto Agent Skills</a>, o que significa que não é conhecimento preso numa ferramenta só.

<p>O que mais gente entende errado, e eu entendi errado por um bom tempo: <strong>a <code>description</code> do frontmatter não é documentação, é o mecanismo de roteamento.</strong> É por ela que o modelo decide carregar a skill ou não. Descrição vaga é skill que nunca dispara.</p>

<div data-lang="markdown"><pre><code>---
name: minha-skill
description: "O que faz + QUANDO usar, com as palavras que aparecem no pedido real. Diga também o que NÃO é, se existir skill vizinha que confunde."
---

## Quando usar
## Passos
## Guardrails</code></pre></div>

<p>Duas coisas que a prática ensinou. <strong>Desambiguação explícita vale ouro</strong>: eu tenho duas skills sobre Kubernetes  que fazem coisas diferentes, e cada descrição termina dizendo "isto é X, não Y, para Y use a outra". Sem isso, disparava a errada metade das vezes.</p>

<strong>Disclosure progressivo importa</strong> porque o corpo da skill só carrega quando ela é usada. Procedimento no <code>SKILL.md</code>, material de referência longo em arquivos ao lado, script que ela chama num subdiretório. Referência de 300 linhas custa quase nada até o momento em que é necessária.

<h3 id="rules-com-escopo-disciplina-de-token">Rules com escopo: disciplina de token</h3>

<p>Um <a href="https://code.claude.com/docs/en/memory" target="_blank" rel="noopener noreferrer"><code>CLAUDE.md</code></a> carrega em toda requisição. Isso é uma faca de dois lados: o que está lá é sempre verdade, e você paga por isso sempre.</p>

<p>Então eu separei. O arquivo raiz ficou deliberadamente curto, contexto, modelo de nomenclatura, os não-negociáveis, e a regra de roteamento. Profundidade de domínio foi para arquivos que carregam <strong>só quando um arquivo daquele tipo é editado</strong>, via glob de caminho.</p>

<p>A lição de escopo veio de um erro que dói de lembrar. Minha regra de manifestos casava com <code><strong>/<em>.yaml</code>, extensão nua. Resultado: disparava em pipeline, em config de linter, em qualquer YAML do mundo, injetando guardrail de Kubernetes onde não tinha Kubernetes. Trocar para escopo por </strong>convenção de diretório</em>* resolveu. Regra que dispara errado treina você a ignorar regra.</p>

<h3 id="mcp-no-docker-um-gateway-muitos-servidores">MCP no Docker: um gateway, muitos servidores</h3>

<a href="https://code.claude.com/docs/en/mcp" target="_blank" rel="noopener noreferrer">MCP</a> é o que faz o loop alcançar sistemas reais. E aqui o Docker resolveu um problema chato de verdade.

<p>Já escrevi um artigo inteiro sobre esse caminho, <a href="https://www.orafaelferreira.com/artigos/terraform-mcp-server-docker">MCP Server com Docker e Terraform: discovery, troubleshooting e produtividade</a>, com a montagem passo a passo. Aqui o recorte é outro: o papel que ele cumpre dentro do loop.</p>

<p>Sem ele, cada servidor MCP é um processo com runtime próprio, dependência própria e credencial largada em algum <code>.env</code>. Com o <a href="https://docs.docker.com/ai/mcp-catalog-and-toolkit/" target="_blank" rel="noopener noreferrer">MCP Toolkit e o Catalog</a>, você habilita servidores pela interface do Docker Desktop e o <a href="https://github.com/docker/mcp-gateway" target="_blank" rel="noopener noreferrer">MCP Gateway</a> agrega todos eles atrás de <strong>uma única entrada</strong> de configuração. Cada servidor roda em container, com limite de CPU e memória e <code>no-new-privileges</code>. E, o ponto que mais me importa, <strong>as credenciais ficam no store cifrado do Docker</strong>, não em arquivo no repo.</p>

<strong>O que eu tenho habilitado hoje.</strong> Não adianta falar de sprawl de ferramentas em abstrato, então aqui está o inventário real, contado na saída do gateway enquanto eu escrevia este parágrafo:
<div><table><thead><tr><th>Servidor MCP</th><th>Ferramentas</th><th>Para que eu uso</th></tr></thead><tbody><tr><td><code>atlassian</code></td><td>77</td><td>Jira e Confluence, o discovery do card e o comentário de volta no PR</td></tr><tr><td><code>azure</code></td><td>65</td><td>consulta de recurso, custo, quota, RBAC, diagnóstico</td></tr><tr><td><code>grafana</code></td><td>65</td><td>dashboards, consulta a métricas e logs, alertas</td></tr><tr><td><code>github-official</code></td><td>44</td><td>PR, issue, busca de código, leitura de workflow</td></tr><tr><td><code>playwright</code></td><td>23</td><td>navegar e validar página de verdade, não só supor</td></tr><tr><td><code>kubernetes</code></td><td>23</td><td>inspeção de cluster, sempre read-only fora do local</td></tr><tr><td><code>dockerhub</code></td><td>13</td><td>busca de imagem e checagem de tag</td></tr><tr><td><code>terraform</code></td><td>9</td><td>versão de provider e schema de recurso, o gate da tese 2</td></tr><tr><td><code>mcp-python-refactoring</code></td><td>9</td><td>análise de código Python das automações</td></tr><tr><td><code>context7</code></td><td>2</td><td>documentação de biblioteca atualizada, contra alucinação de API</td></tr><tr><td><code>docker-docs</code></td><td>1</td><td>documentação oficial do Docker</td></tr></tbody></table></div>
<p>São <strong>331 ferramentas em 11 servidores</strong>, mais as nativas do próprio gateway, o que fecha as ~339 que aparecem no handshake. Um único container por servidor, uma única entrada de configuração no cliente.</p>

<p>Agora olhe essa tabela como orçamento em vez de catálogo. Três servidores concentram <strong>207 das 331 ferramentas</strong>, quase dois terços. Eu não uso 77 operações de Jira: uso quatro ou cinco. Esse é o custo escondido do "habilita que é fácil", e é a causa do problema de timeout logo abaixo, não só um detalhe de contexto.</p>

<strong>Você pode puxar esse setup inteiro com um comando.</strong> Essa é a parte que eu descobri tarde e que mais me deixou com cara de bobo por ter configurado tudo na mão antes: um profile do MCP Toolkit <strong>é publicável como artefato OCI</strong>. Ele vai para um registry como qualquer imagem, e do outro lado alguém puxa e recebe a lista de servidores já montada.

<p>Eu publiquei o meu:</p>

<div data-lang="bash"><pre><code># publicar o profile local em um registry
docker mcp profile push profile rafaferreira011/public:latest

# do outro lado, instalar tudo de uma vez
docker mcp profile pull rafaferreira011/public:latest</code></pre></div>

<p>O <a href="https://hub.docker.com/r/rafaferreira011/public" target="_blank" rel="noopener noreferrer">artefato está público no Docker Hub</a>. Repare que <strong>não é uma imagem executável</strong>: são ~170 kB de JSON com <code>artifactType</code> <code>application/vnd.docker.mcp.profile.v1+json</code>, a relação de servidores com as imagens fixadas por digest. Ninguém roda esse artefato, o Toolkit lê e reconstrói a configuração.</p>

<p>Duas coisas que valem dizer, porque são exatamente as perguntas que eu faria:</p>

<strong>Segredo não viaja junto.</strong> O profile guarda o <em>nome</em> do segredo e a variável de ambiente que ele preenche, nunca o valor. Os valores continuam no store cifrado da sua máquina. Eu confirmei baixando o meu próprio artefato e varrendo o JSON: zero token, zero chave. É o que torna publicar um profile uma coisa segura de fazer, e é o mesmo princípio da seção inteira, referência em vez de cópia.

<strong>O profile público é um recorte, não o meu espelho.</strong> São 8 servidores, os que funcionam para qualquer pessoa: Azure, GitHub, Terraform, Kubernetes, Playwright, Docker Hub, Docker Docs e Context7. Ficaram de fora justamente os que dependem de endpoint interno, porque nesses o campo de configuração carrega a URL do ambiente, e URL de ambiente interno em registry público é vazamento, não é conveniência. Segredo o Toolkit protege sozinho; <strong>configuração ele não protege, e essa parte é sua.</strong> Olhe o que vai no profile antes de dar push.

<p>E fechando o argumento do orçamento de ferramentas lá de cima, existe a régua fina, que eu deveria ter começado a usar antes:</p>

<div data-lang="bash"><pre><code>docker mcp profile tools &lt;profile-id&gt; --disable atlassian.jira_delete_issue
docker mcp profile tools &lt;profile-id&gt; --disable-all playwright</code></pre></div>

<p>Dá para habilitar e desabilitar <strong>ferramenta a ferramenta</strong>, não só servidor inteiro. É a resposta certa para "77 operações de Jira das quais eu uso cinco": em vez de desligar o servidor e perder o que presta, corta a cauda e fica com o que você chama de verdade.</p>

<p>A configuração no lado do cliente é uma entrada só:</p>

<div data-lang="json"><pre><code>{
  "mcpServers": {
    "MCP_DOCKER": {
      "type": "stdio",
      "command": "docker",
      "args": ["mcp", "gateway", "run"]
    }
  }
}</code></pre></div>

<p>Tem caminho ainda mais curto: no Docker Desktop, em <strong>MCP Toolkit → Clients</strong>, existe um botão que conecta o cliente e escreve esse arquivo por você. Pela CLI, o equivalente é <code>docker mcp client connect claude-code</code>. Segredo entra com <code>docker mcp secret set</code>, nunca no JSON. Depois é só rodar <code>/mcp</code> no cliente para conferir que conectou. O <a href="https://www.docker.com/blog/add-mcp-servers-to-claude-code-with-mcp-toolkit/" target="_blank" rel="noopener noreferrer">blog oficial do Docker tem o passo a passo</a>, e existe <a href="https://www.youtube.com/watch?v=1Tu0c1zuz70" target="_blank" rel="noopener noreferrer">um tutorial em vídeo do próprio Docker</a> cobrindo a mesma sequência. Para diagnóstico, o Docker publica <a href="https://github.com/docker/claude-plugins" target="_blank" rel="noopener noreferrer">um plugin oficial</a> que adiciona comandos de status e debug do gateway.</p>

<p>Agora as duas armadilhas que eu paguei, e que não estão em tutorial nenhum.</p>

<strong>Primeira: WSL.</strong> Eu rodo o cliente dentro do WSL, com o Docker Desktop no Windows. O plugin <code>docker mcp</code> do lado Linux <strong>não enxerga o Docker Desktop</strong>, insiste que não está rodando, mesmo com o socket no lugar. Tentei symlink de socket, bind-mount, plugin alternativo; nada. A solução que funciona é chamar o <strong>binário do Windows</strong> via interop, <code>docker.exe</code>, que detecta o Desktop nativamente. Detalhe adicional: o arquivo de configuração precisa estar na <strong>raiz do projeto</strong>, não dentro do diretório de configuração do cliente, nesse segundo caminho ele é ignorado silenciosamente, e você fica olhando uma lista vazia sem nenhuma mensagem de erro.

<strong>Segunda: timeout.</strong> Gateway grande demora para subir. Ele carrega o catálogo, verifica imagens, inicia um container por servidor habilitado e lista as ferramentas de cada um <strong>antes</strong> de responder ao handshake. Eu medi: cerca de <strong>21 segundos</strong> para o <code>initialize</code> responder, já com as imagens em cache, servindo algumas centenas de ferramentas. O timeout padrão de conexão é de 30 segundos. Ou seja: funcionava quente e falhava frio, com uma mensagem de timeout que não diz nada sobre a causa.

<p>A correção é aumentar o teto nas <a href="https://code.claude.com/docs/en/settings" target="_blank" rel="noopener noreferrer">configurações do cliente</a>:</p>

<div data-lang="json"><pre><code>{ "env": { "MCP_TIMEOUT": "120000", "MCP_TOOL_TIMEOUT": "180000" } }</code></pre></div>

<h3 id="estado-externo">Estado externo</h3>

<p>O modelo esquece entre execuções. Então tem que existir memória fora dele, e ela opera em duas escalas no meu setup.</p>

<strong>Entre sessões</strong>, memória persistente guarda o que foi descoberto e custou caro para descobrir, não estrutura de código, que o repo já conta, mas coisa como "esse comportamento estranho tem essa causa raiz", com data. Fato durável, um por arquivo, indexado.

<strong>Dentro da sessão</strong>, um par de hooks com estado: um registra cada arquivo tocado num arquivo temporário por sessão; o outro, no encerramento, filtra os arquivos de infraestrutura, me mostra a lista e lembra de rodar os gates antes do PR, e trunca o registro.

<h3 id="o-loop-que-melhora-o-loop">O loop que melhora o loop</h3>

<p>Voltando ao primeiro componente do Osmani: <strong>automations são o que fazem um loop ser loop.</strong> É a peça que eu demorei mais para colocar, e a que mais mudou as coisas.</p>

<p>Tenho uma rotina semanal agendada que lê os transcripts da própria semana e mede o que aconteceu: quais ferramentas foram mais chamadas, quais skills dispararam, quais subagentes foram acionados. Aí ela cruza isso com o que já existe no meu setup e propõe: aqui houve repetição que merece uma skill nova; aqui uma skill existente ficou vaga e precisa de descrição melhor.</p>

<p>A barra de aceitação é explícita, porque sem ela a rotina cria skill para tudo: precisa ser <strong>repetível e não-óbvio</strong>, ter aparecido em duas sessões com a mesma forma, <em>ou</em> ter custado iteração pesada uma vez, <em>ou</em> ser uma correção minha que ainda não estava escrita em lugar nenhum, do tipo "nesse repositório não crie nada", "sempre use tal comando".</p>

<p>E o detalhe que faz funcionar: ela registra o que foi <strong>rejeitado</strong>. Sem isso, a rodada seguinte propõe a mesma coisa de novo, e você passa a ignorar o relatório inteiro.</p>

<p>Tem uma segunda camada: uma skill de governança que define como escrever artefato nesse setup, quando é regra e quando é skill, limite de tamanho, e a obrigação de procurar sobreposição antes de criar coisa nova. Cada regra dela rastreia para uma falha concreta que eu vivi.</p>

<p>O loop tem meta-loop. E é aí que ele para de ser configuração e começa a ser sistema.</p>

<h3 id="como-eu-montei-essa-rotina">Como eu montei essa rotina</h3>

<p>O objetivo era fácil de enunciar: <strong>toda semana, ler as minhas próprias sessões de trabalho e transformar o que se repetiu em skill</strong>, nova quando não existe nada cobrindo, melhoria na que já existe quando existe. Nada de inventar processo: a fonte é o que eu de fato fiz na semana, com o agente, no ambiente real.</p>

<p>A primeira decisão apareceu antes de qualquer código: <strong>onde vive o insumo.</strong> E a resposta elimina de saída a opção mais confortável. Os transcripts das minhas sessões só existem na minha máquina, então um agendador na nuvem, que rodaria com o computador desligado, sem eu precisar lembrar de nada, veria commit e PR, e é exatamente isso que não interessa. Commit conta o que ficou de pé; transcript conta o que eu pedi, quantas tentativas custou e qual suposição estava errada. <strong>O valor está no atrito, e o atrito só fica registrado localmente.</strong> Sobrou tarefa agendada no sistema operacional chamando o cliente em modo headless: menos elegante, e a única com acesso ao que importa.</p>

<p>A segunda decisão foi de divisão de trabalho, e é a mesma tese do resto do artigo: <strong>o que é determinístico não vai para o agente.</strong> Destilar a semana é trabalho de shell, varrer os transcripts, contar chamada de ferramenta, extrair os prompts reais separando-os do ruído de plumbing, cruzar com o histórico de commits, listar o inventário de skills que já existe. Dezenas de megabytes viram um digest de umas seiscentas linhas em menos de um minuto, sem gastar um token. O agente entra depois, com o digest pronto na mão, para fazer só a parte que exige julgamento: isso é rotina ou foi acidente? já existe skill que cobre? melhora a que existe ou cria nova?</p>

<p>Aí vieram as paredes. Três, e todas se parecem exatamente igual do lado de fora, <strong>o agente diz que precisa de aprovação e para</strong>, sem pista de qual delas é:</p>

<ul>
<li><strong>O agente não escreve na própria camada de configuração.</strong> O diretório de customização é caminho sensível: em modo não-interativo a escrita é recusada, com ou sem regra de permissão liberando explicitamente aquele caminho. E é proteção correta, rotina que pode reescrever as próprias permissões não é rotina, é risco. A saída foi inverter o fluxo: o agente escreve a proposta num diretório de staging, e um script de shell promove só o que casa um padrão estreito, arquivo <code>.md</code> dentro de <code>skills/<nome>/</code>, nunca configuração, nunca hook, nunca executável, guardando backup do que for sobrescrito. O que o script recusa, ele registra.</li>
<li><strong>Liberar o caminho não libera criar arquivo.</strong> Regra de permissão com escopo de caminho não limpa a aprovação de <strong>criação</strong> de arquivo novo, e a execução trava pedindo uma confirmação que, em headless, ninguém pode dar. Precisa combinar com o modo de permissão que aceita edição. Bônus: diretório oculto, começando com ponto, simplesmente não casa com o glob da regra, perdi um ciclo inteiro procurando bug antes de renomear o diretório e ver funcionar.</li>
<li><strong>Comando composto não casa allow-list.</strong> Eu havia liberado o script coletor por caminho; o agente rodou <code>mkdir -p ... && ./coletor</code> e a regra não casou. Isso virou princípio, e é o que consolidou a divisão acima: <strong>passo determinístico roda no wrapper, não dentro do agente.</strong></li>
</ul>

<p>O que a primeira execução real entregou: <strong>uma skill nova</strong>, um procedimento de virada de ingress que atravessa duas camadas de infraestrutura e que nenhuma skill existente cobria; <strong>duas melhoradas</strong>, uma delas ganhou a descoberta que mais me custou na semana, a de que o dry-run do cliente de linha de comando valida schema mas não avalia lógica de política de admissão, então "passou no dry-run" não significa nada ali; e <strong>quatro rejeitadas</strong>, cada uma com o motivo escrito, três delas por duplicarem skill existente.</p>

<p>Mas o item que me convenceu de que a coisa tinha valor foi outro: <strong>ela corrigiu uma memória minha que estava errada.</strong> Eu tinha um fato registrado dizendo que um certo repositório seguia meu fluxo padrão de branch e PR. Durante a semana eu havia dito o contrário, duas vezes, em sessões diferentes. A rotina leu isso nos transcripts, viu a contradição com o que estava escrito, e reescreveu o registro. O loop consertando o estado externo do próprio loop.</p>

<p>E uma honestidade sobre o alcance: <strong>o passe agendado é rede de segurança, não o evento principal.</strong> Rodando sem supervisão, o agente não pode me perguntar "isso vai repetir?", e essa resposta é justamente o critério que separa skill útil de entulho. Quando eu rodo o mesmo procedimento à mão, numa sessão normal, sai skill melhor. O agendamento existe porque o insumo é perecível e disciplina humana não é confiável; o refino continua sendo meu. Outer loop, de novo.</p>

<p>A verificação que me deixou tranquilo não foi ela ter criado skill, foi rodar duas vezes na mesma janela. Na segunda, reconheceu que a semana já tinha sido processada, reconferiu as rejeições anteriores e <strong>não escreveu nada</strong>. Zero arquivos promovidos. Automação que reescreve o que já existe a cada execução não é automação, é ruído com agenda.</p>

<h3 id="a-automacao-que-eu-nao-escrevi">A automação que eu não escrevi</h3>

<p>Outra automação que pensei: uma rotina para <strong>apagar as sessões antigas</strong>, com mais de uma semana. A motivação é menos glamourosa que a da anterior e mais séria. Transcript é texto puro, e <strong>tudo que passa por uma ferramenta é gravado nele</strong>, conteúdo de arquivo, saída de comando, o que eu colei no prompt. Em ambiente de plataforma isso significa detalhe de infraestrutura acumulando em texto claro no meu diretório de usuário, protegido só por permissão de arquivo do sistema. E o bom que o próprio claude code ja tem um mecanismo de limpeza: <strong>o client já varre por idade na inicialização</strong>, e o período é uma chave no arquivo de configuração do usuário, <code>~/.claude/settings.json</code>:</p>

<div data-lang="json"><pre><code>{ "cleanupPeriodDays": 8 }</code></pre></div>

<p>O default são 30 dias, o mínimo é 1. Baixar para 8 foi uma escolha minha.</p>

<strong>A varredura não cobre tudo.</strong> Ela apaga transcript, transcript de subagente, saída grande derramada em arquivo, snapshot pré-edição, cache de imagem e de colagem. Só que o <strong>histórico de prompts</strong>, o arquivo que guarda tudo que eu já digitei, com data e projeto, fica fora dela e persiste indefinidamente. Quem baixa a retenção por privacidade e para aí resolveu a maior parte do problema achando que resolveu o problema inteiro.

<strong>Retenção e janela de análise se amarram.</strong> Se o transcript expira em oito dias e a rotina de skills olha oito dias para trás, os dois números batem no caso normal, mas uma semana perdida por férias ou máquina desligada fica irrecuperável, porque o insumo foi varrido antes da execução seguinte. Semana que não roda é semana que não existe. Duas configurações feitas em minutos, uma dependência entre elas que não estava escrita em lugar nenhum: é assim que loop vira sistema, e é por isso que a dependência precisa ir para o estado externo, se ela só existe na minha cabeça, ela não existe.

<h3 id="um-inventario-inteiro-do-zero-ate-virar-sistema">Um inventário inteiro, do zero até virar sistema</h3>

<p>O exemplo mais completo de tudo isso trabalhando junto não veio da rotina agendada, veio de um pedido pontual: mapear todas as tecnologias em uso num ambiente de plataforma com dezenas de repositórios. Sem inventário prévio. Era descobrir do zero, e o resultado ia decidir o que precisava virar skill.</p>

<p>A primeira rodada foi fan-out puro: um agente por área, infraestrutura como código, pipelines, orquestração de containers, linguagens, todos em paralelo, cada um devolvendo o que achou. Saiu organizado, sem furo visível. Foi exatamente essa perfeição que me fez desconfiar: levantamento bom demais de um ambiente que eu sei que é bagunçado é sinal de cobertura rasa, não de sorte. Pedi mais uma passada, recortando por um repositório específico que eu sabia ser denso, e a lista de tecnologias daquele recorte sozinho quase dobrou o total. O primeiro fan-out tinha visitado cada área uma vez e chamado isso de completo.</p>

<p>Fechei a segunda rodada com o mesmo princípio de sempre: quem escreve não confere. Nova leva de agentes, mas com a instrução invertida, não confirme o que já está escrito, <strong>tente refutar</strong>. Cada um recebeu um pedaço do levantamento e a ordem explícita de achar erro, não validar acerto. Valeu a rodada: achou um item que não existia (um agente anterior tinha inventado um detalhe plausível que não batia com o ambiente real), achou outro atribuído ao lugar errado, e um terceiro marcado como "desativado" quando na verdade estava ativo em produção. Nenhum dos três ia aparecer se eu tivesse pedido para o mesmo agente reler o próprio trabalho, ele ia confirmar o que já acreditava.</p>

<p>Com o levantamento fechado, o passo seguinte foi virar aquilo em conhecimento operacional, não documento pra ler uma vez, skill que o sistema carrega quando alguém pedir ajuda com uma daquelas tecnologias. E aqui entrou a decisão que o resto do artigo já defende, aplicada em escala: <strong>nem tudo virou skill.</strong> Duas coisas viraram <strong>hook</strong>, porque a regra era "isso tem que acontecer sempre, sem depender do modelo lembrar", um aviso de dependência de terceiro que tinha acabado de ser descontinuada e um checador de configuração que falha calado em vez de dar erro. <strong>Nada virou agente novo</strong>, porque agente é persona isolada com escopo de ferramenta próprio, e cada tecnologia daquelas era conhecimento de referência, não um papel a interpretar. Artefato errado custa tanto quanto artefato nenhum, essa parte do julgamento não terceirizo.</p>

<p>Pra não terminar com dezenas de skills competindo pela mesma descrição, agrupei por domínio operacional, um <code>SKILL.md</code> raiz por área, arquivo de referência por tecnologia dentro dele, carregado só quando aquela tecnologia específica entra na conversa. Antes de escrever a primeira linha, consultei a documentação oficial do próprio formato de skill via MCP: a intuição de "menor é melhor" tem limite, e o padrão oficial recomenda exatamente esse agrupamento com disclosure progressivo, pra não competir por trigger nem custar contexto à toa quando ninguém precisa daquele arquivo.</p>

<p>O último passo foi replicar tudo numa segunda camada de customização, que outra ferramenta usa nesse mesmo ambiente. A motivação não foi capricho de organização: é redundância de verdade. Se o Claude Code sair do ar, tiver uma degradação, ou eu simplesmente precisar trocar de ferramenta num dia ruim, o conhecimento não desaparece junto, ele já existe traduzido, pronto para outro agente carregar. Skill, hook e regra viraram ativo do time, não vendor lock-in de configuração. Eu esperava find-and-replace de caminho. Não foi. A documentação oficial da outra ferramenta, puxada via MCP na hora, corrigiu duas suposições de uma vez: a numeração das regras "inegociáveis" era diferente entre as duas camadas, citar por número mantendo só o nome do arquivo teria virado referência errada, e o formato de skill que eu vinha usando já era, na prática, um padrão aberto que a outra ferramenta também suporta nativamente, pasta de recurso e tudo. MCP não é só pra puxar doc de infraestrutura. É pra puxar doc de qualquer coisa que eu não deveria assumir de memória, incluindo o próprio formato que eu uso pra ensinar o agente.</p>

<h2 id="conclusao">Conclusão</h2>

<p>O que eu levaria daqui, na ordem em que eu faria de novo:</p>

<ul>
<li><strong>Comece pelo verificador, não pelo agente.</strong> Sem gate honesto, aumentar autonomia só aumenta a velocidade com que você acumula problema. Um loop com verificador ruim é pior que nenhum loop, porque parece estar funcionando.</li>
<li><strong>Escreva o freio antes do acelerador.</strong> Teto de iteração, regra de parada, guardrail que dispara antes da geração. Quatro dos cinco itens da anatomia de um loop são freios; essa proporção não é acidente.</li>
<li><strong>Separe quem escreve de quem confere, por ferramenta, não por instrução.</strong> Read-only de verdade é não ter a ferramenta de escrita.</li>
<li><strong>Um hook que sai com código 2 é feedback de loop de verdade.</strong> É a peça mais barata e mais eficaz do meu setup, e não tem nada de IA nela.</li>
<li><strong>Escreva primeiro a trava de remoção, e faça ela desconfiar de você.</strong> Toda operação destrutiva para e pede autorização, inclusive no modo que liberou o resto, inclusive quando o pedido veio de uma ferramenta e não do shell. É o único guardrail que protege contra o operador no automático, e não contra o agente. Falso positivo nessa checagem é preço, não defeito.</li>
<li><strong>Exija que o teste de regressão prove que pega o bug.</strong> Se ele passa igual com e sem a correção, não testa nada. Não pedir "escreva um teste". Use "reverta a correção e me mostre o teste falhando" é a defesa mais barata que existe contra reward hacking.</li>
<li><strong>Ordene os gates por custo e nunca deixe pular degrau.</strong> Compilar, unidade, integração com API real, cluster local espelhando o ambiente de verdade, e só então a imagem. A imagem é o resultado do loop, não uma etapa dele.</li>
<li><strong>Deixe o agente ler o CI sozinho, mas só a parte que falhou.</strong> Ele não precisa que você traduza o erro. Precisa de acesso ao veredito e de disciplina para não arrastar o log inteiro para o contexto.</li>
<li><strong>Default otimista, correção barata.</strong> Onde o loop precisaria perguntar, faça ele escolher o mais provável, declarar em voz alta o que escolheu e continuar. Pergunta bloqueante no começo de toda tarefa transforma o loop em formulário. Só não esqueça de escrever as exceções: se a busca voltar vazia, pede, nunca inventa.</li>
<li><strong>Guarde o estado do ciclo onde qualquer sessão acha.</strong> A chave da tarefa no nome da branch faz o objetivo sobreviver a compactação, a sessão nova e a subagente. Estado externo não precisa de banco; às vezes precisa só de uma convenção de nome respeitada.</li>
<li><strong>Deixe a descrição fazer o roteamento.</strong> Skill boa com descrição ruim não dispara. Escope regra por convenção de diretório, nunca por extensão nua.</li>
<li><strong>Automation é o que separa configuração de sistema.</strong> Sem rotina agendada, você tem um setup bonito. Com ela, você tem um loop.</li>
<li><strong>Discorde do padrão quando o seu domínio pedir.</strong> Eu tirei worktree porque em infra o isolamento que importa é de estado, não de arquivo.</li>
</ul>

<p>E o mais importante: <strong>o outer loop continua sendo seu.</strong> Delegar o ciclo interno é alavancagem; delegar o julgamento é abdicação. A frase com que o Osmani fecha o artigo dele é a melhor síntese que eu achei disso, e serve de régua: <em>"Build the loop. But build it like someone who intends to stay the engineer, not just the person who presses go."</em></p>

]]></content:encoded>
    </item>
    <item>
      <title>Vibe Coding com DevSecOps: a IA gerou o site, mas a segurança do deploy foi MINHA - TDC Florianópolis 2026</title>
      <link>https://www.orafaelferreira.com/artigos/tdc-floripa-2026-devsecops</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/tdc-floripa-2026-devsecops</guid>
      <pubDate>Thu, 23 Jul 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Na Trilha Software Security do TDC Florianópolis 2026, mostrei como a IA gerou meu site e como DevSecOps, Terraform e GitHub Actions garantiram o deploy seguro.</description>
      <category>Palestras</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/tdc26/00.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<h2 id="tdc-florianopolis-2026-trilha-software-security">TDC Florianópolis 2026 — Trilha Software Security</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/tdc26/00.png" alt="Banner da palestra Vibe Coding com DevSecOps no TDC Florianópolis 2026" />

<p>No dia <strong>23 de julho de 2026</strong>, junto com <a href="https://www.linkedin.com/in/jessica-tmello/" target="_blank" rel="noopener noreferrer"><strong>Jéssica Mello</strong></a> (LowOps Consultoria), palestrei na <a href="https://thedevconf.com/tdc/2026/florianopolis/trilha-software-security" target="_blank" rel="noopener noreferrer"><strong>Trilha Software Security do TDC Florianópolis</strong></a>, um dos maiores eventos de tecnologia do Brasil, realizado no <strong>CentroSul, em Florianópolis - SC</strong>.</p>

<p>A trilha abordou um tema central: <strong>"Construindo software seguro do design à produção em tempos de IA"</strong>, explorando como a IA generativa acelera o desenvolvimento, mas também expande riscos e responsabilidades.</p>

<h2 id="agenda">Agenda</h2>

<strong>Sessão:</strong> Vibe Coding com DevSecOps: a IA gerou o site, mas a segurança do deploy foi MINHA

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/tdc26/1.jpg" alt="Rafael Ferreira e Jéssica Mello no palco da Trilha Software Security" />

<strong>Palestrantes:</strong>
<ul>
<li>Rafael Ferreira (Senior Azure Platform Engineer, Stefanini North America, Microsoft MVP)</li>
<li>Jéssica Mello (LowOps Consultoria)</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/tdc26/2.jpg" alt="Rafael Ferreira e Jéssica Mello apresentando no TDC Florianópolis 2026" />
<p>Um estudo de caso sobre os limites e riscos do "vibe coding" quando confrontado com exigências reais de produção, e como DevSecOps resolve isso.</p>

<h2 id="programacao-da-trilha-software-security">Programação da Trilha Software Security</h2>

<p>O dia foi repleto de conteúdo técnico de altíssimo nível:</p>

<ul>
<li><strong>10:30–11:05</strong> | <em>Mobile 2026: O custo da compatibilidade e a nova era de exploits com IA</em> — Michel Anderson Lütz Teixeira (AI/R Company)</li>
<li><strong>11:15–11:50</strong> | <em>SecOps Autônomo: Automatizando Bumps de Dependência e Resolução de CVEs com IA em Pipelines Zero Trust</em> — Felipe Faria (Mindera)</li>
<li><strong>11:55–12:30</strong> | <em>Desenvolvimento seguro com IA: planejamento, revisão e Cross-Agent na prática</em> — Marcelo Martins (Unicred)</li>
<li><strong>14:10–14:45</strong> | <em>Vibe Coding com DevSecOps: a IA gerou o site, mas a segurança do deploy foi MINHA</em> — Rafael Ferreira & Jéssica Mello</li>
<li><strong>14:50–15:25</strong> | <em>Prompt Injection: um problema de segurança em LLMs</em> — Guilherme Luiz Maia Pinto (Fortress OS)</li>
<li><strong>15:30–16:30</strong> | <em>Painel: Da AppSec à AgentSec: quem garante a segurança quando a IA escreve, corrige, opera e decide?</em> — Georgia Maria Ferro Benetti, Rodrigo Diehl, Kalita da Silva, Gabriel Ferreira Ramos da Conceição</li>
<li><strong>17:10–17:45</strong> | <em>Eficiência em AppSec: Utilizando a IA para escalar Segurança em Aplicações</em> — Thiago Lotufo (Globo)</li>
<li><strong>17:50–18:25</strong> | <em>IA em produção é risco: como governar decisões automatizadas com segurança</em> — Wesley Souza (AdviceHealth)</li>
</ul>

<h2 id="a-jornada-ia-escreve-voce-responde">A Jornada: IA Escreve, Você Responde</h2>

<h3 id="o-problema">O Problema</h3>

<p>Meu portfólio pessoal (<code>orafaelferreira.com</code>) estava obsoleto. Precisava modernizá-lo rápido, com estilo contemporâneo, mantendo foco em conteúdo (artigos, palestras, certificações). Tempo era um luxo que não tinha.</p>

<h3 id="o-prompt-o-lovable">O Prompt & o Lovable</h3>

<p>Estruturei um prompt detalhado (estilo visual, seções esperadas como blog, palestras e sobre, stack preferido em React e tom de voz) e usei o <a href="https://lovable.dev/" target="_blank" rel="noopener noreferrer"><strong>Lovable</strong></a> para gerar <strong>100% via IA generativa</strong> uma primeira versão.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/tdc26/6.jpg" alt="Slide mostrando o prompt e o site gerado com Lovable" />

<p>O resultado foi perfeito para um protótipo: um site one-page bonito, responsivo, rodando em produção em horas.</p>

<p>Mas aí vem o problema.</p>

<h3 id="a-crise-do-vibe-coding-em-producao">A Crise do Vibe Coding em Produção</h3>

<p>Quando saí do "protótipo legal" pra "arquitetura profissional", os clássicos apareceram:</p>

<ul>
<li><strong>Vendor lock-in:</strong> o Lovable gerou código otimizado pra sua plataforma, não pra ser exportado e sustentado.</li>
<li><strong>Custo insustentável:</strong> hospedagem on-demand sendo cobrada por requisição.</li>
<li><strong>Arquitetura monolítica:</strong> one-page, tudo bundled junto, sem code-splitting, sem preocupação com assets.</li>
<li><strong>Falta de padrão:</strong> sem versionamento Git, sem pipeline, sem testes, sem "agora meu site quebrou em produção, e aí?".</li>
</ul>

<p>Ficou claro: <strong>a IA é excelente em acelerar, mas não entende responsabilidade.</strong></p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/tdc26/4.jpg" alt="Slide sobre os riscos do vibe coding em produção" />

<h3 id="retomando-o-controle">Retomando o Controle</h3>

<p>Exportei o código do Lovable pro <a href="https://github.com/orafaelferreiraa/orafaelferreira-com" target="_blank" rel="noopener noreferrer"><strong>GitHub</strong></a>, e daí começou o trabalho real.</p>

<p>Refatorei com <strong><a href="https://github.com/features/copilot" target="_blank" rel="noopener noreferrer">GitHub Copilot</a></strong> (que também gera código, mas agora <em>meu</em>, meu repositório, minhas decisões), adotei <strong>GitFlow</strong> completo, versionamento semântico, e transformei o "site bonito" em "sistema profissional":</p>

<ul>
<li>Separei conteúdo (TypeScript data files, não CMS) de apresentação.</li>
<li>Estruturei componentes reutilizáveis.</li>
<li>Implementei i18n (português + inglês).</li>
</ul>

<h3 id="devsecops-de-verdade">DevSecOps de Verdade</h3>

<p>Agora veio a camada que diferencia um hobby de um sistema em produção:</p>

<strong>Infraestrutura 100% como código</strong> via <a href="https://www.terraform.io/" target="_blank" rel="noopener noreferrer"><strong>Terraform</strong></a>:
<ul>
<li><a href="https://learn.microsoft.com/en-us/azure/static-web-apps/" target="_blank" rel="noopener noreferrer"><strong>Azure Static Web App</strong></a> (distribuição global, HTTPS nativo, hosting seguro).</li>
<li>DNS automatizado (apex + www) com validação de domínio.</li>
<li>Tudo versionado, revisível, auditável.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/tdc26/8.jpg" alt="Slide com o pipeline DevSecOps versionado e auditável" />

<strong>Pipeline de segurança</strong> via <a href="https://github.com/features/actions" target="_blank" rel="noopener noreferrer"><strong>GitHub Actions</strong></a>:
<ul>
<li><strong><a href="https://github.com/terraform-linters/tflint" target="_blank" rel="noopener noreferrer">tflint</a></strong> — análise estática do Terraform.</li>
<li><strong><a href="https://github.com/aquasecurity/trivy" target="_blank" rel="noopener noreferrer">trivy</a></strong> — scanning de vulnerabilidades em imagens e artefatos.</li>
<li><strong><a href="https://www.checkov.io/" target="_blank" rel="noopener noreferrer">checkov</a></strong> — compliance & policy as code.</li>
<li>Rodam tanto no <code>terraform plan</code> quanto no <code>apply</code>, sem passar, não deploya.</li>
</ul>

<strong>Segredos sem hardcoding:</strong>
<ul>
<li><a href="https://learn.microsoft.com/en-us/entra/identity-platform/app-objects-and-service-principals" target="_blank" rel="noopener noreferrer"><strong>Service Principal</strong></a> do Azure com mínimos privilégios.</li>
<li>Secrets armazenados no GitHub (criptografados, nunca em logs de build).</li>
<li>Rotação automática de credenciais.</li>
</ul>

<strong>Resultado:</strong> posso quebrar meu site à vontade, qualquer merge pra main passa por um gauntlet de checks, testes e validações. Se algo errado subir, ele bate em policy e não sai do passe.

<h3 id="stack-final-qualidade">Stack Final & Qualidade</h3>

<p>A evolução não parou em infraestrutura:</p>

<ul>
<li><strong>Frontend:</strong> <a href="https://react.dev/" target="_blank" rel="noopener noreferrer"><strong>React 19</strong></a> + <a href="https://www.typescriptlang.org/" target="_blank" rel="noopener noreferrer"><strong>TypeScript</strong></a> + <a href="https://vitejs.dev/" target="_blank" rel="noopener noreferrer"><strong>Vite</strong></a> + <a href="https://tailwindcss.com/" target="_blank" rel="noopener noreferrer"><strong>TailwindCSS</strong></a> + <a href="https://ui.shadcn.com/" target="_blank" rel="noopener noreferrer"><strong>shadcn/ui</strong></a> (design system moderno, acessível).</li>
<li><strong>Testes:</strong> pirâmide completa, unit/integration com <a href="https://vitest.dev/" target="_blank" rel="noopener noreferrer"><strong>Vitest</strong></a> & <a href="https://testing-library.com/" target="_blank" rel="noopener noreferrer"><strong>React Testing Library</strong></a>, E2E com <a href="https://playwright.dev/" target="_blank" rel="noopener noreferrer"><strong>Playwright</strong></a>.</li>
<li><strong>SEO tradicional + GEO:</strong> structured data, meta tags, sitemaps, RSS, mas também otimizado pra "Generative Engine Optimization" (como LLMs descobrem conteúdo).</li>
</ul>

<p>Tudo isso não seria possível se eu tivesse confiado 100% no "vibe coding" inicial.</p>

<h2 id="os-4-cs-do-cloud-native-security-aplicados-aqui">Os 4 C's do Cloud Native Security (Aplicados Aqui)</h2>

<p>A estrutura clássica de segurança em cloud funciona em camadas:</p>

<p>1. <strong>Cloud:</strong> políticas de acesso, roles, networking (tudo Terraform, nada clicável em portal).</p>
<p>2. <strong>Cluster/Infra:</strong> Azure Static Web App é gerenciada, mas o Terraform valida config & compliance.</p>
<p>3. <strong>Container:</strong> Trivy verifica imagens; Checkov valida policies.</p>
<p>4. <strong>Code:</strong> GitHub Copilot ajuda, mas os testes garantem que o código faz o que deve.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/tdc26/3.jpg" alt="Slide com os 4 C's do Cloud Native Security" />

<p>Nenhuma camada é ignorada. Nenhuma depende só da IA.</p>

<h2 id="de-prompt-engineer-a-harness-engineer">De "Prompt Engineer" a "Harness Engineer"</h2>

<p>Quando você usa IA pra gerar código, a evolução natural é:</p>

<ul>
<li><strong>Fase 1:</strong> Prompt Engineer, "escrever bons prompts" é o skill.</li>
<li><strong>Fase 2:</strong> Harness Engineer, "estruturar o loop IA + automação + feedback" é o skill.</li>
</ul>

<p>Um harness engineer não só escreve prompts bons; ele:</p>
<ul>
<li>Define pipeline, testes, validações que a IA passa por.</li>
<li>Entende quando a IA pode ir sozinha e quando não.</li>
<li>Desenha feedback loops (errar, aprender, melhorar).</li>
<li>Não confia na IA sozinha, a IA é aceleradora, não substituta.</li>
</ul>

<p>Essa jornada do site foi aprender a ser um harness engineer, não só um prompt engineer.</p>

<h2 id="checklist-pratico-do-funcionando-ao-seguro-em-producao">Checklist Prático: Do "Funcionando" ao "Seguro em Produção"</h2>

<p>Aqui está o que você <strong>não pode ignorar</strong> depois que a IA gera algo funcional:</p>

<ul>
<li><strong>Segredos:</strong> nunca hardcode. Use vaults, env vars, managed secrets.</li>
<li><strong>Infraestrutura:</strong> IaC (Terraform, CloudFormation, ARM), nada de cliques em portal.</li>
<li><strong>Testes:</strong> unit, integration, E2E, a IA gera código, mas testes garantem que funciona <em>seu</em> caso de uso.</li>
<li><strong>Scanning:</strong> SAST (código), DAST (rodando), dependency checks, container scanning.</li>
<li><strong>Logs & Monitoramento:</strong> quem vai investigar incidente às 3 da manhã? Você. Logo, precisa de visibilidade.</li>
<li><strong>Documentação:</strong> a IA gera código rápido, mas documentação arquitetural é coisa de humano.</li>
<li><strong>Código review:</strong> até a IA merece code review.</li>
<li><strong>Backup & Disaster Recovery:</strong> quando der merda (e vai dar), você precisa de plano B.</li>
</ul>

<h2 id="licoes-da-jornada">Lições da Jornada</h2>

<p>1. <strong>Um prompt bem estruturado bate tentativa e erro</strong>, qualidade da entrada determina qualidade da saída.</p>
<p>2. <strong>Unir IA + automação + cloud não é o futuro; é o presente</strong>, mas exige T-shaped skills (rápido em amplitude, profundo em especialização).</p>
<p>3. <strong>UX importa tanto quanto o produto</strong>, design é decisão, não accident.</p>
<p>4. <strong>A IA é o acelerador; você é o piloto</strong>, profissional generalista (velocidade, vibe coding) precisa ser também especialista em T (DevOps, Terraform, Cloud, Security) pra sustentar o que a IA acelera.</p>

<p>E um thought final, polêmico: <strong>se você não está gostando do seu trabalho, ou não está usando IA do jeito certo, ou está no emprego errado.</strong></p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/tdc26/5.jpg" alt="Rafael Ferreira compartilhando lições da jornada no TDC" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/tdc26/7.jpg" alt="Público da Trilha Software Security do TDC Florianópolis 2026" />

<h2 id="slides-da-apresentacao">Slides da Apresentação</h2>

<i></i> <strong>Slides da Apresentação:</strong> <a href="https://stoblobcertificados011.blob.core.windows.net/palestras/tdcfloripa26.pdf" target="_blank" rel="noopener noreferrer">Vibe Coding com DevSecOps: a IA gerou o site, mas a segurança do deploy foi MINHA</a>

<h2 id="repositorios">Repositórios</h2>

<ul>
<li><a href="https://github.com/orafaelferreiraa/orafaelferreira-com" target="_blank" rel="noopener noreferrer">Repositório do Site</a> — código-fonte, Terraform, pipeline completa.</li>
</ul>


<p>Se você está mergulhando em vibe coding, generative AI, ou IA no deploy, as lições dessa jornada valem ouro.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/tdc26/certificado.png" alt="Certificado de palestrante do TDC Florianópolis 2026" />
]]></content:encoded>
    </item>
    <item>
      <title>MCP Server com Docker e Terraform: discovery, troubleshooting e produtividade</title>
      <link>https://www.orafaelferreira.com/artigos/terraform-mcp-server-docker</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/terraform-mcp-server-docker</guid>
      <pubDate>Sat, 27 Jun 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Um guia direto ao ponto para usar Terraform MCP Server com Docker no dia a dia: discovery, troubleshooting e produtividade</description>
      <category>Artigos</category>
      <category>Terraform</category>
      <category>Docker</category>
      <category>DevOps</category>
      <category>Platform Engineering</category>
      <category>MCP</category>
      <category>IA</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/mcp.tf/01.png" length="0" type="image/png" />
      <content:encoded><![CDATA[

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/mcp.tf/01.png" alt="Capa do artigo sobre Terraform MCP Server com Docker" /> 
<h2 id="resumo-rapido">Resumo rápido</h2>

<ul>
<li>MCP cria um padrão para clientes de IA se conectarem a ferramentas e dados externos.</li>
<li>Terraform MCP Server é uma forma prática de trazer contexto de providers, módulos, runs e plans para um workflow mais previsível.</li>
<li>Agentes de codificação trabalham em um loop de execução (análise, ação e observação), e dá para guiar esse loop com engenharia.</li>
<li>MCP e skills se completam: o MCP conecta o agente a dados atuais e as skills carregam as boas práticas para orientar cada passo.</li>
</ul>

<p>O <a href="https://modelcontextprotocol.io/introduction" target="_blank" rel="noopener noreferrer">Model Context Protocol (MCP)</a> cria um formato padrão para um cliente consultar ferramentas e dados sem ficar adivinhando formato ou fazendo scraping de texto.</p>

<p>O protocolo foi inicialmente desenvolvido pela <a href="https://www.anthropic.com/" target="_blank" rel="noopener noreferrer">Anthropic</a> e hoje evolui como padrão aberto no ecossistema.</p>

<p>E o <a href="https://developer.hashicorp.com/terraform/mcp-server" target="_blank" rel="noopener noreferrer">Terraform MCP Server</a> coloca isso no mundo Terraform.</p>

<h2 id="mcp-e-tipo-um-usb-da-internet">MCP é tipo um "USB da internet"</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/mcp.tf/02.png" alt="Ilustração do MCP como um USB-C para apps de IA" /> 

<p>Uma analogia que ajuda muito: MCP funciona como um "USB-C" para apps de IA.</p>

<p>No mundo físico, você conecta mouse, teclado, webcam no mesmo padrão. No mundo de IA, você conecta servidores MCP de docs, cloud, banco, ticket, observabilidade e automação no mesmo protocolo.</p>

<p>Isso permite trocar informações sem reescrever tudo e diminui acoplamento entre cliente e integrações.</p>

<p>Exemplos simples:</p>

<ul>
<li>um agente conecta no MCP do Terraform para ler módulos e providers</li>
<li>o mesmo agente conecta no MCP de observabilidade para investigar incidente</li>
<li>depois conecta no MCP de wiki interna para buscar padrões do time</li>
</ul>

<h2 id="como-o-agente-de-ia-realmente-trabalha-o-loop-de-execucao">Como o agente de IA realmente trabalha: o loop de execução</h2>

<p>Antes de plugar qualquer MCP, vale entender como um agente de codificação (Claude Code, GitHub Copilot, Codex e afins) executa uma tarefa. Ele não resolve tudo de uma vez: trabalha em um <strong>loop de execução</strong>.</p>

<p>O ciclo se repete mais ou menos assim:</p>

<ul>
<li><strong>Análise</strong> — o agente lê a tarefa (ou a especificação) e decide o próximo passo</li>
<li><strong>Ação</strong> — chama uma ferramenta: ler um arquivo, rodar um comando ou consultar um MCP</li>
<li><strong>Observação</strong> — lê o resultado daquela ação</li>
<li><strong>Repetição</strong> — volta para a análise e segue até concluir a tarefa</li>
</ul>

<p>Quando você fica trocando prompt atrás de prompt no chat, corrigindo na tentativa e erro, o agente decide sozinho cada passo, sem trilho. É o famoso "vibe coding": até funciona, mas rende pouco e erra bastante.</p>

<p>A alternativa é aplicar engenharia a esse ciclo, guiar o loop em vez de só reagir a ele. Para isso existem dois controles complementares: <strong>skills</strong> (direção) e <strong>MCPs</strong> (ferramentas).</p>

<h2 id="skills-vs-mcps-dois-controles-que-se-completam">Skills vs MCPs: dois controles que se completam</h2>

<p>É fácil confundir os dois, mas cada um resolve um problema diferente:</p>

<ul>
<li><strong>MCP é o encanamento.</strong> Dá ao agente <em>acesso</em> a ferramentas e dados externos, aqui, a documentação viva de providers e módulos do Terraform. Responde a "o que o agente consegue alcançar?".</li>
<li><strong>Skill é o livro-texto.</strong> Empacota <em>conhecimento e boas práticas</em> que o agente carrega sob demanda: workflows, convenções e guardrails. Responde a "como o agente deve trabalhar?".</li>
</ul>

<p>A própria <a href="https://www.hashicorp.com/en/blog/introducing-hashicorp-agent-skills" target="_blank" rel="noopener noreferrer">HashiCorp resume bem</a>: o MCP é o "cano" que conecta dados à IA, enquanto as <a href="https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview" target="_blank" rel="noopener noreferrer">Agent Skills</a> são os "livros-texto" de conhecimento, e o melhor resultado vem de usar os dois juntos.</p>

<p>Na prática, com Terraform:</p>

<ul>
<li><strong>só com MCP:</strong> o agente consulta a versão atual do provider e evita gerar código preso a uma versão antiga do treinamento</li>
<li><strong>só com skill:</strong> o agente segue o style guide, escreve testes e revisa segurança, mas sem dados atualizados</li>
<li><strong>com os dois:</strong> dados atuais e boas práticas dentro do mesmo loop</li>
</ul>

<p>Skills são um <a href="https://agentskills.io/home" target="_blank" rel="noopener noreferrer">formato aberto</a> criado pela Anthropic: cada uma é uma pasta com um arquivo <code>SKILL.md</code> que descreve, em linguagem natural, quando e como o agente deve agir. Diferente de um prompt pontual, a skill é reutilizável e só entra em contexto quando é relevante.</p>

<h2 id="no-dia-a-dia">No dia a dia</h2>

<p>Sem MCP, o fluxo costuma ser:</p>

<p>1. pesquisar manualmente provider/módulo</p>
<p>2. abrir várias abas para comparar versões</p>
<p>3. cruzar informação de workspace, run e plan na mão</p>
<p>4. responder o time com base em contexto parcial </p>

<p>Com MCP, um cliente compatível consegue consultar essas informações de forma estruturada.</p>

<p>Em vez de prompt genérico, você chama uma tool específica e recebe dados previsíveis. Isso reduz erros, acelera decisões e melhora rastreabilidade.</p>

<p>No dia a dia, os ganhos mais claros são:</p>

<ul>
<li><strong>discovery mais rápido:</strong> buscar providers e módulos sem navegar em 10 páginas</li>
<li><strong>menos erro de versão:</strong> consultar versões recentes de forma objetiva</li>
</ul>

<p>Exemplos de tools disponíveis:</p>

<ul>
<li><strong>search_providers</strong> e <strong>get_provider_details</strong></li>
<li><strong>search_modules</strong> e <strong>get_module_details</strong></li>
<li><strong>get_latest_provider_version</strong> e <strong>get_latest_module_version</strong></li>
<li><strong>list_workspaces</strong> e <strong>get_workspace_details</strong></li>
<li><strong>get_plan_json_output</strong> e <strong>get_run_details</strong></li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/mcp.tf/04.png" alt="Fluxo de uso do Terraform MCP Server no dia a dia" /> 

<h2 id="onde-encontrar-mcps-oficiais-na-internet">Onde encontrar MCPs oficiais na internet</h2>

<p>Se você quer fontes confiáveis para descobrir servidores MCP:</p>

<ul>
<li><a href="https://modelcontextprotocol.io/" target="_blank" rel="noopener noreferrer">Site oficial do MCP</a> (oficial: conceitos, spec e guias)</li>
<li><a href="https://github.com/modelcontextprotocol" target="_blank" rel="noopener noreferrer">Organização oficial no GitHub</a> (oficial)</li>
<li><a href="https://github.com/modelcontextprotocol/servers" target="_blank" rel="noopener noreferrer">Lista de servidores do ecossistema MCP</a> (comunidade/ecossistema)</li>
<li><a href="https://github.com/modelcontextprotocol/registry" target="_blank" rel="noopener noreferrer">Registry MCP da comunidade</a> (comunidade)</li>
</ul>

<p>Para ecossistemas grandes, vale acompanhar registries e catálogos de vendors:</p>

<ul>
<li><a href="https://hub.docker.com/mcp" target="_blank" rel="noopener noreferrer">Docker MCP Registry</a> (oficial Docker)</li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/mcp.tf/mcpdocker.png" alt="Página do Docker MCP Registry no Docker Hub" /> 
<ul>
<li><a href="https://github.com/mcp?utm_source=vscode-website&utm_campaign=mcp-registry-server-launch-2025" target="_blank" rel="noopener noreferrer">Microsoft MCP Registry</a> (oficial Microsoft)</li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/mcp.tf/MCPRegistry.png" alt="Página do MCP Registry do GitHub e Microsoft" /> 
<h2 id="skills-oficiais-de-terraform-da-hashicorp">Skills oficiais de Terraform da HashiCorp</h2>

<p>Além do MCP Server, a HashiCorp publicou uma biblioteca aberta de skills: o <a href="https://www.hashicorp.com/en/blog/introducing-hashicorp-agent-skills" target="_blank" rel="noopener noreferrer">HashiCorp Agent Skills</a>, disponível no repositório <a href="https://github.com/hashicorp/agent-skills" target="_blank" rel="noopener noreferrer">hashicorp/agent-skills</a>.</p>

<p>As skills de Terraform ajudam o agente a:</p>

<ul>
<li><strong>gerar código no style guide</strong> oficial da HashiCorp, em vez de convenções aleatórias encontradas na internet</li>
<li><strong>escrever e rodar testes</strong> com o framework nativo de testes do Terraform</li>
<li><strong>orquestrar com Terraform Stacks</strong> cenários multi-ambiente e multi-região</li>
<li><strong>desenvolver e manter providers</strong> seguindo o plugin framework (schema, ciclo de vida e breaking changes)</li>
<li><strong>refatorar módulos</strong>, quebrando configurações monolíticas em módulos reutilizáveis</li>
</ul>

<p>Instalar é rápido. Para todas as skills, via npx:</p>

<div data-lang="bash"><pre><code>npx skills add hashicorp/agent-skills</code></pre></div>

<p>Ou uma skill específica:</p>

<div data-lang="bash"><pre><code>npx skills add hashicorp/agent-skills/terraform/code-generation/skills/terraform-style-guide</code></pre></div>

<p>No Claude Code, dá para instalar como plugin:</p>

<div data-lang="bash"><pre><code>claude plugin marketplace add hashicorp/agent-skills
claude plugin install terraform-code-generation@hashicorp</code></pre></div>

<p>O ganho reforça o tema deste artigo: a skill entrega as boas práticas e o MCP entrega os dados atuais. Juntos, reduzem alucinação e mantêm o código dentro do padrão.</p>

<h2 id="onde-o-docker-entra-de-verdade">Onde o Docker entra de verdade</h2>

<p>Reduzir variação de ambiente. Com <a href="https://docs.docker.com/" target="_blank" rel="noopener noreferrer">Docker</a>, você empacota o servidor MCP de forma reproduzível para:</p>

<ul>
<li>notebook local</li>
<li>ambiente de desenvolvimento</li>
<li>CI/CD</li>
<li>máquina de quem entrou no time ontem</li>
</ul>

<p>Isso corta o clássico "na minha máquina funciona" e ajuda a manter o mesmo comportamento entre ambientes.</p>

<h2 id="setup-minimo-para-comecar">Setup mínimo para começar</h2>

<p>Primeiro, confirme o Terraform no ambiente:</p>

<div data-lang="bash"><pre><code>terraform version</code></pre></div>

<p>Depois, rode o servidor MCP com Docker (exemplo; ajuste conforme a documentação oficial e versão mais recente):</p>

<div data-lang="bash"><pre><code>docker run --rm -it   --name terraform-mcp   -e TF_IN_AUTOMATION=true   -e TF_LOG=INFO   -v "${PWD}:/workspace"   -w /workspace   hashicorp/terraform-mcp-server:1.0.0</code></pre></div>

<h2 id="primeira-chamada-real-hands-on">Primeira chamada real (hands-on)</h2>

<p>Depois de subir o servidor MCP, o fluxo mínimo no cliente costuma ser:</p>

<p>1. listar as tools disponíveis</p>
<p>2. chamar uma tool de discovery (ex.: <code>search_providers</code>)</p>
<p>3. validar estrutura de resposta antes de automatizar</p>

<p>Exemplo de resposta esperada (resumida). Os campos exatos podem variar conforme a tool e o cliente MCP:</p>

<div data-lang="json"><pre><code>{
  "providers": [
    {
      "name": "azurerm",
      "namespace": "hashicorp",
      "latest_version": "x.y.z"
    }
  ]
}</code></pre></div>

<p>Com isso, você já valida conectividade, autenticação e formato dos dados.</p>

<h2 id="como-instalar-e-rodar-mcp-com-nodejs-o-minimo-necessario">Como instalar e rodar MCP com Node.js (o mínimo necessário)</h2>

<p>Se você quiser criar ou testar um MCP sem Docker, normalmente precisa de:</p>

<ul>
<li>Node.js LTS (18+ ou 20+)</li>
<li>npm, pnpm ou yarn</li>
<li>um cliente MCP (editor, agente, CLI, ou o Inspector)</li>
</ul>

<p>Exemplo de bootstrap rapido com Node:</p>

<div data-lang="bash"><pre><code>mkdir meu-mcp-node &amp;&amp; cd meu-mcp-node
npm init -y
npm install @modelcontextprotocol/xxxx</code></pre></div>

<p>Estrutura mínima comum:</p>

<ul>
<li><code>package.json</code></li>
<li><code>server.ts</code></li>
</ul>

<p>Exemplo mínimo de servidor (conceitual):</p>

<div data-lang="ts"><pre><code>import { Server } from "@modelcontextprotocol/sdk/server/index.js";

const server = new Server(
  { name: "meu-mcp", version: "0.1.0" },
  { capabilities: { tools: {} } }
);

// Registrar tools aqui (status, healthcheck, consultas etc.)</code></pre></div>

<p>Execução típica em desenvolvimento:</p>

<div data-lang="bash"><pre><code>npx tsx server.ts</code></pre></div>

<p>No cliente MCP, configure esse servidor para rodar via stdio.</p>

<ul>
<li>criar um servidor MCP em TypeScript/JavaScript</li>
<li>expor tools (ex.: consultar status, buscar docs, executar validações)</li>
<li>rodar por stdio para o cliente consumir</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/mcp.tf/04.png" alt="Diagrama do cliente MCP consumindo o servidor via stdio" />

<p>Para testar localmente, muita gente usa o <a href="https://github.com/modelcontextprotocol/inspector" target="_blank" rel="noopener noreferrer">MCP Inspector</a>.</p>

<p>Se a equipe usa Docker em tudo, a abordagem mais estável é empacotar também o MCP Node em container para padronizar runtime.</p>

<h2 id="troubleshooting-rapido">Troubleshooting rápido</h2>

<p>Quando estou com erro, normalmente eu peço ajuda para o agent corrigir mesmo.</p>

<p>Exemplo de configuracao MCP (Terraform MCP Server via Docker/stdio):</p>

<div data-lang="json"><pre><code>"io.github.hashicorp/terraform-mcp-server": {
  "type": "stdio",
  "command": "docker",
  "args": [
    "run",
    "-i",
    "--rm",
    "-e",
    "TFE_ADDRESS",
    "-e",
    "TFE_TOKEN",
    "-e",
    "ENABLE_TF_OPERATIONS",
    "hashicorp/terraform-mcp-server:1.0.0"
  ],
  "env": {
    "TFE_ADDRESS": "${input:TFE_ADDRESS}",
    "TFE_TOKEN": "${input:TFE_TOKEN}",
    "ENABLE_TF_OPERATIONS": "${input:ENABLE_TF_OPERATIONS}"
  },
  "gallery": "https://api.mcp.github.com",
  "version": "1.0.0"
}</code></pre></div>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/mcp.tf/03.png" alt="Terminal exibindo o troubleshooting do MCP Server no Docker" />

<h2 id="fluxo-pratico">Fluxo prático</h2>

<p>1. subir o servidor MCP em container</p>
<p>2. conectar o cliente MCP (editor, agente ou automação)</p>
<p>3. validar uma consulta de discovery (provider/módulo)</p>
<p>4. validar uma consulta operacional (workspace/run/plan)</p>

<h2 id="guardrails-que-voce-nao-deve-ignorar">Guardrails que você não deve ignorar</h2>

<p>Se o servidor tiver acesso a ambientes reais, trate como componente crítico:</p>

<ul>
<li>use credenciais com privilégio mínimo</li>
<li>evite segredo em variável solta no container</li>
<li>defina limites claros para operações permitidas</li>
<li>habilite logs suficientes para auditoria e troubleshooting</li>
<li>separe bem o que é dev, homolog e prod</li>
</ul>

<p>MCP acelera muito, mas sem guardrail ele também acelera o caos!</p>

<p>Se quiser aprofundar, estes dois cursos da Anthropic são ótimos pontos de partida:</p>

<ul>
<li><a href="https://anthropic.skilljar.com/introduction-to-model-context-protocol" target="_blank" rel="noopener noreferrer">Introduction to Model Context Protocol</a></li>
<li><a href="https://anthropic.skilljar.com/model-context-protocol-advanced-topics" target="_blank" rel="noopener noreferrer">Model Context Protocol Advanced Topics</a></li>
</ul>

<p>Resumo:</p>

<ul>
<li><strong>Terraform</strong> continua sendo o motor declarativo</li>
<li><strong>MCP</strong> organiza como ferramentas e agentes consomem contexto atualizado</li>
<li><strong>Skills</strong> carregam as boas práticas que guiam o agente no loop de execução</li>
<li><strong>Docker</strong> entrega repetibilidade para rodar isso sem drama</li>
</ul>

<p>Se a meta é reduzir erros operacionais e ganhar velocidade com controle, combinar Terraform MCP Server, skills e Docker é um passo bastante útil.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Meu primeiro curso de Computação em Nuvem: práticas e governança com Azure</title>
      <link>https://www.orafaelferreira.com/artigos/alura-cloud-computing-fundamentos-iaas-paas-saas</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/alura-cloud-computing-fundamentos-iaas-paas-saas</guid>
      <pubDate>Sat, 27 Jun 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Registro do curso que gravei para a Alura, com foco em fundamentos de cloud, governança, segurança, FinOps, IaC, automação e uso de IA com Azure.</description>
      <category>Posts</category>
      <category>Azure</category>
      <category>DevOps</category>
      <category>Terraform</category>
      <category>FinOps</category>
      <category>IA</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/alura/00.jpg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[

<h2 id="computacao-em-nuvem-praticas-e-governanca-com-azure-na-alura">Computação em Nuvem: práticas e governança com Azure Na ALURA!</h2>

<p>Salve, galera. Quero compartilhar com vocês que recentemente gravei o curso <strong>Computação em Nuvem: práticas e governança com Azure</strong> na Alura e ele já está no ar.</p>

<a href="https://www.alura.com.br/curso-online-cloud-computing-fundamentos-de-iaas-paas-e-saas" target="_blank" rel="noopener noreferrer"><strong>Link Oficial do Curso</strong></a>

<p>Caso não seja ainda aluno da Alura, você pode se inscrever com o link: <a href="https://www.alura.com.br/promocao/awin_10EstudeAlurax" target="_blank" rel="noopener noreferrer"><strong>Link amigo</strong></a></p>

<h2 id="por-que-esse-curso-existe">Por que esse curso existe</h2>

<p>Há alguns anos, aprender cloud significava assistir horas de vídeo e, no final, criar uma máquina virtual. Hoje isso já não é suficiente.</p>

<p>Quem trabalha com Azure precisa entender arquitetura, segurança, governança, FinOps, Infrastructure as Code, automação e, agora, como utilizar IA para acelerar tudo isso.</p>

<p>A proposta não é criar mais um curso mostrando onde clicar no portal da Azure.</p>

<p>Quis construir um material que aproxima o estudante do que realmente acontece no mercado, com uma abordagem prática e conectada aos desafios de quem atua com infraestrutura e plataforma.</p>

<h2 id="o-que-o-curso-cobre">O que o curso cobre</h2>

<p>Ao longo de mais de 20 horas de conteúdo, passamos por temas como:</p>

<ul>
<li>Fundamentos de Cloud Computing</li>
<li>Azure na prática</li>
<li>Arquitetura de soluções em nuvem</li>
<li>Segurança, identidade e governança</li>
<li>FinOps e otimização de custos</li>
<li>Redes e conectividade</li>
<li>Infrastructure as Code com Terraform</li>
<li>Como utilizar IA para acelerar o provisionamento de infraestrutura</li>
<li>CI/CD, automação e boas práticas</li>
<li>Well-Architected Framework e estratégias de migração</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/alura/01.png" alt="Capa do curso de Computação em Nuvem com Azure na Alura" />

<h2 id="para-quem-o-curso-foi-pensado">Para quem o curso foi pensado</h2>

<p>Esse conteúdo foi pensado para profissionais de infraestrutura, engenheiros de plataforma, arquitetos de soluções, profissionais de DevOps e estudantes de tecnologia que querem aprender práticas aplicáveis em Azure e conceitos multi-cloud para projetar, governar e operar ambientes em nuvem.</p>

<ul>
<li>entender modelos de serviço como IaaS, PaaS e SaaS</li>
<li>projetar arquiteturas resilientes e escaláveis</li>
<li>orquestrar e versionar infraestrutura com IaC</li>
<li>gerenciar redes, conectividade e políticas</li>
<li>aplicar governança, controle de acesso e otimização de custos</li>
<li>automatizar pipelines e monitorar aplicações com foco em disponibilidade</li>
</ul>

<h2 id="o-que-tem-de-pratica">O que tem de prática</h2>

<ul>
<li>laboratórios de rede, compute e storage</li>
<li>App Services, Functions e bancos gerenciados</li>
<li>governança e permissão com usuários, grupos, políticas e identidade</li>
<li>IA para engenharia de cloud</li>
<li>zonas de disponibilidade</li>
<li>Well-Architected Framework</li>
<li>estratégias de migração</li>
</ul>

<p>Foi um projeto enorme, com muito planejamento e muito cuidado para transformar experiência de mercado em aprendizado aplicável.</p>

<p>Se você já é aluno, depois me conta o que achou. Seu feedback ajuda bastante e me dá ainda mais direção para os próximos conteúdos.</p>

<p>Se você quer aprender cloud indo além do básico, tenho certeza que esse curso vai te ajudar BASTANTE.</p>
]]></content:encoded>
    </item>
    <item>
      <title>GitHub Copilot in VSCode: Agents That Debug, Profile, and Test</title>
      <link>https://www.orafaelferreira.com/artigos/github-copilot-vscode-agents-debug-profile-test</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/github-copilot-vscode-agents-debug-profile-test</guid>
      <pubDate>Sat, 20 Jun 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>No Microsoft Build //localhost: Florianópolis, mostrei como agentes do GitHub Copilot podem acelerar debugging, profiling e testes dentro do Visual Studio Code.</description>
      <category>Palestras</category>
      <category>IA</category>
      <category>DevOps</category>
      <category>GitHub Copilot</category>
      <category>Open Source</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/Ms.Build.localhost.flp/01.png" length="0" type="image/png" />
      <content:encoded><![CDATA[

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/Ms.Build.localhost.flp/01.png" alt="Banner do Microsoft Build localhost Florianópolis 2026" />

<p>No dia <strong>20 de junho de 2026</strong>, realizamos o <a href="https://developer.microsoft.com/pt-br/reactor/events/27206/" target="_blank" rel="noopener noreferrer"><strong>Microsoft Build //localhost: Florianópolis</strong></a>  em <strong>Florianópolis</strong> e apresentei uma talk que conectou uma ideia simples com impacto direto no dia a dia: agentes de IA não servem só para escrever código, eles também podem ajudar a investigar, medir e validar software com mais contexto.</p>

<p>O evento reuniu pessoas interessadas em IA, cloud, DevOps e desenvolvimento moderno. A proposta da palestra foi mostrar, na prática, como o <strong>GitHub Copilot no VSCode</strong> pode atuar como um parceiro de trabalho quando o fluxo exige análise, repetição e rapidez.</p>

<p>Evento organizado por mim e <strong><a href="https://www.linkedin.com/in/viniciusdeschamps/" target="_blank" rel="noopener noreferrer">Vinicius Deschamps</a></strong>, representando a comunidade <a href="https://azureusergroupsbrasil.com.br/" target="_blank" rel="noopener noreferrer"><strong>Azure User Groups Brasil</strong></a>, com o objetivo de aproximar a comunidade de cenários reais de uso do <strong>GitHub Copilot</strong> no dia a dia de quem constrói software.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/Ms.Build.localhost.flp/00.png" alt="Slide de abertura da sessão sobre agentes do GitHub Copilot" />

<p>Agentes bem configurados encurtam esse ciclo sem substituir a habilidade crítica do desenvolvedor. Eles ajudam a chegar mais rápido no ponto certo da investigação.</p>

<p>Na prática, o maior ganho aparece quando o agente ajuda a organizar o problema.</p>

<p>Em vez de abrir dezenas de arquivos sem direção, a conversa pode começar com contexto, hipóteses e sinais observáveis. Isso ajuda a:</p>

<ul>
<li>identificar a parte mais provável do bug</li>
<li>sugerir arquivos e símbolos relacionados</li>
<li>resumir o comportamento esperado versus o comportamento real</li>
</ul>

<p>O resultado é menos tempo procurando e mais tempo corrigindo.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/Ms.Build.localhost.flp/02.jpg" alt="Rafael Ferreira apresentando agentes de debugging do GitHub Copilot" />

<h2 id="harness-com-agentes">Harness com agentes</h2>

<p>Um agente pode ajudar a interpretar sinais de uso de CPU, latência, alocação e dependências, principalmente quando o problema está espalhado por mais de uma camada do sistema.</p>

<p>O ponto não é automatizar o diagnóstico inteiro. O ponto é chegar mais rápido nas perguntas certas:</p>

<ul>
<li>onde a aplicação passa mais tempo?</li>
<li>qual etapa está repetindo trabalho desnecessário?</li>
<li>qual caminho vale instrumentar primeiro?</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/Ms.Build.localhost.flp/05.jpg" alt="Demonstração de profiling com agentes do GitHub Copilot no VS Code" />

<h2 id="testing-com-agentes">Testing com agentes</h2>

<p>Testes são um dos melhores usos para esse tipo de fluxo. Agentes ajudam a transformar um cenário solto em um conjunto de casos reproduzíveis, o que facilita validar correções e evitar regressões. Isso vale especialmente quando o comportamento envolve dependências, interfaces ou estados difíceis de reproduzir manualmente.</p>

<p>A mensagem principal foi que agentes funcionam melhor quando entram no fluxo certo:</p>

<ul>
<li>com contexto</li>
<li>com objetivo claro</li>
<li>com validação humana no final</li>
</ul>

<p>Quando isso acontece, o desenvolvedor ganha velocidade sem perder controle técnico.</p>

<p>Confira os conteúdos que tivemos no evento:</p>

<h2 id="from-cli-to-pr-automating-the-path-to-merged-code">From CLI to PR: Automating the Path to Merged Code  </h2>
<p>🔹 <a href="https://www.linkedin.com/in/viniciusdeschamps/" target="_blank" rel="noopener noreferrer">Vinicius Deschamps</a></p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/Ms.Build.localhost.flp/09.jpg" alt="Vinicius Deschamps apresentando a sessão From CLI to PR" />

<p>Nesta demonstracao pratica, mostramos como utilizar GitHub Copilot CLI e agentes para automatizar desde o planejamento ate a revisao de Pull Requests, explorando gerenciamento de contexto, automacao e fluxos modernos de desenvolvimento.</p>

<h2 id="github-copilot-no-visual-studio-agents-that-debug-profile-and-test">GitHub Copilot no Visual Studio: Agents That Debug, Profile and Test  </h2>
<p>🔹 <a href="https://www.linkedin.com/in/orafaelferreiraa/" target="_blank" rel="noopener noreferrer">Rafael Ferreira</a></p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/Ms.Build.localhost.flp/03.jpg" alt="Rafael Ferreira palestrando sobre GitHub Copilot no Microsoft Build localhost Florianópolis" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/Ms.Build.localhost.flp/06.jpg" alt="Público acompanhando a sessão sobre agentes do GitHub Copilot" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/Ms.Build.localhost.flp/08.jpg" alt="Demonstração ao vivo de agentes do Copilot no Visual Studio Code" />

<p>Nesta sessão, exploramos como os agentes do GitHub Copilot podem ajudar a investigar problemas, identificar gargalos de performance, analisar infraestrutura como codigo, entender comportamentos complexos de aplicacoes e acelerar troubleshooting em ambientes reais.</p>

<p>Menos tempo procurando a causa do problema.  </p>
<p>Mais tempo resolvendo o problema.</p>

<h2 id="from-zero-to-deployed-on-azure-with-ai-agents">From Zero to Deployed on Azure with AI Agents  </h2>
<p>🔹 <a href="https://www.linkedin.com/in/claudioraposo/" target="_blank" rel="noopener noreferrer">Claudio Raposo</a></p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/Ms.Build.localhost.flp/07.jpg" alt="Claudio Raposo conduzindo o laboratório From Zero to Deployed on Azure" />

<p>Um laboratorio pratico para quem quer colocar a mao na massa. Partindo de um terminal vazio, os participantes construiram e publicaram uma aplicacao no Azure utilizando GitHub Copilot CLI e agentes de IA para provisionamento de recursos, desenvolvimento, debugging e deployment.</p>

<h2 id="slides">Slides</h2>

<ul>
<li><a href="https://stoblobcertificados011.blob.core.windows.net/palestras/build26.pdf" target="_blank" rel="noopener noreferrer">Build 2026 - GitHub Copilot in VSCode</a></li>
</ul>

<ul>
<li><a href="https://www.linkedin.com/posts/orafaelferreiraa_microsoftbuild-githubcopilot-azure-activity-7473336231129522176-33Lc?utm_source=share&utm_medium=member_desktop&rcm=ACoAAAiBr9cBknrEzJyFEqCS03tes6G6R1yclRw" target="_blank" rel="noopener noreferrer">LinkedIn Post Divulgação evento</a></li>
</ul>

<h2 id="conecte-se-com-a-comunidade">Conecte-se com a comunidade</h2>

<p>Se você quiser acompanhar os próximos encontros e participar da comunidade:</p>

<ul>
<li><a href="https://azureusergroupsbrasil.com.br/" target="_blank" rel="noopener noreferrer">Site oficial</a></li>
<li><a href="https://linktr.ee/azureusergroupsbrasil" target="_blank" rel="noopener noreferrer">Linktree</a></li>
<li><a href="https://chat.whatsapp.com/HSpFnNyo9ZLD4RJrvEcrrl" target="_blank" rel="noopener noreferrer">Grupo no WhatsApp</a></li>
<li><a href="https://www.youtube.com/@azureusergroupsbrasil?sub_confirmation=1" target="_blank" rel="noopener noreferrer">YouTube</a></li>
<li><a href="https://www.linkedin.com/company/azureusergroupsbrasil" target="_blank" rel="noopener noreferrer">LinkedIn</a></li>
<li><a href="https://www.meetup.com/azureusergroupsbrasil" target="_blank" rel="noopener noreferrer">Meetup</a></li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/Ms.Build.localhost.flp/04.jpg" alt="Participantes e organizadores do Microsoft Build localhost Florianópolis" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/Ms.Build.localhost.flp/10.jpeg" alt="Comunidade Azure User Groups Brasil reunida em Florianópolis" />
]]></content:encoded>
    </item>
    <item>
      <title>Microsoft Build //localhost: Florianópolis</title>
      <link>https://www.orafaelferreira.com/artigos/microsoft-build-localhost-florianopolis</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/microsoft-build-localhost-florianopolis</guid>
      <pubDate>Sat, 20 Jun 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Um registro do evento que organizei com o Vinicius Deschamps em Florianópolis, com foco em IA aplicada ao desenvolvimento, cloud e prática real.</description>
      <category>Organização de Eventos</category>
      <category>IA</category>
      <category>GitHub Copilot</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/Ms.Build.localhost.flp/00.png" length="0" type="image/png" />
      <content:encoded><![CDATA[

<p>No dia <strong>20 de junho de 2026</strong>, realizamos o <a href="https://developer.microsoft.com/pt-br/reactor/events/27206/" target="_blank" rel="noopener noreferrer"><strong>Microsoft Build //localhost: Florianópolis</strong></a>  em <strong>Florianópolis</strong>, uma edição local pensada para colocar IA, desenvolvimento moderno e prática de engenharia no centro da conversa.</p>

<p>Evento organizado por mim e <strong><a href="https://www.linkedin.com/in/viniciusdeschamps/" target="_blank" rel="noopener noreferrer">Vinicius Deschamps</a></strong>, representando a comunidade <a href="https://azureusergroupsbrasil.com.br/" target="_blank" rel="noopener noreferrer"><strong>Azure User Groups Brasil</strong></a>, com o objetivo de aproximar a comunidade de cenários reais de uso do <strong>GitHub Copilot</strong> no dia a dia de quem constrói software.</p>

<p>A proposta foi reunir desenvolvedores, engenheiros de cloud e pessoas de comunidade para discutir o que muda quando agentes de IA entram no fluxo de trabalho.</p>

<p>Mais do que falar de tendência, queríamos mostrar:</p>

<ul>
<li>como agentes ajudam a acelerar investigação, validação e entrega</li>
<li>como manter critério técnico mesmo usando IA</li>
<li>como conectar criação, troubleshooting e automação em um fluxo prático</li>
</ul>

<h2 id="o-evento-em-florianopolis">O evento em Florianópolis</h2>

<p>O encontro aconteceu em Florianópolis e fez parte da série <strong><a href="https://news.microsoft.com/build-2026/" target="_blank" rel="noopener noreferrer">Microsoft Build</a> //localhost</strong>, com uma pegada local e muito próxima da realidade de quem está construindo software em produção.</p>

<strong>Evento:</strong> Microsoft Build //localhost: Florianópolis  
<strong>Data:</strong> 20 de junho de 2026  
<strong>Cidade:</strong> Florianópolis

<ul>
<li><a href="https://developer.microsoft.com/pt-br/reactor/events/27206/" target="_blank" rel="noopener noreferrer">Página oficial do evento</a></li>
<li><a href="https://www.linkedin.com/posts/orafaelferreiraa_microsoftbuild-githubcopilot-azure-activity-7473336231129522176-33Lc?utm_source=share&utm_medium=member_desktop&rcm=ACoAAAiBr9cBknrEzJyFEqCS03tes6G6R1yclRw" target="_blank" rel="noopener noreferrer">LinkedIn Post Divulgação evento</a></li>
</ul>


<p>A programação foi desenhada para conectar IA e prática de engenharia.</p>

<p>Os temas giraram em torno de:</p>

<ul>
<li>GitHub Copilot no fluxo de desenvolvimento</li>
<li>uso de agentes para debugging, profiling e testes</li>
<li>automação com foco em entrega e governança</li>
</ul>

<p>Confira os conteúdos que tivemos no evento:</p>

<h2 id="from-cli-to-pr-automating-the-path-to-merged-code">From CLI to PR: Automating the Path to Merged Code  </h2>
<p>🔹 <a href="https://www.linkedin.com/in/viniciusdeschamps/" target="_blank" rel="noopener noreferrer">Vinicius Deschamps</a></p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/Ms.Build.localhost.flp/09.jpg" alt="Vinicius Deschamps apresentando From CLI to PR no Microsoft Build localhost" />

<p>Nesta demonstracao pratica, mostramos como utilizar GitHub Copilot CLI e agentes para automatizar desde o planejamento ate a revisao de Pull Requests, explorando gerenciamento de contexto, automacao e fluxos modernos de desenvolvimento.</p>

<h2 id="github-copilot-no-visual-studio-agents-that-debug-profile-and-test">GitHub Copilot no Visual Studio: Agents That Debug, Profile and Test  </h2>
<p>🔹 <a href="https://www.linkedin.com/in/orafaelferreiraa/" target="_blank" rel="noopener noreferrer">Rafael Ferreira</a></p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/Ms.Build.localhost.flp/03.jpg" alt="Rafael Ferreira apresentando GitHub Copilot no Visual Studio" />

<p>Nesta sessão, exploramos como os agentes do GitHub Copilot podem ajudar a investigar problemas, identificar gargalos de performance, analisar infraestrutura como codigo, entender comportamentos complexos de aplicacoes e acelerar troubleshooting em ambientes reais.</p>

<p>Menos tempo procurando a causa do problema.  </p>
<p>Mais tempo resolvendo o problema.</p>

<h2 id="from-zero-to-deployed-on-azure-with-ai-agents">From Zero to Deployed on Azure with AI Agents  </h2>
<p>🔹 <a href="https://www.linkedin.com/in/claudioraposo/" target="_blank" rel="noopener noreferrer">Claudio Raposo</a></p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/Ms.Build.localhost.flp/07.jpg" alt="Claudio Raposo conduzindo o laboratório From Zero to Deployed on Azure" />

<p>Um laboratorio pratico para quem quer colocar a mao na massa. Partindo de um terminal vazio, os participantes construiram e publicaram uma aplicacao no Azure utilizando GitHub Copilot CLI e agentes de IA para provisionamento de recursos, desenvolvimento, debugging e deployment.</p>

<p>Esse tipo de evento só acontece porque existe comunidade por trás.</p>

<p>Se você participou, obrigado pela presença. Se não conseguiu ir, este post fica como registro da organização e do propósito da edição.</p>


<h2 id="conecte-se-com-a-comunidade">Conecte-se com a comunidade</h2>

<p>Se você quiser acompanhar os próximos encontros e participar da comunidade:</p>

<ul>
<li><a href="https://azureusergroupsbrasil.com.br/" target="_blank" rel="noopener noreferrer">Site oficial</a></li>
<li><a href="https://linktr.ee/azureusergroupsbrasil" target="_blank" rel="noopener noreferrer">Linktree</a></li>
<li><a href="https://chat.whatsapp.com/HSpFnNyo9ZLD4RJrvEcrrl" target="_blank" rel="noopener noreferrer">Grupo no WhatsApp</a></li>
<li><a href="https://www.youtube.com/@azureusergroupsbrasil?sub_confirmation=1" target="_blank" rel="noopener noreferrer">YouTube</a></li>
<li><a href="https://www.linkedin.com/company/azureusergroupsbrasil" target="_blank" rel="noopener noreferrer">LinkedIn</a></li>
<li><a href="https://www.meetup.com/azureusergroupsbrasil" target="_blank" rel="noopener noreferrer">Meetup</a></li>
</ul>

]]></content:encoded>
    </item>
    <item>
      <title>Atualização sobre a evolução do site: Temos mais Terraform, DNS-as-Code e multi-subscription</title>
      <link>https://www.orafaelferreira.com/artigos/artigo-terraform-infra-evolutiva</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/artigo-terraform-infra-evolutiva</guid>
      <pubDate>Sun, 14 Jun 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>A infraestrutura do blog saiu da migração inicial para um desenho mais maduro: subscriptions separadas, DNS como código, azapi e preservação de registros TXT.</description>
      <category>Artigos</category>
      <category>Azure</category>
      <category>Redes</category>
      <category>CI/CD</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/site-news/01.png" length="0" type="image/png" />
      <content:encoded><![CDATA[<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/site-news/01.png" alt="Imagem 01 - Capa cyberpunk" />

<h2 id="visao-geral">Visão Geral</h2>

<p>No <a href="https://www.orafaelferreira.com/artigos/artigo-terraform-infra-cicd" target="_blank" rel="noopener noreferrer">artigo anterior</a>, eu mostrei a base da construção do blog com Terraform, Azure Static Web Apps e GitHub Actions. Esse texto é o passo seguinte: o que eu evoluí depois que a primeira versão já estava no ar. A ideia aqui não é repetir o conteúdo anterior, é mostrar como a infraestrutura evoluiu depois dessa decisão.</p>
<p>A maior mudança dessa fase foi trazer o meu domínio <strong>orafaelferreira.com</strong> para dentro do Azure. Ele estava registrado e com o DNS na <strong>GoDaddy</strong>, e eu migrei a zona para o <strong>Azure DNS</strong>, assim me possibilitando gerenciar o domínio como código, junto com o resto da infraestrutura.</p>

<p>Com o domínio dentro do Azure, eu passo a:</p>

<ul>
<li>Centralização dos recursos no provider Azure</li>
<li>controlar a zona DNS via Terraform, no mesmo fluxo de IaC do site</li>
<li>reaproveitar o mesmo domínio em outros projetos e subdomínios</li>
<li>versionar e auditar cada mudança de registro como faço com qualquer outro recurso</li>
</ul>

<p>Algumas features:</p>

<ul>
<li>Terraform como infraestrutura como código (IaC)</li>
<li>domínio orafaelferreira.com migrado da GoDaddy para o Azure DNS</li>
<li>subscriptions separadas para site e DNS</li>
<li>DNS-as-Code com CNAME, A e TXT gerenciados no próprio Terraform</li>
<li>azapi para cobrir o que o provider não resolve e manter tudo em IaC</li>
</ul>

<h2 id="1-tirando-o-dominio-da-godaddy">1. Tirando o domínio da GoDaddy</h2>

<p>Antes, o orafaelferreira.com vivia inteiro na GoDaddy: registro e DNS no mesmo lugar, tudo editado na mão pelo painel. Funcionava, mas me prendia a cliques e deixava o DNS fora do meu fluxo de IaC.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/site-news/00.png" alt="Imagem 00 - Migração GoDaddy para Azure DNS com Terraform" />

<p>A migração foi direta: criei a zona no Azure DNS, recriei os registros que já existiam e apontei os name servers do domínio na GoDaddy para os name servers do Azure. A partir daí, a autoridade do DNS passou a ser o Azure.</p>
<p>Isso me abre espaço para reusar o orafaelferreira.com em outros laboratórios e projetos sem repetir configuração manual.</p>

<h2 id="2-duas-subscriptions">2. Duas subscriptions</h2>

<p>Aqui vou mostrar como trabalhar com duas subscriptions usando aliases de provider no Terraform. Em vez de depender de um único contexto, eu passo a indicar explicitamente onde cada recurso vive. Coisas que acontecem no dia a dia real, com ambientes de produção, que decidi espelhar e colocar em prática aqui.</p>

<div data-lang="terraform"><pre><code>provider "azurerm" {
  features {}
}

provider "azurerm" {
  alias           = "site"
  features        {}
  subscription_id = var.site_subscription_id != "" ? var.site_subscription_id : null
}

provider "azurerm" {
  alias           = "dns"
  features        {}
  subscription_id = var.dns_subscription_id != "" ? var.dns_subscription_id : null
}

provider "azapi" {
  alias           = "dns"
  subscription_id = var.dns_subscription_id != "" ? var.dns_subscription_id : null
}</code></pre></div>

<p>Visualmente, a arquitetura ficou assim:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/site-news/03.png" alt="Imagem 03 - Arquitetura multi-subscription" />



<h2 id="3-dns-com-iac">3. DNS com IAC</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/site-news/02.png" alt="Imagem 02 - Azure + DNS + Terraform" />

<p>Essa foi a parte que mais evoluiu em relação ao artigo anterior. Antes, a ideia era basicamente “subir o SWA e validar o domínio”. Agora o DNS também virou parte do código declarativo.</p>

<div data-lang="terraform"><pre><code>data "azurerm_dns_zone" "this" {
  provider            = azurerm.dns
  name                = "orafaelferreira.com"
  resource_group_name = data.azurerm_resource_group.dns_rg.name
}

resource "azurerm_dns_cname_record" "www" {
  provider            = azurerm.dns
  name                = "www"
  zone_name           = data.azurerm_dns_zone.this.name
  resource_group_name = data.azurerm_dns_zone.this.resource_group_name
  ttl                 = 3600
  record              = azurerm_static_web_app.this.default_host_name
}

resource "azurerm_static_web_app_custom_domain" "www" {
  provider          = azurerm.site
  static_web_app_id = azurerm_static_web_app.this.id
  domain_name       = "www.orafaelferreira.com"
  validation_type   = "cname-delegation"
}</code></pre></div>

<ul>
<li>o www aponta diretamente para o host do SWA</li>
<li>a validação passa a refletir o estado real do DNS</li>
</ul>

<h3 id="o-que-e-apex">O que é Apex?</h3>

<p>O <strong>apex</strong> (ou naked domain) é o domínio raiz, sem nenhum prefixo. No caso do meu site, "orafaelferreira.com" é o apex, enquanto "www.orafaelferreira.com" é um subdomínio. O apex é importante porque é a forma "limpa" e mais comum de acessar um site: quando alguém digita só "orafaelferreira.com", está acessando o apex.</p>

<p>O apex também ganhou tratamento próprio. Em vez de esconder isso atrás de configuração manual, eu explicitei o caminho do registro A e a validação por TXT.</p>

<div data-lang="terraform"><pre><code>locals {
  apex_txt_values = distinct(concat(
    var.apex_base_txt_records,
    [azurerm_static_web_app_custom_domain.apex.validation_token]
  ))
}

resource "azurerm_dns_a_record" "apex" {
  provider            = azurerm.dns
  name                = "@"
  zone_name           = data.azurerm_dns_zone.this.name
  resource_group_name = data.azurerm_dns_zone.this.resource_group_name
  ttl                 = 3600
  target_resource_id  = azurerm_static_web_app.this.id
}</code></pre></div>

<p>O detalhe importante está no distinct(concat(...)). Ele preserva os TXT base do domínio, como SPF, e adiciona o token de validação do Azure sem sobrescrever o que já existe.</p>

<p>Esse tipo de cuidado evita uma classe de erro chata: mudar o domínio para validar o SWA e quebrar outros usos do TXT sem perceber.</p>

<h2 id="4-por-que-usei-azapi">4. Por que usei azapi</h2>

<p>Nem tudo o que eu precisava encaixou bem no provider padrão do AzureRM. No caso do TXT do apex, eu usei azapi para garantir o controle do record set.</p>

<div data-lang="terraform"><pre><code>resource "azapi_resource" "apex_validation_txt" {
  provider  = azapi.dns
  type      = "Microsoft.Network/dnsZones/TXT@2018-05-01"
  name      = "@"
  parent_id = data.azurerm_dns_zone.this.id

  body = {
    properties = {
      TTL = 3600
      TXTRecords = [for value in local.apex_txt_values : {
        value = [value]
      }]
    }
  }
}</code></pre></div>

<p>Esse é um bom exemplo de onde o Terraform brilha: você não precisa forçar a solução para caber numa única ferramenta. Usa a melhor peça disponível para cada responsabilidade.</p>

<h2 id="5-o-site-continua-simples-mas-a-operacao-ficou-melhor">5. O site continua simples, mas a operação ficou melhor</h2>

<p>Mesmo com essa evolução, eu não quis transformar o blog numa plataforma altamente complexa.</p>

<p>O SWA continua sendo a base do hosting, e isso me ajuda porque ele entrega o suficiente sem exigir engenharia excessiva para um site pessoal.</p>

<h2 id="6-quando-esse-nivel-de-estrutura-faz-sentido">6. Quando esse nível de estrutura faz sentido</h2>

<p>Nem todo projeto precisa começar assim. Se você está montando um site simples e isolado, talvez uma subscription só e um conjunto mínimo de recursos já resolvam. Mas quando o projeto vira laboratório vivo, quando você quer experimentar, evoluir e manter tudo auditável, esse tipo de arquitetura começa a fazer sentido.</p>

<p>No meu caso, o blog é também um espaço para testar ideias que depois podem virar conteúdo, palestra ou prática de trabalho. Então vale a pena investir tempo e esforço nessa base.</p>

<h2 id="conclusao">Conclusão</h2>

<p>Tirar o orafaelferreira.com da GoDaddy e trazer o domínio para o Azure foi o que destravou tudo: o DNS deixou de ser um painel manual e isolado e passou a fazer parte do mesmo código que descreve o site para criar os registros DNS. Com isso, a infraestrutura saiu de uma migração funcional para um desenho em que o site e o domínio ficam melhor organizados. De quebra, o domínio fica pronto para ser reaproveitado em outros projetos, sempre via IaC. Isso me ajuda no meu vibe coding, compartilhando o troubleshooting com a IA.</p>

]]></content:encoded>
    </item>
    <item>
      <title>Microsoft Build 2026: os destaques de Azure que mais me chamaram atenção</title>
      <link>https://www.orafaelferreira.com/artigos/microsoft-build-2026-destaques-azure</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/microsoft-build-2026-destaques-azure</guid>
      <pubDate>Sun, 07 Jun 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Os anúncios do Microsoft Build 2026 que mais importam para quem trabalha com Azure: Cobalt 200, Azure Linux 4.0, Azure Container Linux, HorizonDB e Functions.</description>
      <category>Artigos</category>
      <category>IA</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/Ms.Build.localhost.flp/build.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<p>O <strong>Microsoft Build 2026</strong> veio recheado de anúncios, e a maior parte deles gira em torno de uma palavra: <strong>agentes</strong>. A plataforma está sendo recortada para suportar workloads agentic AI que raciocinam, tomam decisões em sequência e rodam continuamente em escala.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/Ms.Build.localhost.flp/build.png" alt="Destaques do Microsoft Build 2026 para Azure" />

<h2 id="visao-geral-do-build-2026">Visão geral do Build 2026</h2>

<p>O <strong>Microsoft Build</strong> é a conferência anual da Microsoft voltada para desenvolvedores, onde a empresa apresenta os principais lançamentos e atualizações da sua plataforma, de Azure e ferramentas de desenvolvimento a IA, dados e segurança. </p>
<a href="https://news.microsoft.com/build-2026/" target="_blank" rel="noopener noreferrer">Fonte oficial</a>

<h2 id="azure-cobalt-200">Azure Cobalt 200</h2>

<p>O <strong>early access preview do Azure Cobalt 200</strong> traz a segunda geração de VMs Arm-based da Microsoft, desenhada do zero para workloads cloud-native, escaláveis e baseadas em Linux, com foco explícito em agentic AI.</p>

<ul>
<li>até <strong>50% mais performance de CPU</strong> por geração sobre o Cobalt 100</li>
<li><strong>até 128 vCPUs por VM</strong>, com <strong>3 MB de cache L2 por core</strong> e <strong>192 MB de cache L3</strong> no nível de sistema</li>
<li><strong>criptografia de memória habilitada por padrão</strong>, com impacto de performance desprezível</li>
<li>ganhos reais expressivos: até 135% em banco de dados, 80% em caching e 45% em criptografia de comunicação</li>
</ul>

<a href="https://azure.microsoft.com/en-us/blog/new-azure-cobalt-200-vms-deliver-50-performance-improvement-fully-optimized-for-modern-agentic-ai-workloads/" target="_blank" rel="noopener noreferrer">Fonte oficial</a>

<h2 id="seguranca-para-codigo-agentes-e-modelos">Segurança para código, agentes e modelos</h2>

<p>Com agentes assumindo decisões antes feitas por código determinístico, a segurança muda de figura. A Microsoft trouxe anúncios focados em proteger código, agentes e modelos ao longo de todo o ciclo de desenvolvimento.</p>

<ul>
<li><strong>auditabilidade</strong> das atividades dos agentes e <strong>RBAC</strong> para controlar acesso</li>
<li><strong>circuit breakers</strong> e guardrails independentes do próprio agente</li>
<li>detecção de comportamento anômalo com possibilidade de intervenção humana a qualquer momento</li>
</ul>

<a href="https://www.microsoft.com/en-us/security/blog/2026/06/02/microsoft-build-2026-securing-code-agents-and-models-across-the-development-lifecycle/" target="_blank" rel="noopener noreferrer">Fonte oficial</a>

<h2 id="microsoft-marketplace-para-apps-e-agentes">Microsoft Marketplace para apps e agentes</h2>

<p>O Microsoft Marketplace ganhou destaque como canal para construir, escalar e monetizar aplicações e agentes.</p>

<ul>
<li>caminho unificado para publicar e distribuir apps e agentes</li>
<li>foco em ajudar desenvolvedores e ISVs a alcançar clientes e gerar receita</li>
</ul>

<a href="https://devblogs.microsoft.com/all-things-azure/build-scale-and-monetize-apps-and-agents-with-microsoft-marketplace/" target="_blank" rel="noopener noreferrer">Fonte oficial</a>


<h2 id="azure-horizondb">Azure HorizonDB</h2>

<p>O <strong>Azure HorizonDB (preview)</strong> é um serviço de banco totalmente gerenciado, cloud-native e construído sobre PostgreSQL, pensado para workloads tier-1 e aplicações de IA.</p>

<ul>
<li>arquitetura de <strong>compute e storage desacoplados</strong> com design de <strong>database-as-a-log</strong> para performance previsível e alta disponibilidade</li>
<li><strong>compatibilidade total com PostgreSQL</strong>, drivers, ORMs e SQL existentes migram com pouca ou nenhuma mudança de código</li>
<li><strong>dois endpoints</strong>: um de leitura/escrita (primário) e um reader que faz load-balance entre réplicas HA (hoje até 4, com plano de chegar a 8)</li>
<li><strong>pronto para IA</strong>: vector search, embeddings, hybrid search, reranking semântico e pipelines de IA, servindo como camada de memória e recuperação de conhecimento para agentes</li>
</ul>

<a href="https://aka.ms/HorizonDB-Build-blog" target="_blank" rel="noopener noreferrer">Fonte oficial</a>


<h2 id="azure-linux-40">Azure Linux 4.0</h2>

<p>O <strong>Azure Linux 4.0 (public preview)</strong> é a distribuição Linux open-source mantida pela própria Microsoft, construída para Azure, com footprint pequeno e postura de segurança endurecida.</p>

<ul>
<li>base no ecossistema <strong>Fedora</strong>, com a familiaridade dos pacotes <strong>RPM</strong></li>
<li><strong>kernel 6.18 LTS</strong> otimizado para Azure, com drivers Hyper-V e tuning específico</li>
<li>segurança forte: kernel lockdown, <strong>dm-verity</strong> para boot verificado, <strong>SELinux</strong> e <strong>FIPS 140-3</strong></li>
<li>pipeline de CVE com scan <strong>duas vezes por dia</strong> contra a NVD; ainda <strong>não indicado para produção</strong></li>
</ul>

<a href="https://techcommunity.microsoft.com/blog/linuxandopensourceblog/announcing-azure-linux-4-0-purpose-built-for-azure-now-in-public-preview/4524267" target="_blank" rel="noopener noreferrer">Fonte oficial</a>

<h2 id="azure-container-linux-acl">Azure Container Linux (ACL)</h2>

<p>O <strong>Azure Container Linux (ACL)</strong> é um sistema operacional imutável e container-optimized para node pools do AKS, derivado do projeto <strong>Flatcar Container Linux</strong> e já em <strong>GA a partir do AKS 1.34</strong>.</p>

<ul>
<li>diretório <code>/usr</code> read-only protegido por <strong>dm-verity</strong>, validando hash assinado em boot e runtime</li>
<li>superfície de ataque mínima e <strong>atualizações automáticas semanais</strong> baseadas em imagem</li>
<li><strong>SELinux em enforcing</strong> por padrão e <strong>Trusted Launch com Secure Boot e vTPM</strong> obrigatórios</li>
<li>criação direta com <code>az aks create --os-sku AzureContainerLinux</code>; atenção às limitações (sem Pod Sandboxing, Artifact Streaming e Confidential VMs)</li>
</ul>

<a href="https://techcommunity.microsoft.com/blog/linuxandopensourceblog/introducing-azure-container-linux-acl/4523411" target="_blank" rel="noopener noreferrer">Fonte oficial</a>

<h2 id="novidades-do-aks">Novidades do AKS</h2>

<p>O AKS recebeu um conjunto de anúncios no Build 2026 que ampliam o controle em toda a stack, da operação do cluster até treino e inferência de IA rodando em cima dele.</p>

<ul>
<li><strong>Managed system node pools no AKS Automatic (GA)</strong>: o Azure passa a cuidar do ciclo de vida dos nós de sistema (capacidade, patching, escala), evitando que os componentes do cluster disputem recursos com suas cargas, importante sobretudo em nós com GPU</li>
<li><strong>AKS on bare metal (preview)</strong>: roda o AKS em máquinas dedicadas <strong>sem hypervisor</strong>, com acesso direto a NVLink, RDMA e rede de alta performance, ideal para treino grande, inferência sensível a latência e pipelines de alto throughput</li>
<li><strong>Fleet Manager para clusters Arc-enabled (GA)</strong>: aplica updates, políticas e posicionamento de cargas em clusters dentro e fora do Azure a partir de um único control plane, com rollout progressivo e RBAC consistente</li>
<li><strong>Anyscale on Azure (preview)</strong>: traz o <strong>Ray gerenciado</strong> ao AKS para coordenar execução distribuída (GPUs e CPUs juntas, alocação fracionada de GPU), rodando dentro da sua subscription com Entra ID</li>
<li><strong>AI Runway + KAITO</strong> para servir modelos de forma Kubernetes-native: você escolhe o modelo, valida o ajuste à memória de GPU disponível e faz o deploy; o KAITO provisiona nós e sobe runtimes otimizados como <strong>vLLM</strong></li>
</ul>

<a href="https://techcommunity.microsoft.com/blog/appsonazureblog/whats-new-in-azure-kubernetes-service-at-microsoft-build-2026/4524862" target="_blank" rel="noopener noreferrer">Fonte oficial</a>

<h2 id="gestao-de-file-shares-mais-simples-e-escalavel-ga">Gestão de file shares mais simples e escalável (GA)</h2>

<p>O Azure Files ganhou um novo modelo de gerenciamento para <strong>file shares premium SSD (NFS)</strong>, agora em disponibilidade geral, em que cada share é criado, protegido, escalado e cobrado de forma independente, <strong>sem ficar amarrado à storage account</strong>.</p>

<ul>
<li><strong>Cada share é um recurso próprio</strong>, com performance, segurança e billing isolados (modelo provisioned v2), alinhando os limites aos limites reais da aplicação ou do tenant</li>
<li><strong>Escala maior e provisionamento mais rápido</strong>: até <strong>10.000 file shares por subscription por região</strong> e <strong>time-to-first-share 2,5x mais rápido</strong> que os shares clássicos</li>
<li><strong>Isolamento por share</strong>: restrições de rede, RBAC, política, snapshots e criptografia em trânsito definidos individualmente, ideal para cenários multi-tenant de SaaS</li>
<li><strong>Infraestrutura como código e visibilidade de custo</strong>: define naming, capacidade, IOPS, rede e tags em Bicep/ARM, com meters de billing por share para chargeback preciso</li>
</ul>

<a href="https://techcommunity.microsoft.com/blog/AzureStorageBlog/simpler-scalable-file-share-management-in-azure---now-generally-available/4523035" target="_blank" rel="noopener noreferrer">Fonte oficial</a>


<h2 id="outros-destaques">Outros destaques</h2>

<h3 id="project-solara">Project Solara</h3>

<ul>
<li><strong>Plataforma chip-to-cloud</strong> (codinome) criada do zero para experiências <strong>agent-first</strong> e para uma nova geração de dispositivos moldados ao redor de agentes, não de apps</li>
<li>Aposta em <strong>just-in-time UI</strong>: a interface do agente se adapta a diferentes telas e modalidades (voz, visão, toque) sem o desenvolvedor redesenhar para cada formato</li>
<li>Nasce <strong>enterprise-ready</strong>, com identidade (Entra ID), gestão (Intune), segurança e privacidade como fundação, além de ser <strong>extensível</strong> para você trazer seus próprios agentes</li>
<li>Primeiros conceitos de hardware incluem um <strong>dispositivo de crachá</strong> (portátil) e um <strong>dispositivo de mesa</strong>, com silício de MediaTek e Qualcomm</li>
</ul>

<a href="https://commandline.microsoft.com/project-solara-build-2026/" target="_blank" rel="noopener noreferrer">Fonte oficial</a>

<h3 id="microsoft-scout">Microsoft Scout</h3>

<ul>
<li><strong>Agente pessoal always-on</strong>, pensado para acompanhar o usuário de forma contínua</li>
<li>Conecta-se ao Microsoft 365 para agir sobre contexto real de trabalho, não só responder perguntas isoladas</li>
</ul>

<a href="https://www.microsoft.com/en-us/microsoft-365/blog/2026/06/02/introducing-microsoft-scout-your-always-on-personal-agent/" target="_blank" rel="noopener noreferrer">Fonte oficial</a>

<h3 id="modernizacao-agentic">Modernização agentic</h3>

<ul>
<li><strong>GitHub Copilot modernization agent</strong> chega à <strong>disponibilidade geral</strong>: operado pela CLI, atua como orquestrador que avalia prontidão de várias aplicações ao mesmo tempo, planeja jornadas específicas e automatiza upgrades de <strong>Java e .NET</strong></li>
<li>Integra-se ao fluxo nativo do GitHub criando <strong>issues, pull requests e relatórios de avaliação</strong> por aplicação, com coordenação assíncrona via coding agent e trilha de auditoria no <strong>Agent HQ</strong></li>
<li>Faz par com o <strong>Azure Copilot migration agent (preview)</strong>, que cobre o planejamento em escala de estate, descoberta, mapeamento de dependências, análise de ROI e wave planning, reduzindo meses de análise a minutos</li>
<li><strong>Custom skills (GA)</strong>: o time codifica padrões, bibliotecas e boas práticas em arquivos <code>skill.md</code> (formato aberto) e reaproveita em todo o portfólio</li>
<li>Resultado relatado pela Microsoft: modernização até <strong>4x mais rápida</strong> em centenas de milhares de apps legados .NET e Java</li>
</ul>

<a href="https://techcommunity.microsoft.com/blog/AppsonAzureBlog/closing-the-ai-readiness-gap-with-agentic-modernization/4524011" target="_blank" rel="noopener noreferrer">Fonte oficial</a>

<h3 id="microsoft-web-iq">Microsoft Web IQ</h3>

<ul>
<li><strong>Inteligência de busca para a web</strong>, trazendo dados e contexto atualizados para aplicações e agentes</li>
<li>Pensado para alimentar experiências de IA com informação fresca da web em vez de conhecimento estático</li>
</ul>

<a href="https://blogs.bing.com/search/June-2026/Announcing-Microsoft-Web-IQ" target="_blank" rel="noopener noreferrer">Fonte oficial</a>

<h2 id="azure-functions-no-build-2026">Azure Functions no Build 2026</h2>

<p>No serverless, a mensagem reforça uma direção clara: o <strong>Flex Consumption é onde as novidades chegam primeiro</strong>.</p>

<ul>
<li><strong>cold starts menores</strong> com instâncias always-ready e <strong>integração com rede virtual</strong></li>
<li><strong>per-function scaling</strong> e <strong>scale-out de até 1.000 instâncias</strong> (contra 200 do Consumption)</li>
<li><strong>mounts de Azure Files</strong> para binários grandes e modelos de ML sem empacotar no deploy</li>
</ul>
<a href="https://techcommunity.microsoft.com/blog/appsonazureblog/azure-functions-at-build-2026-update/4524075" target="_blank" rel="noopener noreferrer">Fonte oficial</a>

<h2 id="demos-do-build-2026">Demos do Build 2026</h2>

<p>Para ver na prática, seguem demos selecionadas do canal <strong>Microsoft Developer</strong>, todas gravadas no Build 2026. Cada uma é curta e vai direto ao ponto:</p>

<h3 id="openclaw-windows">OpenClaw + Windows</h3>

<ul>
<li>Mostra o <strong>OpenClaw rodando em conjunto com o Windows</strong>, no contexto da plataforma de desenvolvimento</li>
<li>Boa amostra de como ferramentas de agente se integram ao ambiente nativo do sistema</li>
<li>Teve a <strong>participação especial do fundador da Open Cloud</strong>, comentando um pouco de como ele está animado com o que está por vir</li>
</ul>

<a href="https://www.youtube.com/watch?v=J7ol1VDkg7w" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/J7ol1VDkg7w/hqdefault.jpg" alt="OpenClaw + Windows no Build 2026" /></a>

<a href="https://www.youtube.com/watch?v=J7ol1VDkg7w" target="_blank" rel="noopener noreferrer">Assistir no YouTube</a>

<h3 id="developer-experience-on-windows">Developer Experience on Windows</h3>

<ul>
<li>Um tour pela <strong>experiência de desenvolvimento no Windows</strong>, alinhada aos anúncios de ferramentas para devs (Coreutils, WSL, configurações otimizadas)</li>
<li>Útil para quem quer entender o caminho que a Microsoft está traçando para o fluxo de trabalho no Windows</li>
</ul>

<a href="https://www.youtube.com/watch?v=xVWHZkuhgys" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/xVWHZkuhgys/hqdefault.jpg" alt="Developer Experience on Windows no Build 2026" /></a>

<a href="https://www.youtube.com/watch?v=xVWHZkuhgys" target="_blank" rel="noopener noreferrer">Assistir no YouTube</a>

<h3 id="github-app-rayfin">GitHub App + Rayfin</h3>

<ul>
<li>Integração de um <strong>GitHub App com o Rayfin</strong>, ilustrando fluxos de automação e produtividade</li>
<li>Mostra na prática como conectar repositórios a automações de ponta a ponta</li>
</ul>

<a href="https://www.youtube.com/watch?v=gJX6MOyef8Q" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/gJX6MOyef8Q/hqdefault.jpg" alt="GitHub App + Rayfin no Build 2026" /></a>

<a href="https://www.youtube.com/watch?v=gJX6MOyef8Q" target="_blank" rel="noopener noreferrer">Assistir no YouTube</a>

<h3 id="microsoft-discovery">Microsoft Discovery</h3>

<ul>
<li>Demonstração do <strong>Microsoft Discovery</strong> aplicado a cenários de pesquisa e descoberta acelerada por IA</li>
<li>Dá uma ideia de como a IA encurta o tempo entre uma pergunta e uma resposta acionável</li>
</ul>

<a href="https://www.youtube.com/watch?v=uHtva5r9itY" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/uHtva5r9itY/hqdefault.jpg" alt="Microsoft Discovery no Build 2026" /></a>

<a href="https://www.youtube.com/watch?v=uHtva5r9itY" target="_blank" rel="noopener noreferrer">Assistir no YouTube</a>

<h3 id="mdash">MDASH</h3>

<ul>
<li><strong>MDASH</strong> é o codinome do <strong>sistema de varredura de segurança agêntica multimodelo</strong> da Microsoft Security, criado pela equipe de Segurança de Código Autônomo</li>
<li>Diferente de abordagens de modelo único, <strong>orquestra mais de 100 agentes de IA especializados</strong> (modelos de fronteira e destilados) para descobrir, debater e comprovar bugs exploráveis de ponta a ponta</li>
<li>Na prática, ajudou a encontrar <strong>16 novas vulnerabilidades</strong> na pilha de redes e autenticação do Windows, incluindo 4 falhas críticas de execução remota de código</li>
</ul>

<a href="https://www.youtube.com/watch?v=8QBDaRbur70" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/8QBDaRbur70/hqdefault.jpg" alt="MDASH no Build 2026" /></a>

<a href="https://www.youtube.com/watch?v=8QBDaRbur70" target="_blank" rel="noopener noreferrer">Assistir no YouTube</a>

<h2 id="resumo-brabo-do-que-vem-por-ai-tudo-aponta-para-agentes">Resumo brabo do que vem por ai: tudo aponta para agentes</h2>

]]></content:encoded>
    </item>
    <item>
      <title>Azure Container Registry Artifact Cache: arquitetura, segurança e promoção entre ambientes</title>
      <link>https://www.orafaelferreira.com/artigos/azure-container-registry-artifact-cache</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/azure-container-registry-artifact-cache</guid>
      <pubDate>Sun, 31 May 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Guia prático de Artifact Cache no Azure Container Registry: arquitetura, segurança, pull-through cache e promoção de imagens entre ambientes.</description>
      <category>Artigos</category>
      <category>Kubernetes</category>
      <category>CI/CD</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2026/acr-cache/00.png" length="0" type="image/png" />
      <content:encoded><![CDATA[

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2026/acr-cache/00.png" alt="Capa do artigo sobre Azure Container Registry Artifact Cache" />

<p>Este artigo faz parte da série sobre Docker e containers, agora com foco em <strong>Azure Container Registry (ACR) Artifact Cache</strong>.</p>

<p>Se você trabalha com AKS, App Service, Functions, Container Apps ou pipelines de CI/CD, provavelmente já enfrentou pelo menos um destes problemas:</p>

<ul>
<li>limite de pull em registries públicos</li>
<li>latência e instabilidade para baixar imagens em horário de pico</li>
<li>dependência direta de registry externo em ambiente de produção</li>
<li>excesso de credenciais espalhadas para autenticação entre registries</li>
</ul>

<p>O Artifact Cache do ACR resolve esse conjunto com uma abordagem de <strong>pull-through cache</strong>: você continua puxando imagem com o nome do seu ACR, e a plataforma busca e armazena o conteúdo do upstream no primeiro pull.</p>

<h2 id="onde-a-docker-entra-diretamente-neste-desenho">Onde a Docker entra diretamente neste desenho</h2>

<p>Mesmo sendo um recurso do ACR, a operação do dia a dia passa por componentes do ecossistema Docker:</p>

<ul>
<li><strong>Docker Engine</strong> no host de build ou no workstation</li>
<li><strong>Docker CLI</strong> para validar e executar comandos como pull, tags e comportamento do cache</li>
<li><strong>Docker Hub</strong> como upstream comum para imagens base e imagens de runtime</li>
<li><strong>Formato OCI de imagens</strong> — o mais comum no ecossistema Docker e runtimes cloud-native, mas não o único.</li>
</ul>

<p>Na prática, boa parte do valor aparece quando você tira dependência direta de pull no Docker Hub em momentos de pico e passa a concentrar distribuição via ACR com cache local.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2026/acr-cache/1.png" alt="Diagrama do ACR como cache local entre Docker Hub e clusters" />

<h2 id="o-que-e-artifact-cache-na-pratica">O que é Artifact Cache, na prática</h2>

<p>Pense no Artifact Cache como uma camada de distribuição local para imagens:</p>

<p>1. Seu runtime (AKS, por exemplo) faz pull em <code>meuacr.azurecr.io/time/api:1.0.0</code>.</p>
<p>2. Se a imagem ainda não estiver no cache, o ACR busca no upstream definido na regra.</p>
<p>3. O cliente recebe a imagem e, em paralelo, o ACR persiste o conteúdo de forma assíncrona.</p>
<p>4. Nos próximos pulls, a entrega sai do próprio ACR.</p>

<p>Esse comportamento reduz dependência de internet no caminho crítico, melhora previsibilidade de pull e permite aplicar controle de rede/segurança dentro do seu perímetro Azure.</p>

<h2 id="quando-esse-recurso-brilha">Quando esse recurso brilha</h2>

<h3 id="1-escala-em-cluster">1. Escala em cluster</h3>

<p>Quando muitos nós sobem ao mesmo tempo (rolling update, autoscale, node replacement), o cache reduz pressão no upstream e no egress externo.</p>

<h3 id="2-promocao-de-imagens-entre-ambientes">2. Promoção de imagens entre ambientes</h3>

<p>Você pode manter repositórios separados por ambiente (dev, staging e prod) e usar o cache para padronizar o consumo de imagens no destino.</p>

<h3 id="3-ambientes-restritos-por-rede">3. Ambientes restritos por rede</h3>

<p>Com Private Link bem configurado, você evita expor pipeline e runtime diretamente ao registry externo.</p>

<h2 id="upstreams-suportados-resumo">Upstreams suportados (resumo)</h2>

<h3 id="o-que-e-um-upstream">O que é um upstream?</h3>

<p>No contexto do Artifact Cache, <strong>upstream</strong> é o registry de origem de onde o ACR vai buscar a imagem quando ela não estiver em cache. É o registry "de fora", pode ser Docker Hub, GHCR, Quay ou até outro ACR.</p>

<p>Quando você configura uma cache rule, você define:</p>

<ul>
<li><strong>source-repo</strong>: o caminho no upstream (ex.: <code>docker.io/library/nginx</code>)</li>
<li><strong>target-repo</strong>: o caminho dentro do seu ACR onde o conteúdo ficará espelhado (ex.: <code>mirror/library/nginx</code>)</li>
</ul>

<p>Na prática, o upstream só é acessado no primeiro pull de uma tag. Depois, o ACR serve o conteúdo localmente. Se o upstream ficar indisponível, imagens já em cache continuam acessíveis, esse é o ganho de resiliência do padrão.</p>

<p>De acordo com a documentação oficial, o Artifact Cache suporta vários registries upstream, com diferenças de autenticação por fonte. Alguns exemplos:</p>

<ul>
<li>Docker Hub (somente autenticado)</li>
<li>Azure Container Registry (somente autenticado)</li>
<li>GHCR (autenticado e não autenticado)</li>
<li>Quay (autenticado e não autenticado)</li>
<li>registry.k8s.io (CLI)</li>
<li>Microsoft Artifact Registry (não autenticado)</li>
</ul>

<h3 id="exemplo-com-docker-hub-como-upstream">Exemplo com Docker Hub como upstream</h3>

<p>Um padrão comum é cachear imagens oficiais usadas como base de aplicações:</p>

<div data-lang="bash"><pre><code>az acr cache create \
  --registry "acrpocprod" \
  --name "dockerhub-nginx" \
  --source-repo "docker.io/library/nginx" \
  --target-repo "mirror/library/nginx" \
  --cred-set "DockerHubCredSet"</code></pre></div>

<p>Depois, em vez de puxar direto do Docker Hub, seu ambiente passa a consumir:</p>

<div data-lang="bash"><pre><code>docker pull acrpocprod.azurecr.io/mirror/library/nginx:stable</code></pre></div>

<h2 id="limites-e-comportamento-que-voce-precisa-saber">Limites e comportamento que você precisa saber</h2>

<p>Esses pontos costumam gerar dúvida em troubleshooting:</p>

<p>1. O cache <strong>não é prefetch automático de novas tags</strong>. A tag só entra quando alguém puxa.</p>
<p>2. Limite de <strong>até 1.000 cache rules</strong> por registry.</p>
<p>3. Regras <strong>não podem sobrepor</strong> namespace/caminho.</p>
<p>4. O primeiro pull pode sofrer latência maior; os seguintes tendem a ser mais estáveis.</p>
<p>5. Em cenários com upstream privado, o upstream exige autenticação.</p>

<h2 id="matriz-de-decisao-rapida">Matriz de decisão rápida</h2>
<div><table><thead><tr><th>Cenário</th><th>Recomendação</th></tr></thead><tbody><tr><td>Docker Hub público com limite de pull</td><td>Artifact Cache + credential set</td></tr><tr><td>Promoção entre ambientes com registries distintos</td><td>Artifact Cache + regra por repositório</td></tr><tr><td>Necessidade de menor blast radius de secret</td><td>Preferir credenciais com escopo mínimo e rotação</td></tr><tr><td>Upstream em rede restrita</td><td>Validar Trusted Services e ACLs no source</td></tr><tr><td>Cross-tenant</td><td>Planejar autenticação explícita por credencial</td></tr></tbody></table></div>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2026/acr-cache/3.png" alt="Matriz de decisão para uso do Artifact Cache no ACR" />

<h2 id="troubleshooting-objetivo">Troubleshooting objetivo</h2>

<h3 id="erro-de-autorizacao-no-cache-rule">Erro de autorização no cache rule</h3>

<ul>
<li>Confirme se a identidade foi anexada ao ACR downstream.</li>
<li>Confirme o role assignment no upstream com escopo correto.</li>
<li>Verifique se a autenticação configurada na cache rule está correta.</li>
</ul>

<h3 id="primeiro-pull-funciona-mas-desempenho-nao-melhora">Primeiro pull funciona, mas desempenho não melhora</h3>

<ul>
<li>Lembre que a cópia é assíncrona.</li>
<li>Aguarde alguns instantes e repita pull para validar efeito de cache.</li>
<li>Confira eventos/logs e permissão de leitura no upstream.</li>
</ul>

<h3 id="regra-nao-cria-por-conflito">Regra não cria por conflito</h3>

<ul>
<li>Regras de cache não podem se sobrepor.</li>
<li>Revise namespace de <code>target-repo</code> e caminhos de <code>source-repo</code>.</li>
</ul>

<h3 id="ambientes-com-rede-restrita">Ambientes com rede restrita</h3>

<ul>
<li>Verifique regras de firewall/private endpoint do upstream.</li>
<li>Quando aplicável, habilite Trusted Services no source.</li>
</ul>

<h2 id="boas-praticas-para-ambiente-real">Boas práticas para ambiente real</h2>

<p>1. Padronize naming de cache rule por domínio/time/produto.</p>
<p>2. Separe namespace de cache por ambiente (ex.: <code>promoted/</code>, <code>quarantine/</code>).</p>
<p>3. Use tags imutáveis para promoção crítica (ou controle rigoroso de retag).</p>
<p>4. Evite escopo amplo de permissão quando ABAC estiver habilitado.</p>
<p>5. Adicione validação em pipeline para garantir que a regra de cache existe antes do deploy.</p>
<p>6. Monitore latência de pull e falhas de autenticação como indicadores de saúde.</p>

<h2 id="exemplo-de-fluxo-de-promocao-com-governanca">Exemplo de fluxo de promoção com governança</h2>

<p>1. Build publica imagem em <code>devregistry.azurecr.io/team-a/api:1.4.0</code>.</p>
<p>2. Pipeline de qualidade executa scan e testes.</p>
<p>3. Aprovado, o pipeline dispara pull no destino:</p>

<div data-lang="bash"><pre><code>docker pull prodregistry.azurecr.io/promoted/team-a/api:1.4.0</code></pre></div>

<p>4. Esse pull alimenta o cache no prod.</p>
<p>5. Clusters de produção consomem do ACR de produção.</p>

<p>Esse padrão simplifica governança e reduz scripts customizados de import, sem abrir mão de rastreabilidade.</p>


<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2026/acr-cache/2.png" alt="Fluxo de promoção de imagens entre ambientes com Artifact Cache" />

<h2 id="boas-praticas">Boas práticas</h2>

<p>1. Mantenha imagens base oficiais e versionadas (evite depender sempre de <code>latest</code>).</p>
<p>2. Use tags imutáveis para promover release entre ambientes.</p>
<p>3. Reduza pulls diretos em registry público durante janela crítica de deploy.</p>
<p>4. Centralize auditoria de consumo de imagem no registry corporativo.</p>

<h2 id="conclusao">Conclusão</h2>

<p>O Azure Container Registry Artifact Cache não é apenas um recurso de conveniência. Em plataformas com muitos deploys e múltiplos ambientes, ele vira uma camada de resiliência operacional.</p>

<p>Combinando:</p>

<ul>
<li>pull-through cache</li>
<li>identidade gerenciada</li>
<li>RBAC/ABAC bem definido</li>
<li>segmentação de namespace por ambiente</li>
</ul>

<p>Você constrói uma estratégia mais segura, previsível e escalável para distribuição de imagens.</p>

<p>Para quem já está nessa pegada de Docker + Kubernetes + Azure, o Artifact Cache é um passo natural para maturidade de supply chain de containers.</p>

<h2 id="referencias">Referências</h2>

<ul>
<li><a href="https://learn.microsoft.com/azure/container-registry/artifact-cache-overview" target="_blank" rel="noopener noreferrer">Microsoft Learn: Optimize image pulls with artifact cache in Azure Container Registry</a></li>
<li><a href="https://learn.microsoft.com/cli/azure/acr/cache" target="_blank" rel="noopener noreferrer">Azure CLI: az acr cache</a></li>
<li><a href="https://docs.docker.com/docker-hub/usage/" target="_blank" rel="noopener noreferrer">Docker Docs: Docker Hub usage and limits</a></li>
<li><a href="https://docs.docker.com/reference/cli/docker/image/pull/" target="_blank" rel="noopener noreferrer">Docker Docs: docker pull reference</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>O Dia em que Derrubei Produção em Plena Sexta-Feira e o log tava com meu nome – Code Island Ctrl Z 2026</title>
      <link>https://www.orafaelferreira.com/artigos/code-island-ctrlz-2026</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/code-island-ctrlz-2026</guid>
      <pubDate>Wed, 20 May 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>No Code Island Ctrl Z 2026 contei como derrubei produção numa sexta-feira, o que aprendi com o incidente e por que a cultura blameless importa.</description>
      <category>Palestras</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/ctrl+z26/00.jpeg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/ctrl+z26/00.jpeg" alt="Banner do Code Island Ctrl Z 2026 na UniCesusc" />

<p>No dia <strong>16 de maio de 2026</strong>, rolou o <a href="https://codeisland.com.br/ctrlz" target="_blank" rel="noopener noreferrer"><strong>Code Island Ctrl Z</strong></a> na UniCesusc, em Florianópolis/SC – um evento presencial focado em cases reais, erros honestos e aprendizados práticos de quem já "derrubou produção" e sobreviveu para contar a história.</p>

<h2 id="sobre-o-evento">Sobre o evento</h2>

<p>O Ctrl Z nasceu para mostrar que todo mundo erra – até quem está no palco. Foram <strong>14 palestrantes</strong>, 150 vagas, 8 horas de conteúdo e muita troca sobre DEV, DATA, DEVOPS e CLOUD.</p>

<strong>Local:</strong> UniCesusc – SC-401, 9301 – Santo Antonio de Lisboa, Florianópolis/SC

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/ctrl+z26/001.jpg" alt="Entrada do Code Island Ctrl Z 2026 na UniCesusc" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/ctrl+z26/0.jpg" alt="Público reunido no auditório do Code Island Ctrl Z" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/ctrl+z26/2.jpg" alt="Abertura do Code Island Ctrl Z 2026 em Florianópolis" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/ctrl+z26/3.jpg" alt="Participantes acompanhando as palestras do Ctrl Z 2026" />

<h2 id="meu-case-o-dia-em-que-derrubei-producao-em-plena-sexta-feira-e-o-log-tava-com-me">Meu case: O Dia em que Derrubei Produção em Plena Sexta-Feira e o log tava com meu nome</h2>

<p>> Sim, eu derrubei a produção. E sim, meu nome estava no log.</p>

<p>O ambiente era crítico, o impacto foi imediato e o culpado tinha nome e sobrenome gravados no log do sistema. Mas o mais importante não foi o erro técnico – foi o que veio depois:</p>

<ul>
<li>Como manter a calma quando o negócio está perdendo dinheiro?</li>
<li>Como comunicar o problema sem perder a confiança do time?</li>
<li>O que fazer para o erro não se repetir?</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/ctrl+z26/1.jpg" alt="Rafael Ferreira contando o case de derrubar produção na sexta-feira" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/ctrl+z26/4.jpg" alt="Rafael Ferreira palestrando no Code Island Ctrl Z 2026" />

<h2 id="aprendizados-que-compartilhei">Aprendizados que compartilhei</h2>

<ul>
<li>Todo mundo vai errar – o que diferencia é como você reage</li>
<li>Transparência e comunicação são mais importantes que buscar culpados</li>
<li>Ter processo de rollback e monitoramento salva seu emprego</li>
<li>Cultura de blameless postmortem: aprender, não punir</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/ctrl+z26/7.jpg" alt="Slide sobre blameless postmortem na palestra do Ctrl Z" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/ctrl+z26/8.jpg" alt="Rafael Ferreira compartilhando aprendizados sobre incidentes em produção" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/ctrl+z26/9.jpg" alt="Público interagindo durante a palestra no Code Island Ctrl Z" />


<h2 id="local-e-estrutura">Local e estrutura</h2>

<p>O UniCesusc fica na SC-401, fácil acesso de carro, Uber, ônibus. Estacionamento disponível, acessibilidade garantida, e toda a estrutura para receber a galera tech de Floripa e região.</p>

<h2 id="links-e-materiais">Links e materiais</h2>

<ul>
<li><a href="https://stoblobcertificados011.blob.core.windows.net/palestras/ctrlz.pdf" target="_blank" rel="noopener noreferrer">Slides da Apresentação</a></li>
<li><a href="https://www.linkedin.com/posts/orafaelferreiraa_codeisland-ctrlz-devops-share-7453042662477062144-nXTz?utm_source=share&utm_medium=member_desktop&rcm=ACoAAAiBr9cBknrEzJyFEqCS03tes6G6R1yclRw" target="_blank" rel="noopener noreferrer">Post divulgação do evento</a></li>
</ul>

<h2 id="quer-participar-dos-proximos">Quer participar dos próximos?</h2>

<p>Fique ligado nas redes da <a href="https://codeisland.com.br" target="_blank" rel="noopener noreferrer">Code Island</a> e acompanhe os próximos eventos!</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/ctrl+z26/10.jpg" alt="Palestrantes e organização do Code Island Ctrl Z 2026" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/ctrl+z26/11.jpg" alt="Comunidade Code Island reunida no encerramento do Ctrl Z" />

]]></content:encoded>
    </item>
    <item>
      <title>Global Azure Floripa 2026 (Evento Presencial)</title>
      <link>https://www.orafaelferreira.com/artigos/global-azure-floripa-2026</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/global-azure-floripa-2026</guid>
      <pubDate>Sun, 17 May 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Mais uma edição do Global Azure em Florianópolis, organizada pelo Azure User Groups Brasil com trilhas práticas de cloud, IA e DevOps.</description>
      <category>Organização de Eventos</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/AUGBGA26/00.png" length="0" type="image/png" />
      <content:encoded><![CDATA[

<h2 id="global-azure-floripa-2026">Global Azure Floripa 2026</h2>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/AUGBGA26/00.png" alt="Banner do Global Azure Floripa 2026" />

<p>No dia <strong>18 de abril de 2026</strong>, aconteceu o <a href="https://www.meetup.com/azureusergroupsbrasil/events/313851322/" target="_blank" rel="noopener noreferrer"><strong>Global Azure User Group Floripa 2026</strong></a> no <strong>Colégio Alpha</strong>, em São José/SC, com temas sobre Azure, carreira internacional, segurança, arquitetura cloud native e DevOps.</p>

<p>O evento reuniu profissionais, estudantes e entusiastas para discutir tendências e casos práticos sobre <strong>Microsoft Azure</strong>, <strong>IA</strong> e <strong>DevOps</strong>.</p>

<p>Se você perdeu essa edição, este post reúne o panorama oficial do evento, com agenda, palestras e registros dos palestrantes.</p>

<h2 id="organizadores">Organizadores</h2>

<ul>
<li><strong><a href="https://www.linkedin.com/in/orafaelferreiraa/" target="_blank" rel="noopener noreferrer">Rafael Martin Alves Ferreira</a></strong></li>
<li><strong><a href="https://www.linkedin.com/in/viniciusdeschamps/" target="_blank" rel="noopener noreferrer">Vinicius Deschamps</a></strong></li>
</ul>

<h2 id="sobre-o-evento">Sobre o evento</h2>

<ul>
<li><strong>Nome:</strong> Global Azure Floripa 2026</li>
<li><strong>Cidade:</strong> São José</li>
<li><strong>Local:</strong> Colégio Alpha</li>
<li><strong>Endereço:</strong> Rua Vereador Walter Borges, 424, São José - SC</li>
</ul>

<h2 id="sobre-o-global-azure">Sobre o Global Azure</h2>

<p>O <a href="https://globalazure.net/" target="_blank" rel="noopener noreferrer">Global Azure</a> é uma iniciativa mundial em que comunidades locais realizam eventos para compartilhar conhecimento sobre Microsoft Azure e acelerar a evolução técnica de quem está na linha de frente.</p>

<h2 id="agenda-oficial">Agenda oficial</h2>

<h3 id="manha">Manhã</h3>

<ul>
<li><strong>09:00 - 10:00</strong></li>
</ul>
<p>Arquitetura Celular na Era Cloud Native: Estratégias Modernas com Microsoft Azure  </p>
<p>Palestrante: <a href="https://www.linkedin.com/in/cfraposo/" target="_blank" rel="noopener noreferrer">Claudio Raposo</a></p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/AUGBGA26/claudio.jpg" alt="Claudio Raposo palestrando no Global Azure Floripa 2026" />

<ul>
<li><strong>10:00 - 11:00</strong></li>
</ul>
<p>Azure Virtual Desktop: como acelerar seu negócio em minutos  </p>
<p>Palestrante: <a href="https://www.linkedin.com/in/leomozzer/" target="_blank" rel="noopener noreferrer">Leonardo Souza</a></p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/AUGBGA26/leonardo.jpg" alt="Leonardo Souza palestrando no Global Azure Floripa 2026" />

<ul>
<li><strong>11:00 - 12:00</strong></li>
</ul>
<p>Carreira internacional: como ganhar XP e se dar bem nas fases do jogo  </p>
<p>Palestrante: <a href="https://www.linkedin.com/in/lorenalocks/?locale=en" target="_blank" rel="noopener noreferrer">Lore Locks Coelho</a></p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/AUGBGA26/lorena.jpg" alt="Lore Locks Coelho palestrando no Global Azure Floripa 2026" />

<h3 id="almoco">Almoço</h3>

<ul>
<li><strong>12:00 - 13:30</strong></li>
</ul>
<p>Almoço</p>

<h3 id="tarde">Tarde</h3>

<ul>
<li><strong>13:30 - 14:30</strong></li>
</ul>
<p>Reactive DDD na prática: Modelagem event-first e integração reativa em alta escala  </p>
<p>Palestrante: <a href="https://www.linkedin.com/in/antoniofalcaojr/" target="_blank" rel="noopener noreferrer">Antonio Falcao Jr</a></p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/AUGBGA26/antonio.jpeg" alt="Antonio Falcao Jr palestrando no Global Azure Floripa 2026" />

<ul>
<li><strong>14:30 - 15:30</strong></li>
</ul>
<p>Segurança sem gambiarra: usando HSM para proteger o que realmente importa  </p>
<p>Palestrante: <a href="https://www.linkedin.com/in/viniciusdeschamps/" target="_blank" rel="noopener noreferrer">Vinicius Deschamps</a></p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/AUGBGA26/vinicius.jpeg" alt="Vinicius Deschamps palestrando no Global Azure Floripa 2026" />

<ul>
<li><strong>15:30 - 16:30</strong></li>
</ul>
<p>Vibe Coding com DevOps: usei IA pra criar meu site no Azure, mas quem fez o deploy fui EU  </p>
<p>Palestrante: <a href="https://www.linkedin.com/in/orafaelferreiraa/" target="_blank" rel="noopener noreferrer">Rafael Ferreira</a></p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/AUGBGA26/rafael.jpg" alt="Rafael Ferreira palestrando no Global Azure Floripa 2026" />


<h3 id="comunidade-presente">Comunidade presente</h3>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/AUGBGA26/galera.jpg" alt="Comunidade reunida no Global Azure Floripa 2026" />

<h2 id="links-oficiais">Links oficiais</h2>

<ul>
<li><a href="https://global-azure-floripa-2026.sessionize.com/" target="_blank" rel="noopener noreferrer">Agenda e detalhes no Sessionize</a></li>
</ul>

<h2 id="apoio-local">Apoio local</h2>

<p>Esta edição contou com apoio da <strong><a href="https://www.alphaeducacao.com.br" target="_blank" rel="noopener noreferrer">Alpha Educação</a></strong>.</p>

<h2 id="conecte-se-com-a-comunidade">Conecte-se com a comunidade</h2>

<p>Se você quiser acompanhar os próximos encontros e participar da comunidade:</p>

<ul>
<li><a href="https://azureusergroupsbrasil.com.br/" target="_blank" rel="noopener noreferrer">Site oficial</a></li>
<li><a href="https://linktr.ee/azureusergroupsbrasil" target="_blank" rel="noopener noreferrer">Linktree</a></li>
<li><a href="https://chat.whatsapp.com/HSpFnNyo9ZLD4RJrvEcrrl" target="_blank" rel="noopener noreferrer">Grupo no WhatsApp</a></li>
<li><a href="https://www.youtube.com/@azureusergroupsbrasil?sub_confirmation=1" target="_blank" rel="noopener noreferrer">YouTube</a></li>
<li><a href="https://www.linkedin.com/company/azureusergroupsbrasil" target="_blank" rel="noopener noreferrer">LinkedIn</a></li>
<li><a href="https://www.meetup.com/azureusergroupsbrasil" target="_blank" rel="noopener noreferrer">Meetup</a></li>
</ul>

<p>Obrigado a todos que participaram presencialmente e ajudaram a fortalecer o ecossistema cloud em Santa Catarina e no Brasil.</p>

]]></content:encoded>
    </item>
    <item>
      <title>Vibe Coding com DevOps: usei IA pra criar meu site, mas quem fez o deploy fui EU - Global Azure User Group Floripa 2026</title>
      <link>https://www.orafaelferreira.com/artigos/global-azure-user-group-floripa-2026</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/global-azure-user-group-floripa-2026</guid>
      <pubDate>Sat, 02 May 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Relato do Global Azure User Group Floripa 2026 no Colégio Alpha, em São José/SC: palestra Vibe Coding com DevOps, agenda completa e comunidade Azure em SC.</description>
      <category>Palestras</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/globaaz26/00.png" length="0" type="image/png" />
      <content:encoded><![CDATA[

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/globaaz26/00.png" alt="Banner do Global Azure User Group Floripa 2026" />

<p>No dia <strong>18 de abril de 2026</strong>, aconteceu o <a href="https://www.meetup.com/azureusergroupsbrasil/events/313851322/" target="_blank" rel="noopener noreferrer"><strong>Global Azure User Group Floripa 2026</strong></a> no <strong>Colégio Alpha</strong>, em São José/SC, com temas sobre Azure, carreira internacional, segurança, arquitetura cloud native e DevOps.</p>

<p>Evento organizado por mim e <strong><a href="https://www.linkedin.com/in/viniciusdeschamps/" target="_blank" rel="noopener noreferrer">Vinicius Deschamps</a></strong>, representando a comunidade <a href="https://azureusergroupsbrasil.com.br/" target="_blank" rel="noopener noreferrer"><strong>Azure User Groups Brasil</strong></a>.</p>

<h2 id="sobre-o-global-azure">Sobre o Global Azure</h2>

<p>O <a href="https://globalazure.net/" target="_blank" rel="noopener noreferrer">Global Azure</a> é uma iniciativa mundial em que comunidades locais realizam eventos para compartilhar conhecimento sobre Microsoft Azure e acelerar a evolução técnica de quem está na linha de frente.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/globaaz26/4.jpg" alt="Participantes reunidos no Colégio Alpha em São José" />

<h2 id="agenda-oficial">Agenda oficial</h2>

<h3 id="manha">Manhã</h3>
<div><table><thead><tr><th>Horário</th><th>Palestrante</th><th>Sessão</th></tr></thead><tbody><tr><td>09:00 - 10:00</td><td>Claudio Raposo</td><td>Arquitetura Celular na Era Cloud Native: Estratégias Modernas com Microsoft Azure</td></tr><tr><td>10:00 - 11:00</td><td>Leonardo Souza</td><td>Azure Virtual Desktop: como acelerar seu negócio em minutos</td></tr><tr><td>11:00 - 12:00</td><td>Lore Locks Coelho</td><td>Carreira internacional: como ganhar XP e se dar bem nas fases do jogo</td></tr></tbody></table></div>
<h3 id="almoco">Almoço</h3>
<div><table><thead><tr><th>Horário</th><th>Sessão</th></tr></thead><tbody><tr><td>12:00 - 13:30</td><td>Almoço</td></tr></tbody></table></div>
<h3 id="tarde">Tarde</h3>
<div><table><thead><tr><th>Horário</th><th>Palestrante</th><th>Sessão</th></tr></thead><tbody><tr><td>13:30 - 14:30</td><td>Antonio Falcao Jr</td><td>Reactive DDD na prática: Modelagem event-first e integração reativa em alta escala</td></tr><tr><td>14:30 - 15:30</td><td>Vinicius Deschamps</td><td>Segurança sem gambiarra: usando HSM para proteger o que realmente importa</td></tr><tr><td>15:30 - 16:30</td><td>Rafael Ferreira</td><td>Vibe Coding com DevOps: usei IA pra criar meu site no Azure, mas quem fez o deploy fui EU</td></tr></tbody></table></div>
<h2 id="minha-palestra">Minha palestra</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/globaaz26/1.jpg" alt="Rafael Ferreira palestrando no Global Azure Floripa 2026" />


<p>Nessa edição, apresentei a sessão sozinho, trazendo um case prático sobre como usar IA para acelerar desenvolvimento sem abrir mão de engenharia.</p>

<p>Tema da sessão:</p>

<strong>Vibe Coding com DevOps: usei IA pra criar meu site no Azure, mas quem fez o deploy fui EU</strong>

<p>Abordei principalmente:</p>

<ul>
<li>como usar IA para aumentar produtividade sem terceirizar pensamento técnico</li>
<li>limites de código gerado sem processo de qualidade</li>
<li>papel de CI/CD, validações e ownership técnico no deploy</li>
<li>porque "entregar" não é só subir código, e garantir confiabilidade</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/globaaz26/3.jpg" alt="Slide da palestra Vibe Coding com DevOps no Global Azure" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/globaaz26/2.jpg" alt="Público acompanhando a sessão sobre IA e DevOps" />

<h2 id="comunidade-azure-user-groups-brasil">Comunidade Azure User Groups Brasil</h2>

<p>Se você quiser participar da comunidade:</p>

<ul>
<li><a href="https://chat.whatsapp.com/HSpFnNyo9ZLD4RJrvEcrrl" target="_blank" rel="noopener noreferrer"><strong>WhatsApp</strong></a></li>
<li><a href="https://www.youtube.com/@azureusergroupsbrasil" target="_blank" rel="noopener noreferrer"><strong>YouTube</strong></a></li>
<li><a href="https://www.linkedin.com/company/azureusergroupsbrasil" target="_blank" rel="noopener noreferrer"><strong>LinkedIn</strong></a></li>
</ul>

<a href="https://www.linkedin.com/posts/orafaelferreiraa_palestra-confirmada-do-azure-user-groups-activity-7446882073878929409-aeCr?utm_source=share&utm_medium=member_desktop&rcm=ACoAAAiBr9cBknrEzJyFEqCS03tes6G6R1yclRw" target="_blank" rel="noopener noreferrer">LinkedIn Post Divulgação evento</a>

<h2 id="conteudos-da-sessao">Conteúdos da sessão</h2>

<p>Os slides da minha sessão estão disponíveis:</p>

<ul>
<li><i></i> <a href="https://stoblobcertificados011.blob.core.windows.net/palestras/GlobalAzure26.pdf" target="_blank" rel="noopener noreferrer"><strong>Slides da Apresentação</strong></a></li>
</ul>

<ul>
<li><i></i> <a href="https://github.com/orafaelferreiraa/orafaelferreira-com" target="_blank" rel="noopener noreferrer"><strong>Repositório do Site</strong></a></li>
</ul>

]]></content:encoded>
    </item>
    <item>
      <title>Imagens de contêiners Python no Kubernetes: comparação técnica e estratégia com Distroless</title>
      <link>https://www.orafaelferreira.com/artigos/docker-python-distroless-kubernetes</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/docker-python-distroless-kubernetes</guid>
      <pubDate>Tue, 28 Apr 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Comparação prática entre imagens de contêiners Python (slim, alpine e distroless) e como aplicar técnicas com foco em segurança e workloads no Kubernetes.</description>
      <category>Artigos</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/distroless/1.png" length="0" type="image/png" />
      <content:encoded><![CDATA[

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/distroless/1.png" alt="Imagens de contêiner Python distroless no Kubernetes" />

<p>Vamos explorar estratégias multi-stage build com imagens de contêiner distroless para workloads Python no Kubernetes, criando soluções da vida real.</p>

<h2 id="o-que-e-distroless">O que é distroless</h2>

<p>Imagens distroless contêm <strong>apenas</strong> o runtime da linguagem e suas dependências mínimas. Não incluem:</p>

<ul>
<li><strong>Shell</strong> (bash, sh): não é possível abrir um terminal no container para debug</li>
<li><strong>Package managers</strong> (apt, yum, pip)</li>
<li><strong>Utilitários do sistema</strong> (curl, wget, vi, ls, cat)</li>
<li><strong>Usuário root</strong> (na variante <code>-nonroot</code>, roda como UID 65534). ALTO RISCO DE SEGURANÇA.</li>
</ul>

<p>Exemplo de família de imagens distroless (valores anonimizados para referência arquitetural):</p>

<div data-lang="dockerfile"><pre><code>mcr.microsoft.com/azurelinux/distroless/python:3.12          # root
mcr.microsoft.com/azurelinux/distroless/python:3.12-nonroot  # non-root (recomendado)
mcr.microsoft.com/azurelinux/distroless/debug/python:3.12    # com shell (debug only)</code></pre></div>

<strong>Nota:</strong> a variante <code>debug</code> inclui um shell busybox e serve para troubleshooting temporário. NÃO deve ser usada em produção.

<p>Criei uma solução e botei para rodar no Kubernetes, um script básico em Python para consumir uma API REST e disparar notificações, rodando menos de 5 segundos, uma vez por dia.</p>

<p>Durante a jornada, fiz um benchmark de imagens base para comparar seus tamanho, segurança e operação. A implementação final do workload foi feita com <code>mcr.microsoft.com/azurelinux/base/python:3.12</code> no estágio de build e <code>mcr.microsoft.com/azurelinux/distroless/python:3.12-nonroot</code> no runtime.</p>

<h2 id="comparacao-das-imagens-consultadas">Comparação das imagens consultadas</h2>
<div><table><thead><tr><th>Imagem</th><th>Tamanho</th><th>CVEs</th><th>Shell</th><th>Package Manager</th><th>Non-root</th></tr></thead><tbody><tr><td><code>python:3.12-slim</code> (Debian)</td><td>~150MB</td><td>Médio-alto (Debian libs)</td><td>Sim</td><td>apt</td><td>Não (root)</td></tr><tr><td><code>python:3.12-alpine</code></td><td>~50MB</td><td>Baixo</td><td>Sim</td><td>apk</td><td>Não (root)</td></tr><tr><td><code>registry.example.com/containeres/python-build:3.12</code></td><td>~100MB</td><td>Baixo</td><td>Sim</td><td>tdnf</td><td>Não (root)</td></tr><tr><td><code>registry.example.com/containeres/python-runtime-distroless:3.12-nonroot</code></td><td>~30MB</td><td>Mínimo</td><td>Não</td><td>Não</td><td>Sim</td></tr></tbody></table></div>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/distroless/2.png" alt="Comparação de tamanho e CVEs entre imagens Python slim, alpine e distroless" />

<strong>OBS:</strong> a quantidade/severidade de CVEs varia conforme data do scan, base de vulnerabilidades e versão exata da imagem.

<h2 id="o-problema">O "problema"</h2>

<p>Mesmo imagens otimizadas para runtime geral ainda podem incluir componentes que não são necessários para workloads curtos, por exemplo Jobs/CronJobs:</p>

<ul>
<li>Shell (<code>bash</code>, <code>sh</code>)</li>
<li>Package manager (<code>apt</code>, <code>dpkg</code>)</li>
<li>Utilitários como <code>curl</code>, <code>wget</code> e <code>find</code></li>
<li>Usuário root por padrão</li>
</ul>

<p>Obviamente quando estamos criando, precisamos de certas ferramentas para desenvolvimento e depuração. Finalizado o desenvolvimento e testes, podemos e devemos enxugar a imagem. Para um container que executa um script e termina, nada disso é necessário. Cada binário extra também amplia a superfície de possíveis ataques.</p>

<h2 id="a-engenharia-entrando-em-acao-multi-stage-build-distroless">A engenharia entrando em ação: multi-stage build + distroless</h2>

<p>A estratégia de separar <strong>build</strong> e <strong>runtime</strong> em dois estágios:</p>

<div data-lang="dockerfile"><pre><code># Stage 1: Build - instala dependências
FROM mcr.microsoft.com/azurelinux/base/python:3.12 AS build

WORKDIR /aplicativos
COPY requirements-ex.txt .
RUN pip install --no-cache-dir --target=/aplicativos/deps -r requirements-ex.txt

# Stage 2: Runtime - distroless (sem shell, sem package manager, non-root)
FROM mcr.microsoft.com/azurelinux/distroless/python:3.12-nonroot

WORKDIR /aplicativos
COPY --from=build /aplicativos/deps /aplicativos/deps
COPY worker_alertas.py .

ENV PYTHONPATH=/aplicativos/deps
ENTRYPOINT ["python3", "exemplo.py"]</code></pre></div>

<strong>Resultado:</strong> runtime rodando no mínimo com distroless non-root, menor superfície de ataque e operação mais previsível para Jobs/CronJobs.
<div><table><thead><tr><th>Estágio</th><th>O que tem</th><th>O que NÃO tem</th></tr></thead><tbody><tr><td><strong>Build</strong> (<code>python-build:3.12</code>)</td><td>pip, compiladores, headers; tudo para instalar pacotes</td><td>Não vai para a imagem final</td></tr><tr><td><strong>Runtime</strong> (<code>python-runtime-distroless:3.12-nonroot</code>)</td><td>Python runtime, glibc, CA certs</td><td>Sem shell, sem pip, sem apt, sem binários extras</td></tr></tbody></table></div>
<p>O <code>--target=/aplicativos/deps</code> instala dependências em um diretório isolado, que é copiado para o segundo estágio. O <code>PYTHONPATH</code> aponta para esse diretório.</p>

<h2 id="pontos-de-atencao-na-hora-de-desenvolver-uma-solucao-distroless-do-zero">Pontos de atenção na hora de desenvolver uma solução distroless do zero!</h2>

<h3 id="1-logs">1. Logs</h3>

<p>Falando de código e testes, sem <code>stream=sys.stdout</code> no <code>logging.basicConfig()</code>, os logs iam para <code>stderr</code> e, em alguns cenários de CronJob, não apareciam no <code>kubectl logs</code>:</p>

<div data-lang="python"><pre><code># Logs podem não aparecer
logging.basicConfig(level=logging.INFO)

# Garante stdout
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s %(levelname)s %(message)s",
    stream=sys.stdout,
)</code></pre></div>

<h3 id="2-erros-em-variaveis-de-ambiente">2. Erros em variáveis de ambiente</h3>

<p>Sem shell e sem processo de init, se uma variável estivesse faltando, o container podia falhar rápido demais e dificultar a observabilidade:</p>

<div data-lang="python"><pre><code>REQUIRED_ENV_VARS = ["API_URL", "API_KEY", "RECIPIENTS"]

def load_config() -&gt; dict:
    missing = [v for v in REQUIRED_ENV_VARS if v not in os.environ]
    if missing:
        logger.error("Missing env vars: %s", ", ".join(missing))
        sys.exit(1)
    # ...</code></pre></div>

<h3 id="3-debug-sem-shell">3. Debug sem shell</h3>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/distroless/3.png" alt="Debug de contêiner distroless sem shell no Kubernetes" />

<p>Com distroless, <code>kubectl exec -it <pod> -- /bin/sh</code> não funciona. Para troubleshooting, a estratégia é trocar temporariamente para a imagem de debug:</p>

<div data-lang="dockerfile"><pre><code># Temporário: apenas para troubleshooting
FROM mcr.microsoft.com/azurelinux/distroless/debug/python:3.12</code></pre></div>

<p>Isso adiciona ~15-20MB, mas habilita shell busybox. Depois do diagnóstico, o ideal é voltar para a variante <code>-nonroot</code>.</p>

<h3 id="4-entrypoint-nao-cmd">4. ENTRYPOINT, não CMD</h3>

<p>Em imagens distroless <strong>sem shell</strong>, o formato exec é obrigatório:</p>

<div data-lang="dockerfile"><pre><code># Shell form: exige /bin/sh (que não existe)
# CMD python3 exemplo.py

# Exec form: obrigatório para distroless
ENTRYPOINT ["python3", "exemplo.py"]</code></pre></div>

<h2 id="na-implementacao-final-deste-workload">Na implementação final deste workload:</h2>

<ul>
<li><strong>Build stage:</strong> <code>mcr.microsoft.com/azurelinux/base/python:3.12</code></li>
<li><strong>Runtime stage:</strong> <code>mcr.microsoft.com/azurelinux/distroless/python:3.12-nonroot</code></li>
</ul>

<p>Essa combinação manteve o workload simples para instalação de dependências no build e conseguimos entregar um runtime enxuto, sem shell e sem package manager em produção.</p>

<h2 id="beneficios-de-seguranca">Benefícios de segurança</h2>

<p>1. <strong>Sem shell</strong>: reduz execução arbitrária de comandos</p>
<p>2. <strong>Sem package manager</strong>: impede instalação de ferramentas de exploração em runtime</p>
<p>3. <strong>Non-root</strong>: UID 65534, reduzindo risco de escalonamento trivial</p>
<p>4. <strong>Superfície mínima</strong>: tende a reduzir CVEs reportadas por scanners (como Trivy)</p>
<p>5. <strong>Imutabilidade operacional</strong>: menos formas de alterar o container em execução</p>

<h2 id="quando-usar-e-quando-nao-usar">Quando usar (e quando não usar)</h2>

<h3 id="use-distroless-quando">Use distroless quando</h3>

<ul>
<li>Scripts/workers que rodam e terminam (CronJobs, Functions)</li>
<li>Microsserviços que não exigem debug interativo frequente</li>
<li>Workloads de produção onde segurança é prioridade</li>
</ul>

<h3 id="evite-distroless-quando">Evite distroless quando</h3>

<ul>
<li>O ciclo de desenvolvimento depende fortemente de debug interativo</li>
<li>A aplicação depende de binários de sistema (ffmpeg, imagemagick etc.)</li>
<li>O time ainda não está pronto para um workflow de troubleshooting sem shell</li>
</ul>

<h2 id="template-para-cronjobs-python">Template para CronJobs Python</h2>

<div data-lang="dockerfile"><pre><code># Stage 1: Build

FROM mcr.microsoft.com/azurelinux/base/python:3.12 AS build
WORKDIR /aplicativos
COPY requirements-ex.txt .
RUN pip install --no-cache-dir --target=/aplicativos/deps -r requirements-ex.txt

# Stage 2: Runtime (distroless)
# Para debug temporário, troque por:
# FROM mcr.microsoft.com/azurelinux/distroless/debug/python:3.12

FROM mcr.microsoft.com/azurelinux/distroless/python:3.12-nonroot
WORKDIR /aplicativos
COPY --from=build /aplicativos/deps /aplicativos/deps
COPY exemplo.py .
ENV PYTHONPATH=/aplicativos/deps
ENTRYPOINT ["python3", "exemplo.py"]</code></pre></div>

<p>E no Python, comece com:</p>

<div data-lang="python"><pre><code>import logging
import sys

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s %(levelname)s %(message)s",
    stream=sys.stdout,
)</code></pre></div>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/distroless/4.jpg" alt="Logs em stdout de aplicação Python em contêiner distroless" />

<p>A adoção de distroless non-root removeu shell, package manager e root do runtime. Os principais desafios encontrados foram logs em stdout, validação de variáveis e troubleshooting sem shell, que são contornáveis com práticas simples.</p>

<strong>Nota de compliance (NDA):</strong> nomes de imagens, caminhos e artefatos foram anonimizados para fins de publicação; exemplos, métricas e cenários estão apresentados sem identificação de cliente, tenant ou ambiente específico.

<p>Para workloads Python executados como Jobs no Kubernetes, distroless é uma escolha sólida.</p>

]]></content:encoded>
    </item>
    <item>
      <title>Vibe Coding com DevOps: usei IA pra criar meu site, mas quem fez o deploy fui EU - SQL Saturday Joinville 2026</title>
      <link>https://www.orafaelferreira.com/artigos/sql-saturday-joinville-2026</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/sql-saturday-joinville-2026</guid>
      <pubDate>Mon, 20 Apr 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Relato da palestra Vibe Coding com DevOps no SQL Saturday Joinville 2026: como usei IA para criar meu site sem abrir mão de pipeline, governança e ownership.</description>
      <category>Palestras</category>
      <category>Comunidade</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday26/00.jpeg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday26/00.jpeg" alt="Banner do SQL Saturday Joinville 2026 na Univille" />

<p>No dia <strong>11 de abril de 2026</strong>, participei como palestrante no <strong><a href="https://sqlsaturday.com/2026-04-11-sqlsaturday1139/" target="_blank" rel="noopener noreferrer">SQL Saturday Joinville 2026</a></strong>, realizado na <strong>Univille</strong>, em Joinville/SC, organizado pela comunidade <strong><a href="https://comunidado.com.br/" target="_blank" rel="noopener noreferrer">Comunidado</a></strong></p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday26/03.jpg" alt="Entrada do SQL Saturday Joinville 2026" />

<p>O SQL Saturday é um dos eventos mais tradicionais da comunidade de dados, reunindo profissionais de SQL Server, Azure, analytics e Inteligência Artificial para compartilhar experiências reais de mercado.</p>

<h2 id="cronograma-do-evento">Cronograma do evento</h2>

<h3 id="centro-de-convencoes">Centro de Convenções</h3>
<div><table><thead><tr><th>Horário</th><th>Palestrante</th><th>Sessão</th></tr></thead><tbody><tr><td>08:30 - 09:00</td><td>-</td><td>Keynote - Palestra Inicial</td></tr><tr><td>09:00 - 09:50</td><td>Fabiano Amorim</td><td>Hackeando MSSQL na nuvem. Todas elas. Como me tornei sysadmin no Azure, AWS, GCP e Alibaba.</td></tr><tr><td>09:50 - 10:40</td><td>Rodrigo Ribeiro</td><td>Microsoft SQL and AMD in the era of AI (IA no SQL Server: Embeddings).</td></tr><tr><td>10:40 - 11:10</td><td>-</td><td>Coffee break</td></tr><tr><td>11:10 - 12:00</td><td>Gerson Viergutz</td><td>MCP no Power BI.</td></tr><tr><td>12:00 - 13:30</td><td>-</td><td>Almoço</td></tr></tbody></table></div>
<h3 id="auditorio-da-reitoria">Auditório da Reitoria</h3>
<div><table><thead><tr><th>Horário</th><th>Palestrante</th><th>Sessão</th></tr></thead><tbody><tr><td>13:30 - 14:20</td><td>Sidney Cirqueira</td><td>Microsoft Fabric - What's new and What's next.</td></tr><tr><td>14:20 - 15:10</td><td>Alison Pezzott</td><td>Arquitetura de Dados Moderna com CI/CD no Microsoft Fabric e Power BI: separando responsabilidades entre Engenharia e Analytics.</td></tr><tr><td>15:10 - 15:40</td><td>-</td><td>Coffee break</td></tr><tr><td>15:40 - 16:20</td><td>Walter Silvestre Coan</td><td>Desenvolvendo agentes de IA com o Microsoft Agent Framework.</td></tr><tr><td>16:20 - 17:10</td><td>Nilton Ueda</td><td>A convergência entre Inteligência Artificial e Business Intelligence está transformando a maneira como as organizações criam, consomem e agem com base em insights de dados.</td></tr><tr><td>17:10 - 17:30</td><td>-</td><td>Encerramento</td></tr></tbody></table></div>
<h3 id="anfiteatro-i">Anfiteatro I</h3>
<div><table><thead><tr><th>Horário</th><th>Palestrante</th><th>Sessão</th></tr></thead><tbody><tr><td>13:30 - 14:20</td><td>Paulo dos Santos</td><td>Azure AI Foundry - Do protótipo à produção: IA com governança, segurança e escala.</td></tr><tr><td>14:20 - 15:10</td><td>William Lino Oliveira</td><td>Agentes de IA para bancos de dados: descobrir, recomendar e otimizar.</td></tr><tr><td>15:10 - 15:40</td><td>-</td><td>Coffee break</td></tr><tr><td>15:40 - 16:20</td><td>Lerina Mesquita</td><td>Arquitetura moderna sem governança: como evitar que seu Lakehouse vire um Data Swamp.</td></tr><tr><td>16:20 - 17:10</td><td>Arthur Ferreira Reis</td><td>Qualidade de dados no Databricks: Great Expectations, DQX e testes isolados.</td></tr><tr><td>17:10 - 17:30</td><td>-</td><td>Encerramento</td></tr></tbody></table></div>
<h3 id="anfiteatro-ii">Anfiteatro II</h3>
<div><table><thead><tr><th>Horário</th><th>Palestrante</th><th>Sessão</th></tr></thead><tbody><tr><td>13:30 - 14:20</td><td>Rafael Ferreira & Jessica Mello</td><td>Vibe Coding com DevOps: usei IA para criar meu site, mas quem fez o deploy fui eu.</td></tr><tr><td>14:20 - 15:10</td><td>Laurindo Dunba</td><td>Demonstração prática (hands-on) sobre a plataforma Databricks e GitHub.</td></tr><tr><td>15:10 - 15:40</td><td>-</td><td>Coffee break</td></tr><tr><td>15:40 - 16:20</td><td>Rodrigo Gonçalves</td><td>Do ' OR 1=1 ao Shell: técnicas avançadas de SQLi e evasão para profissionais de dados.</td></tr><tr><td>16:20 - 17:10</td><td>-</td><td>Sessão em aberto</td></tr><tr><td>17:10 - 17:30</td><td>-</td><td>Encerramento</td></tr></tbody></table></div>

<h2 id="minha-palestra">Minha palestra</h2>

<p>Apresentei novamente com a <a href="https://www.linkedin.com/in/jessica-tmello/" target="_blank" rel="noopener noreferrer"><strong>Jéssica Mello</strong></a> a sessão:</p>

<strong>Vibe Coding com DevOps: usei IA para criar meu site, mas quem fez o deploy fui eu</strong>.

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday26/04.jpg" alt="Rafael Ferreira palestrando sobre Vibe Coding com DevOps" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday26/01.jpg" alt="Público acompanhando a palestra no SQL Saturday Joinville 2026" />

<p>A ideia foi mostrar como acelerar construção com IA sem abrir mão de fundamentos de engenharia, pipeline, governança e ownership técnico no deploy.</p>

<p>Falamos sobre:</p>

<ul>
<li>produtividade com IA aplicada ao desenvolvimento</li>
<li>limites e riscos de gerar código sem processo</li>
<li>importância de CI/CD e validações automáticas</li>
<li>responsabilidade técnica no momento de publicar em produção</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday26/07.jpg" alt="Slide sobre pipeline e governança no deploy com IA" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday26/05.jpg" alt="Rafael Ferreira explicando ownership técnico no deploy" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday26/02.jpg" alt="Rafael Ferreira interagindo com o público no SQL Saturday" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday26/08.jpg" alt="Palestrantes reunidos no SQL Saturday Joinville 2026" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday26/final.jpg" alt="Encerramento do SQL Saturday Joinville 2026 na Univille" />

<p>Participar do SQL Saturday Joinville 2026 como palestrante foi uma experiência excelente. O evento apenas reforça a força da comunidade técnica em Santa Catarina e como dados + IA + cloud estão cada vez mais conectados na prática.</p>

<p>Se você trabalha com dados, engenharia, analytics ou arquitetura em nuvem, esse é o tipo de evento que acelera aprendizado e eleva a qualidade das decisões no trabalho real.</p>

<a href="https://www.linkedin.com/posts/orafaelferreiraa_tem-muita-gente-falando-de-ia-criando-c%C3%B3digo-activity-7441808604246073344-ukc7?utm_source=share&utm_medium=member_desktop&rcm=ACoAAAiBr9cBknrEzJyFEqCS03tes6G6R1yclRw" target="_blank" rel="noopener noreferrer">LinkedIn Post Divulgação evento</a>

<h2 id="slides">Slides</h2>

<p>Os slides estão disponíveis aqui:</p>

<ul>
<li><i></i> <strong>Slides da Apresentação:</strong></li>
</ul>
<a href="https://stoblobcertificados011.blob.core.windows.net/palestras/SemServidorPlatform_Engineering.pdf" target="_blank" rel="noopener noreferrer">Vibe Coding com DevOps: usei IA pra criar meu site, mas quem fez o deploy fui EU</a>

<h2 id="repositorios-da-apresentacao">Repositórios da apresentação</h2>

<ul>
<li><strong>Repositório do Site:</strong></li>
</ul>
<p>[](https://github.com/orafaelferreiraa/orafaelferreira-com)</p>

]]></content:encoded>
    </item>
    <item>
      <title>Sem Servidor Conf 2026 (Edição Floripa): Platform Engineering - Construindo uma Plataforma Serverless Self-Service</title>
      <link>https://www.orafaelferreira.com/artigos/sem-servidor-conf-florianopolis-2026</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/sem-servidor-conf-florianopolis-2026</guid>
      <pubDate>Sat, 18 Apr 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Relato do Sem Servidor Conf 2026 em Florianópolis, onde palestrei sobre Platform Engineering e a construção de uma plataforma serverless self-service.</description>
      <category>Palestras</category>
      <category>Comunidade</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/serveless26/00.jpeg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/serveless26/00.jpeg" alt="Banner do Sem Servidor Conf 2026 Edição Floripa" />

<p>No dia <strong>08 de abril de 2026</strong>, participei como palestrante no <strong><a href="https://semservidor.com.br/sem-servidor-2026-edicao-floripa/" target="_blank" rel="noopener noreferrer">Sem Servidor Conf 2026 - Edição Floripa</a></strong>, realizado no <strong>Faial Prime Suites</strong>, em Florianópolis.</p>

<p>Foi um evento presencial com foco total em <strong>cloud, serverless-first e arquitetura moderna</strong>, trazendo discussões práticas para o dia a dia de quem toma decisões técnicas.</p>

<h2 id="grade-de-palestras">Grade de palestras</h2>

<p>13:00 Credenciamento</p>
<p>14:00 - Abertura - Evandro Pires @ Sem Servidor</p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/serveless26/Abertura.jpg" alt="Evandro Pires abrindo o Sem Servidor Conf 2026 em Florianópolis" />
<p>14:15 - Durable Functions vs Step functions... quem leva? - <a href="https://www.linkedin.com/in/giovana-armani/" target="_blank" rel="noopener noreferrer">Giovana Armani</a> @ AWS</p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/serveless26/Giovana.jpg" alt="Giovana Armani palestrando sobre Durable Functions e Step Functions" />
<p>14:55 - O mistério dos pacotes perdidos, MTU quebrando sua Lambda - <a href="https://www.linkedin.com/in/jorgekg/" target="_blank" rel="noopener noreferrer">Jorge Kohn</a> @ Senior Sistemas</p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/serveless26/Jorge.jpg" alt="Jorge Kohn apresentando o mistério dos pacotes perdidos e MTU na Lambda" />
<p>15:35 - Integrações com APIs terceiras e serviços AWS - Um jeito simples usando Appsync - <a href="https://www.linkedin.com/in/meandrade/" target="_blank" rel="noopener noreferrer">Marcelo Andrade</a> @ sls.guru</p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/serveless26/Marcelo.jpg" alt="Marcelo Andrade falando sobre integrações com AppSync" />
<p>16:15 - Netbuilding + Coffee - -</p>
<p>17:00 - Serverless além do Tech (Case Buzios Divers) - <a href="https://www.linkedin.com/in/filipebarretto/" target="_blank" rel="noopener noreferrer">Filipe Barretto</a> @ Buzios Divers / AWS Hero</p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/serveless26/Filipe.jpg" alt="Filipe Barretto apresentando o case Buzios Divers" />
<p>17:40 - Platform Engineering: Construindo uma Plataforma Serverless Self-Service - Rafael Ferreira @ Stefanini North América</p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/serveless26/01.jpg" alt="Rafael Ferreira palestrando sobre Platform Engineering Serverless" />
<p>18:20 - Removendo a tecnologia das suas decisões de tecnologia - <a href="https://www.linkedin.com/in/fernandosapata/" target="_blank" rel="noopener noreferrer">Fernando Sapata</a> @ Select / tnkr</p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/serveless26/Sapata.jpg" alt="Fernando Sapata falando sobre decisões de tecnologia" />
<p>19:00 - Encerramento - Evandro Pires @ Sem Servidor</p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/serveless26/Evandro.jpg" alt="Evandro Pires encerrando o Sem Servidor Conf 2026" />

<p>Apresentei a talk <strong>Platform Engineering: Construindo uma Plataforma Serverless Self-Service</strong>.</p>

<p>A proposta foi mostrar como aplicar conceitos de platform engineering para acelerar entregas padronizadas, com automação e autonomia para os times, sem abrir mão da governança.</p>

<p>Falei sobre desafios de escalar, padronização de ambientes e como transformar boas práticas em produtos internos reutilizáveis.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/serveless26/03.jpg" alt="Rafael Ferreira apresentando a plataforma serverless self-service" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/serveless26/05.jpg" alt="Público acompanhando a palestra de Platform Engineering no Sem Servidor Conf" />

<h2 id="um-evento-com-conteudo-aplicavel">Um evento com conteúdo aplicável</h2>

<p>Rolou palestras técnicas sobre AWS, integrações, arquitetura e tomadas de decisão em tecnologia. O mais legal foi como as palestras se conectaram em torno de um mesmo objetivo: <strong>ajudar times a fazer escolhas melhores em cloud</strong>.</p>

<p>E o diferencial como sempre, foi o networking durante os intervalos. Reunindo profissionais de diferentes contextos e empresas para trocar experiência de forma direta e sem filtro.</p>

<h2 id="comunidade">Comunidade</h2>

<p>Eventos como o Sem Servidor reforçam como a comunidade técnica no Brasil está madura e cada vez mais orientada a conteúdo prático.</p>

<p>Se você trabalha com cloud e arquitetura moderna, esse tipo de encontro acelera muito o aprendizado e melhora a qualidade das decisões no trabalho real.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/serveless26/07.jpg" alt="Comunidade reunida no Sem Servidor Conf 2026 em Florianópolis" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/serveless26/08.jpg" alt="Palestrantes e participantes do Sem Servidor Conf Edição Floripa" />

<a href="https://www.linkedin.com/posts/orafaelferreiraa_dia-08-de-abril-vou-estar-palestrando-no-activity-7439634283931004930-SxKr?utm_source=share&utm_medium=member_desktop&rcm=ACoAAAiBr9cBknrEzJyFEqCS03tes6G6R1yclRw" target="_blank" rel="noopener noreferrer">LinkedIn Post Divulgação evento</a>

<h2 id="slides">Slides</h2>

<p>Os slides estão disponíveis aqui:</p>

<ul>
<li><i></i> <strong>Slides da Apresentação:</strong></li>
</ul>
<a href="https://stoblobcertificados011.blob.core.windows.net/palestras/SemServidorPlatform_Engineering.pdf" target="_blank" rel="noopener noreferrer">Platform Engineering - Construindo uma Plataforma Serverless Self-Service</a>

<h2 id="repositorios-da-apresentacao">Repositórios da apresentação</h2>

<ul>
<li><strong>Platform Stack:</strong></li>
</ul>
<a href="https://github.com/orafaelferreiraa/platform-as-a-service-stack" target="_blank" rel="noopener noreferrer">platform-as-a-service-stack</a>

<ul>
<li><strong>Pipeline Stack:</strong></li>
</ul>
<a href="https://github.com/orafaelferreiraa/pipeline-as-a-service-stack" target="_blank" rel="noopener noreferrer">pipeline-as-a-service-stack</a>

<ul>
<li><strong>TF Modules Stack:</strong></li>
</ul>
<a href="https://github.com/orafaelferreiraa/tfmodules-as-a-service-stack" target="_blank" rel="noopener noreferrer">tfmodules-as-a-service-stack</a>

]]></content:encoded>
    </item>
    <item>
      <title>Platform Engineering e Policy-as-Code que aceleram times</title>
      <link>https://www.orafaelferreira.com/artigos/platform-engineering-policy-as-code</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/platform-engineering-policy-as-code</guid>
      <pubDate>Wed, 15 Apr 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Uma visão agnóstica de cloud sobre como Platform Engineering e Policy-as-Code reduzem carga cognitiva, aumentam segurança e aceleram entregas.</description>
      <category>Artigos</category>
      <category>Azure</category>
      <category>Kubernetes</category>
      <category>Terraform</category>
      <category>CI/CD</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/pac/1.png" length="0" type="image/png" />
      <content:encoded><![CDATA[

<h2 id="introducao">Introdução</h2>

<p>O <a href="https://platformengineering.org/" target="_blank" rel="noopener noreferrer">Platform Engineering</a> surge como resposta à crescente complexidade das aplicações em nuvem. Criamos plataformas internas que automatizam infraestrutura e governança. A plataforma é tratada como um produto: o desenvolvedor é o cliente interno e deve encontrar o “caminho dourado” (golden path). Uma boa definição de Platform Engineering resume seu propósito: “melhorar a segurança, conformidade, custos e tempo de entrega de valor dos times de desenvolvimento por meio de experiências de desenvolvedor aprimoradas e self-service num ambiente seguro e governado”. Ao padronizar processos e oferecer automações prontas, as plataformas eliminam etapas repetitivas e reduzem drasticamente a carga cognitiva dos desenvolvedores.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/pac/1.png" alt="Ilustração de plataforma interna com governança integrada" />

<p>Sem essa governança integrada, temos riscos de custos excessivos, falhas de segurança e não-conformidades. Equipes podem criar recursos em regiões caras ou não vigiadas, esquecer tags obrigatórias, expor APIs inadvertidamente etc. O Platform Engineering garante o complience disso criando guardrails automatizados: cada “guardrail” adiciona automaticamente práticas recomendadas. Isso reforça a segurança e compliance de modo invisível e natural ao desenvolvedor, acelerando entregas em vez de bloqueá-las.</p>

<h2 id="o-que-e-policy-as-code-pac">O que é Policy-as-Code (PaC)</h2>

<a href="https://platformengineering.org/blog/policy-as-code" target="_blank" rel="noopener noreferrer">Policy-as-Code</a> é o paradigma de codificar regras de negócio, segurança e compliance em código executável, versionado e testável em pipelines. Em vez de revisar manuais, é validado automaticamente a mudança. Na prática, regras como “só usar VMs criptografadas” ou “não criar recursos fora de regiões aprovadas” viram definições de política em JSON (ou Rego, YAML etc.), armazenadas em repositório Git. Isso garante feedback rápido e contínuo: violações são detectadas tão cedo quanto possível, evitando que recursos errados cheguem à produção.

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/pac/2.png" alt="Fluxo de Policy-as-Code validando antes do deploy" />

<p>Quando implementamos PaC, mudamos do modelo "fazer e auditar depois" para "validar antes de implantar". Como destaca a comunidade de engenharia de plataforma, chamada "CAPOC" (Compliance At Point Of Change) – comprimir o ciclo de feedback de dias para segundos. Por exemplo, se um desenvolvedor tentar subir um container vulnerável, um engine de política (<a href="#opa">OPA</a> ou <a href="#kyverno">Kyverno</a>) a rejeita imediatamente, retornando erros legíveis. Assim, equipes de segurança se mantem centralizada, mas sem serem gargalo, cada time segue com autonomia porque políticas automatizadas garantem que só configurações aprovadas irão ver a luz do dia. Além disso, todo evento acaba criando trilhas de auditoria nativas que facilitam evidências de compliance.</p>
<h2 id="ecossistema-de-ferramentas-de-politicas">Ecossistema de ferramentas de políticas</h2>

<p>O universo de PaC é amplo e, em geral, independente da nuvem. Várias ferramentas permitem implementar políticas em diferentes camadas:</p>

<h3 id="opa-open-policy-agent">OPA (Open Policy Agent)</h3>

<a href="https://www.openpolicyagent.org/docs/latest/" target="_blank" rel="noopener noreferrer">Open Policy Agent</a> é uma enginee de políticas open-source graduado pela CNCF. Usa a linguagem Rego para definir regras gerais e pode ser integrado em aplicações, gateways de API, pipelines CI/CD e clusters Kubernetes. É ideal para cenários multi-cloud e autorização genérica, oferecendo boa performance e trilhas de auditoria detalhadas. Com OPA, é declarada regras em Rego e avalidas as decisões no ponto de mudança (CAPOC), garantindo feedback rápido e consistente.

<h3 id="kyverno">Kyverno</h3>

<a href="https://kyverno.io/" target="_blank" rel="noopener noreferrer">Kyverno</a> é uma ferramenta declarativa Kubernetes-native de PaC. Políticas em YAML validam, geram e podem até mutar recursos (por exemplo, adicionar labels faltantes automaticamente). Por ser nativo de Kubernetes, costuma ter curva de aprendizado mais suave para engenheiros de plataforma e acompanha features modernas do ecossistema.

<h3 id="conftest">Conftest</h3>

<a href="https://www.conftest.dev/" target="_blank" rel="noopener noreferrer">Conftest</a> é baseada em <a href="#opa">OPA</a> e valida arquivos de infraestrutura como código antes do apply (Terraform, Kubernetes YAML, Helm, CloudFormation etc.). Escrevemos policies em Rego e executamos testes no CI/CD ou localmente (ex.: <code>conftest test ./infra</code>). Isso captura violações cedo (tipos de VMs não permitidos, ausência de tags obrigatórias), evitando deploys inválidos e reduzindo retrabalho.

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/pac/3.png" alt="Conftest validando arquivos de infraestrutura como código" />

<h3 id="azure-policy">Azure Policy</h3>

<a href="https://learn.microsoft.com/en-us/azure/governance/policy/overview" target="_blank" rel="noopener noreferrer">Azure Policy</a> é a solução nativa do Azure com painel de compliance, built-ins e integração com pipelines e CI. Escrevi um artigo detalhado sobre <a href="https://www.orafaelferreira.com/artigos/az-policy" target="_blank" rel="noopener noreferrer">Azure Policy na prática</a>. Em outros provedores, há equivalentes: no AWS, Service Control Policies (SCPs) e AWS Config Rules; no GCP, Organization Policies. Essas políticas nativas são ideais para aplicação universal das regras específicas de cada nuvem.

<p>Hoje minha especialidade é cloud Azure, onde me sinto mais confortável. Recentemente criamos um projeto interno de Policy-as-Code com Terraform: colocamos as policies (arquivos .json) em uma pasta no repositório e o Terraform aplica essas definições automaticamente para toda a organização. Esse fluxo garante consistência, versionamento e a possibilidade de aplicar politicas de forma centralizada e garante governança em escala sem depender de processos manuais.</p>

<h4>Um exemplo de Azure Policy</h4>

<p>Um exemplo prático de Azure Policy que implementei em ambientes de produção foi: "Azure Backup should be enabled for Virtual Machines" (ID: 013e242c-8828-4970-87b3-ab247555486d) para auditar VMs sem item de backup associado a um Recovery Services Vault. Para passo a passo e opções de remediação (Portal, Azure Policy), veja: <a href="https://www.orafaelferreira.com/artigos/azure-backup-virtual-machines" target="_blank" rel="noopener noreferrer">Azure Backup para Máquinas Virtuais</a>.</p>

<h2 id="fluxo-devex-com-governanca-integrada">Fluxo DevEx com governança integrada</h2>

<p>Para não atrapalhar a experiência do desenvolvedor (DevEx), as verificações de política devem ocorrer em todas as etapas do fluxo:</p>

<ul>
<li><strong>IDE/Local</strong>: extensões (VSCode, IntelliJ) validam IaC e alertam sobre violações antes do commit (ex.: região proibida, tag ausente).</li>
<li><strong>CI/CD (pré-merge)</strong>: um job dedicado (policy-test) roda Conftest/OPA/Azure CLI Policy e barra PRs não conformes com mensagens claras.</li>
<li><strong>Admission Controllers (Kubernetes)</strong>: Gatekeeper ou <a href="#kyverno">Kyverno</a> negam deploys inválidos (imagem não autorizada, portas indevidas) e podem mutar recursos para corrigir padrões.</li>
<li><strong>Runtime Cloud</strong>: <a href="https://learn.microsoft.com/en-us/azure/governance/policy/overview" target="_blank" rel="noopener noreferrer">Azure Policy</a>, AWS Config, etc., auditam continuamente; painéis de compliance mostram o status e facilitam remediação rápida.</li>
</ul>

<h2 id="boas-praticas-finops">Boas práticas FinOps</h2>

<p>De acordo com a <a href="https://www.finops.org/" target="_blank" rel="noopener noreferrer">FinOps Foundation</a>, as boas práticas incluem (confira também meu artigo sobre <a href="https://www.orafaelferreira.com/artigos/finops-foundation-cloud" target="_blank" rel="noopener noreferrer">fundação sólida em FinOps</a>):</p>

<ul>
<li><strong>Tags obrigatórias</strong>: owner, costCenter e environment, que são a base para alocação de custos e responsabilização.</li>
<li><strong>Controle de SKUs/limites por ambiente</strong>: restrinja tipos de VMs e SKUs (evita surpresas em dev/staging).</li>
<li><strong>Desligamento automático</strong>: pare recursos de dev/sandbox fora do horário (Azure Automation/Runbooks/Stop schedules).</li>
<li><strong>Orçamentos e alertas</strong>: defina budgets (ex.: 80% do previsto) e acople alertas ao pipeline; falhe deploys quando limites forem excedidos.</li>
<li><strong>Visibilidade e análises</strong>: exporte custos para Analytics/Power BI; use Azure Cost Management/AWS Cost Explorer para dashboards de FinOps.</li>
</ul>

<p>Exemplo: uma <a href="https://www.orafaelferreira.com/artigos/foundation-lz" target="_blank" rel="noopener noreferrer">Azure Landing Zone</a> já vem com tagging obrigatório e orçamentos como parte da fundação.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/pac/4.png" alt="Boas práticas FinOps com tagging e orçamentos na nuvem" />

<h2 id="estrategia-de-implantacao-de-politicas">Estratégia de implantação de políticas</h2>

<p>Ao adotar PaC e políticas de governança, faça um rollout gradual e iterativo:</p>

<strong>Audit → Aviso → Bloqueio → Remediação</strong>: inicie monitorando (modo Audit) para entender impactos sem interromper processos. Depois passe a emitir warning (alertas visíveis) e só então a ações de Deny ou Modify. A comunicação ativa entre TI e times de DevOps é crucial a cada fase.

<strong>Quick wins</strong>: comece por políticas simples e de alto impacto, como região de implantação e tags obrigatórias. São fáceis de entender e gerarão resultados rápidos. Conforme a confiança cresce, evolua para regras mais críticas.

<strong>Mensagens claras</strong>: políticas devem ter descrições óbvias. Erros genéricos tipo "Policy Failed" não são úteis – prefira feedback específico ("Região inválida: use East US ou West Europe"). 

<strong>Planos de 30/60/90 dias</strong>: muitos times definem cronogramas de maturidade. Por exemplo, em 30 dias inventariar políticas desejadas e habilitar audit mode, em 60 dias integrar testes no CI e usar admission controllers em staging, e em 90 dias ativar bloqueios em produção para regras críticas e automatizar remediações. Assim, a governança vira um facilitador continuo, não um obstáculo emergencial.

<h2 id="conclusao">Conclusão</h2>

<p>Integrar Policy-as-Code à engenharia de plataforma transforma a governança numa aliada, não num gargalo. Quando as políticas de segurança, compliance e custo são incorporadas no dia a dia de forma automatizada, elas se tornam invisíveis ao usuário – o time só vê as “regras do jogo” funcionando nos bastidores. Como resultado, equipes entregam mais rápido e com menor risco: não há mais um “time do não” bloqueando solicitações, mas sim orientações automáticas que guiam o desenvolvimento.</p>

<h2 id="referencias">Referências</h2>

<ul>
<li><a href="https://platformengineering.org/" target="_blank" rel="noopener noreferrer">Platform Engineering</a></li>
<li><a href="https://platformengineering.org/blog/policy-as-code" target="_blank" rel="noopener noreferrer">Policy-as-Code</a></li>
<li><a href="https://martinfowler.com/articles/platform-teams-stuff-done.html" target="_blank" rel="noopener noreferrer">Martin Fowler – Platform Engineering</a></li>
<li><a href="https://www.openpolicyagent.org/docs/latest/" target="_blank" rel="noopener noreferrer">Open Policy Agent</a></li>
<li><a href="https://kyverno.io/" target="_blank" rel="noopener noreferrer">Kyverno</a></li>
<li><a href="https://www.conftest.dev/" target="_blank" rel="noopener noreferrer">Conftest</a></li>
<li><a href="https://learn.microsoft.com/en-us/azure/governance/policy/overview" target="_blank" rel="noopener noreferrer">Azure Policy Overview</a></li>
<li><a href="https://learn.microsoft.com/en-us/cloud-adoption-framework/landing-zones/" target="_blank" rel="noopener noreferrer">Azure Cloud Adoption Framework - Landing Zones</a></li>
<li><a href="https://www.finops.org/" target="_blank" rel="noopener noreferrer">FinOps Foundation</a></li>
<li><a href="https://www.orafaelferreira.com/artigos/az-policy" target="_blank" rel="noopener noreferrer">Azure Policy na prática</a></li>
<li><a href="https://www.orafaelferreira.com/artigos/finops-foundation-cloud" target="_blank" rel="noopener noreferrer">Fundação sólida em FinOps</a></li>
<li><a href="https://www.orafaelferreira.com/artigos/azure-backup-virtual-machines" target="_blank" rel="noopener noreferrer">Azure Backup para Máquinas Virtuais</a></li>
</ul>

]]></content:encoded>
    </item>
    <item>
      <title>Arquitetura Baseline do Zero: App Service com Application Gateway, Private Link e Azure DNS</title>
      <link>https://www.orafaelferreira.com/artigos/app-gateway-baseline-private-endpoint</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/app-gateway-baseline-private-endpoint</guid>
      <pubDate>Sun, 08 Mar 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Guia passo a passo da baseline architecture no Azure: Azure DNS, Application Gateway WAF, Private Endpoints, Key Vault, SQL, Storage, TLS e testes finais.</description>
      <category>Artigos</category>
      <category>Terraform</category>
      <category>Segurança</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/labpe/01.png" length="0" type="image/png" />
      <content:encoded><![CDATA[<h2 id="arquitetura-baseline-do-zero-sem-retrabalho">Arquitetura baseline do zero (sem retrabalho)</h2>

<p>Muita gente me pergunta: "como eu pratico?", "como eu estudo pra certificação?", "como eu monto um laboratório de verdade?". A resposta é simples: implementando. Não adianta só assistir vídeo ou ler documentação se você nunca subiu a arquitetura com as próprias mãos.</p>

<p>A arquitetura que vamos implementar é baseada nas referências oficiais do <a href="https://learn.microsoft.com/pt-br/azure/architecture/" target="_blank" rel="noopener noreferrer">Centro de Arquitetura do Azure</a>, onde a Microsoft publica padrões, práticas recomendadas e arquiteturas de referência para cargas de trabalho reais.</p>

<p>Arquitetura final:</p>

<strong>Usuário -> Azure DNS (público) -> Application Gateway WAF -> Private Endpoint -> App Service</strong>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/labpe/01.png" alt="Diagrama da arquitetura baseline com Application Gateway e Private Endpoint" />

<p>Com serviços de apoio privados:</p>

<ul>
<li>Key Vault</li>
<li>Storage Account</li>
<li>Azure SQL</li>
</ul>

<a href="https://learn.microsoft.com/pt-br/azure/architecture/web-apps/app-service/architectures/baseline-zone-redundant" target="_blank" rel="noopener noreferrer">Referência oficial da Microsoft</a>

<h2 id="o-que-vamos-criar">O que vamos criar</h2>

<ul>
<li>Resource Group único para o laboratório</li>
<li>Domínio público delegado para Azure DNS</li>
<li>VNet segmentada com subnets dedicadas</li>
<li>Private DNS Zones para resolução interna de Private Link</li>
<li>App Service com acesso público desabilitado</li>
<li>Application Gateway WAF v2 com IP público</li>
<li>Certificado TLS no Key Vault com Managed Identity</li>
<li>Validações finais de ponta a ponta</li>
</ul>

<p>Troque os nomes abaixo para o seu ambiente, mantendo o padrão:</p>

<ul>
<li>Resource Group: <code>rg-app-baseline-lab</code></li>
<li>Região: <code>Brazil South</code></li>
<li>Domínio: <code>seudominio.com.br</code></li>
<li>App público: <code>app.seudominio.com.br</code></li>
<li>VNet: <code>vnet-app-baseline</code></li>
</ul>

<h2 id="etapa-1-criar-resource-group">ETAPA 1 - Criar Resource Group</h2>

<p>Crie o grupo de recursos:</p>

<ul>
<li>Nome: <code>rg-app-baseline-lab</code></li>
<li>Região: <code>Brazil South</code> (ou outra com suporte a zonas)</li>
</ul>

<p>Tudo do laboratório fica aqui dentro. O RG serve como uma pasta, onde você organizar seus arquivos. E na Azure, é onde fica o seus recursos, você deletando o RG você deleta tudo que tem dentro. </p>

<h2 id="etapa-2-utilizar-dominio">ETAPA 2 - Utilizar domínio</h2>

<p>Compre ou utilize o domínio público (exemplo: <code>seudominio.com.br</code>) no registrador da sua preferência.</p>

<h2 id="etapa-3-criar-zona-dns-publica-no-azure">ETAPA 3 - Criar zona DNS pública no Azure</h2>

<p>No Azure, crie uma <strong>DNS Zone pública</strong>:</p>

<ul>
<li>Nome: <code>seudominio.com.br</code></li>
<li>Tipo: Público</li>
</ul>

<p>Depois de criada:</p>

<ul>
<li>Copie os 4 name servers da zona</li>
<li>No registrador, substitua os DNS atuais pelos name servers do Azure</li>
</ul>

<p>Quando a delegação propagar, o Azure DNS vira autoridade oficial do domínio e assim poderemos seguir com as alterações tudo dentro de um portal.</p>

<h2 id="etapa-4-criar-vnet-e-subnets">ETAPA 4 - Criar VNet e subnets</h2>

<p>Crie a VNet:</p>

<ul>
<li>Nome: <code>vnet-app-baseline</code></li>
<li>Address space: <code>10.0.0.0/16</code></li>
<li>Região: mesma do Resource Group</li>
</ul>

<p>Crie as subnets:</p>

<div data-lang="code"><pre><code>snet-appGateway       10.0.1.0/24
snet-appService       10.0.0.0/24
snet-privateEndpoints 10.0.2.0/27</code></pre></div>

<p>Configuração obrigatória:</p>

<ul>
<li>Em <code>snet-appService</code>, habilite delegation para <code>Microsoft.Web/serverFarms</code></li>
<li>A subnet do Application Gateway deve ser dedicada (não compartilhe com PE, VM ou NIC)</li>
</ul>

<p>Nota prática importante: <code>GatewaySubnet</code> é reservada para <code>VPN Gateway</code> e <code>ExpressRoute</code>. Para <code>Application Gateway</code>, crie uma subnet dedicada com outro nome, por exemplo <code>SubnetAppGateway</code>, <code>agw-subnet</code> ou <code>snet-appgw</code>. O nome não é obrigatório, mas a exclusividade da subnet é obrigatória.</p>

<h2 id="nsg-network-security-group-obrigatorio-na-subnet-do-application-gateway">NSG (Network Security Group) obrigatório na subnet do Application Gateway</h2>

<p>Conforme a documentação da Microsoft, a subnet do Application Gateway v2 exige NSG com regras específicas. Sem essas regras, o gateway não funciona.</p>

<p>Crie um NSG e associe a <code>snet-appGateway</code> com as seguintes regras:</p>

<strong>Inbound:</strong>
<div><table><thead><tr><th>Prioridade</th><th>Nome</th><th>Source</th><th>Destination</th><th>Porta</th><th>Protocolo</th><th>Ação</th></tr></thead><tbody><tr><td>100</td><td>Allow-HTTP</td><td>Any</td><td>Subnet prefix</td><td>80</td><td>TCP</td><td>Allow</td></tr><tr><td>110</td><td>Allow-HTTPS</td><td>Any</td><td>Subnet prefix</td><td>443</td><td>TCP</td><td>Allow</td></tr><tr><td>120</td><td>Allow-GatewayManager</td><td>GatewayManager</td><td>Any</td><td>65200-65535</td><td>TCP</td><td>Allow</td></tr><tr><td>130</td><td>Allow-AzureLoadBalancer</td><td>AzureLoadBalancer</td><td>Any</td><td>Any</td><td>Any</td><td>Allow</td></tr></tbody></table></div>
<strong>Outbound:</strong>
<div><table><thead><tr><th>Prioridade</th><th>Nome</th><th>Source</th><th>Destination</th><th>Porta</th><th>Protocolo</th><th>Ação</th></tr></thead><tbody><tr><td>100</td><td>Allow-Internet</td><td>Any</td><td>Internet</td><td>Any</td><td>Any</td><td>Allow</td></tr></tbody></table></div>
<p>A regra <code>GatewayManager</code> nas portas <code>65200-65535</code> é obrigatória para o control plane do Application Gateway v2. Sem ela, o backend health não funciona.</p>

<h2 id="ddos-protection">DDoS Protection</h2>

<p>A Microsoft recomenda habilitar DDoS Protection na VNet que contém a subnet do Application Gateway com IP público. No portal:</p>

<ul>
<li>VNet -> DDoS Protection -> Enable</li>
</ul>


<h2 id="etapa-5-criar-private-dns-zones">ETAPA 5 - Criar Private DNS Zones</h2>

<p>Crie estas zonas privadas:</p>

<ul>
<li><code>privatelink.azurewebsites.net</code></li>
<li><code>privatelink.database.windows.net</code></li>
<li><code>privatelink.vaultcore.azure.net</code></li>
<li><code>privatelink.blob.core.windows.net</code></li>
</ul>

<p>Depois, crie o <strong>Virtual Network Link</strong> de cada zona para <code>vnet-app-baseline</code>.</p>

<p>Sem esse passo, Private Endpoint costuma quebrar por falha de resolução DNS.</p>


<h2 id="etapa-6-criar-key-vault-privado">ETAPA 6 - Criar Key Vault (privado)</h2>

<p>Crie o Key Vault:</p>

<ul>
<li>Nome: <code>kv-app-baseline</code></li>
<li>Public network access: <strong>Disabled</strong></li>
<li>Authorization model: <strong>Azure RBAC</strong></li>
</ul>

<p>Depois crie o Private Endpoint do Key Vault:</p>

<ul>
<li>Subnet: <code>snet-privateEndpoints</code></li>
<li>Private DNS Zone: <code>privatelink.vaultcore.azure.net</code></li>
</ul>


<h2 id="etapa-7-criar-storage-account-privado">ETAPA 7 - Criar Storage Account (privado)</h2>

<p>Crie a Storage Account:</p>

<ul>
<li>Nome único (exemplo): <code>stappbaseline123</code></li>
<li>Redundância: <code>ZRS</code></li>
<li>Public network access: <strong>Disabled</strong></li>
</ul>

<p>Crie o Private Endpoint para Blob:</p>

<ul>
<li>Subresource: <code>blob</code></li>
<li>Subnet: <code>snet-privateEndpoints</code></li>
<li>Private DNS Zone: <code>privatelink.blob.core.windows.net</code></li>
</ul>


<h2 id="etapa-8-criar-azure-sql-privado">ETAPA 8 - Criar Azure SQL (privado)</h2>

<p>Ordem recomendada no portal para evitar retrabalho:</p>

<p>1. Criar o SQL Server</p>
<p>2. Criar o SQL Database</p>
<p>3. Criar o Private Endpoint para o SQL</p>

<p>Crie o SQL Server:</p>

<ul>
<li>Public network access: <strong>Disabled</strong></li>
</ul>

<p>Crie o banco de dados no servidor criado:</p>

<ul>
<li>Camada: <code>General Purpose</code></li>
<li>Zone redundancy: habilitado</li>
</ul>

<p>Depois crie o Private Endpoint do SQL:</p>

<ul>
<li>Subnet: <code>snet-privateEndpoints</code></li>
<li>Private DNS Zone: <code>privatelink.database.windows.net</code></li>
</ul>


<h2 id="etapa-9-criar-app-service-plan">ETAPA 9 - Criar App Service Plan</h2>

<p>Configuração recomendada para baseline:</p>

<ul>
<li>Tier: <code>Premium v3/v4</code></li>
<li>Zone redundancy: habilitado</li>
<li>Instance count inicial: <code>3</code></li>
</ul>

<p>A Microsoft recomenda no mínimo 3 instâncias para o App Service Plan com zone redundancy. Se uma zona falhar, as outras 2 mantêm a disponibilidade sem esperar o startup de novas instâncias.</p>


<h2 id="etapa-10-criar-web-app">ETAPA 10 - Criar Web App</h2>

<p>Crie o Web App (Node, .NET ou container) usando o plano da etapa anterior.</p>

<p>Depois configure:</p>

<ul>
<li>Networking -> VNet Integration -> <code>snet-appService</code></li>
<li>Public Network Access -> <strong>Disabled</strong></li>
<li>Health Check -> <code>/</code> (ou endpoint de health da sua app)</li>
</ul>

<p>O Health Check permite que o App Service detecte instâncias com problema e redirecione tráfego automaticamente para instâncias saudáveis. Requer no mínimo 2 instâncias no plano.</p>


<h2 id="etapa-11-criar-private-endpoint-do-web-app">ETAPA 11 - Criar Private Endpoint do Web App</h2>

<p>No Web App:</p>

<ul>
<li>Networking -> Private Endpoint -> Add</li>
<li>Subnet: <code>snet-privateEndpoints</code></li>
<li>Subresource: <code>sites</code></li>
<li>Private DNS Zone: <code>privatelink.azurewebsites.net</code></li>
</ul>

<p>Resultado esperado: o App Service fica acessível apenas internamente.</p>


<h2 id="etapa-12-criar-application-gateway-waf">ETAPA 12 - Criar Application Gateway + WAF</h2>

<p>Primeiro, crie um Public IP:</p>

<ul>
<li>SKU: <code>Standard</code></li>
<li>Zone-redundant</li>
</ul>

<p>Depois crie o Application Gateway:</p>

<ul>
<li>SKU: <code>WAF_v2</code></li>
<li>Autoscaling: habilitado</li>
<li>Min instances: <code>3</code> (Microsoft recomenda no mínimo 3 para evitar downtime de 6-7 min no startup de nova instância)</li>
<li>Subnet: <code>snet-appGateway</code> (ou a subnet dedicada definida para o gateway)</li>
</ul>

<p>Depois de criar o Application Gateway, crie uma <strong>WAF Policy</strong>:</p>

<ul>
<li>Pesquise <code>Web Application Firewall policies</code> -> Create</li>
<li>Mode: <strong>Prevention</strong></li>
<li>Ruleset: <code>Microsoft Default Rule Set (DRS) 2.1</code> ou mais recente</li>
<li>Associe ao Application Gateway criado</li>
</ul>

<p>Sem a WAF Policy em Prevention, o WAF não bloqueia ataques como SQL injection e XSS.</p>

<p>Configuração inicial (HTTP temporário para validar fluxo):</p>

<p>1. Listener HTTP:</p>

<ul>
<li>Protocolo: <code>HTTP</code></li>
<li>Porta: <code>80</code></li>
</ul>

<p>2. Backend Pool:</p>

<ul>
<li>Target: FQDN</li>
<li>Valor: <code>nomedoapp.azurewebsites.net</code></li>
</ul>

<p>3. HTTP Settings:</p>

<ul>
<li>Protocolo: <code>HTTPS</code></li>
<li>Porta: <code>443</code></li>
<li>Override host name: <code>nomedoapp.azurewebsites.net</code></li>
<li>SNI: habilitado</li>
</ul>

<p>4. Health Probe customizada:</p>

<ul>
<li>Host: <code>nomedoapp.azurewebsites.net</code></li>
<li>Path: <code>/</code> (ou endpoint de health da sua app)</li>
</ul>

<p>5. Rule:</p>

<ul>
<li>Associe Listener -> Backend Pool -> HTTP Settings</li>
</ul>

<p>Se backend ficar <code>Unhealthy</code>, o problema costuma ser DNS privado não vinculado corretamente ou host/probe incorretos.</p>


<h2 id="etapa-13-criar-registro-dns-publico">ETAPA 13 - Criar registro DNS público</h2>

<p>Na zona DNS pública <code>seudominio.com.br</code>, crie:</p>

<ul>
<li>Tipo: <code>A</code></li>
<li>Nome: <code>app</code></li>
<li>IP: IP público do Application Gateway</li>
</ul>

<p>Resultado:</p>

<code>app.seudominio.com.br</code> -> Application Gateway


<h2 id="etapa-14-configurar-https-real-com-certificado">ETAPA 14 - Configurar HTTPS real com certificado</h2>

<p>Emita certificado para:</p>

<code>app.seudominio.com.br</code>

<p>Pode ser Let's Encrypt, ZeroSSL ou certificado comercial.</p>

<h2 id="tutorial-rapido-certificado-gratuito-com-zerossl">Tutorial rápido - certificado gratuito com ZeroSSL</h2>

<p>Para este lab, use o fluxo por validação DNS no ZeroSSL.</p>

<p>1. Acesse o ZeroSSL e inicie emissão para <code>app.seudominio.com.br</code>.</p>

<p>2. Escolha validação por <code>CNAME</code>.</p>

<p>3. O ZeroSSL vai fornecer um registro parecido com este:</p>

<div data-lang="code"><pre><code>Name
_xxxx.app.seudominio.com.br

Target
xxxx.comodoca.com</code></pre></div>

<p>4. Na zona <code>seudominio.com.br</code> no Azure DNS, crie o <code>CNAME</code> com os valores informados.</p>

<p>5. Aguarde propagação e valide:</p>

<div data-lang="bash"><pre><code>nslookup -type=CNAME _xxxx.app.seudominio.com.br</code></pre></div>

<p>6. Conclua a validação no portal do ZeroSSL e baixe os arquivos:</p>

<div data-lang="code"><pre><code>certificate.crt
ca_bundle.crt
private.key</code></pre></div>

<p>7. Converta para <code>PFX</code>:</p>

<div data-lang="bash"><pre><code>openssl pkcs12 -export \
  -out app-seudominio.pfx \
  -inkey private.key \
  -in certificate.crt \
  -certfile ca_bundle.crt</code></pre></div>

<p>Importe o certificado no Key Vault.</p>

<h2 id="passo-obrigatorio-criar-user-assigned-managed-identity">Passo obrigatório - criar User Assigned Managed Identity</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/labpe/02.png" alt="Portal do Azure criando a User Assigned Managed Identity" />

<a href="https://learn.microsoft.com/azure/application-gateway/key-vault-certs" target="_blank" rel="noopener noreferrer">Referência oficial da Microsoft</a>

<p>Conforme a documentação, a integração Application Gateway + Key Vault exige 3 passos:</p>

<p>1. Criar uma User Assigned Managed Identity</p>
<p>2. Delegar acesso dessa identidade ao Key Vault</p>
<p>3. Associar a identidade e o certificado no Application Gateway via CLI ou PowerShell</p>

<p>Importante: com Azure RBAC no Key Vault (como configuramos na ETAPA 6), o vínculo da identidade e do certificado no Application Gateway não é suportado pelo portal. Use PowerShell ou CLI.</p>

<h3 id="passo-1-criar-a-identidade">Passo 1 - Criar a identidade</h3>

<p>No portal:</p>

<ul>
<li>Pesquise <code>Managed Identities</code> -> Create</li>
<li>Nome: <code>mi-agw-kv-reader</code></li>
<li>Resource Group: <code>rg-app-baseline-lab</code></li>
<li>Região: mesma do lab</li>
</ul>

<h3 id="passo-2-conceder-permissao-no-key-vault">Passo 2 - Conceder permissão no Key Vault</h3>

<p>No Key Vault -> IAM:</p>

<ul>
<li>Role: <code>Key Vault Secrets User</code></li>
<li>Principal: <code>mi-agw-kv-reader</code></li>
</ul>

<p>Nota: como o Key Vault tem Private Endpoint habilitado (ETAPA 6), o Application Gateway já consegue acessar via IP privado desde que a zona <code>privatelink.vaultcore.azure.net</code> esteja linkada a VNet (ETAPA 5).</p>

<h3 id="passo-3-associar-identidade-e-certificado-no-application-gateway-powershell">Passo 3 - Associar identidade e certificado no Application Gateway (PowerShell)</h3>

<div data-lang="powershell"><pre><code># Obter o Application Gateway
$appgw = Get-AzApplicationGateway -Name agw-app-baseline -ResourceGroupName rg-app-baseline-lab

# Associar a User Assigned Managed Identity
Set-AzApplicationGatewayIdentity -ApplicationGateway $appgw \
  -UserAssignedIdentityId "/subscriptions/&lt;subscription-id&gt;/resourceGroups/rg-app-baseline-lab/providers/Microsoft.ManagedIdentity/userAssignedIdentities/mi-agw-kv-reader"

# Obter o secret ID do certificado no Key Vault (sem versão para auto-rotação)
$secret = Get-AzKeyVaultSecret -VaultName "kv-app-baseline" -Name "&lt;nome-do-certificado&gt;"
$secretId = $secret.Id.Replace($secret.Version, "")

# Adicionar o certificado SSL ao Application Gateway
Add-AzApplicationGatewaySslCertificate -KeyVaultSecretId $secretId -ApplicationGateway $appgw -Name $secret.Name

# Aplicar as alterações
Set-AzApplicationGateway -ApplicationGateway $appgw</code></pre></div>

<h3 id="passo-4-criar-listener-https-no-portal">Passo 4 - Criar Listener HTTPS no portal</h3>

<p>Agora sim, no portal:</p>

<ul>
<li>Application Gateway -> Listeners -> Add Listener</li>
<li>Protocol: HTTPS</li>
<li>Porta: 443</li>
<li>Host name: <code>app.seudominio.com.br</code></li>
<li>Certificate: selecione o certificado adicionado no passo anterior</li>
<li>Save</li>
</ul>

<h3 id="passo-5-redirect-http-para-https">Passo 5 - Redirect HTTP para HTTPS</h3>

<p>No Application Gateway, crie uma regra de redirecionamento:</p>

<ul>
<li>Application Gateway -> Rules -> selecione a regra do Listener HTTP (porta 80)</li>
<li>Backend targets: troque para <strong>Redirection</strong></li>
<li>Target type: <code>Listener</code></li>
<li>Target listener: o listener HTTPS criado no passo anterior</li>
<li>Redirect type: <code>Permanent (301)</code></li>
</ul>

<p>Isso garante que todo acesso HTTP seja redirecionado automaticamente para HTTPS.</p>


<h2 id="etapa-15-testes-finais-checklist-de-aceite">ETAPA 15 - Testes finais (checklist de aceite)</h2>

<p>Teste 1:</p>

<div data-lang="code"><pre><code>https://app.seudominio.com.br</code></pre></div>

<p>Esperado: carregar normalmente via Application Gateway.</p>

<p>Teste 2:</p>

<div data-lang="code"><pre><code>https://nomedoapp.azurewebsites.net</code></pre></div>

<p>Esperado: falhar (acesso público do App Service desabilitado).</p>

<p>Teste 3:</p>

<div data-lang="code"><pre><code>nslookup app.seudominio.com.br</code></pre></div>

<p>Esperado: retornar o IP público do Application Gateway.</p>

<p>Se os 3 testes passarem, sua baseline esta pronta com:</p>

<ul>
<li>DNS público no Azure</li>
<li>WAF na borda</li>
<li>Private Link no backend</li>
<li>Isolamento de rede</li>
<li>TLS ponta a ponta</li>
</ul>


<h2 id="troubleshooting-rapido">Troubleshooting rápido</h2>

<h2 id="backend-unhealthy-no-application-gateway">Backend <code>Unhealthy</code> no Application Gateway</h2>

<ul>
<li>Verifique se as Private DNS Zones estão linkadas a VNet</li>
<li>Confirme host da probe e path de health</li>
<li>Valide se o Web App responde 200 no endpoint usado na probe</li>
</ul>

<h2 id="erro-de-certificado-no-listener-https">Erro de certificado no listener HTTPS</h2>

<ul>
<li>Confirme Managed Identity ativa no Application Gateway</li>
<li>Confirme role <code>Key Vault Secrets User</code> no Key Vault</li>
<li>Aguarde propagação de permissões RBAC (pode levar alguns minutos)</li>
</ul>

<h2 id="erro-de-host-header">Erro de host header</h2>

<ul>
<li>Confirme que o domínio público foi adicionado no App Service (Custom Domains), quando exigido pelo seu fluxo</li>
</ul>


<h2 id="exportar-como-infrastructure-as-code-iac">Exportar como Infrastructure as Code (IaC)</h2>

<p>Para quem não conhece, o Azure permite exportar todos os recursos de um Resource Group como código. Você pode gerar templates em ARM (JSON), Bicep ou Terraform direto pelo portal ou CLI.</p>

<p>No portal: Resource Group -> Export template.</p>

<p>Isso é útil para versionar a infraestrutura, replicar o ambiente em outra subscription ou usar como base para automação em pipelines de CI/CD.</p>

<p>Neste laboratório, exportei o Resource Group inteiro no formato Terraform. O arquivo ficou com mais de 2 mil linhas, então não incluí aqui no artigo. Publiquei no meu repositório do GitHub como referência:</p>


<a href="https://github.com/orafaelferreiraa/tf-app-gateway-baseline-private-endpoint" target="_blank" rel="noopener noreferrer"><strong>Github</strong></a>
<p>Importante: esse export não foi testado como implementação real com <code>terraform apply</code>. O Azure gera o código a partir do estado atual dos recursos, mas nem sempre o resultado é aplicável sem ajustes. Use como ponto de partida e referência, não como código pronto para produção.</p>


<h2 id="visualizacao-da-arquitetura-no-portal">Visualização da arquitetura no portal</h2>

<p>O Azure oferece uma funcionalidade de visualização gráfica direto pelo Resource Group. No portal, acesse Resource Group -> Resource visualizer. Lá você consegue ver todos os recursos e suas conexões em um diagrama interativo, e exportar a imagem.</p>

<p>Este é o resultado final do nosso laboratório:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/labpe/03.png" alt="Visualização da arquitetura final no portal do Azure" />


<h2 id="conclusao">Conclusão</h2>

<p>Esse roteiro evita o ciclo comum de "cria recurso, testa, quebra DNS, volta tudo".</p>

<p>Seguindo essa ordem, você implementa a arquitetura baseline completa de forma previsível: primeiro identidade e rede, depois Private Link, em seguida borda WAF e por fim DNS/TLS público com validação final.</p>]]></content:encoded>
    </item>
    <item>
      <title>Vibe Coding com DevOps: usei IA pra criar meu site, mas quem fez o deploy fui EU - Meetup Codecon #15</title>
      <link>https://www.orafaelferreira.com/artigos/codecon-15-florianopolis</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/codecon-15-florianopolis</guid>
      <pubDate>Fri, 27 Feb 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Relato da palestra Vibe Coding com DevOps no Meetup Codecon #15 em Florianópolis: um site que nasceu de um prompt com IA e chegou à produção com DevOps.</description>
      <category>Palestras</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/%2315codecon/00.jpeg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/%2315codecon/00.jpeg" alt="Banner do Meetup Codecon #15 em Florianópolis" />

<p>No dia <strong>25 de fevereiro de 2026</strong>, rolou o <a href="https://eventos.codecon.dev/eventos/floripa-meetup-codecon-15" target="_blank" rel="noopener noreferrer"><strong>Codecon Meetup #15</strong></a> em Florianópolis. O encontro aconteceu no <strong>Impact Hub Bewiki</strong>, no centro da cidade, um espaço de coworking focado em inovação e conexões entre profissionais de tecnologia.</p>

<p>Foram cerca de 3 horas de troca técnica, networking e conversas sobre como a IA e o ensino estão mudando a forma de construir software.</p>

<p>Abri a noite junto com a <a href="https://www.linkedin.com/in/jessica-tmello/" target="_blank" rel="noopener noreferrer"><strong>Jéssica Mello</strong></a> com a talk:</p>
<strong>Vibe Coding com DevOps: usei IA pra criar meu site, mas quem fez o deploy fui EU</strong>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/%2315codecon/02.jpg" alt="Rafael Ferreira palestrando sobre Vibe Coding com DevOps" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/%2315codecon/06.jpg" alt="Público do Codecon #15 no Impact Hub Bewiki" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/%2315codecon/03.jpg" alt="Slide de abertura da palestra Vibe Coding com DevOps" />


<p>A proposta foi mostrar um case real: a construção do meu site pessoal usando <strong>IA generativa + engenharia de software + DevOps</strong>.</p>

<p>A história começou com um prompt simples, pedindo um site profissional, moderno e responsivo. A primeira versão saiu toda com IA e virou um one-page rápido de colocar no ar, mas aquilo era só o começo.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/%2315codecon/01.jpg" alt="Slide mostrando a primeira versão do site gerada com IA" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/%2315codecon/05.jpg" alt="Rafael Ferreira explicando a evolução do site pessoal" />


<h2 id="do-prompt-ao-codigo">Do prompt ao código</h2>

<p>Depois da primeira versão gerada por IA, o próximo passo foi assumir o controle do projeto. O site saiu da ferramenta de geração e foi para um repositório com versionamento profissional, refatoração e organização de código.</p>

<p>Foi ali que o projeto deixou de ser só um experimento de IA e virou um produto de verdade: separação em múltiplas páginas, melhorias de UX, ajustes de SEO e evolução contínua.</p>

<p>A IA ajudou muito a acelerar, mas engenharia ainda manda no resultado final.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/%2315codecon/04.jpg" alt="Slide sobre a pipeline de deploy do site no Azure" />

<h2 id="colocando-em-producao">Colocando em produção</h2>

<p>Toda a infraestrutura foi provisionada usando <strong>Infrastructure as Code (Terraform)</strong>, garantindo imutabilidade e consistência. O deploy ficou totalmente automatizado com pipeline CI/CD.</p>

<p>Push no repositório, testes rodando, deploy automático. No ClickOps.</p>

<p>Também falamos sobre o lado que pouca gente comenta quando o assunto é IA. Dependência de plataforma, custos e vendor lock-in são alguns riscos. IA acelera muito, mas em produção exige controle. Essa foi uma das mensagens centrais da talk.</p>

<p>Mas uma coisa continua igual: deploy ainda é responsabilidade do engenheiro.</p>
<p>E ainda bem.</p>

<h2 id="tecnologia-como-ponte">Tecnologia como ponte</h2>

<p>Na sequência, a <strong><a href="https://www.linkedin.com/in/maizalouise/" target="_blank" rel="noopener noreferrer">Maiza Louise</a></strong> trouxe a talk: <strong>Tecnologia como ponte para educação de qualidade</strong></p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/%2315codecon/09.jpg" alt="Maiza Louise palestrando sobre tecnologia e educação" />

<p>Uma visão bem diferente e complementar, mostrando como tecnologia pode gerar impacto real fora do mundo corporativo. Esse tipo de assunto deixa o meetup muito mais rico.</p>

<h2 id="fechamento">Fechamento</h2>

<p>Eu e a Maisa estavamos representando a Alura, que estava presente apoiando o evento. Tivemos um sorteio de um ano de licença da plataforma. </p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/%2315codecon/10.jpg" alt="Sorteio da licença Alura durante o Codecon #15" />

<p>E essa é a foto com o ganhador:</p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/%2315codecon/11.jpg" alt="Rafael Ferreira e Maiza com o ganhador do sorteio da Alura" />

<h2 id="slides">Slides</h2>

<p>Os slides estão disponíveis aqui:</p>

<ul>
<li><i></i> <strong>Slides da Apresentação:</strong></li>
</ul>
<a href="https://stoblobcertificados011.blob.core.windows.net/palestras/codecon15.pdf" target="_blank" rel="noopener noreferrer">Vibe Coding com DevOps – Codecon #15</a>

]]></content:encoded>
    </item>
    <item>
      <title>Vibe Coding com DevOps: usei IA pra criar meu site, mas quem fez o deploy fui EU - no 92º Python Floripa</title>
      <link>https://www.orafaelferreira.com/artigos/python-floripa-92-hostgator</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/python-floripa-92-hostgator</guid>
      <pubDate>Sun, 01 Feb 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Relato do 92º Python Floripa na HostGator: talk Vibe Coding com DevOps ao lado de Jéssica Mello, IA sem romantização, DevOps no mundo real e networking.</description>
      <category>Palestras</category>
      <category>Comunidade</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/92python-floripa/00.jpg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/92python-floripa/00.jpg" alt="Banner do 92º Python Floripa na HostGator" />

<p>No dia <strong>31 de janeiro de 2026</strong>, rolou o <a href="https://www.meetup.com/pt-br/floripa-python-meetup/events/312978297/?eventOrigin=group_past_events" target="_blank" rel="noopener noreferrer"><strong>92º Python Floripa</strong></a>, dessa vez dentro do QG da <strong>HostGator</strong>, em Florianópolis. E olha… competimos com a praia num sábado de sol em pleno verão e ganhamos. Isso diz muita coisa sobre a força da comunidade.</p>

<p>Casa cheia, energia lá em cima e um clima muito claro: sem hype, mais prática. Menos buzzword, mais ideia de como construir software hoje.</p>

<h2 id="uma-tarde-fod">Uma tarde FOD@</h2>

<p>As talks se conectaram, nada fora do contexto. Como desenvolver software com mais consciência, estratégia e visão de longo prazo.</p>

<p>Abri a tarde junto com a <a href="https://www.linkedin.com/in/jessica-tmello/" target="_blank" rel="noopener noreferrer"><strong>Jéssica Mello</strong></a>, puxando uma conversa bem direta sobre <strong>Vibe Coding com DevOps</strong>. IA ajuda, acelera, mas não substitui humano, processo e muito menos o engenheiro/a. E sim, <strong>DevOps continua sendo peça-chave</strong> quando o assunto é colocar aplicação no ar com segurança, controle e previsibilidade.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/92python-floripa/02.jpg" alt="Rafael Ferreira e Jéssica Mello abrindo a talk Vibe Coding com DevOps" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/92python-floripa/03.jpg" alt="Público lotando o auditório da HostGator no Python Floripa" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/92python-floripa/04.jpg" alt="Slide da palestra sobre IA e DevOps no mundo real" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/92python-floripa/05.jpg" alt="Rafael Ferreira apresentando o case do site pessoal" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/92python-floripa/06.jpg" alt="Jéssica Mello falando sobre IA no dia a dia de quem constrói" />A ideia não foi vender futuro mágico, foi apresentar um case real, mesmo que o meu site (vulgo esse que você está lendo agora).

<h2 id="ia-no-dia-a-dia-de-quem-constroi">IA no dia a dia de quem constrói</h2>

<p>Na sequência, a <strong>Evelyn Cid</strong> aprofundou exatamente esse ponto: como a IA já está impactando a rotina do desenvolvedor agora, do código à tomada de decisão. Menos palco, mais bastidor. Menos promessa, mais uso consciente por quem está no teclado todos os dias.</p>

<p>Fechando o evento, a <strong>Ana Paula Mendes</strong> trouxe um tema que deveria ser obrigatório em qualquer carreira tech: <strong>brag document</strong>.</p>

<h2 id="comunidade-sendo-comunidade">Comunidade sendo comunidade</h2>

<p>As <strong>lightning talks</strong> deram aquele tempero clássico do Python Floripa: projetos pessoais, ideias em construção, dicas práticas e muita troca honesta. Gente aprendendo, gente ensinando e todo mundo no mesmo nível.</p>

<p>E claro, o coffee break fez jus à fama. Muita conversa e networking</p>

<h2 id="agradecimento">Agradecimento</h2>

<p>Fica aqui um agradecimento gigante à Comunidade <strong>Python Floripa</strong>, que fortalecem demais a cena tech em Floripa.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/92python-floripa/07.jpg" alt="Comunidade Python Floripa reunida no 92º encontro" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/92python-floripa/08.jpg" alt="Palestrantes e organizadores do 92º Python Floripa" />

<p>As talks estão disponíveis no <a href="https://www.youtube.com/watch?v=XQPHdujjrAY" target="_blank" rel="noopener noreferrer">YouTube</a> pra quem quiser assistir ou reassistir. E se a quiser participar do próximo, já se organiza e acompanha as novidades no nosso <a href="https://tech.floripa.br/" target="_blank" rel="noopener noreferrer">calendário</a>.</p>

<ul>
<li><i></i> <strong>Slides da Apresentação:</strong> <a href="https://stoblobcertificados011.blob.core.windows.net/palestras/98python-floripa.pdf" target="_blank" rel="noopener noreferrer">Vibe Coding com DevOps: usei IA pra criar meu site, mas quem fez o deploy fui EU</a></li>
</ul>

]]></content:encoded>
    </item>
    <item>
      <title>A Stack por trás do meu Blog: Pipelines CI/CD, Testes e Estratégias GitHub Actions</title>
      <link>https://www.orafaelferreira.com/artigos/artigo-github-actions-deep-dive</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/artigo-github-actions-deep-dive</guid>
      <pubDate>Thu, 22 Jan 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Deep dive nas estratégias de GitHub Actions do meu blog: arquitetura de workflows, cache, pirâmide de testes, segurança e observabilidade em casos reais.</description>
      <category>Artigos</category>
      <category>Azure</category>
      <category>Terraform</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/gh-deep-dipe/01.png" length="0" type="image/png" />
      <content:encoded><![CDATA[<h2 id="introducao">Introdução</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/gh-deep-dipe/01.png" alt="Capa do artigo sobre pipelines CI/CD com GitHub Actions" />

<p>No <a href="https://www.orafaelferreira.com/artigo-terraform-infra-cicd" target="_blank" rel="noopener noreferrer">artigo anterior</a>, mostrei como estruturei a infraestrutura do blog com Terraform e GitHub Actions. Agora vamos seguir em frente e fazer um deep dive no GitHub Actions (Pipelines CI/CD).</p>

<p>Vou compartilhar estratégias de deploy, pull requests, conceitos de engenharia de platforma aplicadas na prática, otimizações de performance e práticas de segurança que apliquei.</p>

<h2 id="o-que-vamos-ver">O que vamos ver:</h2>

<ul>
<li><strong>Arquitetura de Workflows</strong>: Overview das 3 pipelines (infra-plan, infra-deploy, deploy-app)</li>
<li><strong>Estratégias de Branching</strong>: trunk-based development aplicado na prática</li>
<li><strong>Pirâmide de Testes</strong>: unitários, componentes e E2E</li>
<li><strong>Otimização de Performance</strong>: caching de dependências e providers Terraform</li>
<li><strong>Segurança em Pipelines</strong>: tflint, tfsec, Checkov e gestão de secrets Azure</li>
<li><strong>Job Summaries</strong>: informações dos outputs após as execuções</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/gh-deep-dipe/02.png" alt="Visão geral dos tópicos do deep dive em GitHub Actions" />

<h2 id="1-arquitetura-de-workflows">1. Arquitetura de Workflows</h2>

<h3 id="11-organizacao-e-nomenclatura">1.1 Organização e Nomenclatura</h3>

<p>Uma das primeiras decisões que tomei foi: <strong>como organizar as workflows</strong>. Em projetos menores, tudo pode ficar em um único arquivo. Em projetos maiores, com a separação fica mais a manutenção e sua usabilidade.</p>

<strong>Estrutura atual do projeto:</strong>

<div data-lang="code"><pre><code>.github/
  workflows/
    infra-plan.yml        # PR → Terraform plan + validações
    infra-apply.yml       # main → Terraform apply + docs
    deploy-app.yml        # main → build + testes + deploy</code></pre></div>

<h3 id="12-path-filters-execute-apenas-o-necessario">1.2 Path Filters: Execute Apenas o Necessário</h3>

<p>Uma otimização simples mas poderosa: <strong>não rode workflows quando não há mudanças relevantes</strong>.</p>

<strong>infra-plan.yml</strong> (executa apenas em mudanças na infra):

<div data-lang="yaml"><pre><code>on:
  pull_request:
    branches: [ main ]
    paths:
      - 'infra/**'
      - '.github/workflows/infra-plan.yml'</code></pre></div>

<strong>deploy-app.yml</strong> (executa em mudanças no código da aplicação):

<div data-lang="yaml"><pre><code>on:
  push:
    branches: [ main ]
    paths:
      - 'src/**'
      - 'e2e/**'
      - 'public/**'
      - 'index.html'
      - 'package.json'
      - 'package-lock.json'
      - 'bun.lockb'
      - 'tsconfig*.json'
      - 'vite.config.ts'
      - 'tailwind.config.ts'
      - 'postcss.config.js'
      - 'eslint.config.js'
      - '.github/workflows/deploy-app.yml'</code></pre></div>

<p>Se você só mexer no README, nenhum workflow roda.</p>

<h3 id="13-workflow-chaining-infra-app">1.3 Workflow Chaining: Infra → App</h3>

<p>O <strong>deploy-app.yml</strong> tem um trigger com uma condition: aguarda a workflow <strong>infra-apply</strong> terminar com sucesso:</p>

<div data-lang="yaml"><pre><code>on:
  workflow_run:
    workflows: ["infra-apply"]
    types:
      - completed
    branches: [ main ]

jobs:
  build_and_deploy:
    if: github.event.workflow_run.conclusion == 'success'</code></pre></div>

<p>Se eu alterar algo na infraestrutura (Terraform) e o código do site ao mesmo tempo, a infra deve ser provisionada antes do deploy da app.</p>

<h2 id="2-estrategias-de-branching-e-cicd">2. Estratégias de Branching e CI/CD</h2>

<p>A estratégia de branching influencia diretamente <strong>como seus workflows se comportam</strong>.</p>

<h3 id="21-trunk-based-development-na-pratica">2.1 Trunk-Based Development na Prática</h3>

<strong>Abordagem implementada:</strong>

<div data-lang="code"><pre><code>main (produção)
  ↑
feature branches ou commits diretos</code></pre></div>

<strong>Workflow por evento:</strong>

<strong>Pull Request → main</strong> (infra-plan.yml):
<div data-lang="yaml"><pre><code>on:
  pull_request:
    branches: [ main ]
    paths:
      - 'infra/**'
      - '.github/workflows/infra-plan.yml'
  workflow_dispatch:

jobs:
  terraform-plan:
    # Executa plan, validações, scans
    # Adiciona comentário do plan no PR</code></pre></div>

<strong>Push → main</strong> (infra-apply.yml e deploy-app.yml):
<div data-lang="yaml"><pre><code>on:
  push:
    branches: [ main ]
    paths:
      - 'infra/**'
      - '.github/workflows/infra-apply.yml'
  workflow_dispatch:

jobs:
  terraform:         # infra-apply
  build_and_deploy:  # deploy-app</code></pre></div>

<strong>Proteção adicional</strong>: o bot github-actions é bloqueado para evitar loops infinitos:

<div data-lang="yaml"><pre><code>if: github.actor != 'github-actions[bot]'</code></pre></div>

<h3 id="22-concurrency-control">2.2 Concurrency Control</h3>

<strong>Problema</strong>: múltiplos pushes podem criar race conditions no deploy.

<strong>Solução</strong>: controle de concorrência

<div data-lang="yaml"><pre><code>concurrency:
  group: deploy-${{ github.ref }}
  cancel-in-progress: true  # Cancela deploys anteriores</code></pre></div>

<p>Para infraestrutura (Terraform):</p>

<div data-lang="yaml"><pre><code>concurrency:
  group: infra-${{ github.head_ref || github.ref }}
  cancel-in-progress: true  # Cancela runs anteriores</code></pre></div>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/gh-deep-dipe/03.png" alt="Execução de workflows no GitHub Actions com concurrency control" />

<h2 id="3-piramide-de-testes">3. Pirâmide de Testes</h2>

<div data-lang="code"><pre><code>

        /\
       /  \
      / E2E\          ← Poucos, críticos
     /------\
    /  API   \        ← Médios, contratos
   /----------\
  / Unit Tests \       ← Base sólida
 /--------------\

 </code></pre></div>

<h3 id="31-testes-unitarios-base">3.1 Testes Unitários (Base)</h3>

<strong>No projeto do blog:</strong>

<div data-lang="yaml"><pre><code>- name: Unit tests
  run: npm run test:ci</code></pre></div>

<div data-lang="json"><pre><code>// package.json
{
  "scripts": {
    "test": "vitest",
    "test:ci": "vitest run --coverage --reporter=verbose"
  }
}</code></pre></div>

<strong>Configuração Vitest:</strong>

<div data-lang="typescript"><pre><code>// vitest.config.ts
export default defineConfig({
  test: {
    globals: true,
    environment: 'jsdom',
    setupFiles: './src/setupTests.ts',
    coverage: {
      provider: 'v8',
      reporter: ['text', 'lcov', 'html'],
      exclude: [
        'node_modules/',
        'src/setupTests.ts',
        '**/*.d.ts',
        '**/*.config.*',
        '**/mockData',
      ],
      thresholds: {
        lines: 80,
        functions: 75,
        branches: 70,
        statements: 80,
      },
    },
  },
});</code></pre></div>

<strong>Output no CI:</strong>
<ul>
<li>Output no job summary</li>
<li>Falha se abaixo dos thresholds</li>
</ul>

<h3 id="32-testes-de-componente">3.2 Testes de Componente</h3>

<strong>Objetivo</strong>: validar UI isoladamente.

<div data-lang="yaml"><pre><code>- name: Component tests
  run: npm run test:components:ci</code></pre></div>

<strong>React Testing Library + Vitest:</strong>

<div data-lang="typescript"><pre><code>// src/components/ui/button.test.tsx
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { Button } from './button';

describe('Button', () =&gt; {
  it('executa onClick quando clicado', async () =&gt; {
    const handleClick = vi.fn();
    render(&lt;Button onClick={handleClick}&gt;Click me&lt;/Button&gt;);
    
    await userEvent.click(screen.getByRole('button'));
    
    expect(handleClick).toHaveBeenCalledTimes(1);
  });
  
  it('renderiza variantes corretamente', () =&gt; {
    const { container } = render(&lt;Button variant="destructive"&gt;Delete&lt;/Button&gt;);
    expect(container.firstChild).toHaveClass('bg-destructive');
  });
});</code></pre></div>

<strong>Configuração específica:</strong>

<div data-lang="typescript"><pre><code>// vitest.config.components.ts
export default defineConfig({
  test: {
    include: ['src/components/**/*.test.tsx'],
    environment: 'jsdom',
    setupFiles: './src/setupTests.ts',
  },
});</code></pre></div>

<h3 id="33-testes-e2e">3.3 Testes E2E</h3>

<strong>Objetivo</strong>: validar fluxos críticos de ponta a ponta.

<div data-lang="yaml"><pre><code>- name: Get Playwright version
  id: playwright-version
  run: echo "version=$(npm list @playwright/test --depth=0 --json 2&gt;/dev/null | jq -r '.dependencies["@playwright/test"].version // empty')" &gt;&gt; $GITHUB_OUTPUT
  
- name: Cache Playwright browsers
  uses: actions/cache@v4
  with:
    path: ~/.cache/ms-playwright
    key: playwright-${{ runner.os }}-${{ steps.playwright-version.outputs.version }}

- name: Install Playwright browsers
   if: steps.playwright-cache.outputs.cache-hit != 'true'
   run: npx playwright install --with-deps

- name: E2E smoke tests
   run: npm run test:e2e:ci</code></pre></div>

<strong>Testes smoke (cenários críticos):</strong>

<div data-lang="typescript"><pre><code>// e2e/smoke.spec.ts
import { test, expect } from '@playwright/test';

test.describe('Smoke Tests', () =&gt; {
  test('deve carregar a página inicial', async ({ page }) =&gt; {
    await page.goto('/');
    await expect(page).toHaveTitle(/Rafael Ferreira/);
    await expect(page.locator('h1')).toBeVisible();
  });
  
  test('deve navegar para artigo e renderizar conteúdo', async ({ page }) =&gt; {
    await page.goto('/');
    await page.click('text=Blog');
    await page.click('a:has-text("Terraform")').first();
    
    await expect(page).toHaveURL(/artigo-terraform/);
    await expect(page.locator('article')).toBeVisible();
  });
  
  test('deve alternar idioma', async ({ page }) =&gt; {
    await page.goto('/');
    const initialLang = await page.locator('html').getAttribute('lang');
    
    await page.click('[data-testid="language-toggle"]');
    
    const newLang = await page.locator('html').getAttribute('lang');
    expect(newLang).not.toBe(initialLang);
  });
});</code></pre></div>

<strong>Configuração Playwright:</strong>

<div data-lang="typescript"><pre><code>// playwright.config.ts
export default defineConfig({
  testDir: './e2e',
  fullyParallel: true,
  forbidOnly: !!process.env.CI,
  retries: process.env.CI ? 2 : 0,
  workers: process.env.CI ? 1 : undefined,
  reporter: process.env.CI ? 'github' : 'html',
  use: {
    baseURL: 'http://localhost:5173',
    trace: 'on-first-retry',
    screenshot: 'only-on-failure',
  },
  webServer: {
    command: 'npm run preview',
    port: 5173,
    reuseExistingServer: !process.env.CI,
  },
});</code></pre></div>

<h3 id="34-paralelizacao-de-testes">3.4 Paralelização de Testes</h3>

<strong>Estratégia de matriz:</strong>

<div data-lang="yaml"><pre><code>test:
  runs-on: ubuntu-latest
  strategy:
    matrix:
      shard: [1, 2, 3, 4]
  steps:
    - name: Run tests
      run: npm run test:ci -- --shard=${{ matrix.shard }}/4</code></pre></div>

<strong>Para Playwright:</strong>

<div data-lang="yaml"><pre><code>e2e:
  runs-on: ubuntu-latest
  strategy:
    fail-fast: false
    matrix:
      shardIndex: [1, 2, 3, 4]
      shardTotal: [4]
  steps:
    - name: Run E2E
      run: npx playwright test --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }}</code></pre></div>

<strong>Resultado</strong>: redução de ~75% no tempo de execução.

<h2 id="4-otimizacao-de-performance">4. Otimização de Performance</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/gh-deep-dipe/04.png" alt="Otimização de performance com cache no GitHub Actions" />

<h3 id="41-estrategias-de-cache-avancadas">4.1 Estratégias de Cache Avançadas</h3>

<strong>Cache em camadas:</strong>

<div data-lang="yaml"><pre><code>- name: Cache dependencies
  uses: actions/cache@v4
  with:
    path: |
      ~/.npm
      node_modules
      ~/.cache/ms-playwright
    key: ${{ runner.os }}-deps-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**/playwright.config.ts') }}
    restore-keys: |
      ${{ runner.os }}-deps-${{ hashFiles('**/package-lock.json') }}-
      ${{ runner.os }}-deps-</code></pre></div>

<strong>Cache de build:</strong>

<div data-lang="yaml"><pre><code>- name: Cache build output
  uses: actions/cache@v4
  with:
    path: |
      .next/cache
      dist/
      .vite/
    key: build-${{ runner.os }}-${{ github.sha }}
    restore-keys: |
      build-${{ runner.os }}-</code></pre></div>

<strong>Cache de Terraform providers:</strong>

<div data-lang="yaml"><pre><code>- name: Cache Terraform
  uses: actions/cache@v4
  with:
    path: |
      infra/.terraform
      ~/.terraform.d/plugin-cache
    key: terraform-${{ runner.os }}-${{ hashFiles('infra/.terraform.lock.hcl') }}</code></pre></div>

<h3 id="42-artifacts-estrategicos">4.2 Artifacts Estratégicos</h3>

<strong>Quando usar artifacts vs cache:</strong>
<div><table><thead><tr><th>Cache</th><th>Artifacts</th></tr></thead><tbody><tr><td>Dependências</td><td>Build outputs</td></tr><tr><td>Providers/plugins</td><td>Test reports</td></tr><tr><td>Ferramentas CLI</td><td>Deploy packages</td></tr><tr><td>Reutilização entre jobs</td><td>Transferência entre workflows</td></tr></tbody></table></div>
<strong>Exemplo otimizado:</strong>

<div data-lang="yaml"><pre><code>build:
  steps:
    - name: Build
      run: npm run build
    
    - name: Upload build
      uses: actions/upload-artifact@v4
      with:
        name: dist-${{ github.sha }}
        path: dist/
        retention-days: 7
        if-no-files-found: error

deploy:
  needs: build
  steps:
    - name: Download build
      uses: actions/download-artifact@v4
      with:
        name: dist-${{ github.sha }}
        path: dist/</code></pre></div>

<h3 id="43-job-conditionals-inteligentes">4.3 Job Conditionals Inteligentes</h3>

<strong>Evite jobs desnecessários:</strong>

<div data-lang="yaml"><pre><code>deploy-docs:
  if: |
    github.event_name == 'push' &amp;&amp;
    github.ref == 'refs/heads/main' &amp;&amp;
    contains(github.event.head_commit.message, '[docs]')</code></pre></div>

<strong>Path filters:</strong>

<div data-lang="yaml"><pre><code>on:
  push:
    paths:
      - 'src/**'
      - 'package.json'
      - '!**/*.md'</code></pre></div>

<strong>Combinação com GitHub CLI:</strong>

<div data-lang="yaml"><pre><code>- name: Check for relevant changes
  id: changes
  run: |
    FILES=$(gh pr view ${{ github.event.pull_request.number }} \
      --json files --jq '.files[].path')
    if echo "$FILES" | grep -E '^src/'; then
      echo "has-src-changes=true" &gt;&gt; $GITHUB_OUTPUT
    fi

- name: Run tests
  if: steps.changes.outputs.has-src-changes == 'true'
  run: npm test</code></pre></div>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/gh-deep-dipe/05.png" alt="Jobs condicionais executando apenas quando há mudanças relevantes" />

<h2 id="5-seguranca-nas-pipelines">5. Segurança nas Pipelines</h2>

<h3 id="51-a-piramide-de-seguranca-em-iac">5.1 A Pirâmide de Segurança em IaC</h3>

<p>Assim como aplicações (unit → component → E2E), infraestrutura também precisa de validações em camadas:</p>
<div><table><thead><tr><th>Camada</th><th>Ferramenta</th><th>Foco</th></tr></thead><tbody><tr><td><strong>Compliance</strong></td><td>Checkov</td><td>Policies CIS, PCI-DSS, HIPAA</td></tr><tr><td><strong>Segurança</strong></td><td>tfsec</td><td>Vulnerabilidades e misconfigurations</td></tr><tr><td><strong>Estilo</strong></td><td>TFLint</td><td>Boas práticas e sintaxe</td></tr></tbody></table></div>
<strong>Sincero?</strong> Para um blog talvez não fosse necessário. Mas esse projeto é meu <strong>lab vivo</strong> - é aqui onde testo estratégias e aprendo antes de levar pra produção. Vale a pena pelos ~30s adicionados no deploy.

<h3 id="52-implementacao">5.2 Implementação</h3>

<strong>TFLint:</strong>
<div data-lang="yaml"><pre><code>- name: Setup TFLint
  uses: terraform-linters/setup-tflint@v4

- name: Cache TFLint plugins
  uses: actions/cache@v4
  with:
    path: ~/.tflint.d/plugins
    key: ${{ runner.os }}-tflint-${{ hashFiles('infra/.tflint.hcl') }}

- name: Run TFLint
  run: tflint --init &amp;&amp; tflint -f compact</code></pre></div>

<strong>tfsec:</strong>
<div data-lang="yaml"><pre><code>- name: tfsec scan
  uses: aquasecurity/tfsec-action@v1.0.3
  with:
    working_directory: infra
    soft_fail: false</code></pre></div>

<strong>Checkov:</strong>
<div data-lang="yaml"><pre><code>- name: Checkov scan
  uses: bridgecrewio/checkov-action@v12
  with:
    directory: infra
    soft_fail: false</code></pre></div>

<h3 id="53-gestao-de-secrets">5.3 Gestão de Secrets</h3>

<div data-lang="yaml"><pre><code>jobs:
  terraform:
    env:
      ARM_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
      ARM_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
      ARM_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
      ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

deploy:
  steps:
    - name: Deploy to Azure Static Web Apps
      uses: Azure/static-web-apps-deploy@v1
      with:
        azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }}</code></pre></div>

<h2 id="6-job-summaries-visibilidade-pos-execucao">6. Job Summaries: Visibilidade Pós-Execução</h2>

<h3 id="61-job-summary-no-deploy-appyml">6.1 Job Summary no deploy-app.yml</h3>

<div data-lang="yaml"><pre><code>- name: Job summary
  if: always()
  run: |
    {
      echo "## 🚀 App Deploy Summary"
      echo ""
      echo "| Item | Value |"
      echo "|------|-------|"
      echo "| Event | \`${{ github.event_name }}\` |"
      echo "| Branch | \`${{ github.ref_name }}\` |"
      echo "| Actor | \`${{ github.actor }}\` |"
      echo "| Commit | \`$(git rev-parse --short HEAD)\` |"
      echo ""
      echo "### 📦 Build Info"
      echo ""
      echo "| Metric | Value |"
      echo "|--------|-------|"
      echo "| Output | \`dist/\` |"
      echo "| Files | $(find dist -type f | wc -l) |"
      echo "| Size | $(du -sh dist | cut -f1) |"
      echo ""
      echo "### ✅ Deploy Status"
      echo ""
      echo "Application deployed to **Azure Static Web Apps**"
      echo ""
      echo "🌐 [View Application](https://www.orafaelferreira.com)"
    } &gt;&gt; "$GITHUB_STEP_SUMMARY"</code></pre></div>

<strong>Por que <code>if: always()</code>?</strong>
<ul>
<li>Roda mesmo se steps anteriores falharem</li>
<li>Sempre tenho visibilidade do que aconteceu</li>
</ul>

<h3 id="62-job-summary-no-infra-applyyml">6.2 Job Summary no infra-apply.yml</h3>

<div data-lang="yaml"><pre><code>- name: Job summary
  if: always()
  run: |
    {
      echo "## Terraform Apply Summary";
      echo "";
      echo "| Item | Value |";
      echo "|------|-------|";
      echo "| Branch | \`${{ github.ref_name }}\` |";
      echo "| Actor | \`${{ github.actor }}\` |";
      echo "| Backend | \`stostateorafael/statetf/infra.terraform.tfstate\` |";
      echo "| Status | ✅ Applied |";
    } &gt;&gt; "$GITHUB_STEP_SUMMARY"</code></pre></div>

<strong>Benefício</strong>: em vez de vasculhar logs, você vê um resumo direto na UI do Actions.

<h2 id="7-deploy-azure-static-web-apps">7. Deploy: Azure Static Web Apps</h2>

<h3 id="71-deploy-direto-para-producao">7.1 Deploy Direto para Produção</h3>

<p>O deploy-app.yml faz um <strong>deploy simples e direto</strong> para o Azure Static Web Apps:</p>

<div data-lang="yaml"><pre><code>- name: Deploy to Azure Static Web Apps
  uses: Azure/static-web-apps-deploy@v1
  with:
    azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }}
    action: 'upload'
    app_location: 'dist'
    skip_app_build: true  # Já fizemos build antes</code></pre></div>

<strong>Por que skip_app_build: true?</strong>
<ul>
<li>O build já foi executado antes (<code>npm run build</code>)</li>
<li>Testes já rodaram (unitários e componentes)</li>
<li>Apenas fazemos upload do <code>dist/</code> pronto</li>
</ul>

<h3 id="72-fluxo-completo-do-deploy">7.2 Fluxo Completo do Deploy</h3>

<div data-lang="code"><pre><code>1. Install deps (npm install)
   ↓
2. Unit tests (Vitest)
   ↓
3. Component tests (React Testing Library)
   ↓
4. Type check (tsc)
   ↓
5. Build (Vite)
   ↓
6. Deploy to Azure SWA
   ↓
7. Job Summary (métricas)</code></pre></div>

<strong>Tempo total</strong>: ~3-5 minutos dependendo do cache

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/gh-deep-dipe/07.png" alt="Fluxo completo do deploy do blog no GitHub Actions" />

<h2 id="8-custos">8. Custos</h2>

<h3 id="81-custo-zero-para-repositorios-publicos">8.1 Custo Zero para Repositórios Públicos</h3>

<strong>GitHub Actions pricing:</strong>
<ul>
<li><strong>Public repos</strong>: minutos ilimitados ✅</li>
<li>Private repos: 2000 min/mês (free), depois $0.008/min</li>
</ul>

<p>Como o blog é <strong>público</strong>, os custos são <strong>zero</strong>. Mas ainda assim está otimizado.</p>

<h3 id="82-timeouts-protecao-contra-runs-travados">8.2 Timeouts: Proteção Contra Runs Travados</h3>

<p>Todas as pipelines têm <strong>timeout configurado</strong>:</p>

<div data-lang="yaml"><pre><code># infra-plan.yml
timeout-minutes: 25

# infra-apply.yml
timeout-minutes: 30

# deploy-app.yml
timeout-minutes: 20</code></pre></div>

<strong>Por quê?</strong>
<ul>
<li>Evita workflows travados consumindo hardware</li>
<li>Falha rápida em caso de problemas em loop infinito</li>
</ul>

<h2 id="9-workflow-dispatch-triggers-manuais">9. Workflow Dispatch: Triggers Manuais</h2>

<h3 id="91-trigger-manual-nas-3-pipelines">9.1 Trigger Manual nas 3 Pipelines</h3>

<p>Todas as 3 workflows suportam <strong>trigger manual</strong> via <code>workflow_dispatch</code>, permitindo execução sob demanda sem precisar fazer commits:</p>

<div data-lang="yaml"><pre><code>on:
  workflow_dispatch:</code></pre></div>

<strong>Como usar:</strong>
<p>1. Vá para GitHub Actions</p>
<p>2. Selecione o workflow desejado</p>
<p>3. Clique em "Run workflow"</p>
<p>4. Confirme a execução</p>

<p>Caso queira dar uma olhada em detalhes: <a href="https://github.com/orafaelferreiraa/orafaelferreira-com/tree/main/.github/workflows" target="_blank" rel="noopener noreferrer">Workflows</a></p>

<h2 id="conclusao">Conclusão</h2>

<ul>
<li><strong>Arquitetura</strong>: 3 workflows com responsabilidades segregadas</li>
<li><strong>Path filters</strong>: executa apenas quando necessário</li>
<li><strong>Concurrency control</strong>: evita race conditions</li>
<li><strong>Testes</strong>: pirâmide com unitários + componentes</li>
<li><strong>Cache</strong>: dependências npm, providers Terraform e plugins TFLint</li>
<li><strong>Segurança</strong>: TFLint + tfsec + Checkov validam código Terraform</li>
<li><strong>Documentação</strong>: terraform-docs auto-gera docs no README</li>
<li><strong>Deploy</strong>: direto para Azure SWA após validações</li>
<li><strong>Job summaries</strong>: métricas claras em cada execução</li>
<li><strong>Workflow dispatch</strong>: todas as 3 pipelines podem ser executadas manualmente</li>
</ul>

<p>Não comecei com tudo isso, fui evoluindo conforme fui aprendendo coisas novas e implementando em um case real. </p>
<p>Faça o mesmo, crie algum projeto pequeno pessoal, quebre, teste, aprenda, evolua!</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/gh-deep-dipe/06.png" alt="Resumo da stack de CI/CD do blog com GitHub Actions" />]]></content:encoded>
    </item>
    <item>
      <title>AKS Spot &amp; Terraform: Economia de Custos e o Guia Crítico de Taints</title>
      <link>https://www.orafaelferreira.com/artigos/aks-spot-terraform-economia-custos-taints</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/aks-spot-terraform-economia-custos-taints</guid>
      <pubDate>Tue, 30 Dec 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Como economizar até 90% no AKS com Spot Node Pools via Terraform: taints, tolerations e configurações críticas para evitar interrupções inesperadas.</description>
      <category>Artigos</category>
      <category>Azure</category>
      <category>FinOps</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2025-12-30-tf-aks/0.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<h2 id="aks-spot-terraform-economia-de-custos-e-o-guia-critico-de-taints">AKS Spot & Terraform: Economia de Custos e o Guia Crítico de Taints</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2025-12-30-tf-aks/0.png" alt="Capa do artigo sobre AKS Spot Node Pools com Terraform" />

<p>No ecossistema de nuvem, a eficiência financeira é tão importante quanto a eficiência técnica. <a href="https://azure.microsoft.com/pt-br/products/virtual-machines/spot/" target="_blank" rel="noopener noreferrer">O uso de Azure Spot Node Pools no AKS permite economizar até 90% em comparação com instâncias regulares</a>. Contudo, essa economia exige uma configuração rigorosa de Taints para evitar que sua aplicação sofra interrupções inesperadas.</p>

<h2 id="1-o-que-sao-spot-node-pools">1. O que são Spot Node Pools?</h2>

<a href="https://learn.microsoft.com/azure/virtual-machines/spot-vms" target="_blank" rel="noopener noreferrer">Instâncias Spot</a> utilizam a capacidade ociosa do Azure. Quando o Azure precisa dessa capacidade de volta, ele interrompe as instâncias com um aviso prévio de apenas 30 segundos.

<h3 id="caracteristicas-principais">Características Principais</h3>

<ul>
<li><strong>Efemeridade</strong>: Os nós podem ser removidos a qualquer momento.</li>
<li><strong>Custo</strong>: Drasticamente reduzido.</li>
<li><strong>Casos de Uso</strong>: Processamento em lote, ambientes de teste, CI/CD, cargas de trabalho stateless resilientes, ambientes de desenvolvimento.</li>
<li><strong>Limitação</strong>: Não podem ser o pool de sistema (System Node Pool) padrão do cluster.</li>
</ul>

<p>> <strong>Documentação Oficial</strong>: Para mais detalhes sobre a implementação de <a href="https://learn.microsoft.com/pt-br/azure/aks/spot-node-pool" target="_blank" rel="noopener noreferrer">Spot Node Pools no AKS</a>, consulte a documentação completa da Microsoft.</p>

<h2 id="2-o-conceito-vital-taints-e-tolerations">2. O Conceito Vital: Taints e Tolerations</h2>

<p>Um <strong><a href="https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/" target="_blank" rel="noopener noreferrer">Taint</a></strong> é um atributo aplicado a um nó que "repele" pods. Para que um pod seja agendado em um nó com Taint, ele deve possuir uma <strong>Toleration</strong> (tolerância) correspondente.</p>

<p>No contexto de instâncias Spot, o Taint é a sua principal ferramenta de segurança para garantir que apenas pods preparados para interrupções sejam alocados nesses nós.</p>

<h3 id="efeitos-de-taint-no-aks">Efeitos de Taint no AKS</h3>
<div><table><thead><tr><th>Efeito</th><th>Descrição</th></tr></thead><tbody><tr><td><strong>NoSchedule</strong></td><td>O Kubernetes não agendará novos pods no nó se eles não tiverem a tolerância.</td></tr><tr><td><strong>NoExecute</strong></td><td>Além de não agendar novos, remove pods existentes que não toleram o nó.</td></tr><tr><td><strong>PreferNoSchedule</strong></td><td>O sistema tenta evitar o agendamento, mas pode colocar o pod lá se não houver alternativa.</td></tr></tbody></table></div>
<h2 id="3-implementacao-com-terraform">3. Implementação com Terraform</h2>

<p>Para criar um pool de nós Spot com as proteções adequadas, utilizamos o recurso <a href="https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/kubernetes_cluster_node_pool" target="_blank" rel="noopener noreferrer">azurerm_kubernetes_cluster_node_pool</a>. O exemplo abaixo demonstra a configuração ideal:</p>

<div data-lang="terraform"><pre><code>resource "azurerm_kubernetes_cluster_node_pool" "spot" {
  name                  = "spotpool01"
  kubernetes_cluster_id = azurerm_kubernetes_cluster.main.id
  vm_size               = "Standard_DS2_v2"
  
  # Ativação do modo Spot
  priority              = "Spot"
  eviction_policy       = "Delete" # Deleta a VM após o despejo
  spot_max_price        = -1       # Paga até o preço de uma instância regular

  # Configuração do Taint (Crítico!)
  node_taints = [
    "kubernetes.azure.com/scalesetpriority=spot:NoSchedule"
  ]

  # Labels para seleção de nós via Affinity
  node_labels = {
    "kubernetes.azure.com/scalesetpriority" = "spot"
    "node-type"                             = "preemptible"
  }

  # Autoscaling é altamente recomendado para Spot
  enable_auto_scaling = true
  min_count           = 1
  max_count           = 5
}</code></pre></div>

<strong>⚠️ Atenção no Taint</strong>: O AKS aplica por padrão o label <code>kubernetes.azure.com/scalesetpriority=spot</code>. Ao definir <code>node_taints</code> manualmente no Terraform, certifique-se de que ele reflete a estratégia de isolamento da sua carga de trabalho.

<strong>Referência Terraform</strong>: Para configurações adicionais do cluster AKS, consulte a documentação do recurso <a href="https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/kubernetes_cluster" target="_blank" rel="noopener noreferrer">azurerm_kubernetes_cluster</a>.

<h2 id="4-taints-de-inicializacao-node-initialization-taints">4. Taints de Inicialização (Node Initialization Taints)</h2>

<p>Uma funcionalidade avançada mencionada na <a href="https://learn.microsoft.com/azure/aks/use-node-taints" target="_blank" rel="noopener noreferrer">documentação oficial do AKS</a> é o <strong>Node Initialization Taint</strong>. Eles são usados para marcar nós no momento da inicialização, garantindo que o tráfego só chegue ao nó após a execução de scripts de configuração ou instalação de agentes de segurança (como o Prisma Cloud ou Cilium).</p>

<ul>
<li><strong>Uso</strong>: Temporário, durante o boot do nó.</li>
<li><strong>Terraform</strong>: Pode ser configurado para garantir que o nó esteja "pronto" antes de receber qualquer carga.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2025-12-30-tf-aks/1.png" alt="Diagrama de taints de inicialização em nós Spot do AKS" />

<h2 id="5-agendando-pods-no-pool-spot">5. Agendando Pods no Pool Spot</h2>

<p>Para que sua aplicação utilize os nós criados, você deve configurar o manifesto do Kubernetes com a Toleration correta. Caso contrário, o scheduler ignorará o pool Spot e sua aplicação não rodará (ou rodará no pool regular mais caro).</p>

<h3 id="exemplo-de-manifesto-yaml">Exemplo de Manifesto (YAML)</h3>

<div data-lang="yaml"><pre><code>apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-batch-process
spec:
  template:
    spec:
      containers:
      - name: worker
        image: my-repo/worker:latest
      
      # 1. Permite entrar no nó Spot
      tolerations:
      - key: "kubernetes.azure.com/scalesetpriority"
        operator: "Equal"
        value: "spot"
        effect: "NoSchedule"
      
      # 2. Força a preferência pelo nó Spot
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: "kubernetes.azure.com/scalesetpriority"
                operator: In
                values:
                - "spot"</code></pre></div>

<h2 id="6-checklist-de-atencao">6. Checklist de Atenção</h2>

<p>Ao utilizar Terraform para gerenciar AKS Spot, observe estes pontos críticos:</p>

<ul>
<li><strong>Eviction Policy</strong>: Use <code>Delete</code> para evitar custos de disco orfãos e problemas de cota de vCPU no Azure.</li>
<li><strong><a href="https://learn.microsoft.com/azure/aks/cluster-autoscaler" target="_blank" rel="noopener noreferrer">Cluster Autoscaler</a></strong>: Sem ele, se todos os nós Spot forem removidos, o pool pode ficar com 0 nós permanentemente até uma intervenção manual.</li>
<li><strong>Upgrade</strong>: Pools Spot não suportam surge upgrade da mesma forma que pools regulares. O nó é simplesmente substituído.</li>
<li><strong>SLA</strong>: Lembre-se que instâncias Spot não possuem SLA de disponibilidade.</li>
</ul>

<h2 id="7-finops-a-importancia-da-gestao-financeira-em-nuvem">7. FinOps: A Importância da Gestão Financeira em Nuvem</h2>

<p>Quando falamos de otimização de custos no Azure, especialmente em ambientes enterprise e de larga escala, <strong>FinOps</strong> (Financial Operations) se torna algo vital. Em infraestruturas complexas, os custos podem escalar rapidamente, tornando essencial uma abordagem estruturada para monitoramento, análise e otimização contínua de gastos.</p>

<p>FinOps não é apenas sobre reduzir custos, mas sim sobre maximizar o valor do investimento em nuvem. Isso envolve:</p>

<ul>
<li><strong>Visibilidade de Custos</strong>: Entender onde e como os recursos estão sendo consumidos</li>
<li><strong>Otimização Contínua</strong>: Identificar oportunidades de economia, como o uso de Spot Instances</li>
<li><strong>Cultura de Responsabilidade</strong>: Engajar equipes de engenharia, operações e finanças na gestão de custos</li>
<li><strong>Decisões Baseadas em Dados</strong>: Usar métricas para tomar decisões informadas sobre arquitetura e recursos</li>
</ul>

<p>A utilização de Spot Node Pools, como demonstrado neste artigo, é um exemplo prático de como FinOps pode gerar economias significativas (até 90%) sem comprometer a qualidade das aplicações resilientes.</p>

<strong>Aprofunde-se em FinOps</strong>: Para entender melhor como construir uma base sólida em Cloud Native, incluindo práticas de FinOps, DevOps e Sustentabilidade, confira o artigo completo: <a href="https://www.orafaelferreira.com/artigos/antes-cloud-native-fundacao-solida" target="_blank" rel="noopener noreferrer">Antes do Cloud Native: Construindo uma Fundação Sólida para a Nuvem</a>

<h2 id="conclusao">Conclusão</h2>
<p>O uso de AKS Spot via Terraform é uma estratégia brilhante para reduzir a fatura do Azure, mas exige um entendimento profundo do agendador do Kubernetes. Os Taints são sua barreira de proteção: eles garantem que sua aplicação crítica não seja agendada por engano em um nó que pode desaparecer em 30 segundos.</p>
]]></content:encoded>
    </item>
    <item>
      <title>DevOpsDays Florianópolis 2025</title>
      <link>https://www.orafaelferreira.com/artigos/devopsdays-florianopolis-2025</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/devopsdays-florianopolis-2025</guid>
      <pubDate>Sun, 28 Dec 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>DevOpsDays Floripa 2025: um dia que já ficou marcado por talks, café quentinho, salgadinhos disputados e muita gente boa conectada pela cultura DevOps.</description>
      <category>Organização de Eventos</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-floripa25/1.jpg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-floripa25/1.jpg" alt="Abertura do DevOpsDays Florianópolis 2025 no auditório da UNICESUSC" />

<p>Em <strong>6 de dezembro de 2025</strong>, o auditório do <strong>Centro Universitário Cesusc (UNICESUSC)</strong> virou ponto de encontro da comunidade DevOps para um dia inteiro de talks, open-spaces e reencontros.</p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-floripa25/4.jpg" alt="Público do DevOpsDays Floripa 2025 acompanhando as talks" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-floripa25/6.jpg" alt="Palestrante no palco do DevOpsDays Florianópolis 2025" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-floripa25/3.jpg" alt="Comunidade DevOps reunida no DevOpsDays Floripa 2025" />
<p>📍 <strong>Local</strong>: SC-401, 9301 - Santo Antonio de Lisboa, Florianópolis - SC, 88050-001  </p>
<p>🌐 <strong>Site oficial</strong>: <a href="https://devopsdays.org/events/2025-florianopolis/welcome/" target="_blank" rel="noopener noreferrer">DevOpsDays Florianópolis 2025</a>  </p>
<p>📲 <strong>Linktree</strong>: <a href="https://linktr.ee/devopsdaysfln" target="_blank" rel="noopener noreferrer">Redes e novidades</a>  </p>
<h2 id="o-dia-em-ordem-cronologica">O dia em ordem cronológica</h2>

<ul>
<li>08:00 - 09:00 — Credenciamento</li>
<li>09:00 - 09:30 — Abertura oficial.</li>
<li>09:30 - 10:05 — Eduardo Munari Crossplane: Habilitando Engenharia de Plataforma na sua Infraestrutura.</li>
<li>10:05 - 10:45 — Coffee break. Sim, eu estava lá disputando os salgadinhos. 😋 <img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-floripa25/5.jpg" alt="Coffee break" /></li>
<li>10:45 - 11:20 — Alison Duarte — Construindo uma Plataforma Self-Service: Criação de Projetos utilizando um Catálogo de Serviços.</li>
<li>11:20 - 11:55 — Jonatas (jojo) Baldin — Escrevendo seu Primeiro Operador de Kubernetes.</li>
<li>11:55 - 12:30 — Ruan Oliveira — Banalizamos a migração entre clouds com Kubernetes.</li>
<li>12:30 - 13:40 — Almoço para recarregar as energias.</li>
<li>13:40 - 13:55 — Retorno<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-floripa25/7.jpg" alt="Plateia" /></li>
<li>13:55 - 14:30 — Rafael Mateus — Backstage na Prática: É Hora de Subir uma Plataforma de DEx na sua Firma.</li>
<li>14:30 - 15:05 — Camila Maia — Keynote — O Hack das Oportunidades.</li>
<li>15:05 - 15:40 — Lightning Talks</li>
<li>15:40 - 16:15 — Coffee break parte 2</li>
<li>16:15 - 16:50 — Luis Pontes — Lambda Pinball: Simplificando a Orquestração Serverless.</li>
<li>16:50 - 17:25 — Dri Cardoso, João Brito — Cérebro e Código: saúde mental e performance cognitiva na tecnologia.</li>
<li>17:25 - 18:00 — Sorteios <img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-floripa25/8.jpg" alt="Sorteios de brindes no encerramento do DevOpsDays Floripa 2025" /></li>
</ul>

<h2 id="patrocinadores">Patrocinadores</h2>

<ul>
<li><strong>Platinum</strong>: grafana, Elastic</li>
<li><strong>Gold</strong>: Software.com.br</li>
<li><strong>Community</strong>: UNICESUSC</li>
</ul>

<h2 id="organizacao-local">Organização local</h2>

<p>Lanusse Morais • Rafael Ferreira • Patrick Machado • Gislaine Luciane • Julio Fontes • Stefani Dal Puppo • Leandro Venâncio • Henrique Pereira Zimermann</p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-floripa25/2.jpg" alt="Equipe de organização local do DevOpsDays Florianópolis 2025" />


<h2 id="codigo-de-conduta">Código de conduta</h2>

<p>Nosso evento segue o <a href="https://devopsdays.org/events/2025-florianopolis/conduct/" target="_blank" rel="noopener noreferrer">Código de Conduta do DevOpsDays</a>. Ajude a manter um ambiente seguro e acolhedor para todos.</p>

<p>Nos vemos na próxima edição do <strong>DevOpsDays Floripa</strong>! 🚀</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-floripa25/9.jpg" alt="Participantes e organizadores no encerramento do DevOpsDays Floripa 2025" />
]]></content:encoded>
    </item>
    <item>
      <title>Como foi minha jornada para a certificação CKA</title>
      <link>https://www.orafaelferreira.com/artigos/jornada-certificacao-cka</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/jornada-certificacao-cka</guid>
      <pubDate>Sat, 27 Dec 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Três meses de estudo focado, labs diários na KodeKloud, simulados e checklists que usei para conquistar a certificação CKA.</description>
      <category>Artigos</category>
      <enclosure url="https://images.credly.com/size/340x340/images/8b8ed108-e77d-4396-ac59-2504583b9d54/cka_from_cncfsite__281_29.png" length="0" type="image/png" />
      <content:encoded><![CDATA[<h2 id="como-foi-minha-jornada-para-a-certificacao-cka">Como foi minha jornada para a certificação CKA</h2>


<p>Há 3 meses decidi tirar a certificação <strong><a href="https://training.linuxfoundation.org/certification/certified-kubernetes-administrator-cka/" target="_blank" rel="noopener noreferrer">CKA (Certified Kubernetes Administrator)</a></strong>. Para acelerar os estudos, segui a trilha da <strong>KodeKloud</strong>, que é referência absoluta no mercado. </p>

<p>Minha base já contava com o conhecimento dos cursos do <strong><a href="https://curso.devopspro.com.br/devops-pro/" target="_blank" rel="noopener noreferrer">DevOpsPro</a></strong> e da <strong><a href="https://linuxtips.io/" target="_blank" rel="noopener noreferrer">LinuxTips</a></strong>, além da experiência prática que tenho no trabalho. No entanto, para a prova, eu precisava de velocidade e precisão. </p>

<p>Utilizei exaustivamente o curso <strong><a href="https://learn.kodekloud.com/user/courses/ultimate-certified-kubernetes-administrator-cka-mock-exam-series" target="_blank" rel="noopener noreferrer">Ultimate Certified Kubernetes Administrator (CKA) Mock Exam Series</a></strong>. Os exercícios reproduzem a pressão do exame real e me ajudaram a automatizar a resolução de problemas complexos em cenários de cluster real. Documentei abaixo o que funcionou para chegar pronto no dia da prova.</p>

<h3 id="certificados-dos-cursos-de-preparacao">Certificados dos Cursos de Preparação</h3>

<strong><a href="https://www.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/?couponCode=PMNVD2025" target="_blank" rel="noopener noreferrer">Curso Certified Kubernetes Administrator (KodeKloud)</a></strong>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/cka/certificatecourse.png" alt="Certificado do curso KodeKloud CKA" />

<strong><a href="https://learn.kodekloud.com/user/courses/udemy-labs-certified-kubernetes-administrator-with-practice-tests" target="_blank" rel="noopener noreferrer">Udemy Labs - Certified Kubernetes Administrator with Practice Tests</a></strong>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/cka/certificatelabs.png" alt="Certificado Udemy Labs CKA" />

<strong><a href="https://learn.kodekloud.com/user/courses/ultimate-certified-kubernetes-administrator-cka-mock-exam-series" target="_blank" rel="noopener noreferrer">Curso Ultimate CKA Mock Exam Series (KodeKloud)</a></strong>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/cka/certificateUltimatelab.png" alt="Certificado Mock Exam Series" />

<h3 id="resultado-da-prova-cka">🏆 Resultado da Prova CKA</h3>

<p>> <strong>Exam Results</strong></p>
<p>> - <strong>Status:</strong> Pass ✅</p>
<p>> - <strong>Your Score:</strong> 75%</p>
<p>> - <strong>Score Needed:</strong> 66%</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/cka/results.png" alt="Resultado do exame CKA" />

<h3 id="certificacao-oficial">🎖️ Certificação Oficial</h3>

<strong>Certified Kubernetes Administrator (Linux Foundation)</strong>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/cka/certificatecka.png" alt="Certificado CKA" />

<h2 id="topicos-abordados-na-prova-cka-2025">Topicos Abordados na Prova CKA 2025</h2>

<h2 id="1-arquitetura-do-cluster-e-conceitos-core">1. Arquitetura do Cluster e Conceitos Core</h2>
<p>A base de tudo é entender a separação entre o <strong>Control Plane</strong> e os <strong>Worker Nodes</strong>.</p>

<ul>
<li><strong>ETCD:</strong> O banco de dados chave-valor que armazena todo o estado do cluster. Backup e restauração aqui são críticos.</li>
<li><strong>Kube-API Server:</strong> O único componente que fala com o ETCD. Tudo passa por ele.</li>
<li><strong>Kube-Scheduler:</strong> Decide em qual nó o seu Pod vai morar, baseando-se em recursos disponíveis.</li>
<li><strong>Kubelet:</strong> O agente que roda nos nós e garante que os containers estejam rodando conforme o esperado.</li>
<li><strong>Kube-Proxy:</strong> Gerencia as regras de rede (IPtables/IPVS) para permitir a comunicação.</li>
</ul>

<h2 id="2-gerenciamento-do-ciclo-de-vida-da-aplicacao">2. Gerenciamento do Ciclo de Vida da Aplicação</h2>
<p>Administrar aplicações envolve estratégias de atualização e resiliência:</p>

<em> <strong>Deployments:</strong> Permitem atualizações automáticas (</em>Rolling Updates<em>) e reversões (</em>Rollbacks*).
<ul>
<li><strong>ConfigMaps e Secrets:</strong> Separam a configuração e dados sensíveis do código da imagem.</li>
<li><strong>Escalonamento:</strong> O uso de <strong>HPA (Horizontal Pod Autoscaler)</strong> e <strong>VPA (Vertical Pod Autoscaler)</strong> para ajustar a infraestrutura à demanda.</li>
</ul>

<h2 id="3-agendamento-e-escalabilidade-avancada">3. Agendamento e Escalabilidade Avançada</h2>
<p>Não basta rodar o Pod; é preciso saber <em>onde</em> ele deve rodar:</p>

<ul>
<li><strong>Taints and Tolerations:</strong> Impedem que Pods sejam colocados em nós específicos, a menos que tenham uma permissão explícita.</li>
<li><strong>Node Affinity:</strong> Atrai Pods para nós específicos.</li>
<li><strong>Resource Quotas & Limits:</strong> Essenciais para evitar que um único Pod utilize todos os recursos do nó.</li>
</ul>

<h2 id="4-rede-e-conectividade">4. Rede e Conectividade</h2>
<p>A parte MAIS desafiadora do exame.</p>

<ul>
<li><strong>Serviços:</strong> ClusterIP (interno), NodePort (exposição básica) e LoadBalancer (integração com nuvem).</li>
<li><strong>Ingress vs. Gateway API:</strong> Enquanto o Ingress é o padrão clássico, a <strong>Gateway API</strong> (foco nas atualizações de 2025) oferece um modelo mais expressivo.</li>
</ul>
<em> <strong>Network Policies:</strong> O firewall interno do K8s, fundamental para segurança </em>Zero Trust*.

<h2 id="5-armazenamento-storage">5. Armazenamento (Storage)</h2>
<p>A persistência de dados em um ambiente efêmero:</p>

<ul>
<li><strong>PV (Persistent Volume):</strong> O recurso de armazenamento real no cluster.</li>
<li><strong>PVC (Persistent Volume Claim):</strong> O "ticket" ou pedido de um usuário por armazenamento.</li>
<li><strong>Storage Classes:</strong> Permitem o provisionamento automático e dinâmico de discos.</li>
</ul>

<h2 id="6-seguranca-e-manutencao">6. Segurança e Manutenção</h2>
<p>Garantir a integridade e a atualização do cluster:</p>

<ul>
<li><strong>RBAC (Role-Based Access Control):</strong> Definir <strong>QUEM</strong> pode fazer <strong>O QUÊ</strong> e em <strong>QUAL</strong> Namespace.</li>
<li><strong>TLS Certificates:</strong> O Kubernetes usa certificados para todas as comunicações. Saber expirar, renovar e aprovar CSRs é vital.</li>
<li><strong>Upgrade do Cluster:</strong> O processo de usar o <code>kubeadm</code> para atualizar o Control Plane e os Nodes de forma segura.</li>
</ul>

<h2 id="7-resolucao-de-problemas-troubleshooting">7. Resolução de Problemas (Troubleshooting)</h2>
<p>No exame CKA, você passará a maior parte do tempo consertando coisas quebradas.</p>

<ul>
<li><strong>Logs e Describe:</strong> <code>kubectl logs</code> e <code>kubectl describe</code> são seus melhores amigos.</li>
<li><strong>Componentes de Sistema:</strong> Se o cluster cair, verifique o status do serviço no SO com <code>journalctl -u kubelet</code>.</li>
</ul>

<h3 id="dica-de-ouro">Dica de ouro</h3>
<p>Pratique exaustivamente os <strong>Imperative Commands</strong> (<code>kubectl run</code>, <code>kubectl create</code>) para ganhar tempo e evitar erros de sintaxe em arquivos YAML.</p>

<h2 id="consideracoes-sobre-a-prova">Considerações sobre a Prova</h2>

<p>A prova CKA 2025 é 100% prática e exige velocidade e precisão. Você terá <strong>2 horas</strong> para resolver entre <strong>15 e 20 questões</strong> em ambientes reais de cluster Kubernetes. Não existe múltipla escolha, apenas você, o terminal e a documentação oficial.</p>

<h3 id="questoes-que-cairam">Questões que Caíram</h3>

<p>Durante a prova, encontrei questões que abordavam os seguintes tópicos:</p>

<strong>1. Instalação e Configuração de CNI</strong>
<ul>
<li>Instalar o <strong>Calico v3.28.2</strong> via tigera-operator</li>
<li>Configurar CRDs e verificar NetworkPolicies funcionais</li>
</ul>

<strong>2. Gestão de Armazenamento</strong>
<ul>
<li>Criar <strong>PersistentVolumeClaims</strong> e recuperar dados de volumes existentes</li>
<li>Configurar <strong>StorageClass</strong> com <code>volumeBindingMode: WaitForFirstConsumer</code></li>
<li>Definir StorageClass padrão do cluster</li>
</ul>

<strong>3. Troubleshooting de Cluster</strong>
<ul>
<li>Corrigir configurações de <strong>kube-apiserver</strong> após migração (etcd endpoints incorretos)</li>
<li>Identificar componentes quebrados e reiniciar serviços</li>
<li>Ajustar certificados e paths de arquivos após mudança de máquina</li>
</ul>

<strong>4. Configuração de Recursos</strong>
<ul>
<li>Calcular e aplicar <strong>resource requests</strong> para Pods (dividindo recursos do nó igualmente)</li>
<li>Configurar sidecard e containers com os mesmos valores de request</li>
</ul>

<strong>5. Helm e Gerenciamento de Aplicações</strong>
<ul>
<li>Instalar <strong>Argo CD</strong> via Helm (versão 7.7.3) sem reinstalar CRDs</li>
<li>Gerar templates Helm e salvar manifestos</li>
<li>Usar <code>--set crds.install=false</code> para evitar conflitos</li>
</ul>

<strong>6. Ingress e Gateway API</strong>
<ul>
<li>Criar recursos Ingress com TLS</li>
<li>Migrar de Ingress para <strong>Gateway API</strong> (novidade 2025)</li>
<li>Configurar HTTPRoute e Gateway com hostname específico</li>
</ul>

<strong>7. Horizontal Pod Autoscaler (HPA)</strong>
<ul>
<li>Criar HPA com target de 50% CPU</li>
<li>Configurar <code>downscaleStabilizationWindow</code> para 30 segundos</li>
<li>Instalar e configurar metrics-server quando necessário</li>
</ul>

<strong>8. Sidecar Containers</strong>
<ul>
<li>Adicionar container sidecar para streaming de logs</li>
<li>Usar volumes compartilhados (<code>emptyDir</code>)</li>
<li>Comando: <code>tail -n+1 -f /var/log/app.log</code></li>
</ul>

<strong>9. Services e Exposição</strong>
<ul>
<li>Reconfigurar Deployment para expor porta 80/tcp</li>
<li>Criar Service tipo <strong>NodePort</strong> usando comandos imperativos</li>
<li>Entender a diferença entre containerPort e Service port</li>
</ul>

<strong>10. PriorityClass e Preemption</strong>
<ul>
<li>Criar PriorityClass com valor específico</li>
<li>Fazer patch em Deployment existente para usar a nova priority</li>
<li>Observar eviction de Pods de menor prioridade</li>
</ul>

<strong>11. ConfigMaps e TLS</strong>
<ul>
<li>Atualizar ConfigMap para permitir <strong>TLSv1.2</strong> e <strong>TLSv1.3</strong> em NGINX</li>
<li>Recriar Pods para aplicar mudanças de configuração</li>
<li>Testar com <code>curl --tls-max 1.2</code> (deve falhar)</li>
</ul>

<strong>12. Custom Resource Definitions (CRDs)</strong>
<ul>
<li>Listar CRDs do cert-manager</li>
<li>Extrair documentação com <code>kubectl explain</code> (ex: <code>certificate.spec.subject</code>)</li>
<li>Salvar outputs em arquivos específicos</li>
</ul>

<strong>13. Preparação de Sistema (Container Runtime)</strong>
<ul>
<li>Instalar e configurar <strong>cri-dockerd</strong> via dpkg</li>
<li>Configurar parâmetros sysctl para Kubernetes</li>
<li>Habilitar e startar serviços do systemd</li>
</ul>

<strong>14. Services com Cálculos de Recursos</strong>
<ul>
<li>Expor Deployment via NodePort</li>
<li>Considerar overhead de 10% e limites adequados</li>
</ul>

<h3 id="distribuicao-de-pontos">Distribuição de Pontos</h3>

<p>As questões não valem o mesmo. Questões de troubleshooting e setup completo tendem a valer mais (8-12% cada), enquanto tarefas simples como criar um Service valem menos (2-4%). Por isso, é estratégico focar primeiro nas questões que você domina completamente.</p>


<h2 id="recursos-recomendados-para-preparacao">Recursos Recomendados para Preparação</h2>

<p>Além do curso da KodeKloud, aqui estão alguns recursos que podem acelerar significativamente sua preparação:</p>

<h3 id="repositorios-no-github">Repositórios no GitHub</h3>

<ul>
<li><strong><a href="https://github.com/vj2201/CKA-PREP-2025-v2" target="_blank" rel="noopener noreferrer">CKA-PREP-2025-v2</a></strong></li>
<li><strong><a href="https://github.com/gkeskar/CKA2025" target="_blank" rel="noopener noreferrer">CKA2025</a></strong></li>
</ul>

<p>Esses repositórios contêm questões similares às que caem na prova e são excelentes para praticar cenários hands-on.</p>


<h3 id="playlists-no-youtube">Playlists no YouTube</h3>

<ul>
<li><strong><a href="https://www.youtube.com/watch?v=kDZEiXHpEks&list=PLSsEvm2nF_8nGkhMyD1sq-DqjwQq8fAii" target="_blank" rel="noopener noreferrer">Playlist 1 — Kubernetes CKA Full Course</a></strong></li>
<li><strong><a href="https://www.youtube.com/watch?v=-6QTAhprvTo&list=PLkDZsCgo3Isr4NB5cmyqG7OZwYEx5XOjM" target="_blank" rel="noopener noreferrer">Playlist 2 — CKA Crash Course</a></strong></li>
<li><strong><a href="https://www.youtube.com/watch?v=WFTVTi8JhKc&list=PLvZb3tGyqC1TOasSaN36haM5xlCxHQBlA" target="_blank" rel="noopener noreferrer">Playlist 3 — Kubernetes Administrator Series</a></strong></li>
</ul>

<p>Assista às playlists enquanto pratica os labs. A combinação de teoria + prática é fundamental para fixar os conceitos.</p>

<h2 id="conclusao">Conclusão</h2>
<p>A combinação de prática diária, simulados fez toda a diferença. Se você está começando agora, foque em repetir os labs até que os comandos se tornem automáticos.</p>
]]></content:encoded>
    </item>
    <item>
      <title>A Stack por trás do meu Blog: IaC com Terraform, Static Web Apps e Github Actions</title>
      <link>https://www.orafaelferreira.com/artigos/artigo-terraform-infra-cicd</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/artigo-terraform-infra-cicd</guid>
      <pubDate>Sat, 13 Dec 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Como migrei meu blog para Terraform e GitHub Actions: state remoto em Azure Storage, Static Web Apps, domínio customizado e um pipeline confiável até produção.</description>
      <category>Artigos</category>
      <category>Segurança</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2025-12-13-terraform-site.ts.png" length="0" type="image/png" />
      <content:encoded><![CDATA[<h2 id="visao-geral">Visão Geral</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2025-12-13-terraform-site.ts.png" alt="Diagrama da stack do blog: Terraform, Static Web Apps e GitHub Actions" />


<p>Algumas semanas atrás eu decidi migrar meu blog para uma versão mais moderna, simples de operar e fácil de evoluir. O plano: </p>
<p>Terraform para declarar infraestrutura, GitHub Actions para orquestrar e Azure Static Web Apps para hospedar. Neste artigo, irei contar um pouco dessa jornada:</p>


<p>Vamos passar por tudo o que sustenta o blog hoje:</p>

<ul>
<li>Organização dos arquivos Terraform (providers, backend, variáveis e recursos)</li>
<li>Estratégia de state remoto em Azure Storage</li>
<li>Provisionamento do SWA e domínio customizado</li>
<li>Padrões de execução local com Service Principal</li>
<li>Pipelines CI/CD no GitHub Actions para "plan" (PRs) e "apply" (push em main)</li>
<li>Segurança, lint e scans: TFLint, tfsec, Checkov (era preciso tudo isso? claro que não! meu site se tornou meu projeto pessoal de estudos)</li>
<li>Automatização de documentação com terraform-docs</li>
<li>Integração com o deploy do app (build + upload da pasta "dist")</li>
</ul>

<p>Ao final, você terá uma visão ponta a ponta do que acontece desde um "git push" até o site atualizado em produção.</p>


<h2 id="estrutura-terraform">Estrutura Terraform</h2>

<p>Dentro da pasta <code>infra/</code> temos os principais arquivos que definem a infraestrutura:</p>

<ul>
<li><code>providers.tf</code>: versão do Terraform, provider <code>azurerm</code> e suas capabilities.</li>
<li><code>backend.tf</code>: configuração do backend remoto do state no Azure Storage.</li>
<li><code>variables.tf</code>: variáveis para vincular o repositório ao SWA (URL, branch e token).</li>
<li><code>main.tf</code>: recursos da solução (Static Web App + domínio customizado) e o resource group consumido como data source.</li>
</ul>

<h3 id="providerstf">providers.tf</h3>

<p>O arquivo fixa as versões para garantir reprodutibilidade e compatibilidade:</p>

<div data-lang="terraform"><pre><code>terraform {
  required_version = "1.13.4"
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "4.50.0"
    }
  }
}

provider "azurerm" {
  features {}
}</code></pre></div>

<ul>
<li><strong>Terraform</strong>: versão 1.13.4, versão mais atual de quando fiz o projeto</li>
<li><strong>Provider azurerm</strong>: versão 4.50.0, versão mais atual de quando fiz o projeto</li>
</ul>

<h3 id="backendtf">backend.tf</h3>

<p>Quando migrei, uma das primeiras decisões foi nunca manter state local.</p>

<div data-lang="terraform"><pre><code>terraform {
  backend "azurerm" {
    resource_group_name  = "rg-site"
    storage_account_name = "stostateorafael"
    container_name       = "statetf"
    key                  = "infra.terraform.tfstate"
    use_azuread_auth     = true
  }
}</code></pre></div>

<ul>
<li><strong>RG/Storage/Container</strong>: isolam o state em um bucket dedicado.</li>
</ul>

<h3 id="variablestf">variables.tf</h3>

<p>Variáveis me ajudaram a controlar comportamentos por ambiente: no apply em main, os valores reais chegam via secrets. Isso mantém o fluxo seguro com segurança.</p>

<div data-lang="terraform"><pre><code>variable "repository_url" {
  description = "GitHub repository URL para SWA (vazio em PR)"
  type        = string
  default     = ""
}

variable "repository_branch" {
  description = "Branch do repositório para SWA (vazio em PR)"
  type        = string
  default     = ""
}

variable "repository_token" {
  description = "GitHub PAT para linkage CI (omitido em PR)"
  type        = string
  sensitive   = true
  default     = ""
}</code></pre></div>

<ul>
<li>Em apply, os valores reais chegam via secrets do GitHub Actions.</li>
</ul>

<h3 id="maintf">main.tf</h3>

<p>Aqui fica a cereja do bolo: o Azure Static Web Apps na camada gratuita com domínio customizado. Eu queria um hosting estável, com HTTPS automático e integração perfeita com GitHub. O SWA entrega isso sem dor de cabeça.</p>

<div data-lang="terraform"><pre><code># Recurso de RG existente (fora do TF)
data "azurerm_resource_group" "rg" {
  name = "rg-site"
}

# Static Web Apps (SWA)
resource "azurerm_static_web_app" "this" {
  name                = "swa-site-orafael"
  resource_group_name = data.azurerm_resource_group.rg.name
  location            = "eastus2"
  sku_tier = "Free"
  sku_size = "Free"
  repository_url    = var.repository_url
  repository_branch = var.repository_branch
  repository_token  = var.repository_token
}

# Domínio customizado (validação DNS via TXT)
resource "azurerm_static_web_app_custom_domain" "txt-value" {
  static_web_app_id = azurerm_static_web_app.this.id
  domain_name       = "www.orafaelferreira.com"
  validation_type   = "dns-txt-token"
}</code></pre></div>

<ul>
<li>O RG é um <strong>data source</strong> (mantido fora do Terraform), já que é onde fica o storage account para manter o state remoto.</li>
<li>O SWA tem linkage com este repositório, então o deploy do blog é natural ao meu fluxo de commits.</li>
<li>O domínio <strong>www.orafaelferreira.com</strong> usa validação por DNS TXT; depois da propagação, o Azure cuida dos certificados.</li>
</ul>

<h2 id="service-principal">Service Principal</h2>

<p>Para validação das pipelines podem fazer o deploy na cloud, estou utilizando Service Principal (SP).</p>
<p>Exemplo de export das credenciais (Linux) e execução:</p>

<div data-lang="bash"><pre><code>export ARM_CLIENT_ID=&lt;appId-do-SP&gt;
export ARM_CLIENT_SECRET=&lt;clientSecret-do-SP&gt;
export ARM_TENANT_ID=&lt;tenantId&gt;
export ARM_SUBSCRIPTION_ID=&lt;subscriptionId&gt;
export SWA_REPOSITORY_TOKEN=&lt;github-PAT&gt;

cd infra
terraform init
terraform plan
terraform apply -auto-approve   -var "repository_url=https://github.com/&lt;owner&gt;/&lt;repo&gt;"   -var "repository_branch=main"   -var "repository_token=${SWA_REPOSITORY_TOKEN}"
cd -</code></pre></div>

<p>> Em ambientes Windows PowerShell, adapte com <code>$Env:VAR=valor</code>.</p>

<h2 id="pipelines-cicd-no-github-actions">Pipelines CI/CD no GitHub Actions</h2>
<p>Se a infraestrutura é o esqueleto, os pipelines que bota pra rodar. Cada commit tem revisão, aplicação e publicação.</p>

<p>A automação está dividida em três workflows principais.</p>

<h3 id="1-infra-planyml-prs">1) <code>infra-plan.yml</code> (PRs)</h3>

<p>Dispara em pull requests que alteram <code>infra/<strong></code> ou o próprio workflow. Objetivo: validações e geração do </strong>plan<em></em>.</p>

<p>Passos:</p>
<ul>
<li><code>actions/checkout@v4</code></li>
<li><code>hashicorp/setup-terraform@v3</code> (Terraform 1.13.4)</li>
<li>Cache dos providers Terraform e plugins do TFLint</li>
<li><code>terraform init</code></li>
<li><code>terraform fmt -check -recursive</code> (não quebra o build em PR)</li>
<li><code>terraform validate</code></li>
<li><code>tflint --init && tflint -f compact</code></li>
<li><code>tfsec</code> e <code>Checkov</code> com <code>soft_fail: false</code> (quebram em achados críticos)</li>
<li><code>terraform plan -out=tfplan</code> com variáveis placeholder</li>
<li>Upload do artifact <code>tfplan</code></li>
<li>Comentário no PR com o <strong>plan</strong> já expandido (sem tabela de status). Eu quis reduzir cliques e atrito: abrir o PR e já ver o que muda.</li>
</ul>

<h3 id="2-infra-applyyml-push-em-main">2) <code>infra-apply.yml</code> (push em main)</h3>

<p>Dispara em push que altera <code>infra/<em></em></code> ou o próprio workflow, e também pode ser manual via <code>workflow_dispatch</code>.</p>

<p>Passos de segurança e qualidade:</p>
<ul>
<li><code>terraform init</code>, <code>fmt</code>, <code>validate</code>, <code>tflint</code>, <code>tfsec</code>, <code>Checkov</code> (mesma base do plan)</li>
<li><code>terraform apply -auto-approve</code> com <code>repository_url</code>, <code>repository_branch</code>, <code>repository_token</code> vindos de secrets</li>
<li><strong>terraform-docs</strong>: injeta documentação do módulo no <code>README.md</code> e commita automaticamente (quando houver alteração)</li>
<li><strong>Job Summary</strong>: resumo simples (branch/actor/backend/status), sem seção de outputs para evitar ruído quando não definidos. Na migração eu removi a seção de outputs do summary para evitar alertas desnecessários.</li>
</ul>

<h3 id="3-deploy-appyml-build-upload-da-spa">3) <code>deploy-app.yml</code> (build + upload da SPA)</h3>

<p>Dispara em push de arquivos do app, manual (<code>workflow_dispatch</code>) e após conclusão bem-sucedida do <code>infra-apply</code> via <code>workflow_run</code>.</p>

<p>Pipeline do app:</p>
<ul>
<li>Node 20 + cache npm</li>
<li><code>npm install</code></li>
<li>Testes: unitário (Vitest), componentes (RTL) e E2E smoke (Playwright)</li>
<li><code>npm run typecheck</code> e <code>npm run build</code></li>
<li>Cache de browsers do Playwright (otimiza tempo e custo)</li>
<li>Deploy com <code>Azure/static-web-apps-deploy@v1</code> usando <code>action: upload</code> e <code>skip_app_build: true</code> (fazemos o build antes). Essa foi uma escolha de performance e previsibilidade no build.</li>
</ul>

<p>Proteção contra loops:</p>
<ul>
<li>Condição no job: <code>(github.event_name == 'push' && github.actor != 'github-actions[bot]')</code>…</li>
<li>Isso evita que commits automatizados (ex.: terraform-docs) disparem deploys do app desnecessariamente, um ajuste que nasceu de um incidente: o bot fazia commit e o app queria redeploy sem mudanças reais.</li>
</ul>

<h2 id="seguranca-e-qualidade">Segurança e Qualidade</h2>

<ul>
<li><strong>TFLint</strong>: enforce de boas práticas e estilo nos <code>.tf</code>.</li>
<li><strong>tfsec</strong>: análise de segurança estática específica para Terraform (Azure incluído).</li>
<li><strong>Checkov</strong>: políticas de segurança e conformidade (CSPM) adicionais.</li>
<li><strong>actions/cache@v4</strong>: acelera builds mantendo providers e plugins.</li>
<li><strong>Sem outputs no summary</strong>: evita confusão quando não há <code>output</code> definido no módulo.</li>
</ul>

<p>> Observação: caso sejam necessários outputs (ex.: hostname, IDs), basta adicionar blocos <code>output</code> em <code>infra/</code> e consumir no resumo/pipelines. Por ora, optei por manter o módulo minimalista.</p>


<h2 id="documentacao-automatizada">Documentação Automatizada</h2>

<p>Durante a migração, quis que a documentação acompanhasse o código sem esforço humano. O <code>infra-apply.yml</code> roda <strong>terraform-docs</strong> e injeta a referência do módulo no <code>README.md</code>. Se não houver mudanças, nenhum commit é feito, é documentação viva, sem burocracia.</p>


<h2 id="fluxo-de-trabalho-do-pr-ao-deploy">Fluxo de Trabalho: do PR ao Deploy</h2>

<p>1. <strong>PR em <code>infra/</strong></code><em></em> → roda <code>infra-plan.yml</code>: valida, escaneia segurança e gera o <code>plan</code>.</p>
<p>2. <strong>Merge em <code>main</code></strong> → roda <code>infra-apply.yml</code>: aplica mudanças, atualiza docs.</p>
<p>3. <strong>Push do app</strong> (ou workflow_run de infra) → roda <code>deploy-app.yml</code>: builda e publica a pasta <code>dist/</code> no SWA. Esse foi o momento mais satisfatório da migração: ver o blog ir ao ar segundos depois do merge.</p>

<p>Tudo isso com proteção contra loops de commits do bot e com caches para acelerar o ciclo.</p>

<p>Caso queira dar uma olhada em detalhes: <a href="https://github.com/orafaelferreiraa/orafaelferreira-com/tree/main/.github/workflows" target="_blank" rel="noopener noreferrer">Workflows</a></p>

<h2 id="conclusao">Conclusão</h2>

<p>A combinação de Terraform + GitHub Actions entrega uma infraestrutura escalável, auditável e automatizada. </p>
<p>Com state remoto seguro, validações de segurança e documentação contínua, o resultado é um pipeline confiável que leva alterações de infraestrutura e aplicação ao Azure de forma robusta.</p>

]]></content:encoded>
    </item>
    <item>
      <title>Segurança em Camadas e Open Source no DevOpsDays POA 2025</title>
      <link>https://www.orafaelferreira.com/artigos/devopsdays-poa-2025</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/devopsdays-poa-2025</guid>
      <pubDate>Tue, 02 Dec 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Como foi palestrar no DevOpsDays Porto Alegre 2025 sobre Defesa em Profundidade e ferramentas Open Source para proteger ambientes Cloud Native.</description>
      <category>Palestras</category>
      <category>Kubernetes</category>
      <category>Open Source</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-poa25/dod-poa25.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<h2 id="devopsdays-porto-alegre-2025">DevOpsDays Porto Alegre 2025</h2>

<p>No dia <strong>29 de novembro de 2025</strong>, estive presente no <a href="https://devopsdays.org/events/2025-porto-alegre/welcome/" target="_blank" rel="noopener noreferrer"><strong>DevOpsDays Porto Alegre</strong></a>, O DevOpsDays é conhecido mundialmente para quem ama infraestrutura ágil, e a edição de POA manteve a tradição: conteúdo de altíssimo nível.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-poa25/dod-poa25.png" alt="Banner do DevOpsDays Porto Alegre 2025" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-poa25/00.png" alt="Divulgação da palestra de Rafael Ferreira no DevOpsDays POA" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-poa25/02.jpg" alt="Entrada do DevOpsDays Porto Alegre 2025" />

<h2 id="minha-palestra">Minha palestra</h2>

<h3 id="como-aplicar-seguranca-em-camadas-na-sua-arquitetura-cloud-native-com-open-sourc">Como aplicar Segurança em Camadas na sua arquitetura Cloud Native com Open Source</h3>

<p>Fui aceito para apresentar a palestra <strong>"Como aplicar Segurança em Camadas na sua arquitetura Cloud Native com Open Source"</strong>.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-poa25/09.png" alt="Slide de abertura da palestra sobre Segurança em Camadas" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-poa25/03.jpg" alt="Rafael Ferreira palestrando no DevOpsDays Porto Alegre 2025" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-poa25/06.jpg" alt="Público acompanhando a palestra sobre Segurança em Camadas" />

<p>Durante a sessão, explorei a estratégia de <strong>Defesa em Profundidade (Defense in Depth)</strong>, saindo da teoria para a prática com ferramentas do ecossistema CNCF. A defesa deve ser contínua e integrada em cada camada.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-poa25/05.jpg" alt="Rafael Ferreira explicando Defesa em Profundidade com ferramentas CNCF" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-poa25/04.jpg" alt="Slide com as camadas de segurança Cloud Native" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-poa25/11.png" alt="Slide com ferramentas Open Source para cada camada de defesa" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-poa25/13.jpg" alt="Rafael Ferreira encerrando a palestra no DevOpsDays POA" />

<h2 id="destaques-do-evento">Destaques do Evento</h2>

<p>A programação técnica foi excelente, especialmente a parte da tarde! Após minha apresentação, tive a oportunidade de acompanhar grandes colegas da comunidade que trouxeram temas extremamente relevantes para o nosso dia a dia:</p>

<ul>
<li><strong>João Brito</strong> com a palestra <em>As quatro dimensões de segurança em Kubernetes</em>, um excelente complemento ao meu tema.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-poa25/joao1.jpg" alt="João Brito palestrando sobre as quatro dimensões de segurança em Kubernetes" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-poa25/joao2.jpg" alt="Slide da palestra de João Brito sobre segurança em Kubernetes" />

<ul>
<li><strong>Daniel Rodrigues</strong> falando sobre <em>Chaos Mesh: Engenharia do caos para Kubernetes</em>, explorando como injetar falhas de forma controlada.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-poa25/daniel.png" alt="Daniel Rodrigues apresentando Chaos Mesh no DevOpsDays POA" />

<ul>
<li><strong>Vinicius Campitelli</strong> sobre <em>Criando esteiras de CI/CD performáticas e seguras</em>, um tema vital para a cultura DevOps.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-poa25/vinicius.png" alt="Vinicius Campitelli falando sobre esteiras de CI/CD performáticas e seguras" />

<ul>
<li><strong>Cristiano Diedrich</strong> abordando o <em>DevFinOps - Além das tags</em>, mostrando a evolução da mentalidade de custos e eficiência.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-poa25/cristiano.png" alt="Cristiano Diedrich apresentando DevFinOps além das tags" />

<ul>
<li>O tradicional <strong>Coffee Break</strong>, um momento perfeito para recarregar as energias e fazer um networking de qualidade.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-poa25/12.jpg" alt="Coffee break e networking no DevOpsDays Porto Alegre" />


<p>É massa demais ver tanta gente nova interessada em aprender e tantos profissionais experientes dispostos a compartilhar.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-poa25/15.jpg" alt="Participantes reunidos no DevOpsDays Porto Alegre 2025" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-poa25/16.jpg" alt="Rafael Ferreira com participantes do DevOpsDays POA" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-poa25/17.jpg" alt="Comunidade DevOps reunida no DevOpsDays Porto Alegre" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-poa25/final.png" alt="Foto oficial dos palestrantes do DevOpsDays Porto Alegre 2025" />

<p>> <strong>Segurança TEM que começar na fundação.</strong></p>
<p>> Não existe "bala de prata", existe defesa em camadas.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod-poa25/certificado.png" alt="Certificado de palestrante do DevOpsDays Porto Alegre 2025" />

<ul>
<li><i></i> <strong>Slides da Apresentação:</strong> <a href="https://stoblobcertificados011.blob.core.windows.net/palestras/DefesaemCamadasOS.pdf" target="_blank" rel="noopener noreferrer">Defesa em Camadas com Open Source</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Trabalhar para o Exterior – Realidade, Desafios e Oportunidades no IFSC</title>
      <link>https://www.orafaelferreira.com/artigos/trabalhar-para-o-exterior-ifsc-2025</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/trabalhar-para-o-exterior-ifsc-2025</guid>
      <pubDate>Tue, 18 Nov 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Na Semana Acadêmica de ADS do IFSC, eu e Vinícius Deschamps falamos sobre a realidade de trabalhar para o exterior: desafios, oportunidades e histórias reais.</description>
      <category>Palestras</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/IFSC-ADS/1.jpg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[
<h2 id="trabalhar-para-o-exterior-realidade-desafios-e-oportunidades">Trabalhar para o Exterior: Realidade, Desafios e Oportunidades</h2>

<p>Durante a (<a href="https://saads.framer.website/" target="_blank" rel="noopener noreferrer"><strong>1ª Semana Acadêmica de ADS do IFSC</strong></a>), eu e o meu parceiro <a href="https://www.linkedin.com/in/viniciusdeschamps/" target="_blank" rel="noopener noreferrer">Vinícius Deschamps</a> tivemos a honra de fechar a noite do dia 06/11 com uma conversa que muita gente sempre quis ouvir, mas poucos realmente contam: <strong>como é trabalhar para o exterior na vida real</strong>.</p>

<p>Nada de glamour de LinkedIn, nada de “ficar rico em 3 passos”, nada de frase de efeito.  </p>
<p>Foi papo reto, experiência de campo e aquelas histórias que normalmente ficam só no café da firma.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/IFSC-ADS/1.jpg" alt="Rafael Ferreira e Vinícius Deschamps palestrando na Semana Acadêmica do IFSC" />

<p>O evento aconteceu no <strong>IFSC São José</strong>, reunindo estudantes, profissionais e curiosos querendo entender como funciona a vida tech além das fronteiras brasileiras. E, sinceramente, foi incrível ver tanta gente interessada em construir uma carreira internacional com planejamento e consciência.</p>

<h2 id="sobre-a-palestra">Sobre a Palestra</h2>

<strong>Tema:</strong> Trabalhar para o Exterior – Realidade, Desafios e Oportunidades  
<strong>Palestrantes:</strong> <a href="https://www.linkedin.com/in/orafaelferreiraa/" target="_blank" rel="noopener noreferrer">Rafael Ferreira</a> & <a href="https://www.linkedin.com/in/viniciusdeschamps/" target="_blank" rel="noopener noreferrer">Vinícius Deschamps</a>  
<strong>Data:</strong> 06/11 às 21h10  
<strong>Evento:</strong> 1ª Semana Acadêmica de ADS – IFSC  
<strong>Local:</strong> São José – SC

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/IFSC-ADS/00.jpg" alt="Cartaz da palestra Trabalhar para o Exterior no IFSC São José" />

<h2 id="o-que-a-gente-trouxe-pra-galera">O que a gente trouxe pra galera</h2>

<p>A gente sabe que o assunto “trabalhar pra fora” virou moda, mas também virou uma terra de muita promessa vazia. Então fizemos o oposto.</p>

<p>Falamos sobre:</p>

<ul>
<li>O que realmente muda quando você trabalha com times internacionais</li>
<li>Como lidar com cultura, comunicação e expectativas totalmente diferentes</li>
<li>Realidades do fuso, das reuniões e do inglês de verdade (não aquele decorado em curso)</li>
<li>O impacto na vida pessoal: rotina, saúde, relacionamentos e até grana</li>
<li>Estratégias que realmente funcionam pra conquistar oportunidades lá fora</li>
<li>E claro… os perrengues. Porque sempre tem perrengue.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/IFSC-ADS/3.jpg" alt="Público da Semana Acadêmica de ADS acompanhando a palestra" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/IFSC-ADS/4.jpg" alt="Rafael Ferreira compartilhando experiências de trabalho para o exterior" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/IFSC-ADS/5.jpg" alt="Vinícius Deschamps falando sobre oportunidades internacionais no IFSC" />

<p>A ideia não foi mostrar um “mundo perfeito”.  </p>
<p>A ideia foi preparar a galera para o que é <strong>de fato</strong>.</p>

<h2 id="por-que-esse-assunto-importa">Por que esse assunto importa??</h2>

<p>Porque a comunidade técnica precisa falar sobre carreira e escolhas reais.  </p>
<p>Trabalhar para o exterior pode abrir portas absurdas, mas também exige maturidade, adaptação e clareza sobre o que você quer da sua vida.</p>

<p>Achar que trabalhar pra fora é só “ganhar em dólar e ser feliz” é receita pra frustração.  </p>
<p>Mas entender como se preparar, como se posicionar e como navegar esses ambientes… aí sim muda o jogo.</p>

<p>E se a nossa conversa ajudou pelo menos uma pessoa a tomar uma decisão mais consciente, já valeu o rolê.</p>

<h2 id="alguns-momentos-da-noite">Alguns momentos da noite</h2>

<p>Aqui você pode inserir as fotos do evento:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/IFSC-ADS/6.jpg" alt="Estudantes do IFSC São José durante a palestra" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/IFSC-ADS/7.jpg" alt="Palestrantes e estudantes reunidos após a palestra no IFSC" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/IFSC-ADS/2.jpg" alt="Momento de perguntas do público na Semana Acadêmica de ADS" />

<h2 id="links-de-indicacao-uteis-pra-quem-quer-trabalhar-pra-fora">🧾 Links de Indicação Úteis pra Quem Quer Trabalhar pra Fora</h2>

<p>Se você está <strong>começando sua jornada internacional</strong>, aqui vão dois serviços que <strong>uso pessoalmente</strong> e recomendo:</p>

<h3 id="abrir-ou-manter-seu-cnpj-com-a-contabilizei">💼 Abrir ou manter seu CNPJ com a <strong>Contabilizei</strong>  </h3>
<p>Simplifique sua vida como PJ, sem dor de cabeça com impostos e obrigações contábeis:  </p>
<p>👉 <a href="https://www.contabilizei.com.br/programa-de-indicacao?ref=daf792a9759933c6a3f54a8832357168&nome=RAFAEL&email=rafael_low@hotmail.com&utm_source=plataforma&utm_campaign=MGM&utm_source=plataforma" target="_blank" rel="noopener noreferrer">Abra sua conta na Contabilizei com meu link de indicação</a></p>

<h3 id="receber-em-dolar-com-otimas-taxas-usando-a-techfx">💸 Receber em dólar com ótimas taxas usando a <strong>TechFX</strong>  </h3>
<p>Pra quem recebe moeda de fora (dólar, euro, libra...) direto na conta PJ, TechFX ajuda a economizar nas taxas e ganhar agilidade:  </p>
<p>👉 <a href="https://www.techfx.com.br/rafa-ferreira/" target="_blank" rel="noopener noreferrer">Crie sua conta TechFX com meu link e comece a receber melhor</a></p>

<h2 id="gratidao-pelo-convite">Gratidão pelo convite</h2>

<p>Fica meu agradecimento ao IFSC, ao pessoal da organização da Semana Acadêmica e a todo mundo que ficou até o final da noite com a gente.</p>

<p>A troca foi forte e verdadeira.  </p>
<p>E que venham mais conversas que vão além do código.</p>

<ul>
<li><i></i> <strong>Slides da Apresentação:</strong> <a href="https://stoblobcertificados011.blob.core.windows.net/palestras/CarreiraGlobal%20emDevOps.pdf" target="_blank" rel="noopener noreferrer">GreenOps e Cloud Sustentável no MVP Conf 2025</a></li>
</ul>

]]></content:encoded>
    </item>
    <item>
      <title>GreenOps e Cloud Sustentável no MVP Conf 2025</title>
      <link>https://www.orafaelferreira.com/artigos/mvp-conf-sp</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/mvp-conf-sp</guid>
      <pubDate>Mon, 10 Nov 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Relato da palestra GreenOps e Cloud Sustentável no MVP Conf Brasil 2025: estratégias para uma nuvem eficiente, econômica e sustentável, e fotos do evento.</description>
      <category>Palestras</category>
      <category>Comunidade</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp25/01.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<h2 id="mvp-conf-brasil-2025">MVP Conf Brasil 2025</h2>

<p>Nos dias <strong>24 e 25 de outubro de 2025</strong>, estive presente no <a href="https://mvpconf.com.br/" target="_blank" rel="noopener noreferrer"><strong>MVP Conf Brasil</strong></a>, realizado na <strong>UNIP Campus Paraíso/Vergueiro, em São Paulo - SP</strong>.  </p>
<p>O evento reuniu <strong>mais de 500 especialistas Microsoft</strong> de todo o país, dois dias intensos de <strong>aprendizado, networking e compartilhamento de conhecimento técnico de alto nível</strong>.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp25/01.png" alt="Abertura do MVP Conf Brasil 2025 em São Paulo" />

<h2 id="minha-palestra">Minha palestra</h2>

<h3 id="greenops-e-cloud-sustentavel-o-equilibrio-entre-performance-custo-e-meio-ambient">GreenOps e Cloud Sustentável: o equilíbrio entre performance, custo e meio ambiente</h3>

<p>Fui convidado para compartilhar a palestra <strong>"GreenOps e Cloud Sustentável"</strong>, onde explorei <strong>estratégias práticas para adotar uma operação de nuvem mais eficiente, econômica e ambientalmente responsável</strong>.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp25/02.jpg" alt="Rafael Ferreira palestrando sobre GreenOps no MVP Conf 2025" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp25/03.jpg" alt="Slide de abertura da palestra GreenOps e Cloud Sustentável" />

<p>Durante a sessão, mergulhamos em tópicos como:</p>
<ul>
<li>O papel do <strong>GreenOps</strong> dentro da governança de nuvem corporativa</li>
<li>Como medir e reduzir o <strong>carbon footprint</strong> em ambientes Azure</li>
<li>A união entre <strong>FinOps, Cloud Efficiency e automação</strong></li>
<li>Arquiteturas <strong>verdes, resilientes e escaláveis</strong></li>
<li>Casos reais de <strong>sustentabilidade digital aplicada ao dia a dia corporativo</strong></li>
</ul>

<p>A ideia foi mostrar que dá pra fazer <strong>mais com menos impacto</strong>, sem comprometer a performance, e ainda <strong>gerando economia real</strong>.  </p>
<p>Porque, convenhamos, eficiência e sustentabilidade podem (e devem) andar juntas.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp25/04.jpg" alt="Slide sobre eficiência e sustentabilidade na nuvem" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp25/05.jpg" alt="Público acompanhando a palestra sobre GreenOps" />

<h2 id="um-evento-com-proposito">Um evento com propósito</h2>

<p>O <strong>MVP Conf</strong> vai muito além de tecnologia.  </p>
<p>Todo o valor arrecadado com os ingressos é <strong>100% destinado a instituições sociais</strong>, como a <strong>Casa do Zezinho</strong>, <strong>Associação Prato Cheio</strong> e <strong>Associação Fênix</strong>.  </p>
<p>É inspirador ver uma comunidade tão técnica e diversa unida por um propósito tão nobre: <strong>usar o conhecimento pra gerar impacto real</strong>.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp25/06.jpg" alt="Participantes reunidos no MVP Conf Brasil 2025" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp25/07.jpg" alt="Ação social promovida durante o MVP Conf 2025" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp25/08.jpg" alt="Comunidade Microsoft reunida no evento em São Paulo" />

<h2 id="um-encontro-de-gigantes">Um encontro de gigantes</h2>

<p>Foi uma honra dividir o palco com tanta gente incrível e poder representar a comunidade de <strong>arquitetura cloud e sustentabilidade</strong> dentro desse ecossistema.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp25/11.jpg" alt="Rafael Ferreira com outros palestrantes do MVP Conf 2025" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp25/12.jpg" alt="MVPs Microsoft reunidos no palco do MVP Conf Brasil" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp25/13.jpg" alt="Encontro de especialistas Microsoft no MVP Conf 2025" />

<h2 id="networking-e-reencontros">Networking e reencontros</h2>

<p>O MVP Conf é aquele tipo de evento que <strong>você chega pra assistir uma palestra e sai com dez novas conexões no LinkedIn</strong>.  </p>
<p>O ambiente colaborativo e cheio de energia positiva.  </p>
<p>Reencontrei amigos de comunidade, troquei ideias com profissionais de diferentes regiões e claro, <strong>renderam boas conversas sobre café, cloud e caos controlado</strong>.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp25/09.jpg" alt="Momento de networking com a comunidade no MVP Conf" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp25/10.jpg" alt="Reencontro com amigos da comunidade Microsoft" />

<p>Participar do <strong>MVP Conf Brasil 2025</strong> foi uma experiência única.  </p>
<p>Um evento <strong>feito por especialistas para a comunidade</strong>, com <strong>propósito social, conteúdo técnico de peso e um clima de colaboração genuína</strong>.</p>

<p>> <strong>Sustentabilidade não é tendência, é responsabilidade.</strong>  </p>
<p>> E quando unimos tecnologia e propósito, o impacto é exponencial.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp25/Certificate.png" alt="Certificado de palestrante do MVP Conf Brasil 2025" />

<ul>
<li><i></i> <strong>Slides da Apresentação:</strong> <a href="https://stoblobcertificados011.blob.core.windows.net/palestras/mvp-conf25.pdf" target="_blank" rel="noopener noreferrer">GreenOps e Cloud Sustentável no MVP Conf 2025</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Antes de Estudar Ferramentas, Entenda a Cultura DevOps - whiteStone_dev 8ª Edição</title>
      <link>https://www.orafaelferreira.com/artigos/wsd-devops</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/wsd-devops</guid>
      <pubDate>Sun, 19 Oct 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>No dia 02 de outubro de 2025, participei como palestrante na 8ª edição da whiteStone_dev, realizada no INAITEC – Pedra Branca, em Palhoça (SC).</description>
      <category>Palestras</category>
      <category>Comunidade</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/wsd-devops/01.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<h2 id="whitestonedev-8-edicao-cultura-devops">whiteStone_dev – 8ª Edição | Cultura DevOps</h2>

<p>No dia <strong>02 de outubro de 2025</strong>, participei como palestrante na <a href="https://whitestonedev.com.br/#/eventos/8edicao" target="_blank" rel="noopener noreferrer"><strong>8ª edição da whiteStone_dev</strong></a>, realizada no <strong>INAITEC – Pedra Branca</strong>, em <strong>Palhoça (SC)</strong>.  </p>
<p>Uma noite dedicada à <strong>Cultura DevOps</strong>, onde a comunidade se reuniu para discutir o que realmente faz essa mentalidade transformar times e organizações.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/wsd-devops/01.png" alt="Banner da 8ª edição da whiteStone_dev sobre Cultura DevOps" />

<h2 id="o-evento">O evento</h2>

<p>A <strong>whiteStone_dev</strong> chegou à sua 8ª edição com uma proposta diferente:  </p>
<p>falar menos sobre <em>ferramentas</em> e mais sobre <strong>pessoas, princípios e práticas</strong> que tornam o DevOps algo vivo dentro das empresas.  </p>

<p>O evento contou com <strong>apoio do INAITEC</strong> (que sediou o encontro) e <strong>patrocínio educacional da FIAP</strong>, reunindo profissionais, estudantes e entusiastas de tecnologia da região metropolitana de Florianópolis.</p>

<p>📍 <strong>Local:</strong> INAITEC – Pedra Branca, Palhoça – SC  </p>
<p>📅 <strong>Data:</strong> 02 de outubro de 2025  </p>
<p>🕖 <strong>Horário:</strong> A partir das 19h  </p>

<h2 id="minha-palestra">Minha palestra</h2>

<h3 id="antes-de-estudar-ferramentas-entenda-a-cultura-devops">Antes de Estudar Ferramentas, Entenda a Cultura DevOps  </h3>

<p>Na minha sessão, falei sobre o que vem <strong>antes das ferramentas</strong>, a <strong>mentalidade e os valores que sustentam o verdadeiro DevOps</strong>.  </p>
<p>Abordei temas como colaboração, aprendizado contínuo e o impacto cultural que transforma a forma como entregamos software no dia a dia.  </p>

<p>Toquei em pontos como:  </p>
<ul>
<li>O que realmente significa <em>Cultura DevOps</em></li>
<li>Por que a transformação começa nas pessoas, não nas ferramentas</li>
<li>Exemplos reais de times que aplicam princípios DevOps com propósito</li>
<li>Como a empatia e a colaboração se traduzem em entregas melhores</li>
<li>Práticas para criar times autônomos e de alta performance</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/wsd-devops/02.jpg" alt="Rafael Ferreira palestrando sobre Cultura DevOps na whiteStone_dev" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/wsd-devops/03.jpg" alt="Público acompanhando a palestra sobre Cultura DevOps na whiteStone_dev" />

<h2 id="programacao-da-noite">Programação da Noite</h2>

<p>A 8ª edição da whiteStone_dev foi marcada por talks inspiradoras e uma energia de comunidade contagiante:</p>

<ul>
<li><strong>19:00</strong> — Abertura e Check-in</li>
</ul>

<ul>
<li><strong>19:10</strong> — Rafael Ferreira — <em>Antes de Estudar Ferramentas, Entenda a Cultura DevOps</em></li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/wsd-devops/04.jpg" alt="Rafael Ferreira abrindo a programação da noite na whiteStone_dev" />

<ul>
<li><strong>20:00</strong> — Julio Santos — <em>Da Entropia ao Equilíbrio: Lições de Arquitetura de Software Sustentável</em></li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/wsd-devops/julio.jpeg" alt="Julio Santos palestrando sobre arquitetura de software sustentável" />

<ul>
<li><strong>21:00</strong> — Eduardo P. Gutkoski - AppSync Event API – <em>AWS User Group Floripa</em></li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/wsd-devops/aws.jpg" alt="Eduardo Gutkoski apresentando AppSync Event API pelo AWS User Group Floripa" />

<ul>
<li><strong>21:50</strong> — Networking & Encerramento</li>
</ul>

<h2 id="galeria-de-fotos">Galeria de Fotos</h2>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/wsd-devops/05.jpg" alt="Participantes reunidos no INAITEC durante a whiteStone_dev" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/wsd-devops/06.jpg" alt="Networking entre participantes da whiteStone_dev 8ª edição" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/wsd-devops/07.jpg" alt="Palestrantes da whiteStone_dev reunidos no palco" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/wsd-devops/08.jpg" alt="Público da whiteStone_dev em Palhoça acompanhando as palestras" />

<h2 id="encontro-com-a-comunidade">Encontro com a Comunidade</h2>

<p>Além das palestras, o evento foi uma grande oportunidade pra reencontrar amigos, conhecer novas pessoas e fortalecer os laços entre comunidades, especialmente com a presença do <strong>AWS User Group Floripa</strong> e parceiros locais.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/wsd-devops/final.jpg" alt="Comunidade whiteStone_dev reunida no encerramento do evento" />

<h2 id="conclusao">Conclusão</h2>

<p>Participar do <strong>whiteStone_dev 8ª Edição | Cultura DevOps</strong> foi uma experiência incrível.  </p>
<p>Ver a comunidade reunida para discutir cultura, arquitetura e colaboração é o que mantém viva a essência do movimento DevOps.  </p>

<p>Agradecimento especial à <strong>organização do whiteStone_dev</strong>, aos <strong>palestrante Julio Santos e equipe do AWS User Group Floripa</strong>, e a todos que participaram dessa noite memorável.  </p>

<p>> <strong>DevOps não é sobre ferramentas, é sobre pessoas, cultura e propósito.</strong></p>

<ul>
<li><i></i> <strong>Slides da Apresentação:</strong> <a href="https://stoblobcertificados011.blob.core.windows.net/palestras/dod-wsd.pdf" target="_blank" rel="noopener noreferrer">Antes de Estudar Ferramentas, Entenda a Cultura DevOps</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>DevOps Além da Hype: Pessoas, Cultura e Prática - Esquenta MVPConf 2025 Curitiba</title>
      <link>https://www.orafaelferreira.com/artigos/mvp-crtb</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/mvp-crtb</guid>
      <pubDate>Sun, 12 Oct 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Relato da palestra DevOps Além da Hype no Esquenta MVPConf 2025, na UTFPR em Curitiba: cultura DevOps, programação completa do evento e fotos da experiência.</description>
      <category>Palestras</category>
      <category>Comunidade</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EsquentaMVPCuritiba/EsquentaMVPCuritiba.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<p>No dia <strong>27 de setembro de 2025</strong>, participei como palestrante no <a href="https://www.hubingressos.com.br/evento/mvpconfcuritiba" target="_blank" rel="noopener noreferrer"><strong>Esquenta do MVPConf 2025</strong></a>, realizado no <strong>auditório da UTFPR</strong>, em Curitiba – PR.  </p>
<p>Um evento incrível que serviu como prévia do maior encontro de especialistas Microsoft do Brasil: o <strong>MVPConf</strong>.  </p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EsquentaMVPCuritiba/EsquentaMVPCuritiba.png" alt="Banner do Esquenta MVPConf 2025 em Curitiba" />

<h2 id="o-evento">O evento</h2>

<p>Curitiba foi o palco da <strong>última edição do Esquenta MVPConf</strong>, reunindo profissionais, estudantes e entusiastas de tecnologia para um dia inteiro de <strong>palestras técnicas de altíssimo nível</strong>.  </p>
<p>A cidade, reconhecida como uma das mais inteligentes e inovadoras do Brasil, recebeu especialistas premiados com o título de <strong>Microsoft MVP (Most Valuable Professional)</strong>, compartilhando conhecimento e experiências reais do dia a dia.  </p>

<p>📍 <strong>Local:</strong> Auditório Principal da UTFPR  </p>
<p>📅 <strong>Data:</strong> 27 de setembro de 2025  </p>
<p>🕘 <strong>Horário:</strong> 09h00 às 18h00  </p>

<h2 id="minha-palestra">Minha palestra</h2>

<h3 id="devops-alem-da-hype-pessoas-cultura-e-pratica">DevOps Além da Hype: Pessoas, Cultura e Prática  </h3>

<p>Durante a minha sessão, falei sobre o que realmente sustenta o DevOps além das ferramentas, as <strong>pessoas, a cultura e as práticas reais</strong>.  </p>
<p>Abordei como o movimento nasceu, como evoluiu, e por que as empresas que prosperam em DevOps entendem que <strong>colaboração e empatia</strong> vêm antes do código.  </p>

<p>Toquei em pontos como:</p>
<ul>
<li>O nascimento do movimento DevOps e o <em>Agile Infrastructure</em></li>
<li>Os <strong>Three Ways</strong>, do <em>The Phoenix Project</em></li>
<li>As 4 métricas do livro <em>Accelerate</em></li>
<li>O framework <strong>CALMS</strong> e como aplicá-lo na prática</li>
<li>Como criar um ambiente onde a <strong>cultura</strong> habilita a <strong>entrega contínua</strong></li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EsquentaMVPCuritiba/07.jpg" alt="Rafael Ferreira palestrando sobre DevOps Além da Hype no Esquenta MVPConf" />


<h2 id="programacao-do-evento">Programação do evento</h2>

<p>O dia foi repleto de palestras inspiradoras e muito conteúdo técnico:</p>

<ul>
<li><strong>09:00 - 09:10</strong> — Abertura do evento</li>
<li><strong>09:10 - 09:50</strong> — Keynote - Task TI</li>
<li><strong>10:00 - 10:50</strong> — Felipe Augusto — <em>Testes de unidade e integração em .NET com xUnit, Bogus, ReportGenerator e TestContainers</em></li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EsquentaMVPCuritiba/11.jpg" alt="Felipe Augusto palestrando sobre testes em .NET com xUnit" />

<ul>
<li><strong>11:00 - 11:50</strong> — Rafael Ferreira — <em>DevOps além da hype: Pessoas, cultura e prática</em></li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EsquentaMVPCuritiba/01.jpg" alt="Rafael Ferreira no palco do auditório da UTFPR" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EsquentaMVPCuritiba/03.jpg" alt="Slides da palestra DevOps Além da Hype exibidos no auditório" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EsquentaMVPCuritiba/04.jpg" alt="Público acompanhando a palestra sobre cultura DevOps" />

<ul>
<li><strong>12:00 - 14:00</strong> — Almoço e Networking</li>
</ul>

<ul>
<li><strong>14:00 - 14:50</strong> — Bruno Brito — <em>Do 1º usuário ao 1 milhão: Como escalar sua aplicação</em></li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EsquentaMVPCuritiba/bruno.jpg" alt="Bruno Brito falando sobre como escalar aplicações" />

<ul>
<li><strong>15:00 - 15:50</strong> — Carlos dos Santos — <em>Criando e publicando uma aplicação com Containers e Azure</em></li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EsquentaMVPCuritiba/carlos.jpg" alt="Carlos dos Santos apresentando containers e Azure" />

<ul>
<li><strong>16:00 - 16:50</strong> — Walter Coan — <em>Monitoramento de equipamentos industriais com Azure IoT Operations e OPC UA</em></li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EsquentaMVPCuritiba/walter.jpg" alt="Walter Coan palestrando sobre Azure IoT Operations e OPC UA" />

<ul>
<li><strong>17:00 - 17:50</strong> — Johnson — <em>Proteção na era da IA com o Microsoft Security Copilot</em></li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EsquentaMVPCuritiba/johnson.jpg" alt="Johnson apresentando o Microsoft Security Copilot" />

<h2 id="estrutura-e-experiencia">Estrutura e Experiência</h2>

<p>O evento contou com uma <strong>estrutura impecável</strong>, com estandes, recepção organizada e um público engajado.  </p>
<p>Além das palestras, rolou aquele networking maroto nos intervalos, com troca de ideias e reencontros com amigos da comunidade.  </p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EsquentaMVPCuritiba/00.jpg" alt="Entrada do auditório da UTFPR no Esquenta MVPConf 2025" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EsquentaMVPCuritiba/08.jpg" alt="Participantes durante o networking no intervalo do evento" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EsquentaMVPCuritiba/05.jpg" alt="Palestrantes reunidos no Esquenta MVPConf Curitiba" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EsquentaMVPCuritiba/10.jpg" alt="Público lotando o auditório da UTFPR" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EsquentaMVPCuritiba/09.jpg" alt="Rafael Ferreira com amigos da comunidade Microsoft em Curitiba" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EsquentaMVPCuritiba/final.jpg" alt="Foto oficial de encerramento do Esquenta MVPConf 2025 Curitiba" />


<p>Poder compartilhar com a comunidade aprendizados sobre <strong>Cultura DevOps</strong> em um evento com tantos profissionais talentosos reforça o propósito de continuar disseminando conhecimento.  </p>

<p>Agradeço à <strong>organização</strong>, aos <strong>palestrantes</strong>, aos <strong>patrocinadores</strong> e a todos que fizeram parte desse dia memorável.  </p>

<strong>DevOps é sobre pessoas, tecnologia é apenas a ponte.</strong>

<ul>
<li><i></i> <strong>Slides da Apresentação:</strong> <a href="https://stoblobcertificados011.blob.core.windows.net/palestras/mvpcrtb25.pdf" target="_blank" rel="noopener noreferrer">DevOps Além da Hype: Pessoas, Cultura e Prática</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>Projetar e Implementar Soluções de Rede no Azure - AZ-700</title>
      <link>https://www.orafaelferreira.com/artigos/az-700</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/az-700</guid>
      <pubDate>Mon, 06 Oct 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Guia de estudos para a AZ-700: endereçamento IP, DNS, hub-and-spoke, NAT Gateway, VPN, ExpressRoute, balanceadores, Private Endpoint e segurança de rede.</description>
      <category>Artigos</category>
      <category>Redes</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/700/01.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<h2 id="introducao">Introdução</h2>

<p>Se você está querendo se aventurar no mundo das redes em nuvem, a <strong>certificação AZ-700</strong> é o passaporte para provar que domina como projetar e implementar soluções de rede dentro do Microsoft Azure.</p>

<p>Depois de concluir o curso <a href="https://www.udemy.com/course/az-700-vnet/" target="_blank" rel="noopener noreferrer"><em>AZ-700 - Projetar e Implementar Soluções de Rede do Azure</em> do Higor Barbosa</a>, compilei aqui os principais aprendizados e boas práticas que realmente fazem diferença, tanto para quem administra ambientes corporativos quanto para quem busca aprofundar o domínio técnico em Azure Networking.</p>


<h2 id="1-planejamento-de-enderecamento-ip">1. Planejamento de Endereçamento IP</h2>

<p>Tudo começa com as redes.  </p>
<p>Planeje suas <strong>VNets e subnets</strong> com cuidado: o Azure reserva sempre cinco endereços por subnet (do primeiro ao quarto e o último).  </p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/700/01.png" alt="Diagrama de planejamento de endereçamento IP em VNets e subnets" />


<h2 id="2-resolucao-de-nomes-dns-publico-e-privado">2. Resolução de Nomes (DNS Público e Privado)</h2>

<ul>
<li><strong>Azure DNS:</strong> gerencia domínios públicos com redundância global e desempenho via anycast.</li>
<li><strong>Azure Private DNS:</strong> resolve nomes internamente entre VNets privadas, integrando automaticamente registros das VMs.</li>
<li><strong>Private DNS Resolver:</strong> resolve consultas entre ambientes <em>on-premises</em> e Azure sem precisar expor tráfego para a internet.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/700/02.png" alt="Diagrama de resolução de nomes com Azure DNS público e privado" />


<h2 id="3-conectividade-e-roteamento-de-vnets">3. Conectividade e Roteamento de VNets</h2>

<p>1. <strong>VNet Peering</strong> – comunicação direta, rápida e segura.  </p>
<p>2. <strong>VPN Gateway</strong> – conecta VNets entre regiões ou com ambiente local.  </p>
<p>3. <strong>UDR (User Defined Routes)</strong> – define rotas personalizadas entre sub-redes.</p>

<strong>Topologia Hub-and-Spoke</strong>  
<p>Organize o ambiente para que o <em>hub</em> concentre segurança e conectividade. As <em>spokes</em> hospedam workloads isolados, conectados via peering ou WAN Virtual.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/700/03.png" alt="Topologia hub-and-spoke com peering entre VNets no Azure" />

<h2 id="4-nat-gateway">4. NAT Gateway</h2>

<p>Quando suas VMs precisam de saída de internet com IP fixo, use o <strong>Azure NAT Gateway</strong>.  </p>
<p>Ele evita exaustão de portas SNAT e garante previsibilidade em cenários de egress controlado.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/700/04.png" alt="Diagrama do NAT Gateway controlando o tráfego de saída" />

<h2 id="5-monitoramento-e-diagnostico">5. Monitoramento e Diagnóstico</h2>

<strong>Network Watcher</strong> oferece:
<ul>
<li><em>Connection Monitor</em></li>
<li><em>IP Flow Verify</em></li>
<li><em>Packet Capture</em></li>
<li><em>NSG Flow Logs</em></li>
</ul>

<p>Combine com <strong>Azure Monitor</strong> e <strong>Log Analytics</strong> para construir uma visão completa da rede, detectar gargalos e ativar alertas automáticos.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/700/05.png" alt="Ferramentas do Network Watcher para monitoramento e diagnóstico" />

<h2 id="6-vpn-site-to-site-e-ponto-a-site">6. VPN Site-to-Site e Ponto-a-Site</h2>

<strong>Site-to-Site (S2S):</strong>
<ul>
<li>Conecta datacenters e VNets.</li>
<li>Use gateways <strong>route-based</strong> e é possível, configuração ativa-ativa com BGP.</li>
</ul>

<strong>Ponto-a-Site (P2S):</strong>
<ul>
<li>Conexões individuais de dispositivos.</li>
<li>Suporte a SSTP, IKEv2 e OpenVPN.</li>
<li>Pode autenticar via certificados, RADIUS ou Entra ID (AAD).</li>
</ul>

<p>Essas opções permitem criar conectividade híbrida estável e segura entre diferentes ambientes.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/700/06.png" alt="Diagrama de VPN Site-to-Site e Ponto-a-Site no Azure" />

<h2 id="7-expressroute-e-wan-virtual">7. ExpressRoute e WAN Virtual</h2>

<p>Quando o assunto é conectividade privada e de alta performance:</p>
<ul>
<li><strong>ExpressRoute</strong> conecta seu ambiente local diretamente ao backbone do Azure.</li>
<li><strong>Azure Virtual WAN</strong> centraliza e automatiza o roteamento global, integrando S2S, P2S, ER e VNets.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/700/07.png" alt="Arquitetura com ExpressRoute e Azure Virtual WAN" />

<h2 id="8-balanceadores-de-carga-e-entrega-de-aplicacoes">8. Balanceadores de Carga e Entrega de Aplicações</h2>

<p>Camada 4 → <strong>Azure Load Balancer</strong>  </p>
<p>Camada 7 → <strong>Application Gateway (AppGW)</strong>  </p>
<p>Gerenciamento Global → <strong>Traffic Manager</strong> e <strong>Azure Front Door</strong></p>

<p>Cada serviço tem seu lugar:</p>
<ul>
<li><strong>LB</strong>: ideal para backend interno.</li>
<li><strong>AppGW</strong>: faz roteamento baseado em URL e HTTPS com WAF embutido.</li>
<li><strong>Front Door</strong>: CDN global + balanceamento inteligente entre regiões.</li>
<li><strong>Traffic Manager</strong>: DNS-based routing (latência, prioridade, geográfico).</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/700/08.png" alt="Comparativo dos balanceadores de carga do Azure" />

<h2 id="9-acesso-privado-a-servicos-paas">9. Acesso Privado a Serviços PaaS</h2>

<p>Duas opções dominam:</p>
<p>1. <strong>Service Endpoints:</strong> protegem o acesso a serviços PaaS via backbone, mas mantêm o recurso com IP público.  </p>
<p>2. <strong>Private Endpoints:</strong> criam uma interface privada na sua VNet, isolando o tráfego totalmente.</p>

<p>Hoje, o padrão corporativo é sempre <strong>Private Endpoint</strong>, mais seguro, mais fácil de auditar e compatível com políticas de compliance.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/700/09.png" alt="Diagrama de Private Endpoint para acesso a serviços PaaS" />

<h2 id="10-seguranca-de-rede-no-azure">10. Segurança de Rede no Azure</h2>

<p>Os blocos de segurança que mais fazem diferença no dia a dia:</p>
<div><table><thead><tr><th>Serviço</th><th>Função</th></tr></thead><tbody><tr><td><strong>NSG (Network Security Group)</strong></td><td>Controle de tráfego em sub-redes e NICs</td></tr><tr><td><strong>ASG (Application Security Group)</strong></td><td>Agrupamento lógico de VMs por aplicação</td></tr><tr><td><strong>Azure Firewall</strong></td><td>Inspeção e regras centralizadas</td></tr><tr><td><strong>Firewall Manager</strong></td><td>Políticas e governança em larga escala</td></tr><tr><td><strong>WAF (Web Application Firewall)</strong></td><td>Proteção camada 7 contra ataques Web</td></tr><tr><td><strong>DDoS Protection</strong></td><td>Mitigação automática de ataques volumétricos</td></tr></tbody></table></div>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/700/10.png" alt="Camadas de segurança de rede no Azure com NSG, Firewall e WAF" />

<h2 id="11-conclusao">11. Conclusão</h2>

<p>Entender <strong>endereçamento, conectividade, segurança e entrega de aplicações</strong> te coloca em outro nível, não só tecnicamente, mas na forma de pensar na infraestrutura com sua resiliência e escalabilidade de rede.</p>

<p>---</p>

<h3 id="referencias-oficiais">Referências oficiais</h3>

<ul>
<li><a href="https://learn.microsoft.com/certifications/exams/az-700/" target="_blank" rel="noopener noreferrer">Microsoft Learn — AZ-700: Design and Implement Azure Network Solutions</a></li>
<li><a href="https://learn.microsoft.com/azure/virtual-network/virtual-networks-overview" target="_blank" rel="noopener noreferrer">Microsoft Docs — Virtual Network Overview</a></li>
<li><a href="https://learn.microsoft.com/azure/architecture/reference-architectures/hybrid-networking/hub-spoke" target="_blank" rel="noopener noreferrer">Azure Architecture Center — Hub-and-Spoke Network Topology</a></li>
</ul>

<em>Baseado no curso de Higor Barbosa na Udemy (2025).</em>

<ul>
<li><a href="https://www.udemy.com/certificate/UC-49bfc006-aeb5-476d-8083-229aac73cd8f/" target="_blank" rel="noopener noreferrer">2025-06 - AZ-700 - Projetar e Implementar Soluções de Rede do Azure</a></li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/700/certificado.png" alt="Certificado do curso preparatório AZ-700 na Udemy" />]]></content:encoded>
    </item>
    <item>
      <title>GreenOps na Cloud: Arquitetando um Futuro Sustentável - TDC São Paulo 2025</title>
      <link>https://www.orafaelferreira.com/artigos/tdc-greenops</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/tdc-greenops</guid>
      <pubDate>Sat, 04 Oct 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Relato da minha palestra GreenOps na Cloud na Trilha de Arquitetura Cloud do TDC São Paulo 2025, com práticas sustentáveis, networking e certificado.</description>
      <category>Palestras</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/TDCSP25/01.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<h2 id="tdc-sao-paulo-2025">TDC São Paulo 2025</h2>

<p>No dia <strong>17 de setembro de 2025</strong>, participei como palestrante da <a href="https://thedevconf.com/tdc/2025/sao-paulo/trilha-arquitetura-cloud" target="_blank" rel="noopener noreferrer"><strong>Trilha de Arquitetura Cloud</strong> no <strong>TDC São Paulo</strong></a>, um dos maiores eventos de tecnologia do Brasil, realizado no <strong>ProMagno, em São Paulo - SP</strong>.  </p>
<p>Foram <strong>8 horas de muito conteúdo, inovação, networking e tecnologia</strong> reunindo profissionais, comunidades e empresas de todo o país.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/TDCSP25/01.png" alt="Banner do TDC São Paulo 2025 na Trilha Arquitetura Cloud" />

<h2 id="minha-palestra">Minha palestra</h2>

<h3 id="greenops-na-cloud-arquitetando-um-futuro-sustentavel">GreenOps na Cloud: Arquitetando um Futuro Sustentável</h3>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/TDCSP25/02.jpg" alt="Rafael Ferreira palestrando sobre GreenOps na Cloud no TDC São Paulo" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/TDCSP25/03.jpg" alt="Público da Trilha Arquitetura Cloud durante a palestra de GreenOps" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/TDCSP25/04.jpg" alt="Slide de abertura da palestra GreenOps na Cloud" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/TDCSP25/05.jpg" alt="Rafael Ferreira no palco da Trilha Arquitetura Cloud do TDC" />

<p>Na minha sessão, falei sobre como <strong>adotar práticas sustentáveis na nuvem</strong> pode gerar impacto positivo tanto para o planeta quanto para o negócio.  </p>
<p>Exploramos estratégias que combinam <strong>FinOps, automação e arquitetura verde</strong>, mostrando que é possível reduzir custos e emissões sem comprometer performance.</p>

<p>Toquei em temas como:</p>
<ul>
<li>O papel do <strong>GreenOps</strong> na governança de nuvem corporativa</li>
<li>Como usar <strong>métricas ambientais (carbon footprint)</strong> dentro do Azure</li>
<li>Boas práticas de <strong>FinOps + Cloud Efficiency</strong></li>
<li>A importância de <strong>arquiteturas sustentáveis e automatizadas</strong></li>
<li>Casos reais e aprendizados práticos em ambientes globais</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/TDCSP25/07.jpg" alt="Slide com práticas sustentáveis na nuvem apresentado no TDC" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/TDCSP25/06.jpg" alt="Rafael Ferreira explicando casos reais de GreenOps" />

<h2 id="programacao-da-trilha-arquitetura-cloud">Programação da Trilha Arquitetura Cloud</h2>

<p>O dia foi intenso e repleto de conteúdo técnico de altíssimo nível, participi de algumas palestras:</p>

<ul>
<li><strong>Thiago Silva (Bosch)</strong> — Construindo o futuro na nuvem: Benefícios da Redundância e paz de espírito com Recuperação de Desastres</li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/TDCSP25/thiago.jpg" alt="Thiago Silva da Bosch palestrando sobre redundância e recuperação de desastres" />

<ul>
<li><strong>Renan Oliveira (CTO - Hypetech)</strong> e <strong>André Bassi (Platform Engineer - Hypetech)</strong> — Arquitetura Multi-cloud na Prática: Escalabilidade Sem Fronteiras</li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/TDCSP25/multicloud.jpg" alt="Renan Oliveira e André Bassi apresentando arquitetura multi-cloud na prática" />

<ul>
<li><strong>Marcello Ozzetti (Accenture)</strong> e <strong>Victor Muniz (Accenture)</strong> — DevOps como Serviço: Templates Padronizados para Multi-Frameworks e Multi-Cloud</li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/TDCSP25/acc.jpeg" alt="Marcello Ozzetti e Victor Muniz apresentando DevOps como Serviço" />

<ul>
<li><strong>Camila Macedo (Red Hat)</strong> — Descomplicando o Operator Pattern: estenda a API do Kubernetes</li>
</ul>

<h2 id="encontro-com-os-alura-stars">Encontro com os Alura Stars</h2>

<p>Durante o evento, também rolou um momento especial com o <strong>grupo dos Alura Stars</strong> que estavam presentes no TDC.  </p>
<p>Foi ótimo encontrar tanta gente que compartilha a mesma paixão por tecnologia, aprendizado e comunidade.  </p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/TDCSP25/13.jpg" alt="Encontro com os Alura Stars no TDC São Paulo 2025" />

<h2 id="espaco-de-fotos-e-networking">Espaço de Fotos e Networking</h2>

<p>O <strong>hall de entrada do ProMagno</strong> estava com uma estrutura incrível, e o evento ainda contou com um <strong>espaço dedicado para fotos profissionais</strong>.  </p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/TDCSP25/12.jpg" alt="Hall de entrada do ProMagno durante o TDC São Paulo" />

<p>Com um fotógrafo no local, os participantes puderam <strong>atualizar a foto do perfil do LinkedIn</strong> e registrar o momento com qualidade.</p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/TDCSP25/14.jpg" alt="Espaço de fotos profissionais do TDC São Paulo 2025" />

<h2 id="galeria-de-fotos">Galeria de Fotos</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/TDCSP25/08.jpg" alt="Palestrantes da Trilha Arquitetura Cloud reunidos no TDC" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/TDCSP25/09.jpg" alt="Networking entre participantes do TDC São Paulo 2025" />

<h2 id="certificado-de-participacao">Certificado de Participação</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/TDCSP25/Certificado.png" alt="Certificado de palestrante do TDC São Paulo 2025" />

<p>Participar do <strong>TDC São Paulo</strong> foi uma experiência incrível, energia contagiante, público engajado e discussões profundas sobre o futuro da <strong>arquitetura em nuvem e sustentabilidade digital</strong>.  </p>

<p>> <strong>Pense grande, pense verde.</strong></p>

<ul>
<li><i></i> <strong>Slides da Apresentação:</strong> <a href="https://stoblobcertificados011.blob.core.windows.net/palestras/tdc-greenops-25.pdf" target="_blank" rel="noopener noreferrer">GreenOps na Cloud: Arquitetando um Futuro Sustentável</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Explorando a cultura DevOps: Por que tanto se fala de cultura por trás da entrega contínua? - Encontro das comunidades AWS User Group Floripa + DevOps Floripa 2025</title>
      <link>https://www.orafaelferreira.com/artigos/dod-meetupaws</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/dod-meetupaws</guid>
      <pubDate>Tue, 30 Sep 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Palestrei sobre cultura DevOps no encontro das comunidades AWS User Group Floripa e DevOps Floripa, realizado no auditório da ACATE em setembro de 2025.</description>
      <category>Palestras</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EncontroDOD/01.jpeg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[
<h2 id="encontro-das-comunidades-aws-user-group-floripa-devops-floripa">Encontro das comunidades AWS User Group Floripa + DevOps Floripa</h2>

<p>No dia <strong>03 de setembro de 2025</strong>, participei como palestrante no <a href="https://www.meetup.com/aws-user-group-floripa/events/310698392/?eventOrigin=group_events_list" target="_blank" rel="noopener noreferrer"><strong>Encontro das comunidades AWS User Group Floripa + DevOps Floripa</strong></a>, realizado no <strong>Auditório da ACATE - Passeio Primavera (SC-401)</strong>.  </p>
<p>Um evento colaborativo que uniu duas comunidades vibrantes para discutir <strong>computação em nuvem, cultura DevOps, inovação e muito networking</strong>.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EncontroDOD/01.jpeg" alt="Encontro das comunidades AWS User Group Floripa e DevOps Floripa na ACATE" />

<h2 id="minha-palestra">Minha palestra</h2>

<h3 id="explorando-a-cultura-devops-por-que-tanto-se-fala-de-cultura-por-tras-da-entrega">Explorando a Cultura DevOps: Por que tanto se fala de cultura por trás da entrega contínua?  </h3>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EncontroDOD/foto-rafael2.jpg" alt="Rafael Ferreira palestrando sobre cultura DevOps no encontro das comunidades" />

<p>Na minha sessão, trouxe reflexões sobre como a <strong>cultura</strong> é o principal motor por trás das práticas DevOps.  </p>
<p>Mais do que ferramentas, DevOps é sobre <strong>mentalidade, colaboração e propósito</strong>.</p>

<p>Toquei em pontos como:</p>
<ul>
<li>Por que falar de <strong>cultura</strong> importa tanto quanto falar de tecnologia</li>
<li>O impacto da <strong>empatia e colaboração</strong> em times distribuídos</li>
<li>Como <strong>práticas reais</strong> transformam entregas contínuas em valor para o negócio</li>
<li>Casos práticos de pipelines e times que adotaram a mudança cultural antes da técnica</li>
</ul>

<h2 id="programacao-do-evento">Programação do evento'</h2>

<p>O encontro teve uma programação muito rica e diversa:</p>

<ul>
<li><strong>18h45 - 19h20</strong> — Recepção + Introdução às comunidades</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EncontroDOD/foto-recepcao.jpg" alt="Recepção dos participantes no auditório da ACATE" />

<ul>
<li><strong>19h20 - 19h30</strong> — Apresentação da empresa <strong>Zallpy</strong> (patrocinadora do evento)</li>
</ul>

<ul>
<li><strong>19h30 - 20h</strong> — <em>Do Qubit à Aritmética: Como calcular a + b usando computadores quânticos?</em> — <em>Ruan Luiz (Grupo de Computação Quântica da UFSC)</em></li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EncontroDOD/foto-ruan.jpg" alt="Ruan Luiz apresentando a palestra sobre computação quântica" />

<ul>
<li><strong>20h - 20h30</strong> — Coffee + Networking ☕</li>
</ul>

<ul>
<li><strong>20h45 - 21h15</strong> — <em>Explorando a Cultura DevOps</em> — <em>Rafael Ferreira (Senior Platform Engineer)</em></li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EncontroDOD/foto-rafael.jpg" alt="Rafael Ferreira apresentando a palestra Explorando a Cultura DevOps" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EncontroDOD/foto-rafael3.jpg" alt="Público acompanhando a palestra sobre cultura DevOps na ACATE" />

<ul>
<li><strong>21h15 - 21h45</strong> — <em>Logs não são o suficiente</em> — <em>Marcelo Scheidt (Principal Engineer, e-Hub da Zallpy)</em></li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EncontroDOD/foto-marcelo.jpg" alt="Marcelo Scheidt apresentando a palestra Logs não são o suficiente" />

<ul>
<li><strong>21h45</strong> — Encerramento</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EncontroDOD/foto-encerramento.jpg" alt="Encerramento do encontro AWS User Group Floripa e DevOps Floripa" />

<h2 id="destaques-da-minha-sessao">Destaques da minha sessão</h2>

<ul>
<li>Cultura DevOps é sobre <strong>pessoas e interações</strong></li>
<li>Ferramentas só têm valor quando aplicadas com <strong>propósito claro</strong></li>
<li>A <strong>entrega contínua</strong> depende de confiança e alinhamento cultural</li>
<li><strong>Exemplos práticos</strong> de mudanças que deram certo (e outras que ensinaram muito)</li>
</ul>

<h2 id="galeria-de-fotos">Galeria de Fotos</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EncontroDOD/02.jpg" alt="Participantes reunidos no encontro das comunidades na ACATE" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EncontroDOD/03.jpg" alt="Networking entre participantes durante o coffee break" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EncontroDOD/04.jpg" alt="Palestrantes e organizadores do encontro AWS User Group e DevOps Floripa" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EncontroDOD/05.jpg" alt="Auditório da ACATE lotado durante o encontro das comunidades" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EncontroDOD/06.jpg" alt="Momento de interação com o público durante as palestras" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EncontroDOD/07.jpg" alt="Comunidade DevOps Floripa reunida no Passeio Primavera" />

<h2 id="conclusao">Conclusão</h2>

<p>O encontro foi uma irado cheio de aprendizado e conexão com as comunidade <strong>AWS User Group Floripa</strong>, <strong>DevOps Floripa</strong> aos patrocinadores e todos que participaram dessa noite.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/EncontroDOD/certificado.png" alt="Certificado de palestrante do encontro AWS User Group Floripa e DevOps Floripa" />

<p>> <strong>DevOps é sobre cultura, não sobre ferramentas.</strong></p>

<ul>
<li><i></i> <strong>Slides da Apresentação:</strong> <a href="https://stoblobcertificados011.blob.core.windows.net/palestras/dod-meetup25.pdf" target="_blank" rel="noopener noreferrer">Explorando a cultura DevOps: Por que tanto se fala de cultura por trás da entrega contínua?</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>DevOps Além da Hype: Pessoas, Cultura e Prática - DevOpsDays Curitiba 2025</title>
      <link>https://www.orafaelferreira.com/artigos/dod-crtb25</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/dod-crtb25</guid>
      <pubDate>Mon, 01 Sep 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Relato da palestra DevOps Além da Hype no DevOpsDays Curitiba 2025, na UFPR: cultura, pessoas, framework CALMS, programação do evento e galeria de fotos.</description>
      <category>Palestras</category>
      <category>Kubernetes</category>
      <category>Observabilidade</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/DOD-Curitiba/1.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<h2 id="devopsdays-curitiba-2025">DevOpsDays Curitiba 2025</h2>

<p>No dia <strong>30 de agosto de 2025</strong>, tive o prazer de participar do <strong>DevOpsDays Curitiba</strong>, um dos principais eventos da comunidade DevOps no Brasil. O evento aconteceu no <strong>Centro Politécnico da UFPR</strong>, reunindo profissionais apaixonados por tecnologia, inovação e cultura DevOps.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/DOD-Curitiba/1.png" alt="Banner do DevOpsDays Curitiba 2025 no Centro Politécnico da UFPR" />

<h2 id="minha-palestra">Minha palestra</h2>

<h3 id="devops-alem-da-hype-pessoas-cultura-e-pratica">DevOps Além da Hype: Pessoas, Cultura e Prática  </h3>
<p>Falar sobre DevOps vai muito além de falar sobre ferramentas. Na minha sessão, foquei na <strong>transformação cultural</strong>, no papel das <strong>pessoas</strong> e em <strong>práticas reais</strong> que impactam a entrega de software de forma mais rápida, contínua e confiável.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/DOD-Curitiba/1.jpg" alt="Rafael Ferreira palestrando no DevOpsDays Curitiba 2025" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/DOD-Curitiba/0.jpg" alt="Público acompanhando a palestra DevOps Além da Hype" />

<p>Toquei em pontos como:</p>
<ul>
<li>O nascimento do movimento DevOps, desde o <em>Agile Infrastructure</em> em 2008</li>
<li>Os <strong>Three Ways</strong>, do <em>The Phoenix Project</em></li>
<li>As 4 métricas do livro <em>Accelerate</em></li>
<li>A importância das <strong>topologias de times</strong> (Team Topologies)</li>
<li>O framework <strong>CALMS</strong> e os pilares para sustentar o DevOps na prática</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/DOD-Curitiba/2.jpg" alt="Slide sobre o framework CALMS durante a palestra" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/DOD-Curitiba/3.jpg" alt="Rafael Ferreira apresentando os pilares do DevOps no palco" />

<h2 id="programacao-do-evento">Programação do evento</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/DOD-Curitiba/grade.png" alt="Grade de programação do DevOpsDays Curitiba 2025" />

<p>O evento contou com nomes de peso e temas de altíssimo nível, como:</p>

<ul>
<li><strong>Vinicius Moraes</strong> — Usando Infraestrutura como Código para Criar um Sistema de Detecção de Intrusões</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/DOD-Curitiba/vinicius.png" alt="Vinicius Moraes palestrando sobre Infraestrutura como Código" />

<ul>
<li><strong>Ederson do Nascimento</strong> — SRE na Prática</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/DOD-Curitiba/ederson.png" alt="Ederson do Nascimento apresentando SRE na Prática" />

<ul>
<li><strong>Bruno Lopes</strong> — Otimizando Clusters Kubernetes com Karpenter</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/DOD-Curitiba/bruno.jpg" alt="Bruno Lopes falando sobre Karpenter em clusters Kubernetes" />  

<ul>
<li><strong>João Brito</strong> — 15 Dicas em 30 Minutos</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/DOD-Curitiba/joao.png" alt="João Brito apresentando 15 Dicas em 30 Minutos" />

<ul>
<li><strong>Lucas Ribeiro da Mata</strong> — MLOps na prática</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/DOD-Curitiba/lucas.png" alt="Lucas Ribeiro da Mata palestrando sobre MLOps na prática" />

<ul>
<li><strong>Gabriel Bazzotti</strong> — Policy as Code e Segurança em Clusters!</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/DOD-Curitiba/gabriel.jpg" alt="Gabriel Bazzotti apresentando Policy as Code e segurança em clusters" /> 

<ul>
<li><strong>Igor Estevan Jasinski</strong> — Machine Learning e Séries Temporais com Prometheus</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/DOD-Curitiba/igor.png" alt="Igor Estevan Jasinski falando sobre Machine Learning com Prometheus" />


<h2 id="destaques-da-minha-sessao">Destaques da minha sessão</h2>

<ul>
<li>🧠 Cultura DevOps ≠ Ferramentas</li>
<li>🛠️ Integração de ferramentas com propósito (CI/CD, IAC, observabilidade)</li>
<li>🚀 Transformação real de pipelines com Kubernetes</li>
<li>📊 Métricas de sucesso para times de alta performance</li>
<li>👥 Colaboração e empatia como base de qualquer transformação</li>
</ul>

<h2 id="galeria-de-fotos">Galeria de Fotos</h2>


<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/DOD-Curitiba/4.png" alt="Palestrantes e participantes reunidos no DevOpsDays Curitiba 2025" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/DOD-Curitiba/5.png" alt="Auditório do Centro Politécnico da UFPR durante o evento" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/DOD-Curitiba/6.jpg" alt="Momento de networking entre participantes do DevOpsDays Curitiba" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/DOD-Curitiba/7.png" alt="Rafael Ferreira com membros da comunidade DevOps em Curitiba" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/DOD-Curitiba/8.png" alt="Palco principal do DevOpsDays Curitiba 2025" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/DOD-Curitiba/9.jpg" alt="Participantes durante o intervalo do DevOpsDays Curitiba" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/DOD-Curitiba/10.png" alt="Foto oficial do encerramento do DevOpsDays Curitiba 2025" />

<h2 id="conclusao">Conclusão</h2>

<p>Agradeço à organização, aos palestrantes, e a toda galera que colou na minha sessão.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/DOD-Curitiba/certificado.png" alt="Certificado de palestrante do DevOpsDays Curitiba 2025" />

<p>> <strong>DevOps não é um destino. É uma jornada contínua.</strong></p>

<ul>
<li><i></i> <strong>Slides da Apresentação:</strong> <a href="https://stoblobcertificados011.blob.core.windows.net/palestras/DevOps-CRTB.pdf" target="_blank" rel="noopener noreferrer">DevOps Além da Hype: Pessoas, Cultura e Prática</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Cloud Moderna ANTI Ataque: blindagem DevOps que você PRECISA conhecer - Hacking na Web Day Florianópolis 2025</title>
      <link>https://www.orafaelferreira.com/artigos/hack</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/hack</guid>
      <pubDate>Wed, 20 Aug 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Relato da palestra Cloud Moderna ANTI Ataque no Hacking na Web Day Florianópolis 2025: defesa em camadas, os 4Cs da Cloud Native Security e blindagem DevOps.</description>
      <category>Palestras</category>
      <category>Kubernetes</category>
      <category>Governança</category>
      <category>Comunidade</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/HNWD/1.jpeg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[
<h2 id="cloud-moderna-anti-ataque-minha-experiencia-no-hnwd-floripa-2025">Cloud Moderna ANTI Ataque: minha experiência no HNWD Floripa 2025</h2>

<p>No último dia <strong>16 de agosto de 2025</strong>, rolou em Florianópolis o <a href="https://www.sympla.com.br/evento/hnwd-florianopolis-2025/2960275?referrer=orafaelferreira.com&referrer=orafaelferreira.com" target="_blank" rel="noopener noreferrer"><strong>HNWD (Hacking na Web Day)</strong></a>, um dos eventos mais autênticos e relevantes da cena de hacking e segurança cibernética no Brasil. Essa edição aconteceu no Castelmar Hotel, reunindo especialistas, entusiastas e comunidades apaixonadas por segurança da informação.  </p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/HNWD/1.jpeg" alt="Banner do Hacking na Web Day Florianópolis 2025" />

<p>O HNWD nasceu como um encontro feito <em>da comunidade para a comunidade</em>, e já virou referência nacional. Em 2025, a tour passou por <strong>seis cidades brasileiras</strong>, trazendo conteúdo de altíssimo nível, com palestras práticas, CTFs presenciais, além de muito networking e trocas intensas de experiência.  </p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/HNWD/00.JPG" alt="Entrada do evento HNWD em Florianópolis" />

<h2 id="minha-palestra-blindagem-devops-em-ambientes-cloud">Minha palestra: blindagem DevOps em ambientes cloud</h2>

<p>Tive a honra de palestrar no <strong>Auditório 2</strong>, ao meio-dia, com o tema:  </p>
<strong>"Cloud Moderna ANTI Ataque: blindagem DevOps que você PRECISA conhecer"</strong>.  

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/HNWD/001.JPG" alt="Rafael Ferreira palestrando sobre Cloud Moderna ANTI Ataque" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/HNWD/2.JPG" alt="Público acompanhando a palestra sobre blindagem DevOps" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/HNWD/3.JPG" alt="Slide de abertura da palestra no HNWD Floripa 2025" />

<h2 id="resumo-da-talk">Resumo da Talk</h2>

<p>Na palestra <strong>Cloud Moderna ANTI Ataque: Blindagem DevOps Essencial</strong>, apresentei duas frentes principais de segurança:</p>

<h2 id="parte-1-defesa-em-camadas">Parte 1 — Defesa em Camadas  </h2>

<p>Mostrei como proteger ambientes cloud com uma <strong>arquitetura em múltiplas camadas</strong>, utilizando os principais recursos nativos das clouds:  </p>

<ul>
<li><strong>Identidade & Acesso</strong>: IAM, RBAC, Zero Trust, MFA.</li>
<li><strong>Perímetro</strong>: WAF, CDN, VPN, Bastion, proteção DDoS.</li>
<li><strong>Rede & Segmentação</strong>: VNet/SG/NACL, isolamento de workloads.</li>
<li><strong>Compute & Containers</strong>: Defender, Inspector, OS Config, AKS/EKS/GKE.</li>
<li><strong>Aplicações</strong>: API Management, App Services, Gateways, Key Vault/Secrets.</li>
<li><strong>Dados</strong>: Criptografia, KMS, controle de chaves.</li>
<li><strong>Monitoramento & Resposta</strong>: SIEM (Sentinel, Security Hub, Chronicle), logs centralizados, automação de incidentes.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/HNWD/4.JPG" alt="Slide sobre defesa em camadas em ambientes cloud" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/HNWD/5.jpg" alt="Rafael Ferreira explicando identidade e rede na nuvem" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/HNWD/6.jpg" alt="Slide sobre monitoramento e resposta a incidentes" />

<h2 id="parte-2-os-4cs-da-cloud-native-security">Parte 2 — Os 4Cs da Cloud Native Security  </h2>

<p>Conectando com o modelo da CNCF, mostrei como aplicar defesa de forma <strong>Cloud Native</strong>:  </p>

<ul>
<li><strong>Cloud</strong> → Governança, Policy, Defender for Cloud, Config, SCC.</li>
<li><strong>Cluster</strong> → Segurança em Kubernetes (RBAC, hardening, runtime visibility).</li>
<li><strong>Container</strong> → Scan de imagens, assinatura, execução não-root, OPA/Kyverno.</li>
<li><strong>Código</strong> → Shift Left, SAST/DAST, SCA, secret scanning, IaC seguro.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/HNWD/7.JPG" alt="Slide sobre os 4Cs da Cloud Native Security" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/HNWD/8.png" alt="Rafael Ferreira apresentando segurança em código e containers" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/HNWD/9.JPG" alt="Público interagindo durante a palestra no HNWD" />

<p>O evento foi cheio de aprendizado. Tivemos palestras sobre <strong>IA adversarial, XSS avançado, Kubernetes hacking, deepfakes, AWS hardening</strong> e muito mais. Além disso, o espaço de comunidades e patrocinadores trouxe aquela vibe que só a cena de segurança brasileira tem: <strong>colaboração acima da competição</strong>.  </p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/HNWD/10.JPG" alt="Espaço de comunidades e patrocinadores do HNWD Floripa" />

<p>Quero agradecer a todos que participaram da minha palestra e trocaram ideias comigo durante o evento. Foi uma experiência incrível poder compartilhar práticas de blindagem em nuvem com tanta gente interessada em levar segurança a sério no dia a dia.  </p>

<p>E claro: parabéns à organização do HNWD e a todos os apoiadores que tornam esse evento possível. É nítido que o hacking no Brasil está cada vez mais <strong>forte, maduro e conectado</strong>.  </p>

<p>Nos vemos na próxima!  </p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/HNWD/11.png" alt="Certificado de palestrante do Hacking na Web Day Florianópolis 2025" />

<ul>
<li><i></i> <strong>Slides da Apresentação:</strong> <a href="https://stoblobcertificados011.blob.core.windows.net/palestras/CloudModernaANTIAtaque.pdf" target="_blank" rel="noopener noreferrer">Cloud Moderna ANTI Ataque: blindagem DevOps que você PRECISA conhecer</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Certificação HashiCorp Terraform Associate 003: Dicas, Experiências e Preparação</title>
      <link>https://www.orafaelferreira.com/artigos/terraform-associate-artigo</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/terraform-associate-artigo</guid>
      <pubDate>Sun, 03 Aug 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Como foi passar no exame HashiCorp Certified Terraform Associate 003: estrutura da prova, experiência pessoal e dicas de estudo para a preparação.</description>
      <category>Artigos</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2025-08-03-terraform-associate-artigo.png" length="0" type="image/png" />
      <content:encoded><![CDATA[<h2 id="secao"></h2>

<h2 id="introducao">Introdução</h2>

<p>Fala galera! Tudo bom? Recentemente passei no exame <strong>HashiCorp Certified: Terraform Associate (003)</strong> e quero compartilhar com vocês um pouco sobre como foi a experiência, desde a estrutura da prova até as minhas dicas de estudo. Se você é um profissional de DevOps querendo se certificar em Terraform, este artigo é pra você!</p>

<p>Para quem não conhece, essa certificação Terraform Associate basicamente valida seus conhecimentos fundamentais sobre o Terraform e conceitos de Infraestrutura como Código (IaC).</p>

<h2 id="sobre-o-exame-terraform-associate">Sobre o Exame Terraform Associate</h2>

<p>O Terraform Associate (versão 003) é uma certificação de nível "fundamental" da HashiCorp voltada para Terraform. É recomendada para engenheiros de infraestrutura/DevOps que atuam em operações, TI ou desenvolvimento e já conhecem os conceitos básicos do Terraform.</p>

<strong>Formato da prova:</strong>
<ul>
<li>Online, com supervisão (proctored)</li>
<li>57 questões de múltipla escolha</li>
<li>Tempo: 1 hora (60 minutos)</li>
<li>Idioma: Inglês</li>
<li>Custo: cerca de US$70</li>
<li>Validade: 2 anos</li>
</ul>

<h2 id="topicos-principais-do-exame">Tópicos Principais do Exame</h2>

<ul>
<li><strong>Infraestrutura como Código (IaC):</strong> Saber o que é IaC e por que é vantajosa, destacando a consistência, automação e versionamento de infraestrutura.</li>
<li>Exercício prático: <a href="https://github.com/orafaelferreiraa/Terraform-Training-Projects/tree/main/Treinamento%20TFTEC%20Terrafom%20Associate/1-UnderstandInfrastructureasCode(IaC" target="_blank" rel="noopener noreferrer">1-UnderstandInfrastructureasCode(IaC)concepts-BuildingVM</a>concepts-BuildingVM)</li>
</ul>

<ul>
<li><strong>Propósito do Terraform em relação a outras ferramentas:</strong> Entender os benefícios de ser multi-cloud e agnóstico ao provedor e o papel do arquivo de estado.</li>
<li>Exercício prático: <a href="https://github.com/orafaelferreiraa/Terraform-Training-Projects/tree/main/Treinamento%20TFTEC%20Terrafom%20Associate/2-UnderstandTerraformbasics" target="_blank" rel="noopener noreferrer">2-UnderstandTerraformbasics</a></li>
<li><strong>Fundamentos do Terraform:</strong> Dominar sintaxe HCL, blocos de recursos e dados, providers, variáveis e outputs.</li>
<li><strong>Uso do Terraform além do fluxo básico:</strong> Conhecer comandos como <code>terraform import</code> para importar recursos, <code>terraform state</code> para inspecionar o estado e como habilitar logs de depuração.</li>
<li><strong>Módulos:</strong> Saber encontrar módulos no registro público, usar módulos locais e remotos, versionar e entender o escopo de variáveis.</li>
<li>Exercício prático: <a href="https://github.com/orafaelferreiraa/Terraform-Training-Projects/tree/main/Treinamento%20TFTEC%20Terrafom%20Associate/5-InteractwithTerraformmodules1" target="_blank" rel="noopener noreferrer">5-InteractwithTerraformmodules1</a></li>
<li>Exercício prático: <a href="https://github.com/orafaelferreiraa/Terraform-Training-Projects/tree/main/Treinamento%20TFTEC%20Terrafom%20Associate/5-InteractwithTerraformmodules2" target="_blank" rel="noopener noreferrer">5-InteractwithTerraformmodules2</a></li>
<li><strong>Fluxo de trabalho:</strong> Gravar a sequência <code>write → plan → apply</code> (CAI NA PROVA) e também <code>validate</code>, <code>fmt</code> e <code>destroy</code>.</li>
<li><strong>Estado:</strong> Entender backends locais e remotos, locking de estado, drifts e comandos como <code>terraform state mv</code>, bem como segredos no <code>tfstate</code>.</li>
<li><strong>Ler e modificar configurações:</strong> Utilizar variáveis e outputs corretamente, proteger segredos, trabalhar com tipos complexos e funções HCL.</li>
<li>Exercício prático: <a href="https://github.com/orafaelferreiraa/Terraform-Training-Projects/tree/main/Treinamento%20TFTEC%20Terrafom%20Associate/8-Read%2Cgenerate%2CModifyConfiguration-Collections" target="_blank" rel="noopener noreferrer">8-Read,generate,ModifyConfiguration-Collections</a></li>
<li>Exercício prático: <a href="https://github.com/orafaelferreiraa/Terraform-Training-Projects/tree/main/Treinamento%20TFTEC%20Terrafom%20Associate/8-Read%2Cgenerate%2CModifyConfiguration-Functions" target="_blank" rel="noopener noreferrer">8-Read,generate,ModifyConfiguration-Functions</a></li>
<li>Exercício prático: <a href="https://github.com/orafaelferreiraa/Terraform-Training-Projects/tree/main/Treinamento%20TFTEC%20Terrafom%20Associate/8-Read%2Cgenerate%2CModifyConfiguration-Secrets" target="_blank" rel="noopener noreferrer">8-Read,generate,ModifyConfiguration-Secrets</a></li>
<li><strong>Conhecer o Terraform Cloud/Enterprise:</strong> Ter noções das funcionalidades da oferta SaaS (state remoto, integração com VCS, políticas e colaboração).</li>
<li><strong>Workspaces:</strong> Embora não apareça explicitamente no blueprint, várias questões NA PROVA abordam Workspaces. Saiba criar, listar, selecionar e remover workspaces e as diferenças em relação a usar backends distintos.</li>
</ul>

<h2 id="minha-preparacao-e-materiais-de-estudo">Minha Preparação e Materiais de Estudo</h2>

<ul>
<li><strong>Curso TFTEC:</strong> 100% prático, com labs e simulado final. <a href="https://tftec.curseduca.pro/m/c/terrafom-associate-1694628491755" target="_blank" rel="noopener noreferrer">Acesse aqui</a></li>
<li><strong>Labs próprios:</strong> Pratiquei com cloud Azure.</li>
<li><strong>GitHub pessoal:</strong> Criei um <a href="https://github.com/orafaelferreiraa/Terraform-Training-Projects/tree/main/Treinamento%20TFTEC%20Terrafom%20Associate" target="_blank" rel="noopener noreferrer">repositório</a> com todos os projetos que fiz nos labs.</li>
<li><strong>Curso Udemy – Terraform Associate Practice Exam (em inglês):</strong> Excelente para testar conhecimentos com simulado realista. <a href="https://www.udemy.com/course/terraform-associate-practice-exam/" target="_blank" rel="noopener noreferrer">Acesse aqui</a></li>
</ul>

<h2 id="dicas-para-o-exame">Dicas para o Exame</h2>

<ul>
<li><strong>Domine IaC na teoria:</strong> O exame cobra definições e vantagens da IaC. Saiba explicar por que versionar infraestrutura como código aumenta a confiabilidade e como se diferencia de ferramentas de gerenciamento de configuração.</li>
<li><strong>Pratique todos os comandos:</strong> Não fique só no trio <code>init/plan/apply</code>. Experimente <code>fmt</code>, <code>import</code>, <code>state list/show/mv</code>, <code>workspace</code>, <code>login/logout</code> e assim por diante.</li>
<li><strong>Estude o arquivo de estado:</strong> Saiba que o <code>tfstate</code> é salvo localmente por padrão e pode ser movido para backends remotos. Entenda como funciona o locking, como lidar com drifts e quando usar <code>terraform state rm</code>.</li>
<li><strong>Módulos são fundamentais:</strong> Crie e utilize módulos para entender entradas e saídas, escopo de variáveis, versionamento e fontes (local, registro ou repositório Git).</li>
<li><strong>Aprenda sobre Workspaces:</strong> Domine os comandos <code>workspace new/list/select/show</code> e compreenda que cada workspace tem seu próprio arquivo de estado.</li>
<li><strong>Conheça o Terraform Cloud:</strong> Mesmo que nunca tenha usado a versão SaaS, leia sobre suas vantagens: state remoto com bloqueio automático, integrações com Git, execução em equipe e políticas de governança.</li>
<li><strong>Gerencie o tempo na prova:</strong> Sessenta minutos para 57 perguntas dá cerca de um minuto por questão. Marque a melhor opção e volte depois se necessário.</li>
<li><strong>Mantenha a calma:</strong> Revise as opções com atenção, pois muitas vezes a diferença está em uma palavra (e em inglês). Antes de submeter, revise tudo.</li>
<li><strong>Transfira o aprendizado para o trabalho:</strong> Refatore códigos reais com boas práticas. Aplicar o conteúdo no dia a dia reforça o aprendizado.</li>
</ul>

<h2 id="conclusao">Conclusão</h2>

<p>Fazer a certificação Terraform Associate foi uma experiência valiosa. Além de receber o badge, consolidei conceitos essenciais de IaC e do Terraform que aplico diariamente. A prova reflete demandas do mundo real: ao estudar para ela, você aprimora seu domínio da ferramenta e se prepara melhor para projetos de nuvem e automação.</p>

<p>Recomendo a certificação para quem já utiliza Terraform. Ela formaliza o conhecimento e pode abrir portas, muitas vagas pedem familiaridade com Terraform, e ter a certificação ajuda a comprovar essa habilidade. Para quem pretende avançar, a HashiCorp oferece também o nível Professional, então a Associate pode ser só o começo.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2025-08-03-terraform-associate-artigo.png" alt="Badge da certificação HashiCorp Certified Terraform Associate 003" />

<strong>Referências</strong>:
<ul>
<li><a href="https://developer.hashicorp.com/terraform/tutorials/certification-003/associate-review-003" target="_blank" rel="noopener noreferrer">HashiCorp Terraform Associate</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>Organizador – Azure User Groups Brasil</title>
      <link>https://www.orafaelferreira.com/artigos/azure-user-groups-brasil</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/azure-user-groups-brasil</guid>
      <pubDate>Sat, 21 Jun 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Atuação nacional no Azure User Groups Brasil e local no Azure User Group Florianópolis, fortalecendo comunidades, eventos e conteúdo sobre Microsoft Azure.</description>
      <category>Organizador Grupo de Comunidade</category>
      <enclosure url="https://azureusergroupsbrasil.com.br/common/logo-semfundo.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<img src="https://azureusergroupsbrasil.com.br/common/logo-semfundo.png" alt="Azure User Groups Brasil" />

<h2 id="introducao">Introdução</h2>

<p>O <strong>Azure User Groups Brasil</strong> nasceu para conectar comunidades regionais, incentivar novas branches e ampliar o acesso a conteúdo de qualidade sobre <strong>Microsoft Azure</strong> e tecnologias cloud em todo o país.</p>

<p>Além de fortalecer a troca entre organizadores, palestrantes e participantes, a iniciativa cria um ponto de encontro nacional para quem quer aprender, compartilhar experiências reais e evoluir na carreira.</p>

<p>Se você curte comunidade, cloud e colaboração, esse grupo é para você.</p>

<h2 id="azure-user-groups-brasil">Azure User Groups Brasil</h2>

<ul>
<li>🌐 <a href="https://azureusergroupsbrasil.com.br/" target="_blank" rel="noopener noreferrer">Site oficial</a></li>
<li>🔗 <a href="https://linktr.ee/azureusergroupsbrasil" target="_blank" rel="noopener noreferrer">Linktree oficial</a></li>
<li>🗂️ <a href="https://azureusergroupsbrasil.com.br/branches" target="_blank" rel="noopener noreferrer">Branches</a></li>
<li>📅 <a href="https://azureusergroupsbrasil.com.br/events" target="_blank" rel="noopener noreferrer">Eventos</a></li>
<li>🧭 <a href="https://azureusergroupsbrasil.com.br/nova-branch" target="_blank" rel="noopener noreferrer">Nova Branch</a></li>
<li>👥 <a href="https://chat.whatsapp.com/HSpFnNyo9ZLD4RJrvEcrrl" target="_blank" rel="noopener noreferrer">Grupo WhatsApp</a></li>
<li>▶️ <a href="https://www.youtube.com/@azureusergroupsbrasil?sub_confirmation=1" target="_blank" rel="noopener noreferrer">YouTube</a></li>
<li>💼 <a href="https://www.linkedin.com/company/azureusergroupsbrasil" target="_blank" rel="noopener noreferrer">LinkedIn</a></li>
<li>🤝 <a href="https://www.meetup.com/azureusergroupsbrasil" target="_blank" rel="noopener noreferrer">Meetup</a></li>
<li>📸 <a href="https://www.instagram.com/azureusergroupsbrasil/" target="_blank" rel="noopener noreferrer">Instagram</a></li>
<li>🔗 <a href="https://linktr.ee/azureusergroupsbrasil" target="_blank" rel="noopener noreferrer">Acessar o Linktree do Azure User Groups Brasil</a></li>
</ul>

<h2 id="nossas-branches">Nossas Branches</h2>

<p>Comunidades regionais ativas em todo o Brasil, organizando meetups, workshops e eventos técnicos sobre Azure.</p>
<div><table><thead><tr><th>Branch</th><th>Local</th><th>Resumo</th><th>Organizadores</th></tr></thead><tbody><tr><td><a href="https://azureusergroupsbrasil.com.br/branches/florianopolis" target="_blank" rel="noopener noreferrer"><strong>Azure User Group Florianópolis</strong></a></td><td>Florianópolis, SC</td><td>Comunidade Azure de Floripa conectando desenvolvedores, arquitetos e profissionais de TI com meetups, workshops e eventos na Ilha da Magia.</td><td>2</td></tr><tr><td><a href="https://azureusergroupsbrasil.com.br/branches/curitiba" target="_blank" rel="noopener noreferrer"><strong>Azure User Group Curitiba</strong></a></td><td>Curitiba, PR</td><td>Comunidade focada em Microsoft Azure na região de Curitiba, reunindo profissionais, estudantes e entusiastas para compartilhar experiências e boas práticas.</td><td>3</td></tr></tbody></table></div>## Expansão da comunidade

<p>Quer levar o <strong>Azure User Groups Brasil</strong> para a sua cidade? A comunidade mantém uma página dedicada para abertura de novas branches, reunindo pessoas que queiram organizar encontros locais e expandir o alcance da iniciativa.</p>

<ul>
<li>🚀 <a href="https://azureusergroupsbrasil.com.br/nova-branch" target="_blank" rel="noopener noreferrer">Quero abrir uma branch</a></li>
<li>ℹ️ <a href="https://azureusergroupsbrasil.com.br/about" target="_blank" rel="noopener noreferrer">Saiba mais sobre a comunidade</a></li>
</ul>

<h2 id="atuacao-local-azure-user-group-florianopolis">Atuação local: Azure User Group Florianópolis</h2>

<p>Além da frente nacional, também faço parte do <strong>Azure User Group Florianópolis</strong>, branch local da comunidade em Santa Catarina.</p>

<p>O grupo conecta desenvolvedores, arquitetos e profissionais de TI interessados em tecnologias Microsoft Azure, promovendo meetups, workshops e eventos para fortalecer o ecossistema tech da Ilha da Magia.</p>

<ul>
<li>📍 <a href="https://azureusergroupsbrasil.com.br/branches/florianopolis" target="_blank" rel="noopener noreferrer">Página da branch Florianópolis</a></li>
</ul>

<h2 id="como-participar">Como participar</h2>

<p>Se você quer acompanhar eventos, conhecer a branch mais próxima ou entrar em contato com a organização nacional, estes são os principais canais:</p>

<ul>
<li>👥 <a href="https://chat.whatsapp.com/HSpFnNyo9ZLD4RJrvEcrrl" target="_blank" rel="noopener noreferrer">Entrar no grupo do WhatsApp</a></li>
</ul>

<p>O <strong>Azure User Groups Brasil</strong> consolida um movimento nacional de comunidades locais sobre Azure. No meu caso, essa atuação acontece em duas frentes complementares: no nível nacional, apoiando a expansão da comunidade, e no nível local, ajudando a fortalecer o <strong>Azure User Group Florianópolis</strong>.</p>

<p>Se fizer sentido para você, participe da branch mais próxima ou ajude a abrir a próxima.</p>

<img src="https://azureusergroupsbrasil.com.br/common/logo-semfundo.png" alt="Azure User Groups Brasil" />
]]></content:encoded>
    </item>
    <item>
      <title>Os 6Rs que Você Precisa Conhecer para Migrar para a Cloud; O sétimo R é de Rivotril?! - Esquenta MVP Conf Blumenau 2025</title>
      <link>https://www.orafaelferreira.com/artigos/mvp-conf-blu</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/mvp-conf-blu</guid>
      <pubDate>Fri, 23 May 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Palestrei sobre os 6Rs de migração para a cloud no Esquenta MVP Conf Blumenau 2025, evento que antecipou o clima da próxima edição do MVP Conf em São Paulo.</description>
      <category>Palestras</category>
      <category>Azure</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvpconfblu24/01.jpeg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[<h2 id="esquenta-mvp-conf-blumenau">Esquenta MVP Conf Blumenau</h2>

<p>No último dia <strong>26 de abril de 2025</strong>, Blumenau foi palco de um grande evento tech do sul do Brasil: o <strong>Esquenta MVP Conf</strong>, uma amostra da energia e do conteúdo de alto nível que teremos na próxima edição do <a href="https://www.mvpconf.com.br" target="_blank" rel="noopener noreferrer">MVP Conf em São Paulo</a>. A FURB (Fundação Universidade Regional de Blumenau) recebeu MVPs da Microsoft e rolou muita troca de ideia.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvpconfblu24/01.jpeg" alt="Palco do Esquenta MVP Conf Blumenau 2025" />

<h2 id="minha-palestra">Minha palestra</h2>

<h3 id="os-6rs-que-voce-precisa-conhecer-para-migrar-para-a-cloud">Os 6Rs que Você Precisa Conhecer para Migrar para a Cloud  </h3>
<strong>O sétimo R é de Rivotril?!</strong>  
<p>Falar sobre migração pode parecer batido, mas muita gente ainda se perde na hora de escolher a estratégia certa. Na minha sessão eu trouxe o <strong>framework dos 6Rs</strong> (Rehost, Replatform, Rearchitect, Rebuild, Replace e Retire), mostrei quando usar cada um e acrescentei algumas piadas para manter a sanidade da galera.  </p>

<h2 id="palestrantes-e-temas">Palestrantes e temas</h2>

<ul>
<li><strong>Henrique Mauri</strong> — Desenvolvendo aplicações modernas com .NET e Azure</li>
<li><strong>Vinicius Deschamps</strong> — “Olha mãe, sem usar senhas”: como utilizar Managed Identity no Azure</li>
<li><strong>Rodrigo Dornel</strong> — Análise de Dados com Power BI & Copilot</li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvpconfblu24/15.jpg" alt="Rodrigo Dornel palestrando sobre Power BI e Copilot no Esquenta MVP Conf" /> 
<ul>
<li><strong>Walter Coan</strong> — Evolução da plataforma Azure IoT: do IoT Hub até o IoT Operations</li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvpconfblu24/14.jpg" alt="Walter Coan palestrando sobre a evolução da plataforma Azure IoT" />
<ul>
<li><strong>Claudio Rapôso</strong> — Revolucione Suas Aplicações: o segredo contra falhas em FaaS com JavaScript que ninguém te contou!</li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvpconfblu24/13.jpg" alt="Claudio Rapôso palestrando sobre resiliência em FaaS com JavaScript" /> 
<ul>
<li><strong>Felipe Augusto</strong> — Event-Driven no Azure: como utilizar o Azure Service Bus para escalabilidade e resiliência</li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvpconfblu24/11.jpg" alt="Felipe Augusto palestrando sobre Event-Driven com Azure Service Bus" />
<ul>
<li><strong>Rafael Ferreira</strong> — Os 6Rs que Você Precisa Conhecer para Migrar para a Cloud; o sétimo R é de Rivotril?!</li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvpconfblu24/04.jpg" alt="Rafael Ferreira palestrando sobre os 6Rs de migração para a cloud" />
<ul>
<li><strong>Johnson de Souza</strong> — Preparar a segurança e a conformidade para dar suporte ao Microsoft 365 Copilot</li>
<li><strong>Bruno Leires</strong> — O futuro da administração do 365 com Copilot: o que esperar?</li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvpconfblu24/12.jpg" alt="Bruno Leires palestrando sobre administração do Microsoft 365 com Copilot" />

<h2 id="destaques-da-palestra">Destaques da Palestra</h2>

<ul>
<li>🚀 <strong>Cloud Foundation</strong>: por que não adianta colocar o telhado antes da base</li>
<li>🧱 <strong>Landing Zones</strong>: seu ponto de partida estruturado</li>
<li>🛠️ Ferramentas como <strong>Azure Migrate</strong> e <strong>Database Migration Service</strong></li>
<li>💰 <strong>FinOps</strong> e <strong>GreenOps</strong>: migrar sem estourar o orçamento</li>
</ul>

<h2 id="galeria-de-fotos">Galeria de Fotos</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvpconfblu24/02.jpg" alt="Público do Esquenta MVP Conf Blumenau 2025" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvpconfblu24/03.jpg" alt="Palestrantes e MVPs reunidos no Esquenta MVP Conf Blumenau" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvpconfblu24/05.jpg" alt="Rafael Ferreira no palco do Esquenta MVP Conf Blumenau 2025" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvpconfblu24/07.jpg" alt="Participantes em networking no Esquenta MVP Conf Blumenau" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvpconfblu24/09.jpg" alt="Auditório do Esquenta MVP Conf Blumenau durante as palestras" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvpconfblu24/10.jpeg" alt="Comunidade Microsoft reunida no Esquenta MVP Conf Blumenau 2025" />
]]></content:encoded>
    </item>
    <item>
      <title>Trabalhando para o Exterior – Global Azure Floripa 2025</title>
      <link>https://www.orafaelferreira.com/artigos/carreira-internacional</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/carreira-internacional</guid>
      <pubDate>Sun, 18 May 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Abertura do Global Azure Floripa 2025 com Vinicius Deschamps: realidade, desafios e oportunidades de trabalhar para o exterior na área de tecnologia.</description>
      <category>Palestras</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/gba25ci/00.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<h2 id="trabalhar-para-o-exterior-realidade-desafios-e-oportunidades">Trabalhar para o Exterior: Realidade, Desafios e Oportunidades 🌍💼</h2>

<p>Durante o <a href="https://www.meetup.com/azure-user-groups/events/306207034/?eventOrigin=group_past_events" target="_blank" rel="noopener noreferrer"><strong>Global Azure 2025 – Edição Azure Floripa</strong></a>, tive o prazer de abrir o evento ao lado do grande amigo e profissional <strong><a href="https://www.linkedin.com/in/viniciusdeschamps/" target="_blank" rel="noopener noreferrer">Vinicius Deschamps</a></strong> com uma palestra que foge um pouco do tradicional técnico, mas que é um divisor de águas <strong>"Trabalhando para o Exterior: Realidade, Desafios e Oportunidades"</strong>.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/gba25ci/00.png" alt="Banner da palestra Trabalhando para o Exterior no Global Azure Floripa 2025" />

<p>Falamos sobre como é atuar em uma empresa internacional, os bastidores que, os impactos na vida pessoal e profissional, e claro, compartilhamos nossas experiências reais no mercado global.</p>


<h2 id="sobre-a-palestra">🎙️ Sobre a Palestra</h2>

<strong>Tema:</strong> Trabalhando para o Exterior
<strong>Palestrantes:</strong> <a href="https://www.linkedin.com/in/orafaelferreiraa/" target="_blank" rel="noopener noreferrer">Rafael Ferreira</a> & <a href="https://www.linkedin.com/in/viniciusdeschamps/" target="_blank" rel="noopener noreferrer">Vinicius Deschamps</a>  
<strong>Evento:</strong> Global Azure 2025 – Azure Floripa  
<strong>Data:</strong> 10 de maio de 2025  
<strong>Local:</strong> Neoway, Florianópolis - SC


<h2 id="o-que-abordamos">💬 O que abordamos?</h2>

<ul>
<li>Diferenças culturais e adaptação no trabalho remoto com times globais</li>
<li>Estratégias para se destacar em entrevistas internacionais</li>
<li>Dicas montar um perfil atrativo para o mercado global</li>
<li>Dicas práticas de quem vive isso no dia a dia</li>
<li>E o mais importante: falamos a real!</li>
</ul>

<h2 id="momentos-que-valem-o-registro">📸 Momentos que Valem o Registro</h2>

<p>Confira algumas fotos da nossa palestra:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/gba25ci/0.jpg" alt="Rafael Ferreira e Vinicius Deschamps abrindo o Global Azure Floripa 2025" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/gba25ci/1.jpg" alt="Rafael Ferreira palestrando sobre trabalhar para o exterior" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/gba25ci/2.jpg" alt="Vinicius Deschamps compartilhando experiências de carreira internacional" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/gba25ci/3.jpg" alt="Público acompanhando a palestra sobre carreira internacional" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/gba25ci/4.jpg" alt="Slide da palestra Trabalhando para o Exterior" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/gba25ci/5.jpg" alt="Rafael Ferreira e Vinicius Deschamps no palco do Global Azure" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/gba25ci/6.jpg" alt="Participantes do Global Azure Floripa 2025 durante a abertura" />


<h2 id="links-de-indicacao-uteis-pra-quem-quer-trabalhar-pra-fora">🧾 Links de Indicação Úteis pra Quem Quer Trabalhar pra Fora</h2>

<p>Se você está <strong>começando sua jornada internacional</strong>, aqui vão dois serviços que <strong>uso pessoalmente</strong> e recomendo:</p>

<h3 id="abrir-ou-manter-seu-cnpj-com-a-contabilizei">💼 Abrir ou manter seu CNPJ com a <strong>Contabilizei</strong>  </h3>
<p>Simplifique sua vida como PJ, sem dor de cabeça com impostos e obrigações contábeis:  </p>
<p>👉 <a href="https://www.contabilizei.com.br/programa-de-indicacao?ref=daf792a9759933c6a3f54a8832357168&nome=RAFAEL&email=rafael_low@hotmail.com&utm_source=plataforma&utm_campaign=MGM&utm_source=plataforma" target="_blank" rel="noopener noreferrer">Abra sua conta na Contabilizei com meu link de indicação</a></p>

<h3 id="receber-em-dolar-com-otimas-taxas-usando-a-techfx">💸 Receber em dólar com ótimas taxas usando a <strong>TechFX</strong>  </h3>
<p>Pra quem recebe moeda de fora (dólar, euro, libra...) direto na conta PJ, TechFX ajuda a economizar nas taxas e ganhar agilidade:  </p>
<p>👉 <a href="https://www.techfx.com.br/rafa-ferreira/" target="_blank" rel="noopener noreferrer">Crie sua conta TechFX com meu link e comece a receber melhor</a></p>


<h2 id="por-que-falamos-disso">💙 Por que falamos disso?</h2>

<p>Porque a comunidade técnica precisa falar sobre carreira, escolhas conscientes e qualidade de vida, não só sobre código. E se pudermos ajudar alguém a conquistar uma oportunidade internacional com mais preparo e menos ilusões, já valeu a pena!</p>

<p>#GlobalAzure #AzureFloripa #TrabalhoInternacional #CarreiraTI #ComunidadeTech #Azure</p>
]]></content:encoded>
    </item>
    <item>
      <title>Global Azure feat Azure Floripa 2025 (Evento Remoto)</title>
      <link>https://www.orafaelferreira.com/artigos/global-azure25</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/global-azure25</guid>
      <pubDate>Sun, 18 May 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Relato da edição remota do Global Azure 2025 com o Azure Floripa: dois dias intensos de conteúdo técnico de qualidade e aprendizado com a comunidade brasileira.</description>
      <category>Organização de Eventos</category>
      <enclosure url="https://img.youtube.com/vi/fWaowwBWUwU/0.jpg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[
<h2 id="global-azure-2025-feat-azure-floripa-tecnologia-cafe-e-muito-compartilhamento">Global Azure 2025 feat. Azure Floripa: Tecnologia, Café e Muito Compartilhamento!</h2>

<p>Mais um ano, mais uma edição do <a href="https://www.meetup.com/azure-user-groups/events/306207034/?eventOrigin=group_past_events" target="_blank" rel="noopener noreferrer"><strong>Global Azure 2025 – Edição Azure Floripa</strong></a>! E sim, o <strong>Azure Floripa</strong> colou junto mais uma vez pra fazer história com a comunidade técnica brasileira. Foram 2 dias intensos, com conteúdo de qualidade, e muito aprendizado!</p>

<p>Se você perdeu, relaxa, a gente fez esse post cheio de links pra você maratonar as talks.</p>

<h2 id="organizadores">Organizadores</h2>

<ul>
<li><strong><a href="https://www.linkedin.com/in/orafaelferreiraa/" target="_blank" rel="noopener noreferrer">Rafael Martin Alves Ferreira</a></strong></li>
<li><strong><a href="https://www.linkedin.com/in/viniciusdeschamps/" target="_blank" rel="noopener noreferrer">Vinicius Deschamps</a></strong></li>
</ul>

<h2 id="palestras-e-sessoes-em-destaque">Palestras e Sessões em Destaque</h2>

<h3 id="fazendo-backup-de-vms-no-azure-utilizando-o-azure-backup">Fazendo Backup de VMs no Azure Utilizando o Azure Backup</h3>
<a href="https://www.youtube.com/watch?v=fWaowwBWUwU" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/fWaowwBWUwU/0.jpg" alt="Fazendo Backup de VMs no Azure" /></a>

<h3 id="migrando-sua-infraestrutura-para-nuvem-projeto-real">Migrando sua infraestrutura para Nuvem - Projeto Real</h3>
<a href="https://www.youtube.com/watch?v=gP4tWge98to" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/gP4tWge98to/0.jpg" alt="Migrando sua infraestrutura para Nuvem" /></a>

<h3 id="bcdr-business-continuity-and-disaster-recovery">BCDR - Business Continuity and Disaster Recovery</h3>
<a href="https://www.youtube.com/watch?v=uHe08MPkJG4" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/uHe08MPkJG4/0.jpg" alt="BCDR - Business Continuity" /></a>

<h3 id="desenvolvendo-agentes-inteligentes-com-semantic-kernel-e-llm">Desenvolvendo Agentes Inteligentes com Semantic Kernel e LLM</h3>
<a href="https://www.youtube.com/watch?v=1F6sn6Q4vEc" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/1F6sn6Q4vEc/0.jpg" alt="Agentes Inteligentes com Semantic Kernel" /></a>

<h3 id="azure-app-service-e-docker-trabalhando-com-aplicacoes-conteinerizadas">Azure App Service e Docker: Trabalhando com Aplicações Contêinerizadas</h3>
<a href="https://www.youtube.com/watch?v=g5dusKDV3Ig" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/g5dusKDV3Ig/0.jpg" alt="App Service e Docker" /></a>

<h3 id="azure-iot-operations">Azure IoT Operations</h3>
<a href="https://www.youtube.com/watch?v=4FqXwTd-hNg" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/4FqXwTd-hNg/0.jpg" alt="Azure IoT Operations" /></a>

<h3 id="arquitetando-agentics-e-aplicacoes-multiagentes">Arquitetando Agentics e Aplicações Multiagentes</h3>
<a href="https://www.youtube.com/watch?v=6-PuO2A9NmA" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/6-PuO2A9NmA/0.jpg" alt="Agentics e Multiagentes" /></a>

<h3 id="your-gateway-to-the-world-of-artificial-intelligence">Your Gateway to the World of Artificial Intelligence</h3>
<a href="https://www.youtube.com/watch?v=Gx8viB0t6wU" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/Gx8viB0t6wU/0.jpg" alt="Gateway para IA" /></a>

<h3 id="do-codigo-a-nuvem-iac-e-conteinerizacao-no-ecossistema-azure">Do Código à Nuvem: IaC e Conteinerização no Ecossistema Azure</h3>
<a href="https://www.youtube.com/watch?v=8aG6Q-4DKjI" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/8aG6Q-4DKjI/0.jpg" alt="IaC e Container" /></a>

<h3 id="facilite-sua-vida-com-azure-blobs">Facilite sua vida com Azure Blobs</h3>
<a href="https://www.youtube.com/watch?v=3PygDrlNdEM" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/3PygDrlNdEM/0.jpg" alt="Azure Blobs" /></a>

<h3 id="impulsione-seus-estudos-com-a-cloud-explorando-o-poder-do-azure-para-aprender-na">Impulsione seus estudos com a Cloud: Explorando o poder do Azure para aprender na prática!</h3>
<a href="https://www.youtube.com/watch?v=9sH15kycARo" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/9sH15kycARo/0.jpg" alt="Azure para aprender na prática" /></a>


<h2 id="bora-se-conectar">Bora se conectar?</h2>

<p>Se você quer participar, contribuir ou só ficar por dentro dos próximos eventos da comunidade <strong>Azure Floripa</strong>, se liga aqui:</p>

<ul>
<li><strong><a href="https://chat.whatsapp.com/HSpFnNyo9ZLD4RJrvEcrrl" target="_blank" rel="noopener noreferrer">WhatsApp</a></strong></li>
<li><strong><a href="https://lnkd.in/dtX9uKEk" target="_blank" rel="noopener noreferrer">YouTube</a></strong></li>
<li><strong><a href="https://lnkd.in/d8vBRFpm" target="_blank" rel="noopener noreferrer">Visite nosso site</a></strong></li>
</ul>

<p>Saiba mais: <a href="https://globalazure.net/" target="_blank" rel="noopener noreferrer">Global Azure</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Global Azure 2025 – Azure Floripa (Evento Presencial)</title>
      <link>https://www.orafaelferreira.com/artigos/global-azure25pres</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/global-azure25pres</guid>
      <pubDate>Sun, 18 May 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>No dia 10 de maio de 2025, rolou a edição presencial do Global Azure 2025 – Edição Azure Floripa em Florianópolis, e que evento, meus amigos!</description>
      <category>Organização de Eventos</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/gbaz25/0.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<h2 id="global-azure-2025-azure-floripa">Global Azure 2025 – Azure Floripa</h2>

<p>No dia <strong>10 de maio de 2025</strong>, rolou a edição <strong>presencial</strong> do <a href="https://www.meetup.com/azure-user-groups/events/306207034/?eventOrigin=group_past_events" target="_blank" rel="noopener noreferrer"><strong>Global Azure 2025 – Edição Azure Floripa</strong></a> em <strong>Florianópolis</strong>, e que evento, meus amigos! Recebemos a comunidade na sede da <strong>Neoway</strong>, com uma programação intensa, conteúdo técnico de qualidade e aquele clima de parceria e aprendizado que só quem vive comunidade entende.</p>

<p>Com palestras inspiradoras, demos na prática e muito networking com profissionais incríveis, essa edição mostrou a força da <strong>comunidade Azure em Santa Catarina</strong>.</p>


<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/gbaz25/0.png" alt="Banner do Global Azure 2025 Edição Azure Floripa" />

<h2 id="onde-foi">📍 Onde foi?</h2>

<strong>Local:</strong> Neoway – R. Patrício Farias, 131 – Itacorubi, Florianópolis - SC  
<strong>Data:</strong> Sábado, 10 de maio de 2025  
<strong>Formato:</strong> Presencial e gratuito!

<h2 id="programacao-completa">🗓️ Programação Completa</h2>
<div><table><thead><tr><th>Horário</th><th>Duração</th><th>Atividade</th></tr></thead><tbody><tr><td>09:00 - 09:15</td><td>15 min</td><td>Abertura do Evento – Vinicius Deschamps / Rafael Ferreira</td></tr><tr><td>09:15 - 09:55</td><td>40 min</td><td>Keynote: Trabalhando para o exterior – Vinicius Deschamps / Rafael Ferreira</td></tr><tr><td>09:55 - 10:35</td><td>40 min</td><td>Migração de Backups (GRS para LRS) – Thiago Henrique Mattos</td></tr><tr><td>10:35 - 10:55</td><td>20 min</td><td>☕ Pausa da Manhã</td></tr><tr><td>10:55 - 11:35</td><td>40 min</td><td>Acesso Seguro Global – Denis Alonso</td></tr><tr><td>11:35 - 12:15</td><td>40 min</td><td>Diga adeus à infraestrutura cara! Descubra o poder do OCR serverless na Azure! – Cláudio Filipe Lima Rapôso</td></tr><tr><td>12:15 - 13:30</td><td>1h15</td><td>🍽 Almoço</td></tr><tr><td>13:30 - 14:10</td><td>40 min</td><td>Desenvolvendo uma Aplicação de Chat com RAG usando o Azure AI Foundry – Marcelo Pacífico</td></tr><tr><td>14:10 - 14:50</td><td>40 min</td><td>Message Broker com Azure Service Bus – Felipe Pimentel Augusto</td></tr><tr><td>14:50 - 15:30</td><td>40 min</td><td>Integração do GitHub Actions com o Azure – Kauã Pozzi</td></tr><tr><td>15:30 - 15:55</td><td>25 min</td><td>☕ Pausa da Tarde</td></tr><tr><td>15:55 - 16:45</td><td>40 min</td><td>Protegendo sua arquitetura multi-cloud com o Microsoft Defender for Cloud – Pedro Ignácio</td></tr><tr><td>16:45 - 17:00</td><td>15 min</td><td>Encerramento e Agradecimentos</td></tr></tbody></table></div>

<h2 id="quer-ver-como-foi">📸 Quer ver como foi?</h2>

<p>Se liga nas fotos e reveja os melhores momentos:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/gbaz25/1.jpg" alt="Abertura do Global Azure 2025 na Neoway em Florianópolis" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/gbaz25/2.jpg" alt="Palestrante apresentando demo no Global Azure Floripa" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/gbaz25/3.jpg" alt="Público acompanhando as palestras do Global Azure 2025" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/gbaz25/4.jpg" alt="Participantes durante o coffee break do evento" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/gbaz25/5.jpg" alt="Palestra técnica sobre Azure no Global Azure Floripa" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/gbaz25/6.jpg" alt="Comunidade Azure Floripa reunida no evento presencial" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/gbaz25/7.jpg" alt="Momento de networking entre participantes do Global Azure" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/gbaz25/8.jpg" alt="Foto oficial dos participantes do Global Azure 2025 Floripa" />

<h2 id="agradecimentos">👏 Agradecimentos</h2>
<p>Um evento como esse não acontece sozinho. Nosso <strong>muito obrigado aos palestrantes, patrocinadores, parceiros</strong>.</p>

<p>Em especial, agradecemos à <strong><a href="https://www.neoway.com.br/" target="_blank" rel="noopener noreferrer">Neoway</a></strong>, que gentilmente cedeu o espaço para o evento, e à <strong><a href="https://www.softensity.com/" target="_blank" rel="noopener noreferrer">Softensity</a></strong>, que apoiou com um coffee break.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/gbaz25/01.png" alt="Logos dos apoiadores Neoway e Softensity do Global Azure Floripa" />

<p>E claro, nosso reconhecimento à <strong>comunidade</strong>, que marcou presença em peso e mostrou, mais uma vez, que conhecimento se constrói <strong>junto</strong>.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/gbaz25/9.jpg" alt="Organizadores e comunidade do Azure Floripa no encerramento" />





<h2 id="participe-da-comunidade-azure-floripa">💙 Participe da Comunidade Azure Floripa!</h2>

<p>Não deixe a energia acabar aqui. Cola com a gente nas redes, participe dos meetups e fique por dentro dos próximos eventos!</p>

<ul>
<li><strong><a href="https://chat.whatsapp.com/HSpFnNyo9ZLD4RJrvEcrrl" target="_blank" rel="noopener noreferrer">WhatsApp</a></strong></li>
<li><strong><a href="https://lnkd.in/dtX9uKEk" target="_blank" rel="noopener noreferrer">YouTube</a></strong></li>
<li><strong><a href="https://lnkd.in/d8vBRFpm" target="_blank" rel="noopener noreferrer">Visite nosso site</a></strong></li>
</ul>
<p>---</p>

<p>#GlobalAzure #AzureFloripa #MicrosoftAzure #EventoPresencial #ComunidadeTech #AzureBrasil</p>
]]></content:encoded>
    </item>
    <item>
      <title>Pipelines com Azure DevOps: Automatizando o Provisionamento Seguro da sua infraestrutura na nuvem - SQL Saturday 2025 by Comunidado</title>
      <link>https://www.orafaelferreira.com/artigos/sqlsat25</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/sqlsat25</guid>
      <pubDate>Sun, 06 Apr 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Relato da palestra sobre Pipelines com Azure DevOps no SQL Saturday Joinville 2025, com provisionamento seguro de infraestrutura via Terraform e Bicep.</description>
      <category>Palestras</category>
      <category>Comunidade</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday/01.jpg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[
<p>No último sábado, 5 de abril de 2025, tive o imenso prazer de participar como palestrante no <a href="https://sqlsaturday.com/2025-04-05-sqlsaturday1104/" target="_blank" rel="noopener noreferrer"><strong>SQL Saturday Joinville 2025</strong></a>, realizado na UNIVILLE – Campus Universitário, localizado em Joinville, SC. Este evento presencial, que reuniu cerca de 500 participantes, foi uma excelente oportunidade para mergulhar fundo em temas como tecnologia, dados, inteligência artificial e inovação.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday/01.jpg" alt="Entrada do SQL Saturday Joinville 2025 na UNIVILLE" />

<p>O SQL Saturday é conhecido mundialmente por ser um evento referência para a comunidade de dados, e esta edição em Joinville não deixou nada a desejar. Contou com uma programação rica, oferecendo palestras simultâneas com conteúdos altamente relevantes e ministradas por grandes nomes do mercado brasileiro de tecnologia.</p>

<h2 id="sobre-minha-palestra">Sobre Minha Palestra</h2>

<p>Na minha palestra intitulada <strong>"Pipelines com Azure DevOps: Automatizando o Provisionamento Seguro da sua Infraestrutura na Nuvem"</strong>, abordei pontos essenciais para implementar pipelines eficientes utilizando Azure DevOps, garantindo agilidade, segurança e qualidade na entrega da infraestrutura.</p>

<p>Conversamos bastante sobre como DevOps deixou de ser uma simples tendência e se tornou uma cultura fundamental nas empresas modernas. Também mostrei na prática o funcionamento das pipelines de Integração Contínua e Entrega Contínua (CI/CD) e como essa automação facilita significativamente o processo de deploy em ambientes cloud, utilizando ferramentas como Terraform para provisionamento de infraestrutura.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday/2.heic" alt="Rafael Ferreira palestrando sobre Pipelines com Azure DevOps" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday/3.heic" alt="Público acompanhando a palestra sobre Azure DevOps no SQL Saturday" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday/4.heic" alt="Slide sobre cultura DevOps apresentado no SQL Saturday Joinville" />

<p>Alguns tópicos detalhados que abordei durante a palestra foram:</p>

<ul>
<li><strong>Fundamentos e Cultura DevOps</strong>: Expliquei como o DevOps está transformando as empresas, melhorando significativamente a comunicação, colaboração e produtividade dos times de desenvolvimento e operações.</li>
</ul>

<ul>
<li><strong>Azure DevOps Overview</strong>: Discuti brevemente sobre a história e as funcionalidades principais do Azure DevOps, destacando as diferenças e vantagens entre Azure DevOps Services (SaaS) e Azure DevOps Server (IaaS).</li>
</ul>

<ul>
<li><strong>Estruturando Pipelines CI/CD</strong>: Apresentei passo a passo a criação e execução de pipelines usando Azure DevOps, mostrando como é possível automatizar testes, builds e deploys, garantindo entregas rápidas e seguras.</li>
</ul>

<ul>
<li><strong>Casos Práticos</strong>: Compartilhei exemplos reais e cenários práticos em que utilizei o Azure DevOps com Terraform e Bicep, evidenciando a importância da automação para lidar com infraestruturas complexas.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday/5.heic" alt="Demonstração de pipeline com Terraform e Bicep no Azure DevOps" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday/6.heic" alt="Rafael Ferreira explicando provisionamento seguro de infraestrutura" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday/7.jpg" alt="Rafael Ferreira encerrando a palestra no SQL Saturday Joinville 2025" />

<h2 id="networking-e-troca-de-experiencias">Networking e Troca de Experiências</h2>

<p>Um grande diferencial de eventos é o networking, e SQL Saturday Joinville não foi diferente.</p>

<p>Quero deixar aqui um agradecimento especial ao Comunidado e a toda equipe organizadora que tornou esse evento possível, proporcionando uma experiência incrível para todos os envolvidos.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday/8.jpg" alt="Networking com participantes do SQL Saturday Joinville" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday/9.jpg" alt="Rafael Ferreira com palestrantes do SQL Saturday Joinville 2025" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday/10.heic" alt="Equipe organizadora do Comunidado no SQL Saturday Joinville" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday/11.jpg" alt="Participantes reunidos no SQL Saturday Joinville 2025" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday/12.heic" alt="Momento de troca de experiências entre palestrantes e público" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday/13.heic" alt="Comunidade de dados reunida na UNIVILLE em Joinville" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday/14.jpg" alt="Rafael Ferreira com amigos da comunidade no SQL Saturday" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sqlsaturday/15.jpg" alt="Encerramento do SQL Saturday Joinville 2025" />

<p>Até o próximo evento!</p>

<p>---</p>

]]></content:encoded>
    </item>
    <item>
      <title>Minhas Contribuições para a Tradução do Kubernetes</title>
      <link>https://www.orafaelferreira.com/artigos/translatek8s</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/translatek8s</guid>
      <pubDate>Sun, 23 Mar 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Como contribuí com a tradução da documentação do Kubernetes para o português brasileiro e por que isso torna a tecnologia mais acessível à comunidade.</description>
      <category>Artigos</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2023-02-05-artigo-aks-acr1.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<h2 id="minhas-contribuicoes-para-a-traducao-do-kubernetes">Minhas Contribuições para a Tradução do Kubernetes</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2023-02-05-artigo-aks-acr1.png" alt="Documentação do Kubernetes traduzida para o português brasileiro" />

<p>Como parte do meu aprendizado e desejo de retribuir à comunidade, decidi participar do projeto de tradução da documentação do Kubernetes para o português brasileiro. Este esforço é importante para tornar a tecnologia mais acessível ao público da língua portuguesa.</p>

<h2 id="contribuicoes-recentes">Contribuições Recentes</h2>

<h3 id="1-windows-no-kubernetes">1. Windows no Kubernetes</h3>

<ul>
<li><strong>Issue</strong>: <https://github.com/kubernetes/website/issues/48421#event-14835008370></li>
<li><strong>Pull Request</strong>: <https://github.com/kubernetes/website/pull/48423#event-14835008036></li>
<li><strong>Página traduzida</strong>: <https://kubernetes.io/pt-br/docs/concepts/windows/></li>
</ul>

<strong>Descrição</strong>: Tradução da página de visão geral "Windows no Kubernetes" para o português brasileiro. Esta página oferece uma introdução abrangente sobre o suporte a nós Windows no Kubernetes, incluindo tópicos como rede, armazenamento, gerenciamento de recursos e segurança para nós Windows.

<h3 id="2-guia-para-executar-conteineres-do-windows-no-kubernetes">2. Guia para executar contêineres do Windows no Kubernetes  </h3>

<ul>
<li><strong>Issue</strong>: <https://github.com/kubernetes/website/issues/49553#event-16646436029></li>
<li><strong>Pull Request</strong>: <https://github.com/kubernetes/website/pull/49576#event-16356896347></li>
<li><strong>Página traduzida</strong>: <https://kubernetes.io/pt-br/docs/concepts/windows/user-guide/></li>
</ul>

<strong>Descrição</strong>: Tradução da página de conceito "Guia para executar contêineres do Windows no Kubernetes" para o português brasileiro. Esta página fornece instruções detalhadas sobre como utilizar contêineres Windows no ambiente Kubernetes, tornando o conteúdo acessível para a comunidade lusófona.

<h3 id="3-containers-windows-no-kubernetes">3. Containers Windows no Kubernetes</h3>

<ul>
<li><strong>Issue</strong>: <https://github.com/kubernetes/website/issues/48930#event-15947044415></li>
<li><strong>Pull Request</strong>: <https://github.com/kubernetes/website/pull/48932#event-15947043380></li>
<li><strong>Página traduzida</strong>: <https://kubernetes.io/pt-br/docs/concepts/windows/intro/></li>
</ul>

<strong>Descrição</strong>: Tradução da página de conceito "Containers Windows no Kubernetes" para o português brasileiro. Esta página introduz o conceito de contêineres Windows no ecossistema Kubernetes, explicando sua importância e funcionamento básico.


<h2 id="importancia-da-traducao">Importância da Tradução</h2>

<p>A tradução da documentação do Kubernetes para o português brasileiro é fundamental por várias razões:</p>

<p>1. <strong>Acessibilidade</strong>: Permite que desenvolvedores e profissionais de TI brasileiros acessem informações cruciais em sua língua nativa.</p>
<p>2. <strong>Adoção</strong>: Facilita a adoção do Kubernetes por empresas e organizações no Brasil.</p>
<p>3. <strong>Comunidade</strong>: Fortalece a comunidade brasileira de Kubernetes, incentivando mais pessoas a contribuírem e participarem.</p>
<p>4. <strong>Educação</strong>: Auxilia no aprendizado e na formação de novos profissionais especializados em Kubernetes.</p>

<h2 id="como-contribuir">Como Contribuir</h2>

<p>Se você também deseja contribuir para a tradução do Kubernetes, aqui estão algumas etapas para começar:</p>

<p>1. Familiarize-se com o <a href="https://kubernetes.io/pt-br/docs/contribute/" target="_blank" rel="noopener noreferrer">processo de contribuição do Kubernetes</a>.</p>
<p>2. Junte-se ao canal Slack <code>#kubernetes-docs-pt</code> da comunidade Kubernetes.</p>
<p>3. Verifique as <a href="https://kubernetes.io/pt-br/docs/contribute/localization_pt-br/" target="_blank" rel="noopener noreferrer">páginas pendentes de tradução</a>.</p>
<p>4. Escolha uma página para traduzir e crie uma issue no <a href="https://github.com/kubernetes/website" target="_blank" rel="noopener noreferrer">repositório kubernetes/website</a>.</p>
<p>5. Faça um fork do repositório, crie uma branch e realize a tradução.</p>
<p>6. Submeta um Pull Request com sua tradução para revisão.</p>

<p>Contribuir para a tradução do Kubernetes é uma excelente maneira de aprender mais sobre a tecnologia enquanto ajuda a comunidade. Junte-se a nós neste esforço importante!</p>


]]></content:encoded>
    </item>
    <item>
      <title>O que é Azure Policy? Uma Visão Completa</title>
      <link>https://www.orafaelferreira.com/artigos/az-policy</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/az-policy</guid>
      <pubDate>Thu, 09 Jan 2025 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>O Azure Policy é um recurso da Microsoft Azure que ajuda organizações a implementar governança e compliance de forma automatizada e em larga escala.</description>
      <category>Artigos</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/az-policy/01.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/az-policy/01.png" alt="Capa do artigo sobre Azure Policy" />


<p>O <a href="https://learn.microsoft.com/pt-br/azure/governance/policy/" target="_blank" rel="noopener noreferrer"><strong>Azure Policy</strong></a> é um recurso da Microsoft Azure que ajuda organizações a implementar governança e compliance de forma automatizada e em larga escala. Ele garante que os recursos na nuvem estejam em conformidade com as diretrizes corporativas, padrões de segurança e requisitos regulatórios. </p>
<p>Imagine que, toda vez que você vê uma placa, seja no shopping ou no trânsito, ela funciona como uma policy (política). A placa tem a função de te alertar sobre regras e comportamentos esperados. Caso você não siga essas orientações e um segurança perceba a irregularidade, ele pode te abordar, corrigir sua ação ou até mesmo te impedir de continuar no local.</p>

<h2 id="o-que-o-azure-policy-faz">O que o Azure Policy Faz?</h2>
<p>O Azure Policy avalia continuamente os recursos e as ações no Azure com base em <strong>definições de política</strong>. Essas definições, escritas em formato JSON, descrevem regras que determinam se os recursos estão ou não em conformidade com os padrões estabelecidos.</p>

<h3 id="principais-beneficios-e-casos-de-uso">Principais Benefícios e Casos de Uso:</h3>
<ul>
<li><strong>Conformidade em Larga Escala:</strong> Avalia recursos e toma ações automáticas para garantir conformidade.</li>
<li><strong>Automação e Consistência:</strong> Implementa políticas de maneira consistente em todas as suas assinaturas e grupos de recursos.</li>
<li><strong>Segurança e Gerenciamento:</strong> Reforça políticas de segurança, como restringir SKUs de VMs, impor criptografia e definir regiões específicas para implantação de recursos.</li>
<li><strong>Conformidade Regulatória:</strong> Auxilia no cumprimento de normas como GDPR, ISO 27001 e SOC 2.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/az-policy/02.png" alt="Principais benefícios e casos de uso do Azure Policy" />

<h2 id="como-o-azure-policy-funciona">Como o Azure Policy Funciona?</h2>

<p>O <strong>Azure Policy</strong> funciona criando e aplicando <strong>definições de política</strong> e <strong>iniciativas</strong> para controlar como os recursos são implantados e gerenciados. Esses componentes incluem:</p>

<h3 id="definicoes-de-politica">Definições de Política</h3>
<p>Uma <strong>definição de política</strong> é uma regra individual que descreve um critério para conformidade, como:</p>
<ul>
<li>Permitir a criação de recursos apenas em uma região específica.</li>
<li>Garantir que todas as VMs utilizem discos criptografados.</li>
</ul>

<p>Exemplo de definição de política em JSON:</p>

<div data-lang="json"><pre><code>{
  "mode": "All",
  "policyRule": {
    "if": {
      "field": "location",
      "notIn": ["eastus", "westus"]
    },
    "then": {
      "effect": "deny"
    }
  }
}</code></pre></div>

<h3 id="iniciativas">Iniciativas</h3>
<p>Uma <strong>iniciativa</strong> é uma coleção de múltiplas definições de políticas agrupadas com um propósito comum, como:</p>
<ul>
<li>Garantir conformidade regulatória (por exemplo: GDPR, ISO 27001).</li>
<li>Padronizar a segurança de uma aplicação.</li>
</ul>

<h3 id="atribuicoes">Atribuições</h3>
<p>Uma <strong>atribuição de política</strong> aplica uma definição ou iniciativa a um escopo específico, como:</p>
<ul>
<li>Assinatura Azure.</li>
<li>Grupo de Recursos.</li>
<li>Recurso Individual.</li>
</ul>

<h3 id="efeitos-das-politicas">Efeitos das Políticas</h3>
<p>As políticas podem ter diferentes efeitos, como:</p>
<ul>
<li><strong>Deny:</strong> Impede a criação ou modificação de recursos não conformes.</li>
<li><strong>Audit:</strong> Apenas registra a não conformidade sem bloquear a ação.</li>
<li><strong>Modify:</strong> Faz modificações automáticas nos recursos para garantir conformidade.</li>
<li><strong>DeployIfNotExists:</strong> Implanta recursos adicionais para garantir conformidade.</li>
</ul>

<h2 id="imagine-a-situacao-ser-bloqueado-por-uma-politica-do-azure">Imagine a Situação: Ser Bloqueado por uma Política do Azure</h2>

<p>Imagine que você está tentando implantar uma nova máquina virtual no Azure para testar uma aplicação. Você escolhe uma região aleatória, digamos <strong>South India</strong>, porque parece conveniente no momento. No entanto, ao tentar concluir a criação da VM, você recebe um erro: </p>

<strong>"A criação de recursos nesta região não está permitida pela política da empresa."</strong>

<p>O que aconteceu? Você foi impedido por uma <strong>Azure Policy</strong> aplicada em sua organização! Essa política foi configurada pelo time de governança de TI para garantir que todos os recursos sejam criados apenas em regiões específicas, como <strong>East US</strong> e <strong>West Europe</strong>, por razões de conformidade e segurança.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/az-policy/04.png" alt="Mensagem de bloqueio de criação de recurso pelo Azure Policy" />

<h3 id="frustracao-sim-mas-por-uma-boa-razao">Frustração? Sim. Mas por uma Boa Razão.</h3>

<p>Parece frustrante ser bloqueado quando você só queria testar uma VM, certo? No entanto, o propósito dessa <strong>regra</strong> não é atrapalhar seu trabalho, mas sim proteger o ambiente da empresa e manter padrões consistentes. Veja o porquê:</p>

<ul>
<li>✅ <strong>Conformidade Legal:</strong> Algumas empresas precisam armazenar dados apenas em regiões específicas por leis como a LGPD (Lei Geral de Proteção de Dados).</li>
<li>✅ <strong>Otimização de Custos:</strong> Restringir o uso de regiões mais caras pode reduzir significativamente os gastos.</li>
</ul>

<h3 id="como-resolver">Como Resolver?</h3>

<p>Se você precisar de uma exceção para essa política, você pode:</p>

<p>1. <strong>Solicitar uma Isenção (Exemption):</strong> Um administrador pode criar uma isenção temporária para um recurso específico.</p>
<p>2. <strong>Testar em um Sandbox:</strong> Se for um teste, você pode pedir acesso a um ambiente separado sem restrições.</p>
<p>3. <strong>Propor uma Revisão da Política:</strong> Se a necessidade for frequente, pode ser o caso de revisar a política e flexibilizar as regiões permitidas.</p>

<p>Essa experiência mostra como o <strong>Azure Policy</strong> ajuda a manter o controle e a segurança, mesmo quando parece um bloqueio.</p>

<h2 id="azure-policy-vs-azure-rbac-controle-de-acesso-baseado-em-funcao">Azure Policy vs Azure RBAC (Controle de Acesso Baseado em Função)</h2>

<p>Embora ambos estejam relacionados à governança e controle no Azure, eles têm propósitos diferentes:</p>
<div><table><thead><tr><th>Aspecto</th><th>Azure Policy</th><th>Azure RBAC</th></tr></thead><tbody><tr><td><strong>Objetivo Principal</strong></td><td>Garantir conformidade de recursos</td><td>Controlar permissões de acesso</td></tr><tr><td><strong>Escopo de Aplicação</strong></td><td>Regras de conformidade e segurança</td><td>Controle de ações de usuários</td></tr><tr><td><strong>Exemplo de Uso</strong></td><td>Negar criação de VMs não criptografadas</td><td>Restringir quem pode criar VMs</td></tr></tbody></table></div>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/az-policy/03.png" alt="Comparativo entre Azure Policy e Azure RBAC" />

<h2 id="melhores-praticas-ao-utilizar-azure-policy">Melhores Práticas ao Utilizar Azure Policy</h2>

<ul>
<li><strong>Inicie com o Efeito Audit:</strong> Antes de bloquear recursos, use <code>Audit</code> para monitorar o impacto das políticas.</li>
<li><strong>Use Iniciativas:</strong> Agrupe políticas relacionadas para facilitar a gestão.</li>
<li><strong>Automatize com IAC:</strong> Implemente Azure Policy como infraestrutura como código (IAC) para aplicar políticas de forma automatizada em pipelines CI/CD.</li>
<li><strong>Exclua Recursos Sensíveis:</strong> Utilize <code>notScopes</code> para excluir recursos ou grupos de recursos específicos de políticas rígidas.</li>
</ul>

<h2 id="conclusao">Conclusão</h2>

<p>O <strong>Azure Policy</strong> é uma ferramenta essencial para garantir governança e conformidade no Azure. Ele proporciona controle robusto para organizações que buscam proteger seus ambientes de nuvem e manter padrões de segurança e conformidade regulatória.</p>

<p>Implementando boas práticas e monitoramento contínuo, sua organização pode manter um ambiente seguro e alinhado às políticas corporativas.</p>

<p>Ao estudar <strong>Azure Policy</strong> você estará se preparando para as certificações:</p>

<ul>
<li><a href="https://learn.microsoft.com/pt-br/credentials/certifications/azure-administrator/?practice-assessment-type=certification" target="_blank" rel="noopener noreferrer"><strong>Microsoft Certified: Azure Administrator Associate (AZ-104)</strong></a></li>
<li><a href="https://learn.microsoft.com/pt-br/credentials/certifications/azure-security-engineer/?practice-assessment-type=certification" target="_blank" rel="noopener noreferrer"><strong>Microsoft Certified: Azure Security Engineer Associate (AZ-500)</strong></a></li>
</ul>
<p>Nos próximos artigos, irei demonstrar de forma prática projetos que implementei em organizações de nível enterprise.</p>

<p>---</p>


]]></content:encoded>
    </item>
    <item>
      <title>Pipelines com Azure DevOps: Automatizando o (im)possível - Code Island Cloud 2024</title>
      <link>https://www.orafaelferreira.com/artigos/code-island24</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/code-island24</guid>
      <pubDate>Sun, 24 Nov 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Palestrei sobre pipelines com Azure DevOps na segunda edição do Code Island Cloud, realizada na Unisul Centro Florianópolis em novembro de 2024.</description>
      <category>Palestras</category>
      <category>Comunidade</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/code.island/0.jpg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[
<p>No último sábado, 23 de novembro de 2024, tive o prazer de participar como palestrante da segunda edição do <strong>Code Island Cloud</strong>, realizado na Unisul – Centro Florianópolis. O evento foi 100% presencial e trouxe à comunidade as últimas novidades em <strong>Cloud</strong>, abrangendo temas de <strong>Dev, Data e DevOps</strong>. Além disso, foi uma grande oportunidade para <strong>networking</strong> com profissionais apaixonados por tecnologia!</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/code.island/0.jpg" alt="Abertura do Code Island Cloud 2024 na Unisul Centro Florianópolis" />

<p>O evento contou com uma programação irada, com grandes nomes do cenário tech e proporcionando momentos de aprendizado e troca de experiências. Com minha palestra, <strong>"Pipelines com Azure DevOps: Automatizando o (Im)possível"</strong>, compartilhei insights e práticas para otimizar a automação de fluxos de trabalho em projetos modernos relacionados a Infraestrutura.</p>

<h2 id="sobre-minha-palestra">Sobre Minha Palestra</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/code.island/1.jpeg" alt="Rafael Ferreira palestrando sobre pipelines com Azure DevOps no Code Island Cloud" />

<p>Na minha apresentação, mostrei como utilizar o Azure DevOps para criar pipelines robustas e automatizar processos de deploy de infra. Alguns dos tópicos que discuti incluem:</p>

<ul>
<li><strong>Estruturando Pipelines</strong>: Teorioa de pipelines CI/CD.</li>
<li><strong>Automação Inteligente</strong>: Boas práticas de integração de testes, builds e deploys automatizados.</li>
<li><strong>Casos Reais</strong>: Exemplos práticos de projetos onde a automação simplificou processos complexos.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/code.island/2.jpg" alt="Slide da palestra Pipelines com Azure DevOps no Code Island Cloud" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/code.island/3.JPG" alt="Público acompanhando a palestra sobre automação com Azure DevOps" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/code.island/4.jpeg" alt="Rafael Ferreira apresentando casos reais de automação de infraestrutura" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/code.island/5.jpeg" alt="Rafael Ferreira no palco do Code Island Cloud 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/code.island/6.jpeg" alt="Momento da palestra sobre pipelines no Code Island Cloud" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/code.island/7.jpg" alt="Demonstração de pipelines de infraestrutura no Azure DevOps" />

<h2 id="o-evento-como-um-todo">O Evento Como Um Todo</h2>

<p>Além da minha palestra, rolou talks sobre <strong>Blockchain</strong>, <strong>Resiliência na AWS</strong>, <strong>Segurança em Nuvem</strong>, <strong>Inteligência Artificial Generativa</strong>, e muito mais.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/code.island/8.jpeg" alt="Palestrantes e participantes do Code Island Cloud 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/code.island/9.jpeg" alt="Networking entre participantes do Code Island Cloud na Unisul" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/code.island/10.jpg" alt="Comunidade tech reunida no Code Island Cloud 2024" />

<p>Destaque também para o networking proporcionado pelo evento. Foi uma grande oportunidade para trocar ideias com os amigos de comunidade e profissionais de tecnoligia, compartilhar experiências valiosas sobre o dia a dia na área.</p>

<p>---</p>


]]></content:encoded>
    </item>
    <item>
      <title>Estratégias de Cloud Foundation em Larga Escala: Garantindo que Você Não Retorne para On-Premise - Tech Connection Floripa 2 Edição 2024</title>
      <link>https://www.orafaelferreira.com/artigos/tc-floripa24</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/tc-floripa24</guid>
      <pubDate>Sun, 10 Nov 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>No dia 9 de novembro de 2024, tive o prazer de palestrar na segunda edição do Tech Connection Florianópolis.</description>
      <category>Palestras</category>
      <category>Azure</category>
      <category>Governança</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tc.floripa.2024/1.jpeg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[
<p>No dia <strong>9 de novembro de 2024</strong>, tive o prazer de palestrar na segunda edição do <strong><a href="https://talkfloripa.com.br/" target="_blank" rel="noopener noreferrer">Tech Connection Florianópolis</a></strong>. Minha palestra, intitulada <strong>“Estratégias de Cloud Foundation em Larga Escala: Garantindo que Você Não Retorne para On-Premise”</strong>, foi uma oportunidade de compartilhar minha experiência e conhecimento com um público engajado e apaixonado por tecnologia.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tc.floripa.2024/1.jpeg" alt="Rafael Ferreira palestrando no Tech Connection Florianópolis 2024" />


<h2 id="o-contexto-da-palestra">O Contexto da Palestra</h2>

<p>Migrar para a nuvem é um dos grandes movimentos tecnológicos da atualidade, mas garantir que essa jornada seja sustentável e escalável é um desafio ainda maior. Muitos projetos de adoção de nuvem enfrentam dificuldades ao longo do caminho, seja por falta de planejamento, arquitetura inadequada ou governança insuficiente.</p>

<p>O foco da minha palestra foi exatamente este: como construir uma <strong>Cloud Foundation</strong> robusta, que suporte o crescimento da organização e evite o temido retorno ao ambiente <strong>on-premise</strong> – um movimento custoso e frequentemente sinal de insucesso na jornada para a nuvem.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tc.floripa.2024/2.jpeg" alt="Slide sobre Cloud Foundation na palestra do Tech Connection Floripa" />

<h2 id="os-pilares-de-uma-cloud-foundation-de-sucesso">Os Pilares de uma Cloud Foundation de Sucesso</h2>

<p>Durante a apresentação, abordei alguns pilares para construir uma <strong>Cloud Foundation</strong> sólida, incluindo:</p>

<p>1. <strong>Governança e Políticas de Segurança</strong>  </p>
<p>   Expliquei como estabelecer políticas claras para gerenciamento de identidades, controle de acessos e compliance, garantindo que a adoção da nuvem atenda aos padrões corporativos e regulatórios.</p>

<p>2. <strong>Automação com Infraestrutura como Código (IaC)</strong>  </p>
<p>   Destaquei o papel de ferrramentas como <strong>Terraform</strong> como ferramentas indispensáveis para automatizar a criação e manutenção de recursos na nuvem, promovendo consistência e reduzindo erros manuais.</p>

<p>3. <strong>Observabilidade e Monitoramento</strong>  </p>
<p>   Enfatizei a importância de integrar ferramentas para garantir visibilidade total sobre o ambiente, facilitando a identificação de gargalos e problemas antes que eles impactem o negócio.</p>

<p>4. <strong>Custos e FinOps</strong>  </p>
<p>   Um ponto essencial foi como implementar boas práticas de <strong>FinOps</strong> para gerenciar e otimizar custos, evitando desperdícios e garantindo o retorno do investimento na nuvem.</p>

<p>5. <strong>Resiliência e Escalabilidade</strong>  </p>
<p>   Por fim, mostrei como arquitetar soluções que sejam resilientes a falhas e capazes de escalar conforme a demanda.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tc.floripa.2024/3.jpeg" alt="Rafael Ferreira apresentando os pilares de uma Cloud Foundation" />

<h2 id="o-engajamento-do-publico">O Engajamento do Público</h2>

<p>A resposta do público foi extremamente positiva. Desde o início da apresentação, percebi olhares atentos e perguntas surgindo – um reflexo de como o tema ressoou com os desafios enfrentados por muitos profissionais.</p>

<p>Além da palestra, o evento foi uma oportunidade única para criar novas conexões e aprender com outros profissionais incríveis.</p>

<p>Que essa seja apenas mais uma etapa na nossa jornada de aprendizado e evolução tecnológica. Obrigado a todos que participaram. <strong>Até a próxima!</strong> 🚀</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tc.floripa.2024/4.jpeg" alt="Público do Tech Connection Florianópolis 2024 durante a palestra" />

<img src="https://stoblobcertificados011.blob.core.windows.net/certificados/2024-11-2TECHCONNECTIONFLORIPA.png" alt="Certificado de palestrante do Tech Connection Floripa 2024" />

<p>---</p>


]]></content:encoded>
    </item>
    <item>
      <title>TFTEC Ao Vivo 2024: Conexão, Conhecimento e Imersão em Cloud</title>
      <link>https://www.orafaelferreira.com/artigos/tftec2024</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/tftec2024</guid>
      <pubDate>Mon, 04 Nov 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Nos dias 26 e 27 de outubro, São Paulo foi palco do evento TFTEC Ao Vivo, uma imersão totalmente única no universo do Azure.</description>
      <category>Registro Eventos Presenciais</category>
      <category>Kubernetes</category>
      <category>Docker</category>
      <category>Terraform</category>
      <category>GitOps</category>
      <category>DevOps</category>
      <category>Observabilidade</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tftec/01.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<p>Nos dias 26 e 27 de outubro, São Paulo foi palco do evento <a href="https://www.tftec.com.br/tftecaovivo-2024/" target="_blank" rel="noopener noreferrer"><strong>TFTEC Ao Vivo</strong></a>, uma imersão totalmente única no universo do Azure. O evento reuniu profissionais e entusiastas de tecnologia de todo o Brasil para um aprendizado prático e aprofundado, com um dia cheio de "mão na massa" e interações em tempo real com especialistas. Foram mais de 16 horas de conteúdo intensivo, distribuídas em dois dias, proporcionando uma experiência completa e exclusiva aos participantes.</p>

<p>Além do aprendizado técnico, o evento ofereceu diversas oportunidades de <strong>networking</strong>, permitindo conhecer a comunidade técnica além das fotinhas do Youtube e Linkedin HAHA. Houve também um happy hour para os participantes onde trocamos experiências e demos várias risadas.</p>

<h3 id="beneficios-oferecidos-aos-participantes">Benefícios oferecidos aos participantes:</h3>

<ul>
<li>Acesso completo aos dois dias de evento.</li>
<li>Brindes exclusivos.</li>
<li>Coffee breaks e almoço.</li>
<li>Acesso às gravações por 2 anos.</li>
<li>Certificado de participação impresso.</li>
</ul>

<p>Os alunos do <a href="https://www.tftec.com.br/" target="_blank" rel="noopener noreferrer"><strong>TFTEC Prime</strong></a> que participaram do evento receberam vantagens especiais, como renovação gratuita ou descontos para eventos futuros.</p>

<h2 id="arquitetura-da-solucao-azure-do-tftec-cloud">Arquitetura da Solução Azure do TFTEC Cloud</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tftec/01.png" alt="Diagrama da arquitetura da solução Azure apresentada no TFTEC Cloud" />

<p>Um dos grandes destaques do evento foi a apresentação de uma <strong>arquitetura robusta e moderna</strong> para aplicações no Azure, projetada para alta escalabilidade e segurança. Esse exemplo prático foi essencial para que os participantes compreendessem como construir soluções complexas na plataforma. Irei explorar os principais componentes dessa arquitetura.</p>

<h3 id="visao-geral-da-arquitetura">Visão Geral da Arquitetura</h3>

<p>A arquitetura integra diversos serviços do Azure, organizados para oferecer uma infraestrutura segura, escalável e fácil de manter para aplicações corporativas. Os principais elementos são:</p>

<ul>
<li><strong>Segurança e Autenticação</strong>: Uso do Azure Active Directory (Entra ID) e Azure AD B2C, para autenticação e autorização para usuários internos e externos. O App Registration facilita o gerenciamento de permissões e registros de aplicações.</li>
</ul>

<ul>
<li><strong>Application Gateway (App GW) e API Management (APIM)</strong>: O App Gateway protege e gerencia o tráfego de entrada para as aplicações, enquanto o APIM centraliza a gestão de APIs, garantindo roteamento seguro e controle de acesso.</li>
</ul>

<ul>
<li><strong>Monitoramento e Análise</strong>: Com o Azure Application Insights e Log Analytics, a arquitetura oferece visibilidade dos logs e desempenho. Isso facilita o monitoramento em tempo real.</li>
</ul>

<ul>
<li><strong>Serviços Backend e Banco de Dados</strong>: No backend, as APIs centralizam a lógica de negócios, incluindo sistemas de CRM e outros serviços essenciais. Essas APIs se conectam ao Azure SQL Database para armazenamento com alta disponibilidade e integridade dos dados.</li>
</ul>

<ul>
<li><strong>Serviços Integrados do Azure</strong>: A arquitetura também utiliza serviços como Storage Account para armazenamento de arquivos, Key Vault para gerenciamento seguro de Secrets, Azure Functions para execução de tarefas sob demanda, Logic Apps para automação de fluxos de trabalho e DNS Zone.</li>
</ul>

<ul>
<li><strong>Azure DevOps</strong>: Com o Azure Repos para controle de versão do código, Azure Pipelines para automação CI/CD, e Terraform para definição de infraestrutura como código (IaC).</li>
</ul>

<ul>
<li><strong>Azure Container Registry (ACR)</strong>: Permite fácil integração com o Kubernetes e outros serviços, facilitando o deploy seguro e contínuo das aplicações.</li>
</ul>

<h2 id="terraform-e-kubernetes">Terraform e Kubernetes</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tftec/02.png" alt="Diagrama de provisionamento com Terraform e Kubernetes no Azure" />

<h4>Provisionamento de Infraestrutura com Terraform:</h4>

<ul>
<li><strong>Infraestrutura como Código (IaC)</strong>: O Terraform é utilizado para gerenciar a infraestrutura como código, permitindo que toda a configuração seja descrita em arquivos, facilitando a reutilização e o versionamento.</li>
</ul>

<ul>
<li><strong>Configuração e Versionamento</strong>: Geralmente profissionais de DevOps configuram o código Terraform para a infraestrutura, que é versionado no Azure Repos e gerenciado por pipelines, garantindo consistência e segurança nos deploys.</li>
</ul>

<h4>Pipeline de Build e Deploy:</h4>

<ul>
<li><strong>Construção e Armazenamento de Imagens</strong>: Com o código da infraestrutura no Azure Repos, o pipeline é ativado para construir e enviar as imagens de contêiner para o Azure Container Registry (ACR).</li>
</ul>

<ul>
<li><strong>Testes e Validações</strong>: O pipeline automatizado executa testes e validações antes de enviar a imagem, garantindo que o build esteja em conformidade com as políticas de qualidade da equipe.</li>
</ul>

<h4>Gerenciamento de Estado com Backend Remoto:</h4>

<ul>
<li><strong>Armazenamento Seguro de Estado</strong>: O estado do Terraform, armazenado no arquivo <code>tfstate</code>, é mantido em um backend remoto, utilizando Azure Key Vault e Storage Account para garantir segurança e facilitar a colaboração.</li>
</ul>

<h4>Azure Kubernetes Service (AKS):</h4>

<ul>
<li><strong>Orquestração de Contêineres</strong>: O AKS gerencia os contêineres, consumindo as imagens armazenadas no ACR e distribuindo as cargas de trabalho conforme necessário, mantendo a disponibilidade e performance das aplicações.</li>
</ul>

<h4>Monitoramento e Análise:</h4>

<ul>
<li><strong>Visibilidade e Monitoramento Contínuo</strong>: Log Analytics e Application Insights oferecem uma visão em tempo real dos logs e dados de desempenho, facilitando a análise e resolução proativa de problemas.</li>
</ul>

<h2 id="descricao-do-pipeline-de-cicd-com-terraform">Descrição do Pipeline de CI/CD com Terraform</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tftec/03.png" alt="Fluxo do pipeline de CI/CD com Terraform" />

<p>1. <strong>Desenvolvimento</strong></p>
<ul>
<li><strong>Codificação</strong>: O desenvolvedor escreve o código da infraestrutura usando Terraform.</li>
<li><strong>Pull Request (PR)</strong>: Após finalizar, cria um PR no Azure Repos, enviando as mudanças.</li>
</ul>

<p>2. <strong>Pipeline de Integração Contínua (CI)</strong></p>
<ul>
<li><strong>Validações Automatizadas</strong>:</li>
<li><code>terraform init</code>: Inicializa o Terraform.</li>
<li><code>terraform fmt</code>: Formata o código conforme os padrões.</li>
<li><code>terraform validate</code>: Valida a sintaxe e a integridade do código.</li>
<li><code>checkov</code>: Verifica a segurança do código.</li>
<li><code>tflint</code>: Executa linting para identificar possíveis erros e padrões não recomendados.</li>
<li><code>terraform plan</code>: Gera um plano de execução mostrando as mudanças que serão aplicadas.</li>
<li><strong>Infracost</strong>: Calcula o custo estimado das alterações e adiciona um comentário no PR com a previsão de custos, auxiliando na avaliação do impacto financeiro.</li>
</ul>

<p>3. <strong>Verificação e Revisão</strong></p>
<ul>
<li><strong>Correção de Erros</strong>: Se o pipeline CI falhar, o desenvolvedor revisa e corrige o código.</li>
<li><strong>Revisão do PR</strong>: Com o CI aprovado, o PR é revisado pela equipe.</li>
<li><strong>Aprovação</strong>: Se aprovado, o pipeline de CD é iniciado.</li>
</ul>

<p>4. <strong>Pipeline de Entrega Contínua (CD)</strong></p>
<ul>
<li><code>terraform init</code>: Reexecuta a inicialização para o ambiente de produção.</li>
<li><code>terraform apply</code>: Aplica as mudanças no ambiente real, atualizando a infraestrutura conforme o plano.</li>
</ul>

<p>5. <strong>Validação Final</strong></p>
<ul>
<li><strong>Verificação do Ambiente</strong>: A equipe valida se tudo está conforme o esperado no ambiente de produção.</li>
</ul>

<p>Esse fluxo garante que as mudanças na infraestrutura sejam aplicadas de forma controlada e segura, com verificações de qualidade, segurança e custo antes de qualquer alteração no ambiente produtivo. O uso de ferramentas como Terraform e Infracost permite automação e transparência, contribuindo para um gerenciamento eficiente da infraestrutura em nuvem.</p>


<h2 id="arquitetura-de-cicd-com-azure-devops-para-deploy-no-azure-kubernetes-service-aks">Arquitetura de CI/CD com Azure DevOps para Deploy no Azure Kubernetes Service (AKS)</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tftec/04.png" alt="Arquitetura de CI/CD com Azure DevOps para deploy no AKS" />

<p>O diagrama a seguir ilustra um pipeline de CI/CD configurado no Azure DevOps, integrando o Azure Kubernetes Service (AKS) para orquestração de contêineres. Esse pipeline automatiza o processo de build, packaging, armazenamento e deploy de uma aplicação em contêiner no AKS.</p>

<p>1. <strong>Código Fonte</strong></p>
<ul>
<li><strong>Desenvolvedor</strong>: Cria e edita o código da aplicação.</li>
<li><strong>Azure Repos</strong>: O código é versionado e armazenado no Azure Repos.</li>
<li><strong>Trigger de CI</strong>: O pipeline de Integração Contínua inicia automaticamente após o push.</li>
</ul>

<p>2. <strong>Build</strong></p>
<ul>
<li><strong>Azure Pipelines Build</strong>: Constrói a aplicação e prepara o contêiner.</li>
<li><strong>Docker</strong>: O código é empacotado em uma imagem Docker.</li>
<li><strong>Helm</strong>: Um chart Helm é gerado para definir e configurar o deploy no Kubernetes.</li>
<li><strong>Azure Container Registry (ACR)</strong>: A imagem Docker é armazenada no ACR.</li>
<li><strong>Trigger de CD</strong>: Um trigger de Entrega Contínua é acionado quando uma nova imagem é enviada ao ACR.</li>
</ul>

<p>3. <strong>Deploy</strong></p>
<ul>
<li><strong>Azure Pipelines Deploy</strong>: Aplica o chart Helm e realiza o deploy da imagem no cluster AKS.</li>
</ul>

<p>4. <strong>Ambiente</strong></p>
<ul>
<li><strong>Azure Kubernetes Service (AKS)</strong>: Ambiente final de execução da aplicação, onde o Kubernetes orquestra e gerencia os contêineres em um cluster escalável.</li>
</ul>

<p>Esse fluxo automatizado facilita a integração e o deploy contínuos, assegurando que cada alteração no código seja construída, validada e implantada de maneira consistente. A integração com Docker e Helm permite uma configuração flexível e reproduzível para a implantação de contêineres no AKS.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tftec/05.jpg" alt="Rafael Ferreira participando do TFTEC Ao Vivo 2024 em São Paulo" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tftec/06.jpg" alt="Público do TFTEC Ao Vivo 2024 acompanhando as sessões sobre Azure" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tftec/07.jpg" alt="Palco do TFTEC Ao Vivo 2024 durante a imersão em Azure" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tftec/14.jpg" alt="Participantes do TFTEC Ao Vivo 2024 em momento de networking" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tftec/08.jpg" alt="Instrutores do TFTEC Cloud apresentando a arquitetura no Azure" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tftec/09.jpg" alt="Rafael Ferreira participando do TFTEC Ao Vivo 2024 em São Paulo" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tftec/10.jpg" alt="Público do TFTEC Ao Vivo 2024 acompanhando as sessões sobre Azure" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tftec/11.jpg" alt="Palco do TFTEC Ao Vivo 2024 durante a imersão em Azure" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tftec/12.jpg" alt="Participantes do TFTEC Ao Vivo 2024 em momento de networking" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tftec/13.png" alt="Instrutores do TFTEC Cloud apresentando a arquitetura no Azure" />

<h2 id="conclusao">Conclusão</h2>

<p>O <strong>TFTEC Ao Vivo</strong> foi um evento incrível, proporcionando uma oportunidade única de rever amigos, fortalecer o networking e aprender mais sobre o universo Azure. Durante dois dias imersivos, profissionais de todo o Brasil puderam se aprofundar em tecnologias de ponta, participar de sessões práticas e interagir diretamente com especialistas da área. Além do aprendizado técnico, o ambiente amigável e colaborativo criou um espaço valioso para trocas de experiências e conexões duradouras, reafirmando a importância da comunidade Azure no desenvolvimento de novas competências e na inovação contínua. Estamos ansiosos para o próximo encontro e para continuar crescendo juntos na jornada rumo à nuvem!</p>

<p>Caso queira visitar o repositório oficial do projeto, segue os links:</p>
<a href="https://github.com/raphasi/tftecsp2024?tab=readme-ov-file" target="_blank" rel="noopener noreferrer">tftecsp2024</a>
<a href="https://github.com/raphasi/-tftec-aovivo-iac/tree/main" target="_blank" rel="noopener noreferrer">-tftec-aovivo-iac</a>

<p>---</p>


]]></content:encoded>
    </item>
    <item>
      <title>Architecting a Secure Landing Zone for AI Workloads in the Cloud - MVP TALKS CI&amp;T 2024</title>
      <link>https://www.orafaelferreira.com/artigos/mvp-day</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/mvp-day</guid>
      <pubDate>Sat, 02 Nov 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Relato do primeiro CI&amp;T MVP Day em Campinas: palestra sobre landing zone segura para workloads de IA, sessões de outros MVPs e painel sobre ser Microsoft MVP.</description>
      <category>Organização de Eventos</category>
      <category>IA</category>
      <category>Azure</category>
      <category>Segurança</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp.talks/1.png" length="0" type="image/png" />
      <content:encoded><![CDATA[

<p>No último dia 24 de outubro, organizamos o primeiro CI&T MVP Day, um evento interno, exclusivo para funcionários da CI&T, realizado na nossa sede global tech em Campinas. Este evento marcante reuniu palestras sobre segurança, nuvem e inteligência artificial, além de proporcionar momentos de troca e inspiração entre profissionais apaixonados por tecnologia. Com nomes de peso como <strong><a href="https://www.linkedin.com/in/orafaelferreiraa/" target="_blank" rel="noopener noreferrer">Rafael Martin Alves Ferreira</a></strong>, <strong><a href="https://www.linkedin.com/in/nizzola/" target="_blank" rel="noopener noreferrer">Márcio Rogério Nizzola</a></strong> e <strong><a href="https://www.linkedin.com/in/cfraposo/" target="_blank" rel="noopener noreferrer">Cláudio Raposo</a></strong>, exploramos temas que estão moldando o presente e o futuro da tecnologia.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp.talks/1.png" alt="Abertura do CI&T MVP Day na sede em Campinas" />


<p>> 💬 "Posso dizer! CI&T MVP Day foi o pipoco do trovão azul celestial!", <em>Cláudio Raposo, Software Architect e MVP Microsoft</em></p>


<h2 id="o-que-rolou-no-cit-mvp-day">O que Rolou no CI&T MVP Day:</h2>

<h3 id="architecting-a-secure-landing-zone-for-ai-workloads-in-the-cloud">🔹 Architecting a Secure Landing Zone for AI Workloads in the Cloud</h3>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp.talks/2.jpg" alt="Rafael Ferreira palestrando sobre Secure Landing Zone para IA" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp.talks/3.jpeg" alt="Slide com a arquitetura da landing zone segura para workloads de IA" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp.talks/4.jpeg" alt="Público do CI&T MVP Day acompanhando a palestra" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp.talks/5.jpeg" alt="Rafael Ferreira explicando segurança em nuvem para workloads de IA" />
<strong>Palestrante:</strong> Rafael Martin Alves Ferreira

<p>Apresentei um guia prático para a criação de uma Landing Zone segura para workloads de IA na nuvem. Destaquei como as Landing Zones, fundamentadas nos frameworks <strong>Cloud Adoption Framework (CAF)</strong> e <strong>Well-Architected Framework (WAF)</strong>, são essenciais para escalar e proteger workloads de IA.</p>

<ul>
<li><i></i> <strong>Slides da Apresentação:</strong> <a href="https://stoblobcertificados011.blob.core.windows.net/palestras/CIT.pdf" target="_blank" rel="noopener noreferrer">Architecting a Secure Landing Zone for AI Workloads in the Cloud</a></li>
</ul>

<h3 id="desenvolvimento-de-function-apps-seguros-com-managed-identity-e-service-connecto">🔹 Desenvolvimento de Function Apps Seguros com Managed Identity e Service Connector</h3>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp.talks/6.jpg" alt="Cláudio Raposo palestrando sobre Function Apps com Managed Identity" />

<strong>Palestrante:</strong> <a href="https://www.linkedin.com/in/cfraposo/" target="_blank" rel="noopener noreferrer">Cláudio Raposo</a>

<p>Cláudio abordou um dos grandes desafios do desenvolvimento serverless: segurança no gerenciamento de credenciais. Ele demonstrou como o uso de <strong>Managed Identity</strong> e <strong>Service Connector</strong> no Azure elimina a necessidade de armazenar senhas no código, reforçando a segurança de aplicações na nuvem. Essa sessão foi essencial para quem busca criar soluções na nuvem mais seguras e eficientes.</p>

<h3 id="utilizando-azure-openai-para-reconhecimento-e-interpretacao-de-documentos">🔹 Utilizando Azure OpenAI para Reconhecimento e Interpretação de Documentos</h3>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp.talks/7.jpeg" alt="Márcio Nizzola apresentando Azure OpenAI para interpretação de documentos" />

<strong>Palestrante:</strong> <a href="https://www.linkedin.com/in/nizzola/" target="_blank" rel="noopener noreferrer">Márcio Rogério Nizzola</a>

<p>Márcio compartilhou suas experiências com o <strong>Azure OpenAI</strong>, <strong>Document Intelligence</strong> e <strong>Form Recognizer</strong>. Ele demonstrou, com exemplos práticos, como essas ferramentas estão transformando o reconhecimento e a interpretação de documentos, abrindo novas oportunidades para a automação de processos e gestão de informações empresariais.</p>

<h2 id="inspirando-a-proxima-geracao-de-mvps">Inspirando a Próxima Geração de MVPs</h2>

<p>O evento foi encerrado com um painel inspirador: <strong>"O que preciso para ser um Microsoft MVP?"</strong>. Cada palestrante compartilhou suas trajetórias e experiências, ressaltando que o título de MVP vai além de um reconhecimento técnico, representa um compromisso com a tecnologia e com a comunidade.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mvp.talks/8.jpg" alt="Painel sobre o que é preciso para ser um Microsoft MVP" />

<h2 id="conclusao-um-dia-para-guardar-na-memoria">Conclusão: Um Dia para Guardar na Memória</h2>

<p>O CI&T MVP Day foi uma oportunidade de aprendizado transformador e troca de conhecimentos. Agradeço a todos que participaram e contribuíram para tornar esse dia memorável. Se você não pôde estar presente, fique atento aos próximos eventos e conteúdos que estamos preparando!</p>

<p>Para todos que compartilham a paixão por tecnologia e inovação, reforçamos nosso compromisso com a comunidade. Vamos juntos em direção ao futuro, onde conhecimento, colaboração e segurança na nuvem serão mais importantes do que nunca.</p>

<p>---</p>


]]></content:encoded>
    </item>
    <item>
      <title>Deploy de um Futuro com Sustentabilidade: GreenOps na Cloud - #27 Cloud Native São Paulo - Sustainability Day na AWS 2024</title>
      <link>https://www.orafaelferreira.com/artigos/sustentability-day</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/sustentability-day</guid>
      <pubDate>Thu, 31 Oct 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Resumo do Sustainability Day 2024 no AWS Startup Loft em São Paulo: palestras sobre GreenOps na Cloud, Backstage, Karpenter e KEDA com o Cloud Native São Paulo.</description>
      <category>Palestras</category>
      <category>Comunidade</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/1.jpg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[
<p>No último dia 22 de outubro, o <strong><a href="https://www.linkedin.com/company/cloud-native-sao-paulo/posts/?feedView=all" target="_blank" rel="noopener noreferrer">CNCF - Cloud Native São Paulo 🇧🇷</a></strong>, em parceria com a <strong><a href="https://www.linkedin.com/company/amazon-web-services/" target="_blank" rel="noopener noreferrer">Amazon Web Services (AWS)</a></strong> e a <strong><a href="https://www.linkedin.com/company/cloud-native-computing-foundation/posts/?feedView=all" target="_blank" rel="noopener noreferrer">Cloud Native Computing Foundation (CNCF)</a></strong>, organizou o aguardado evento "Sustainability Day" no AWS Startup Loft em São Paulo. Com um foco especial na sustentabilidade nas operações de TI, o meetup reuniu especialistas, desenvolvedores e entusiastas da tecnologia para discutir estratégias inovadoras que equilibram eficiência e responsabilidade ambiental na nuvem.</p>



<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/1.jpg" alt="Abertura do Sustainability Day no AWS Startup Loft em São Paulo" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/2.jpg" alt="Público reunido no AWS Startup Loft para o Sustainability Day" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/3.jpg" alt="Participantes do meetup Cloud Native São Paulo no Sustainability Day" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/4.jpg" alt="Palco do Sustainability Day 2024 no AWS Startup Loft" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/5.jpg" alt="Comunidade Cloud Native São Paulo no Sustainability Day na AWS" />


<p>Se você não pôde comparecer, este post traz um resumo completo com os principais insights sobre práticas sustentáveis que prometem revolucionar a tecnologia e sua aplicação na nuvem. Confira como o <strong>GreenOps</strong> está impactando a infraestrutura e veja como você pode começar a implementar essas práticas para um futuro mais verde e eficiente.</p>

<h3 id="a-importancia-da-sustentabilidade-na-nuvem">🌍 A Importância da Sustentabilidade na Nuvem</h3>

<p>A tecnologia, com seu crescimento acelerado, trouxe uma nova demanda por infraestrutura na nuvem, aumentando o consumo de energia e os custos operacionais. Agora, o desafio é claro: como equilibrar eficiência e inovação sem comprometer o meio ambiente? Esse tema foi o ponto de partida do evento, abordando como ferramentas e práticas inovadoras podem otimizar o consumo de recursos e reduzir a pegada de carbono na nuvem.</p>

<h3 id="palestras-e-insights-inspiradores">💡 Palestras e Insights Inspiradores</h3>

<h4>1. Deploy de um Futuro com Sustentabilidade: GreenOps na Cloud  </h4>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/6.jpg" alt="Rafael Ferreira palestrando sobre GreenOps na Cloud no Sustainability Day" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/7.jpg" alt="Slide da palestra Deploy de um Futuro com Sustentabilidade" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/8.jpg" alt="Rafael Ferreira apresentando práticas de GreenOps na AWS" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/9.jpg" alt="Público acompanhando a palestra sobre GreenOps na Cloud" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/11.jpg" alt="Rafael Ferreira palestrando sobre GreenOps na Cloud no Sustainability Day" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/13.jpg" alt="Slide da palestra Deploy de um Futuro com Sustentabilidade" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/15.jpg" alt="Rafael Ferreira apresentando práticas de GreenOps na AWS" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/17.jpg" alt="Público acompanhando a palestra sobre GreenOps na Cloud" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/19.jpg" alt="Rafael Ferreira palestrando sobre GreenOps na Cloud no Sustainability Day" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/20.jpg" alt="Slide da palestra Deploy de um Futuro com Sustentabilidade" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/21.jpg" alt="Rafael Ferreira apresentando práticas de GreenOps na AWS" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/22.jpg" alt="Público acompanhando a palestra sobre GreenOps na Cloud" />

<strong>Palestrante:</strong> <a href="https://www.linkedin.com/in/orafaelferreiraa/" target="_blank" rel="noopener noreferrer">Rafael Martin Alves Ferreira</a>  
<strong>Resumo:</strong> Compartilhei como o GreenOps pode ser incorporado ao dia a dia das operações na nuvem, permitindo que empresas façam deploys de forma mais sustentável. Discuti práticas e frameworks que empresas líderes têm utilizado para minimizar o impacto ambiental, enquanto aumentam a eficiência dos sistemas. Foram apresentados <strong>cases reais</strong> e <strong>exemplos práticos</strong> que mostram como a sustentabilidade e a inovação podem caminhar lado a lado.

<ul>
<li><i></i> <strong>Slides da Apresentação:</strong> <a href="https://stoblobcertificados011.blob.core.windows.net/palestras/cncn-sp.pdf" target="_blank" rel="noopener noreferrer">Deploy de um Futuro com Sustentabilidade: GreenOps na Cloud</a></li>
</ul>

<h4>2. Otimizando DevEx e Sustentabilidade: Como o Backstage Transforma Infraestruturas com GreenOps  </h4>
<strong>Palestrante:</strong> <a href="https://www.linkedin.com/in/cfraposo/" target="_blank" rel="noopener noreferrer">Cláudio Filipe Lima Rapôso</a>  
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/23.jpg" alt="Cláudio Rapôso palestrando sobre Backstage e GreenOps no Sustainability Day" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/24.jpg" alt="Cláudio Rapôso palestrando sobre Backstage e GreenOps no Sustainability Day" />
<strong>Resumo:</strong> Cláudio explorou como o <strong>Backstage</strong>, plataforma de experiência do desenvolvedor (DevEx), pode facilitar a integração de GreenOps na infraestrutura de TI. Ele demonstrou como a experiência do desenvolvedor pode ser aprimorada ao automatizar pipelines sustentáveis e reduzir custos operacionais. <strong>Casos de uso</strong> mostraram a força do Backstage para uma infraestrutura sustentável e centrada no desenvolvedor.

<h4>3. Escalonamento Eficiente e Sustentável no Kubernetes: Como Karpenter e KEDA Fazem a Diferença </h4>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/25.jpg" alt="Pedro Oliveira e Tiago Reichert palestrando sobre Karpenter e KEDA" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/26.jpg" alt="Pedro Oliveira e Tiago Reichert palestrando sobre Karpenter e KEDA" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/31.jpg" alt="Pedro Oliveira e Tiago Reichert palestrando sobre Karpenter e KEDA" /> 
<strong>Palestrantes:</strong> <a href="https://www.linkedin.com/in/pedrohco1/" target="_blank" rel="noopener noreferrer">Pedro Oliveira</a> & <a href="https://www.linkedin.com/in/tiago-reichert/" target="_blank" rel="noopener noreferrer">Tiago Reichert</a>  
<strong>Resumo:</strong> Pedro e Tiago discutiram a importância do gerenciamento de recursos para a sustentabilidade e otimização de custos no Kubernetes. Utilizando <strong>Karpenter para escalonamento automático</strong> e <strong>Amazon Graviton para economizar até 60% de energia</strong>, eles mostraram como essas soluções são eficientes para atender à demanda e, ao mesmo tempo, reduzir o desperdício de recursos.

<h3 id="como-participar-desse-movimento">🔥 Como Participar desse Movimento</h3>

<p>Mesmo que você não tenha participado do meetup, ainda é possível adotar as práticas discutidas e fazer parte dessa revolução na nuvem:</p>

<ul>
<li><strong>Estude mais sobre GreenOps:</strong> Entenda como aplicar práticas sustentáveis nas operações em nuvem e descubra as ferramentas que auxiliam no monitoramento e otimização do consumo energético. Para um entendimento aprofundado, confira o <a href="https://www.orafaelferreira.com/artigos/finops-foundation-cloud" target="_blank" rel="noopener noreferrer">artigo sobre Green Computing Foundation e sustentabilidade na nuvem</a> no blog!</li>
<li><strong>Experimente soluções como Backstage, Karpenter e KEDA:</strong> Essas ferramentas já fazem a diferença em muitas empresas e podem ser incorporadas facilmente ao seu ambiente para criar uma infraestrutura mais sustentável.</li>
<li><strong>Conecte-se com a comunidade Cloud Native:</strong> Os organizadores e palestrantes do <a href="https://www.linkedin.com/company/cloud-native-sao-paulo/posts/?feedView=all" target="_blank" rel="noopener noreferrer">CNCF Cloud Native São Paulo 🇧🇷</a> são grandes influenciadores neste campo. Acompanhe-os e aprenda como eles aplicam conceitos de sustentabilidade em projetos de alta escala.</li>
<li><strong>Participe de futuros meetups:</strong> O movimento está apenas começando! Esses encontros proporcionam aprendizado contínuo e networking com profissionais que estão liderando a transformação sustentável na tecnologia.</li>
</ul>

<h3 id="conclusao-sua-jornada-rumo-a-sustentabilidade-comeca-agora">🌱 Conclusão: Sua Jornada Rumo à Sustentabilidade Começa Agora!</h3>

<p>A sustentabilidade já não é uma escolha opcional, é uma necessidade. Com as práticas e ferramentas apresentadas, você pode começar a fazer a diferença, implementando GreenOps em seu ambiente e otimizando o uso de recursos. <strong>Pequenas mudanças podem gerar um grande impacto</strong>, mostrando que sua empresa está comprometida com um futuro mais sustentável e eficiente.</p>

<p>Então, prepare-se! Fique atento aos próximos eventos do <a href="https://www.linkedin.com/company/cloud-native-sao-paulo/posts/?feedView=all" target="_blank" rel="noopener noreferrer">CNCF Cloud Native São Paulo 🇧🇷</a> e venha descobrir como pequenas mudanças na infraestrutura podem trazer benefícios duradouros para o seu negócio e para o meio ambiente. Vamos juntos transformar a tecnologia em uma força para um futuro verde!</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/27.jpg" alt="Palestrantes e organizadores reunidos no encerramento do Sustainability Day" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/28.jpg" alt="Comunidade Cloud Native São Paulo no encerramento do Sustainability Day" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/29.jpg" alt="Foto oficial dos participantes do Sustainability Day 2024" />

<a href="https://www.credly.com/badges/a6940f87-b34a-497e-8c1e-93545075c0ee/public_url" target="_blank" rel="noopener noreferrer"><img src="https://images.credly.com/size/680x680/images/d0775caa-a49d-4419-ac8e-9c0688085b9d/blob" alt="Speaker - Cloud Native Sustainability Week 2024" /></a>

<h3 id="encerramento">Encerramento </h3>
<p>Seguimos com um animado happy hour, proporcionando uma excelente oportunidade para networking e risadas. Um ambiente descontraído e divertido, permitindo uma troca de ideias mais informal e a formação de novas conexões profissionais. E para quem se perguntou da qualidade das fotos, sim, é isso, tivemos um fotógrafo profissional (<a href="https://www.linkedin.com/in/erivaldolopes/" target="_blank" rel="noopener noreferrer">Erivaldo Lopes</a>)!</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/sustentability.day/30.jpg" alt="Happy hour de networking após o Sustainability Day na AWS" />

<p>Quer participar como palestrante em um próximo meetup? </p>

<p>https://lnkd.in/ddvBG7hM</p>

<p>Caso queira conferir todas as fotos, segue o <a href="https://lightroom.adobe.com/shares/7f7588265265451f9f986f379c64bd13" target="_blank" rel="noopener noreferrer">link</a>.</p>

<p>Se você não teve a oportunidade de comparecer a este evento, não se preocupe, você pode conferir a gravação no YouTube:</p>

<a href="https://www.youtube.com/watch?v=mIgEJseOt0U&t" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/mIgEJseOt0U/0.jpg" alt="#27 Cloud Native São Paulo - Sustainability Day na AWS" /></a>


]]></content:encoded>
    </item>
    <item>
      <title>Automatizando Infraestrutura Moderna com Metodologias Ágeis</title>
      <link>https://www.orafaelferreira.com/artigos/agil</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/agil</guid>
      <pubDate>Tue, 29 Oct 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Como metodologias ágeis apoiam a automação de infraestrutura moderna em DevOps, com Scrum, ciclo de vida do projeto ágil e exemplos práticos.</description>
      <category>Artigos</category>
      <category>Azure</category>
      <category>Terraform</category>
      <category>CI/CD</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/agil/agil1.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<p>No mundo altamente competitivo em todas as áreas (iremos focar na tecnologia), a agilidade tornou-se uma característica indispensável, especialmente para profissionais de DevOps (assim como eu). A implementação de metodologias ágeis, como o Scrum, transformou a maneira como projetos de infraestrutura são gerenciados e executados. Com o uso de ferramentas modernas como Terraform, Ansible, Puppet, ferramentas de Infraestrutura como Código (IaC), Azure DevOps, GitHub Actions e players de nuvem Azure e AWS, as equipes podem provisionar e migrar aplicativos de maneira eficiente e adaptável.</p>

<h2 id="metodologias-ageis-em-devops">Metodologias Ágeis em DevOps</h2>

<p>As metodologias ágeis promovem uma abordagem iterativa e incremental, permitindo que as equipes respondam rapidamente às mudanças e entreguem valor continuamente. Em DevOps, isso se traduz em uma colaboração mais eficaz entre equipes de desenvolvimento e operações, facilitando a integração contínua e a entrega contínua (CI/CD).</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/agil/agil1.png" alt="Diagrama do framework Scrum aplicado a times DevOps" />

<strong>Componentes Chave do Scrum:</strong>

<ul>
<li><strong>Papéis:</strong> Product Owner, ScrumMaster e Equipe de Desenvolvimento.</li>
<li><strong>Ritos:</strong> Sprint Planning, Daily Scrum, Sprint Review e Sprint Retrospective.</li>
<li><strong>Artefatos:</strong> Product Backlog, Sprint Backlog e Incremento.</li>
</ul>

<p>Essa estrutura ajuda a garantir que todos os membros da equipe estejam alinhados e trabalhando de forma coesa para alcançar os objetivos do projeto.</p>

<h2 id="provisionamento-agil-de-infraestrutura">Provisionamento Ágil de Infraestrutura</h2>

<p>O provisionamento ágil de infraestrutura é essencial para suportar a migração de aplicativos de forma segura e veloz, garantindo que o provisionamento seja executado de maneira eficiente. Utilizando IaC, as equipes podem definir, provisionar e gerenciar.</p>

<strong>Benefícios do Terraform e IaC:</strong>

<ul>
<li><strong>Consistência:</strong> Garantia de que a infraestrutura seja provisionada de maneira idêntica em diferentes ambientes.</li>
<li><strong>Automação:</strong> Redução de erros humanos e aumento da eficiência operacional.</li>
<li><strong>Versão de Controle:</strong> Capacidade de rastrear mudanças na infraestrutura ao longo do tempo.</li>
</ul>

<h2 id="ciclo-de-vida-do-projeto-agil">Ciclo de Vida do Projeto Ágil</h2>

<p>1. <strong>Planejamento Inicial:</strong> No Sprint Planning, a equipe define as necessidades de infraestrutura e divide o trabalho em histórias claras e gerenciáveis.</p>
<p>2. <strong>Desenvolvimento Iterativo:</strong> Durante os Sprints, a equipe trabalha em ciclos curtos, entregando incrementos de infraestrutura provisionada, testada e validada.</p>
<p>3. <strong>Feedback Contínuo:</strong> O Sprint Review permite que o PO e outros stakeholders forneçam feedback imediato, garantindo que a infraestrutura atenda às expectativas.</p>
<p>4. <strong>Adaptação e Melhoria Contínua:</strong> A Sprint Retrospective ajuda a equipe a identificar áreas de melhoria, ajustando processos e práticas para futuros Sprints.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/agil/agil2.png" alt="Ciclo de vida de um projeto ágil com Sprints" />

<h2 id="casos-de-uso-e-exemplos-praticos">Casos de Uso e Exemplos Práticos</h2>

<p>Um exemplo prático da aplicação dessas metodologias pode ser visto em uma equipe DevOps responsável por migrar uma aplicação crítica para a nuvem Azure. Utilizando Scrum, Terraform e GitHub Actions, a equipe pode definir e automatizar a infraestrutura necessária, garantindo que cada parte do sistema esteja funcionando corretamente antes de avançar.</p>

<strong>Exemplo de Histórias de Usuário:</strong>

<ul>
<li>"Como administrador de sistema, quero provisionar servidores no Azure para garantir a migração contínua do aplicativo."</li>
<li>"Como desenvolvedor, quero configurar pipelines CI/CD com GitHub Actions para automatizar testes e implementações."</li>
</ul>

<h2 id="conclusao">Conclusão</h2>

<p>A integração de metodologias ágeis com ferramentas modernas como Terraform, GitHub Actions e Azure transforma a maneira como os profissionais de DevOps gerenciam projetos de provisionamento de infraestrutura. A abordagem ágil permite que as equipes naveguem pelas complexidades do provisionamento de infraestrutura com confiança, mantendo a flexibilidade necessária para adaptar-se às mudanças e garantindo a entrega contínua de valor. Em um ambiente de TI em constante evolução, a agilidade, juntamente com a automação e a colaboração, é a chave para o sucesso sustentado.</p>


]]></content:encoded>
    </item>
    <item>
      <title>Prepare-se para a Transição Obrigatória do TLS 1.2 no Azure</title>
      <link>https://www.orafaelferreira.com/artigos/tls</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/tls</guid>
      <pubDate>Tue, 08 Oct 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Em outubro de 2024 a Microsoft encerra o suporte ao TLS 1.0 e 1.1 em todos os serviços Azure: entenda o impacto e como preparar suas aplicações para o TLS 1.2.</description>
      <category>Artigos</category>
      <category>Segurança</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Logo2.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<p>Em outubro de 2024, a Microsoft encerrará o suporte para as versões mais antigas do TLS (Transport Layer Security), especificamente TLS 1.0 e 1.1, em todos os serviços Azure. A partir de 31 de outubro de 2024, todas as interações com serviços do Azure deverão ser feitas via TLS 1.2 ou superior. Essa mudança é parte de um esforço contínuo para garantir segurança e criptografia avançadas nos dados e interações envolvendo os serviços da plataforma.</p>

<p>Se você ainda utiliza versões anteriores do TLS em seus recursos, essa mudança poderá impactar diretamente sua operação, resultando em possíveis interrupções de serviço caso a transição não seja feita a tempo.</p>
<p>Caso queira saber mais do <a href="https://learn.microsoft.com/pt-br/lifecycle/announcements/transport-layer-security-1x-disablement" target="_blank" rel="noopener noreferrer">anúncio</a></p>

<h2 id="o-que-e-tls-e-por-que-e-importante">O que é TLS e por que é importante?</h2>

<p>TLS (Transport Layer Security) é um protocolo de criptografia que visa proteger a comunicação entre dois sistemas, como navegadores e servidores ou servidores entre si, garantindo a privacidade e a integridade dos dados. Ele é o sucessor do SSL (Secure Sockets Layer) e tem sido amplamente adotado em diversas camadas de aplicação, especialmente em ambientes de nuvem e serviços web.</p>

<p>A importância de usar o TLS 1.2 ou superior se resume a três pontos principais:</p>

<p>1. <strong>Segurança Aprimorada</strong>: As versões mais antigas do TLS (1.0 e 1.1) não oferecem os mesmos níveis de proteção que o TLS 1.2 ou 1.3. Vulnerabilidades conhecidas nessas versões podem ser exploradas, tornando-as menos seguras para proteger dados sensíveis.</p>

<p>2. <strong>Sigilo em Frente Perfeita (Perfect Forward Secrecy)</strong>: Uma das melhorias trazidas pelas versões mais recentes do TLS é o conceito de "sigilo em frente perfeita". Isso significa que, mesmo que uma chave de sessão seja comprometida, as sessões passadas não podem ser descriptografadas, garantindo maior segurança a longo prazo.</p>

<p>3. <strong>Conjuntos de Cifras Mais Fortes</strong>: TLS 1.2 oferece suporte para conjuntos de cifras mais fortes, protegendo contra ataques criptográficos que podem ser eficazes contra cifras mais antigas usadas em TLS 1.0 e 1.1.</p>

<h2 id="impacto-da-mudanca-em-ambientes-azure">Impacto da Mudança em Ambientes Azure</h2>

<p>Em termos práticos, isso significa que qualquer recurso que interaja com os serviços do Azure, como appliances de rede, gateways de aplicação ou scripts automatizados que utilizam APIs do Azure, precisará estar preparado para utilizar TLS 1.2 ou superior até a data limite.</p>

<p>Uma área que pode não ser diretamente afetada por essa mudança são os recursos internos de clusters, como em clusters Kubernetes que usam comunicações internas que não envolvem APIs externas do Azure. Nesses casos, as mudanças no protocolo TLS podem não ser aplicáveis, pois o foco da atualização está nos serviços que fazem interface diretamente com as APIs do Azure.</p>

<h2 id="acoes-recomendadas">Ações Recomendadas</h2>

<p>1. <strong>Verifique a Compatibilidade de TLS 1.2</strong>: Confirme que seus sistemas, servidores e recursos que interagem com o Azure estão configurados para usar TLS 1.2 ou superior. Isso inclui revisar gateways de aplicação (como o Azure Application Gateway), appliances de rede e quaisquer outros pontos que possam utilizar versões legadas do TLS.</p>

<p>2. <strong>Atualize ou Migre</strong>: Caso seus recursos ainda dependam de TLS 1.0 ou 1.1, é fundamental fazer a transição para o TLS 1.2 ou superior antes de 31 de outubro de 2024. Esse processo pode envolver atualizações de software ou reconfigurações em appliances de rede e servidores.</p>

<p>3. <strong>Teste suas Aplicações e Infraestrutura</strong>: Além de confirmar que os recursos suportam TLS 1.2, é importante testar suas aplicações e infraestrutura para garantir que elas continuarão funcionando corretamente após a migração.</p>

<h2 id="como-verificar-se-seus-recursos-estao-usando-tls-inferior-a-12">Como Verificar se Seus Recursos Estão Usando TLS Inferior a 1.2</h2>

<p>Se você possui recursos no Azure que interagem com serviços da Microsoft, é fundamental verificar se eles estão configurados para usar TLS 1.2. Abaixo, segue um resumo de como identificar a versão de TLS em uso para alguns dos principais recursos do Azure.</p>
<a href="https://jamescook.dev/azure-tls-end-of-support-2024#heading-storage-accounts" target="_blank" rel="noopener noreferrer">Referência</a>
<h3 id="1-storage-accounts">1. Storage Accounts</h3>

<p>Para verificar a versão mínima de TLS em Storage Accounts:</p>

<ul>
<li>Acesse a conta de armazenamento no portal do Azure.</li>
<li>No menu lateral, selecione <strong>Configurações</strong>.</li>
<li>Localize a seção <strong>Versão mínima de TLS</strong>.</li>
</ul>

<h3 id="2-web-apps">2. Web Apps</h3>

<p>Para verificar em Web Apps:</p>

<ul>
<li>Selecione o recurso de Web App.</li>
<li>Vá até <strong>Configurações</strong> e, em seguida, selecione <strong>Configurações gerais</strong>.</li>
<li>Procure por <strong>Versão mínima de TLS de entrada</strong>.</li>
</ul>

<h3 id="3-sql-managed-instance">3. SQL Managed Instance</h3>

<p>Para verificar em SQL Managed Instance:</p>

<ul>
<li>Selecione o recurso SQL Managed Instance.</li>
<li>Acesse <strong>Configurações</strong> > <strong>Rede</strong>.</li>
<li>Localize a <strong>Versão mínima de TLS</strong>.</li>
</ul>

<h3 id="4-azure-database-for-postgresql">4. Azure Database for PostgreSQL</h3>

<p>Para verificar em Azure Database for PostgreSQL:</p>

<ul>
<li>Selecione o recurso Azure Database for PostgreSQL.</li>
<li>Acesse <strong>Segurança de conexão</strong> no menu lateral.</li>
<li>Localize a <strong>Versão mínima de TLS</strong>.</li>
</ul>

<h3 id="5-azure-cosmos-db">5. Azure Cosmos DB</h3>

<p>Para verificar em Azure Cosmos DB:</p>

<ul>
<li>Acesse o recurso Azure Cosmos DB.</li>
<li>No menu lateral, selecione <strong>Rede</strong> > <strong>Conectividade</strong>.</li>
<li>Verifique o campo <strong>Protocolo de Segurança de Camada de Transporte Mínimo</strong>.</li>
</ul>

<h3 id="6-function-apps">6. Function Apps</h3>

<p>Para verificar em Function Apps:</p>

<ul>
<li>Selecione o recurso Function App.</li>
<li>Vá até <strong>Configurações</strong> e depois para <strong>Configurações Gerais</strong>.</li>
<li>Localize <strong>Versão mínima de TLS de entrada</strong>.</li>
</ul>

<h2 id="consideracoes-importantes">Considerações Importantes</h2>

<p>Antes de migrar para TLS 1.2 ou superior, é importante considerar os seguintes pontos:</p>

<ul>
<li><strong>Conectividade</strong>: Verifique a compatibilidade dos sistemas que utilizam o recurso. Alguns clientes ou sistemas legados podem não suportar TLS 1.2.</li>
</ul>

<ul>
<li><strong>Testes em Ambientes Controlados</strong>: Realize testes em ambientes de desenvolvimento ou teste para garantir que a migração para TLS 1.2 não causará impactos inesperados.</li>
</ul>

<ul>
<li><strong>Compatibilidade com Software Antigo</strong>: Alguns softwares ou sistemas legados podem não suportar TLS 1.2, exigindo atualizações ou reconfigurações adicionais.</li>
</ul>

<ul>
<li><strong>Configurações Personalizadas de TLS</strong>: Verifique se há configurações personalizadas de TLS nos seus recursos que possam precisar de ajustes.</li>
</ul>

<h2 id="como-verificar-o-ambiente-no-azure-em-massa">Como Verificar o ambiente no Azure em massa</h2>

<p>Se você gerencia vários recursos no Azure, pode ser demorado verificar a versão de TLS manualmente em cada um deles. No entanto, utilizando ferramentas como o <strong>Azure Resource Graph</strong> e o <strong>Log Analytics</strong>, você pode executar consultas que facilitam esse processo.</p>

<h3 id="o-que-e-o-azure-resource-graph">O que é o Azure Resource Graph?</h3>

<p>O <a href="https://learn.microsoft.com/pt-br/azure/governance/resource-graph/overview" target="_blank" rel="noopener noreferrer">Azure Resource Graph</a> é uma ferramenta poderosa para realizar consultas sobre seus recursos no Azure, permitindo que você execute pesquisas eficientes e rápidas em todos os recursos distribuídos em diferentes assinaturas. Ele facilita a visualização de metadados, como o tipo de recurso, a localização e, neste caso, a versão mínima de TLS em uso.</p>

<p>Com o Azure Resource Graph, você pode fazer consultas que identificam rapidamente quais recursos ainda estão utilizando TLS 1.0 ou 1.1 e precisam ser atualizados. Isso pode ser aplicado em diversos serviços do Azure, como Application Gateways, App Services, Storage Accounts, SQL Servers, Key Vaults, entre outros.</p>

<h3 id="exemplo-de-consultas">Exemplo de Consultas</h3>

<h4>Verificar Todos os Recursos com Versões de TLS Abaixo de 1.2</h4>

<p>Esta consulta identifica diferentes tipos de recursos e verifica se eles estão utilizando versões antigas de TLS:</p>

<div data-lang="bash"><pre><code>resources
| where type in (
    "microsoft.keyvault/vaults",
    "microsoft.storage/storageaccounts",
    "microsoft.web/sites",
    "microsoft.sql/servers",
    "microsoft.network/applicationgateways",
    "microsoft.apimanagement/service",
    "microsoft.containerregistry/registries",
    "microsoft.cdn/profiles"
)
| extend minTlsVersion = case(
    type == "microsoft.keyvault/vaults", properties.properties.minimumTlsVersion,
    type == "microsoft.storage/storageaccounts", properties.minimumTlsVersion,
    type == "microsoft.web/sites", properties.siteConfig.minTlsVersion,
    type == "microsoft.sql/servers", properties.minimalTlsVersion,
    type == "microsoft.network/applicationgateways", properties.sslPolicy.minProtocolVersion,
    type == "microsoft.apimanagement/service", properties.customProperties["Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Tls10"],
    type == "microsoft.containerregistry/registries", properties.policies.trust.minTlsVersion,
    type == "microsoft.cdn/profiles", properties.deliveryPolicy.minTlsVersion,
    "Unknown"
)
| where isnotempty(minTlsVersion) and minTlsVersion != "Unknown" and minTlsVersion !contains "1.2"
| project name, type, resourceGroup, subscriptionId, minTlsVersion
| sort by type, name</code></pre></div>

<h4>Verificação em Contas de Armazenamento</h4>

<div data-lang="bash"><pre><code>resources
| where type == "microsoft.storage/storageaccounts"
| extend minTlsVersion = properties.minimumTlsVersion
| where isnotempty(minTlsVersion) and minTlsVersion !contains "1.2"
| project name, resourceGroup, subscriptionId, minTlsVersion</code></pre></div>

<h4>Verificação em Web Apps</h4>

<div data-lang="bash"><pre><code>AppServiceResources
| where type =~ 'microsoft.web/sites/config'
| project id, name, minTlsVersion = properties.MinTlsVersion
| where isnotempty(minTlsVersion)</code></pre></div>

<h4>Verificação em Azure Cosmos DB</h4>

<div data-lang="bash"><pre><code>resources
| where type == "microsoft.documentdb/databaseAccounts"
| extend minTlsVersion = properties.minimalTlsVersion
| where isnotempty(minTlsVersion) and minTlsVersion !contains "1.2"
| project name, resourceGroup, subscriptionId, minTlsVersion</code></pre></div>
<p>Essas consultas podem ser adaptadas para incluir outros tipos de recursos e ajudar a garantir que toda a sua infraestrutura do Azure esteja em conformidade com os novos requisitos de segurança.</p>

<h2 id="utilizando-o-azure-monitor-para-monitorar-versoes-tls">Utilizando o Azure Monitor para Monitorar Versões TLS</h2>

<p>Além do Azure Resource Graph, o Azure Monitor pode ser utilizado para monitorar as versões de TLS em uso em tempo real.</p>

<h3 id="monitoramento-de-tls-com-azure-monitor">Monitoramento de TLS com Azure Monitor</h3>

<p>Para garantir que seus recursos estejam usando TLS 1.2 ou superior, você pode utilizar as consultas de logs e métricas disponíveis no Azure Monitor e no Log Analytics. O monitoramento da versão do TLS em uso é crucial, especialmente considerando a proximidade da descontinuação de versões mais antigas como o TLS 1.0 e 1.1.</p>
<a href="https://learn.microsoft.com/en-us/azure/key-vault/general/monitor-key-vault#sample-kusto-queries" target="_blank" rel="noopener noreferrer">Referência</a>

<h3 id="identificar-clientes-usando-tls-inferior-a-12">Identificar Clientes Usando TLS Inferior a 1.2</h3>

<p>Essa consulta mostra requisições ao Key Vault feitas com uma versão de TLS inferior a 1.2 nos últimos 90 dias:</p>

<div data-lang="bash"><pre><code>AzureDiagnostics
| where TimeGenerated &gt; ago(90d)
| where ResourceProvider == "MICROSOFT.KEYVAULT"
| where isnotempty(tlsVersion_s) and strcmp(tlsVersion_s, "TLS1_2") &lt; 0
| project TimeGenerated, Resource, OperationName, requestUri_s, CallerIPAddress, OperationVersion, clientInfo_s, tlsVersion_s
| sort by TimeGenerated desc</code></pre></div>

<h2 id="verificando-recursos-via-powershell">Verificando Recursos via PowerShell</h2>

<p>Se preferir usar PowerShell para verificar a versão do TLS em seus recursos, você pode usar o seguinte comando:</p>
<a href="https://stackoverflow.com/questions/77559639/what-azure-resources-uses-tls" target="_blank" rel="noopener noreferrer">Referência</a>

<div data-lang="powershell"><pre><code>Install-Module -Name Az.ResourceGraph
Connect-AzAccount
Search-AzGraph -Query "Resources | where properties.minimumTlsVersion == 'TLS1_2' | project name, type, properties.minimumTlsVersion"</code></pre></div>

<p>Esse comando retorna uma lista de recursos que já estão configurados para usar TLS 1.2.</p>

<h2 id="conclusao">Conclusão</h2>

<p>Embora a Microsoft tenha declarado que suas implementações de TLS 1.0 e 1.1 não apresentam vulnerabilidades conhecidas, a mudança para TLS 1.2 oferece uma série de vantagens, especialmente em termos de segurança. A transição para uma versão mais segura do TLS é essencial para evitar interrupções e garantir que seus dados estejam devidamente protegidos.</p>

<p>Portanto, não deixe para a última hora. Avalie suas dependências no TLS agora e inicie o processo de migração para evitar problemas com a mudança em outubro de 2024.</p>

<p>Se precisar de suporte técnico, a Microsoft oferece recursos como a comunidade Microsoft Q&A, além de opções de suporte formal para quem possui um plano de suporte ativo.</p>


<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Logo2.png">

]]></content:encoded>
    </item>
    <item>
      <title>Como Configurar um WSL de Respeito</title>
      <link>https://www.orafaelferreira.com/artigos/zsh</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/zsh</guid>
      <pubDate>Thu, 12 Sep 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Aprenda a montar um WSL de respeito para DevOps e SRE: Zsh com tema e plugins, ferramentas essenciais de linha de comando e aliases poderosos para o dia a dia.</description>
      <category>Artigos</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Logo2.png" length="0" type="image/png" />
      <content:encoded><![CDATA[<h2 id="introducao">Introdução</h2>

<p>Neste artigo, você vai aprender a montar um WSL de respeito, ambiente que todo DevOps, SRE ou engenheiro de plataforma deveria ter na manga. Vamos configurar o WSL com Zsh, tema e plugins, instalar ferramentas essenciais como <code>kubectx</code> e <code>kubens</code>, e configurar atalhos poderosos como o alias <code>k</code> para <code>kubectl</code>.</p>

<p>Ideal para quem vive no terminal e quer performance, praticidade.</p>

<h2 id="parte-1-shell-zsh-com-estilo-e-produtividade">Parte 1 – Shell Zsh com estilo e produtividade</h2>

<h3 id="passo-1-verificar-se-o-zsh-ja-esta-instalado">Passo 1: Verificar se o Zsh já está instalado</h3>

<div data-lang="bash"><pre><code>zsh --version</code></pre></div>

<h3 id="passo-2-instalar-o-zsh">Passo 2: Instalar o Zsh</h3>

<div data-lang="bash"><pre><code>sudo apt install zsh -y</code></pre></div>

<h3 id="passo-3-mudar-o-shell-padrao-para-zsh">Passo 3: Mudar o shell padrão para Zsh</h3>

<div data-lang="bash"><pre><code>chsh -s /bin/zsh</code></pre></div>

<h3 id="passo-3-reiniciar-o-terminal">Passo 3: Reiniciar o terminal</h3>
<p>Feche e reabra seu terminal.</p>

<h3 id="passo-4-instalar-oh-my-zsh">Passo 4: Instalar Oh My Zsh</h3>

<div data-lang="bash"><pre><code>sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"</code></pre></div>

<h3 id="passo-5-clonar-o-tema-dracula-para-zsh">Passo 5: Clonar o tema Dracula para Zsh</h3>
<div data-lang="bash"><pre><code>git clone https://github.com/dracula/zsh.git</code></pre></div>

<h3 id="passo-6-criar-um-link-simbolico-para-o-tema">Passo 6: Criar um link simbólico para o tema</h3>
<p>Após clonar o repositório, crie um link simbólico para o tema na pasta de temas do Oh My Zsh:</p>

<div data-lang="bash"><pre><code>ln -s $PWD/zsh/dracula.zsh-theme ~/.oh-my-zsh/themes/dracula.zsh-theme</code></pre></div>

<h3 id="passo-7-configurar-o-tema-no-zsh">Passo 7: Configurar o tema no Zsh</h3>
<p>Edite o arquivo de configuração do Zsh:</p>

<div data-lang="bash"><pre><code>vim ~/.zshrc</code></pre></div>

<p>Altere a linha que começa com ZSH_THEME= para:</p>

<div data-lang="bash"><pre><code>ZSH_THEME="dracula"</code></pre></div>

<h3 id="passo-8-instalar-plugins">Passo 8: Instalar Plugins</h3>
<p>Instale os plugins úteis com os seguintes comandos:</p>

<p>a) zsh-autosuggestions</p>

<div data-lang="bash"><pre><code>git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions</code></pre></div>

<p>b) zsh-syntax-highlighting</p>
<div data-lang="bash"><pre><code>git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting</code></pre></div>

<h3 id="passo-9-adicionar-os-plugins-ao-zsh">Passo 9: Adicionar os plugins ao Zsh</h3>
<p>Abra o arquivo ~/.zshrc novamente:</p>

<div data-lang="bash"><pre><code>vim ~/.zshrc</code></pre></div>

<p>Adicione os plugins que você instalou na linha plugins=(...):</p>

<div data-lang="bash"><pre><code>plugins=(git zsh-autosuggestions zsh-syntax-highlighting)</code></pre></div>

<h3 id="passo-10-aplicar-as-mudancas">Passo 10: Aplicar as mudanças</h3>
<p>Após fazer as alterações, salve e feche o editor. Aplique as mudanças com:</p>

<div data-lang="bash"><pre><code>source ~/.zshrc</code></pre></div>

<h3 id="passo-11-verificar-se-tudo-esta-funcionando">Passo 11: Verificar se tudo está funcionando</h3>
<p>Reinicie o terminal e verifique se o tema Dracula e os plugins estão funcionando corretamente.</p>

<h2 id="parte-2-kubernetes-com-classe-kubectx-kubens-e-alias-k">Parte 2 – Kubernetes com classe: kubectx, kubens e alias <code>k</code></h2>

<h3 id="instalar-kubectx-e-kubens">Instalar <code>kubectx</code> e <code>kubens</code></h3>

<div data-lang="bash"><pre><code>mkdir -p ~/.local/bin
git clone https://github.com/ahmetb/kubectx.git ~/.local/bin/kubectx

sudo ln -sf ~/.local/bin/kubectx/kubectx /usr/local/bin/kubectx
sudo ln -sf ~/.local/bin/kubectx/kubens /usr/local/bin/kubens</code></pre></div>

<p>Autocomplete para kubectx e kubens no Zsh</p>
<div data-lang="bash"><pre><code>mkdir -p ~/.oh-my-zsh/completions

cp ~/.local/bin/kubectx/completion/_kubectx.zsh ~/.oh-my-zsh/completions/_kubectx
cp ~/.local/bin/kubectx/completion/_kubens.zsh ~/.oh-my-zsh/completions/_kubens
</code></pre></div>

<p>Edite e adicione no final do arquivo ~/.zshrc:</p>
<div data-lang="bash"><pre><code>fpath+=("$HOME/.oh-my-zsh/completions")

autoload -Uz compinit
compinit</code></pre></div>

<p>Recarregar o Zsh</p>
<div data-lang="bash"><pre><code>exec zsh</code></pre></div>

<p>Criar o alias k para kubectl com autocomplete</p>
<p>Adicione no ~/.zshrc:</p>
<div data-lang="bash"><pre><code>alias k="kubectl"</code></pre></div>

<p>E recarregue:</p>
<div data-lang="bash"><pre><code>source ~/.zshrc</code></pre></div>

<p>Pronto! Com autocomplete e velocidade. O terminal nunca mais será o mesmo.</p>


<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Logo2.png">

]]></content:encoded>
    </item>
    <item>
      <title>Minha Experiência na Codecon Summit: Um Evento Para Devs e Por Devs</title>
      <link>https://www.orafaelferreira.com/artigos/codecon</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/codecon</guid>
      <pubDate>Wed, 11 Sep 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>No último dia 07/09/2024, tive a oportunidade de participar da Codecon Summit, um dos maiores eventos de tecnologia voltados para desenvolvedores.</description>
      <category>Registro Eventos Presenciais</category>
      <category>Comunidade</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/codecon/1.jpg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[
<p>No último dia 07/09/2024, tive a oportunidade de participar da <a href="https://codecon.dev/summit/programacao" target="_blank" rel="noopener noreferrer">Codecon Summit</a>, um dos maiores eventos de tecnologia voltados para desenvolvedores. Se você já esteve em um evento organizado por devs e para devs, sabe que a experiência é sempre enriquecedora, com uma abundância de conteúdo técnico de alto nível.</p>

<p>A Codecon se destaca não apenas como um espaço de aprendizado, mas também como um ambiente de conexão, troca de experiências e um verdadeiro festival de ideias. O formato descontraído do evento nos faz sentir como se estivéssemos em um grande festival, mas com uma imersão total em tecnologia.</p>

<h3 id="o-que-aconteceu-no-evento">O Que Aconteceu no Evento?</h3>

<h4>Manhã: Explorando os Stands e Conectando com a Comunidade</h4>

<p>Começamos o dia explorando os diversos stands do evento. Você sentia no ar uma vibe contagiante, e cada stand trazia uma temática única, onde empresas e comunidades de tecnologia ofereceram atividades interativas e muita informação sobre suas soluções e ferramentas.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/codecon/entra.mp4" alt="Vídeo da entrada da Codecon Summit 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/codecon/1.jpg" alt="Stands das empresas e comunidades na Codecon Summit" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/codecon/2.jpg" alt="Participantes explorando os stands do evento" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/codecon/3.jpg" alt="Ativação de uma comunidade de tecnologia na Codecon Summit" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/codecon/4.jpg" alt="Rafael Ferreira visitando os stands da Codecon Summit" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/codecon/5.jpg" alt="Brindes e desafios oferecidos nos stands do evento" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/codecon/6.jpg" alt="Público circulando pelo espaço da Codecon Summit 2024" />


<p>Além de conhecer novas tecnologias, houve várias oportunidades de diversão, brindes e desafios, incluindo a famosa "caça ao pato", uma das atividades mais comentadas do evento. 🦆 Os participantes que conseguissem coletar o pato, podiam levar ele embora, tornando o evento único. Foi uma excelente maneira de quebrar o gelo e iniciar conexões com outros participantes.</p>

<p>O networking aconteceu de forma natural, com os participantes entusiasmados e dispostos a compartilhar suas experiências. Para mim, essa foi uma das partes mais gratificantes do evento, conhecer pessoas que compartilham a mesma paixão pela tecnologia e descobrir soluções inovadoras através das conversas informais.</p>

<h4>Tarde: Palestras e Painéis Inspiradores</h4>

<p>Após uma manhã repleta de interações nos stands, a tarde foi dedicada a conteúdo técnico de altíssima qualidade. Abaixo, destaco as principais palestras e painéis que pude acompanhar:</p>

<ul>
<li><strong>Painel: Skip Level – De Júnior para Pleno e de Pleno para Sênior</strong> (14:30 - 15:30)</li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/codecon/7.jpg" alt="Painel Skip Level sobre evolução de carreira dev" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/codecon/8.jpg" alt="Palestrantes do painel Skip Level no palco da Codecon" />
<ul>
<li><strong>Painel: Tendências em IA e o Impacto no Desenvolvimento de Software</strong> (15:30 - 16:30)</li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/codecon/9.jpg" alt="Painel sobre tendências em IA e desenvolvimento de software" />
<ul>
<li><strong>Construindo Soluções Flexíveis e Escaláveis com Arquitetura Orientada a Eventos</strong> (16:30 - 17:30)</li>
</ul>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/codecon/10.jpg" alt="Palestra sobre arquitetura orientada a eventos na Codecon" /> 
<ul>
<li><strong>Como Vídeos Funcionam: Pipeline de Streaming com FFMpeg e Serverless</strong> (17:30 - 18:30)</li>
</ul>

<p>Esses momentos foram essenciais para aprofundar conhecimentos em áreas cruciais para o desenvolvimento de software moderno, com ênfase em escalabilidade, inteligência artificial e arquitetura de sistemas.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/codecon/11.jpg" alt="Palestra sobre pipeline de streaming com FFMpeg e serverless" /> 

<h3 id="reflexoes-finais">Reflexões Finais</h3>

<p>A Codecon Summit vai além do aprendizado técnico, é também sobre construir conexões e fazer parte da comunidade de tecnologia comprometidos com a inovação. As interações matinais nos stands e o conteúdo técnico das palestras me reforçaram a importância de estar conectado à comunidade e de manter o aprendizado contínuo.</p>

<p>Se você está em busca de uma oportunidade para se atualizar sobre as últimas tendências no desenvolvimento de software e conhecer pessoas incríveis da área, não pode perder a próxima edição da Codecon. E se você também esteve presente nesta edição, que tal continuarmos essa conversa? O que achou do evento?</p>

<ul>
<li><i></i> <a href="hhttps://www.linkedin.com/posts/rafaelmaferreira_codecon-desenvolvimento-microservices-activity-7238878836468133888-Ypt6?utm_source=share&utm_medium=member_desktop"><strong>Post Linkedin</strong></a></li>
</ul>

<p>---</p>

]]></content:encoded>
    </item>
    <item>
      <title>Curso DP-900 Fundamentos de Dados do Azure 2024</title>
      <link>https://www.orafaelferreira.com/artigos/curso-dp-900</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/curso-dp-900</guid>
      <pubDate>Mon, 02 Sep 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Relato do curso DP-900 Fundamentos de Dados do Azure ministrado para a comunidade Azure Floripa em agosto de 2024: conteúdo, dinâmica do dia e agradecimentos.</description>
      <category>Organização de Eventos</category>
      <category>Certificações</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dp-900/1.jpeg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[
<p>No último sábado, 31 de agosto de 2024, a comunidade técnica Azure Floripa se reuniu na Igreja Batista de Forquilhinhas para um dia de aprendizado e colaboração com o curso <strong>DP-900: Fundamentos de Dados do Azure</strong>. Parabenizamos todos os participantes pelo incrível engajamento e dedicação ao longo do evento!</p>

<ul>
<li><i></i> <strong>Saiba mais:</strong> <a href="https://www.eventbrite.com.br/e/curso-dp-900-em-sao-josesc-tickets-947904667377" target="_blank" rel="noopener noreferrer">Curso DP-900 Em São José/SC</a></li>
</ul>

<ul>
<li><i></i> <a href="https://www.linkedin.com/posts/rafaelmaferreira_curso-dp-900-em-s%C3%A3o-jos%C3%A9sc-activity-7221484277182402560-mdRO?utm_source=share&utm_medium=member_desktop" target="_blank" rel="noopener noreferrer"><strong>Post Linkedin</strong></a></li>
</ul>

<ul>
<li><i></i> <strong>Slides da Apresentação:</strong> Utilizado Material Oficial da Microsoft fornecido para MCT's.</li>
</ul>

<h2 id="explorando-os-fundamentos-de-dados-na-nuvem-com-a-azure-floripa">Explorando os Fundamentos de Dados na Nuvem com a Azure Floripa</h2>

<p>O curso <strong>DP-900</strong>, também conhecido como "Microsoft Azure Data Fundamentals", proporcionou uma imersão prática e teórica no universo dos dados na nuvem. Com o objetivo de atender tanto profissionais de TI quanto iniciantes na gestão de dados, o curso ofereceu uma base sólida sobre os principais conceitos de dados no Azure, preparando os alunos para o exame de certificação DP-900.</p>

<h2 id="aprendizado-com-especialistas-reconhecidos">Aprendizado com Especialistas Reconhecidos</h2>

<p>O evento contou com a presença de dois renomados especialistas, ambos membros ativos da comunidade Azure Floripa:</p>

<p>👨‍🏫 <a href="https://www.linkedin.com/in/cfraposo/" target="_blank" rel="noopener noreferrer">Cláudio Raposo</a> - Microsoft MVP e Microsoft Certified Trainer, trouxe mais de uma década de experiência em desenvolvimento de software, compartilhando insights valiosos sobre análise de sistemas e melhores práticas de desenvolvimento.</p>

<p>👨‍🏫 <a href="https://www.linkedin.com/in/orafaelferreiraa/" target="_blank" rel="noopener noreferrer">Rafael Martin Alves Ferreira</a> (eu) - Microsoft MVP e Microsoft Certified Trainer, com vasta experiência em arquiteturas de nuvem Azure, ofereceu uma visão aprofundada sobre a transformação digital e soluções inovadoras em nuvem.</p>

<h2 id="engajamento-e-colaboracao-da-comunidade-azure-floripa">Engajamento e Colaboração da Comunidade Azure Floripa</h2>

<p>Durante o curso, os participantes exploraram tópicos como dados relacionais e não relacionais, big data, análise de dados, e os principais serviços de dados no Azure, como <strong>Azure SQL Database</strong>, <strong>Azure Cosmos DB</strong>, <strong>Azure Data Lake Storage</strong> e <strong>Azure Synapse Analytics</strong>. As sessões foram dinâmicas e interativas, com discussões e trocas de ideias que enriqueceram o aprendizado.</p>

<p>O entusiasmo e a dedicação de todos foram notáveis, reafirmando o compromisso da comunidade Azure Floripa com o crescimento profissional e o compartilhamento de conhecimentos.</p>

<h2 id="proximos-passos-e-agradecimentos">Próximos Passos e Agradecimentos</h2>

<p>Agradecemos a todos os participantes pelo engajamento. Vocês não apenas participaram, mas contribuíram significativamente para o sucesso do evento. Este curso foi apenas o início, e esperamos vê-los aplicando esses conhecimentos em seus projetos e avançando em suas carreiras.</p>

<p>Fiquem atentos aos próximos eventos e oportunidades de aprendizado promovidos pela Azure Floripa. Continuaremos a fortalecer nossa comunidade técnica por meio de encontros que visam a troca de conhecimento e o crescimento coletivo.</p>

<strong>Juntos, Construímos o Futuro da Tecnologia com a Azure Floripa</strong>

<p>Nosso sincero agradecimento aos instrutores, participantes e a todos que contribuíram para o sucesso deste evento. É por meio de encontros como este que fortalecemos nossos laços como comunidade e nos preparamos para os desafios do futuro.</p>

<p>Até o próximo evento!</p>


<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dp-900/1.jpeg" alt="Turma do curso DP-900 reunida na Igreja Batista de Forquilhinhas" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dp-900/2.jpeg" alt="Rafael Ferreira ministrando o curso DP-900 para a comunidade Azure Floripa" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dp-900/3.jpeg" alt="Participantes acompanhando a aula de Fundamentos de Dados do Azure" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dp-900/4.jpeg" alt="Slides do curso DP-900 exibidos no telão" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dp-900/5.jpeg" alt="Alunos praticando conceitos de dados do Azure durante o curso" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dp-900/6.jpeg" alt="Momento de interação entre instrutor e participantes do DP-900" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dp-900/8.jpeg" alt="Foto oficial dos participantes do curso DP-900 Azure Floripa" />

<img src="https://stoblobcertificados011.blob.core.windows.net/certificados/2024-09-Instrutor-dp-900.jpeg" alt="Certificado de instrutor do curso DP-900 em setembro de 2024" />

]]></content:encoded>
    </item>
    <item>
      <title>Estratégias de Modernização de Aplicações: Aplicando os 6Rs com o Cloud Adoption Framework</title>
      <link>https://www.orafaelferreira.com/artigos/6rs</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/6rs</guid>
      <pubDate>Sun, 11 Aug 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>A modernização de aplicações na nuvem é extremamente importante para que as organizações maximizem suas capacidades oferecidas pela computação em nuvem.</description>
      <category>Artigos</category>
      <category>Azure</category>
      <category>Cloud Foundation</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/6rs/1.png" length="0" type="image/png" />
      <content:encoded><![CDATA[<h2 id="introducao">Introdução</h2>

<p>A modernização de aplicações na nuvem é extremamente importante para que as organizações maximizem suas capacidades oferecidas pela computação em nuvem. No contexto do Microsoft Azure, as estratégias de modernização podem ser categorizadas em quatro grandes abordagens: <strong>Innovate</strong>, <strong>Migrate</strong>, <strong>Modernize</strong> e <strong>Retire</strong>. Cada uma dessas abordagens oferece diferentes caminhos para otimizar, reestruturar ou descontinuar aplicações, de acordo com as necessidades específicas de negócios e tecnologia. Neste artigo, exploraremos essas estratégias detalhadamente, utilizando o framework dos 6Rs como base para a tomada de decisões.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/6rs/1.png" alt="Visão geral das estratégias de modernização do Cloud Adoption Framework" />

<h3 id="1-innovate">1. Innovate</h3>

<strong>Inovar na nuvem</strong> vai além da simples migração de aplicações existentes. Trata-se de reimaginar e reconstruir aplicações para explorar as capacidades e possibilidades únicas que a nuvem oferece. A inovação envolve transformações profundas, como a reestruturação da arquitetura ou até a reconstrução completa das aplicações. As abordagens dentro da categoria <strong>Innovate</strong> incluem:

<h4>Rearchitect (Rearquitetar):</h4>

<p>Rearquitetar consiste em uma reestruturação significativa da arquitetura da aplicação, visando otimizar seu desempenho e funcionalidade no ambiente de nuvem. Esse processo pode envolver a adoção de abordagens modernas, como microsserviços, computação serverless e arquiteturas orientadas a eventos. Essas abordagens melhoram a escalabilidade granular e aumentam a resiliência da aplicação, permitindo que ela responda de forma eficiente a variações de demandas e falhas.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/6rs/Rearchitect.png" alt="Diagrama da estratégia Rearchitect de modernização de aplicações" />

<strong>Quando usar Rearquitetar:</strong>

<ul>
<li><strong>Alta Escalabilidade e Resiliência:</strong> Use quando a aplicação precisa escalar e resistir a variações na demanda.</li>
<li><strong>Limitações Estruturais:</strong> Quando a arquitetura atual impede a adoção de novas tecnologias ou cenários modernos.</li>
</ul>

<h4>Rebuild (Reconstruir):</h4>

<p>Reconstruir é a abordagem ideal quando a aplicação atual não pode ser adaptada para atender às necessidades futuras ou novas demandas de negócios. Ao reconstruir uma aplicação do zero utilizando, por exemplo, tecnologias cloud native, é possível introduzir novas funcionalidades, melhorar a escalabilidade e flexibilidade, e alinhar a aplicação com as melhores práticas de desenvolvimento moderno. Essa abordagem facilita a criação de soluções compatíveis com as capacidades avançadas da nuvem, como inteligência artificial (IA), machine learning e análises em tempo real.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/6rs/Rebuild.png" alt="Diagrama da estratégia Rebuild de reconstrução de aplicações" />

<strong>Quando usar Reconstruir:</strong>

<ul>
<li>Inadequação Tecnológica: Use quando a aplicação não acompanha as demandas tecnológicas atuais ou futuras.</li>
<li>Aproveitamento Máximo da Nuvem: Quando o objetivo é explorar ao máximo capacidades como IA e machine learning.</li>
</ul>

<h4>Replace (Substituir):</h4>

<p>A abordagem <strong>Replace</strong> consiste em substituir uma aplicação existente por uma solução de <strong>Software as a Service (SaaS)</strong> ou outra solução comercial pronta. Essa estratégia permite à empresa evitar os custos e o tempo envolvidos na modificação ou manutenção de uma aplicação legada, optando por uma solução que já atende de forma mais eficiente às necessidades do negócio. Ao adotar uma solução SaaS, a organização também se beneficia de atualizações contínuas, suporte especializado e a possibilidade de escalabilidade sem a complexidade de gerenciar a infraestrutura subjacente.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/6rs/Replace.png" alt="Diagrama da estratégia Replace com soluções SaaS" />

<strong>Quando usar Replace:</strong>

<ul>
<li>SaaS como Solução Ideal: Quando uma solução SaaS moderna atende melhor às necessidades do negócio e pode ser implementada facilmente.</li>
<li>Custo-Benefício: Quando os custos de manter ou modernizar a aplicação atual superam os benefícios, tornando a substituição por uma solução pronta mais econômica e estratégica.</li>
</ul>

<h4>Inovação Relacionada à Adoção da Nuvem</h4>

<p>A inovação na nuvem é um diferencial competitivo, vai além da migração ou modernização, desbloqueando novas capacidades técnicas e expandindo as possibilidades de negócios. No <strong>Cloud Adoption Framework</strong>, o foco é entender profundamente as necessidades dos clientes e criar inovações que transformem a forma como eles interagem com os produtos da empresa.</p>

<p>Para saber mais sobre o CAF, <a href="https://www.orafaelferreira.com/artigos/foundation-cloud" target="_blank" rel="noopener noreferrer">confira esse artigo</a> no meu blog.</p>

<strong>Implementação de Inovação com MVPs</strong>

<p>Uma abordagem eficaz é começar com um Produto Mínimo Viável (MVP), que é uma versão inicial de um novo recurso ou aplicação. O MVP oferece funcionalidade suficiente para coletar feedback dos usuários e validar a possibilidade da inovação. Esse processo de construir, medir e aprender permite ajustes rápidos para atender melhor às necessidades dos clientes.</p>

<h3 id="2-migrate">2. Migrate</h3>

<p>A migração para a nuvem é a maneira mais rápida de levar aplicações ao Azure, permitindo que as organizações operem na nuvem da mesma forma que estava no onpremise. Essa abordagem é especialmente vantajosa para empresas que buscam agilidade na transição, aproveitando rapidamente os benefícios da escalabilidade, flexibilidade e redução de custos operacionais, o famoso OPEX . A principal estratégia dentro da categoria <strong>Migrate</strong> é o <strong>Rehost</strong>, também conhecido como "vai do jeito que dá", traduzido do lift-and-shift.</p>

<h4>Rehost (Reospedagem):</h4>

<p>O Rehost envolve mover aplicações para a nuvem sem modificar o código ou a arquitetura existente, um exemplo prático é mover uma virtual machine do jeito que ela se encontra no onpremise para a cloud. Essa abordagem é ideal para empresas que desejam desativar rapidamente datacenters locais ou que precisam migrar urgentemente, mas cujas aplicações já atendem aos requisitos de negócios e não necessitam de mudanças significativas no curto prazo.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/6rs/Rehost.png" alt="Diagrama da estratégia Rehost de migração para a nuvem" />

<strong>Quando Usar Migrate:</strong>

<ul>
<li><strong>Migração Urgente:</strong> Move aplicações para a nuvem rapidamente, com mínima complexidade.</li>
<li><strong>Preservação de Funcionalidade:</strong> Mantém as aplicações inalteradas enquanto as transfere para a nuvem.</li>
</ul>

<h4>Visão Geral da Migração no Azure</h4>

<p>O processo de migração para o Azure é estruturado para garantir uma transição suave e eficaz, minimizando riscos e maximizando os benefícios da nuvem. A migração segue a metodologia do <strong>Cloud Adoption Framework (CAF)</strong>, dividida em quatro estágios principais: <strong>Preparação</strong>, <strong>Avaliação</strong>, <strong>Implantação</strong> e <strong>Liberação</strong>.</p>

<p>1. <strong>Preparação:</strong> Garante que todos os pré-requisitos sejam atendidos e que as equipes estejam prontas para o projeto. Inclui o alinhamento organizacional, a seleção de regiões do Azure e a preparação da infraestrutura necessária.</p>
<p>2. <strong>Avaliação:</strong> Analisa as cargas de trabalho e o ambiente existente para identificar a melhor abordagem de migração, documentando a complexidade do cenário.</p>
<p>3. <strong>Implantação:</strong> Replicação e modernização das cargas de trabalho na nuvem, preparando-as para a gestão contínua.</p>
<p>4. <strong>Liberação:</strong> Testes, otimização e liberação das cargas de trabalho para as operações, com documentação completa do processo.</p>

<h4>Ferramentas para Migração:</h4>
<div><table><thead><tr><th><strong>Ferramenta</strong></th><th><strong>Funcionalidade</strong></th><th><strong>Descrição</strong></th></tr></thead><tbody><tr><td>Migrações para Azure: Descoberta e Avaliação</td><td>Avaliar servidores locais (SQL, Web)</td><td>Avalia servidores VMware, Hyper-V e físicos para migração para o Azure.</td></tr><tr><td>Migração e Modernização</td><td>Migrar servidores</td><td>Migra VMs de VMware, Hyper-V, servidores físicos e VMs públicas para Azure.</td></tr><tr><td>Assistente de Migração de Dados</td><td>Avaliar bancos de dados SQL Server</td><td>Avalia e identifica bloqueadores e melhorias para migração de SQL Server.</td></tr><tr><td>Serviço de Migração de Banco de Dados do Azure</td><td>Migrar bancos de dados</td><td>Migra bancos de dados locais para SQL Server no Azure.</td></tr><tr><td>Migration Assistant de Aplicativo Web</td><td>Avaliar e migrar aplicativos Web</td><td>Avalia e migra aplicativos .NET e PHP para o Serviço de Aplicativo do Azure.</td></tr><tr><td>Azure Data Box</td><td>Migrar dados offline</td><td>Transfere grandes volumes de dados offline para o Azure.</td></tr></tbody></table></div>

<h3 id="3-modernize">3. Modernize</h3>

<p>Modernizar aplicações é um algo fundamental para extrair o máximo valor dos recursos nativos da nuvem. Diferente de uma simples migração, a modernização envolve ajustes na arquitetura ou na plataforma da aplicação, sem necessidade de reestruturação completa. A principal abordagem dentro da categoria <strong>Modernize</strong> é o <strong>Replatform</strong>.</p>

<h4>Replatform (Replataforma):</h4>

<p>O Replatform envolve pequenas alterações na aplicação para que ela execute de maneira mais eficiente no ambiente de nuvem. Isso pode incluir a migração de um banco de dados para uma solução gerenciada ou a adaptação da infraestrutura para utilizar serviços de Plataforma como Serviço (PaaS). Essa abordagem melhora a eficiência operacional e reduz o custo total de propriedade (TCO), mantendo a integridade das funcionalidades principais.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/6rs/Replatform.png" alt="Diagrama da estratégia Replatform com serviços gerenciados" />

<strong>Quando Usar Modernize:</strong>

<ul>
<li><strong>Aproveitamento de Recursos Nativos da Nuvem:</strong> Quando a aplicação pode se beneficiar significativamente dos recursos nativos da nuvem, como serviços gerenciados e automação, sem grandes mudanças estruturais.</li>
<li><strong>Foco em Eficiência e Redução de Custos:</strong> Quando o objetivo principal é melhorar a eficiência operacional e reduzir o TCO, aproveitando os serviços gerenciados da nuvem.</li>
</ul>

<h4>Modernização na Nuvem: Uma Abordagem Estruturada</h4>

<p>A modernização é estruturada em duas fases principais:</p>

<p>1. <strong>Alinhamento de Negócios:</strong> Identifica as cargas de trabalho que mais irão se beneficiar da modernização e estabelece um roteiro detalhado para alcançar esses objetivos.</p>
<p>2. <strong>Estratégias de Modernização:</strong> Adota novas tecnologias e metodologias, como DevOps e PaaS, para aprimorar processos, aplicativos e bancos de dados.</p>

<strong>Benefícios da Modernização:</strong>

<ul>
<li><strong>Maximização da Produtividade:</strong> Libera as equipes para focarem na inovação, reduzindo a sobrecarga de gerenciamento.</li>
<li><strong>Redução de Custos:</strong> Adotar soluções PaaS e modernizar processos operacionais, diminuindo os custos de manutenção de infraestrutura.</li>
<li><strong>Aumento da Agilidade:</strong> Agiliza a resposta às mudanças de mercado, permitindo lançamentos rápidos de novas funcionalidades.</li>
</ul>

<h4>Implementação de PaaS para Modernização</h4>

<p>A modernização pode ser realizada através de várias soluções de PaaS, cada uma oferecendo um equilíbrio diferente entre controle e produtividade:</p>

<ul>
<li><strong>Container PaaS:</strong> Como o Azure Kubernetes Service (AKS) e Azure Red Hat OpenShift, oferecem maior controle sobre cargas de trabalho, gerenciando todo o cluster, manutenção e implementação.</li>
</ul>

<ul>
<li><strong>Application PaaS:</strong> Recursos como Azure App Service, Azure Spring Cloud e Azure Functions proporcionam um facilidade entre controle e produtividade, onde a plataforma gerencia a disponibilidade e a implementação.</li>
</ul>

<ul>
<li><strong>Low/No Code PaaS:</strong> Ferramentas como Power Apps e Power Automate permitem a construção rápida de aplicações com pouca ou nenhuma codificação, maximizando a produtividade e o tempo de mercado.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/6rs/3.png" alt="Opções de PaaS no Azure para modernização de aplicações" />

<p>Se ainda estiver em dúvida, confira a árvore de decisões abaixo para identificar qual serviço de computação na Azure melhor atende às suas necessidades</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/6rs/4.png" alt="Árvore de decisão para escolha do serviço de computação no Azure" />

<h4>Modernização de Bancos de Dados na Nuvem</h4>

<p>A modernização de bancos de dados pode melhorar significativamente a forma como você armazena, processa e utiliza dados. O objetivo é aumentar a confiabilidade, o desempenho e reduzir custos. Existem soluções de <strong>PaaS</strong> e <strong>IaaS</strong> disponíveis para modernizar qualquer tipo de banco de dados na nuvem.</p>

<strong>Categorias de Soluções de Banco de Dados:</strong>

<ul>
<li><strong>Azure SQL</strong>: Soluções para SQL Server e outros bancos de dados SQL de código fechado.</li>
<li><strong>Open-source e NoSQL</strong>: Soluções para bancos de dados SQL de código aberto e NoSQL.</li>
</ul>

<p>Cada categoria de banco de dados oferece três soluções: duas de <strong>PaaS</strong> e uma de <strong>IaaS</strong>. Essas opções permitem um equilíbrio entre controle e produtividade, suportando diferentes origens de bancos de dados.</p>

<strong>Azure SQL:</strong>

<ul>
<li><strong>SQL Server em máquinas virtuais (IaaS)</strong></li>
<li><strong>Azure SQL Managed Instance (PaaS)</strong></li>
<li><strong>Banco de Dados Azure SQL totalmente gerenciado (PaaS)</strong></li>
</ul>

<strong>Open-source SQL & NoSQL:</strong>

<ul>
<li><strong>MySQL, MariaDB ou PostgreSQL em máquinas virtuais (IaaS)</strong></li>
<li><strong>Azure Cosmos DB e Azure Managed Instance para Apache Cassandra (PaaS)</strong></li>
<li><strong>Bancos de dados MySQL, MariaDB e PostgreSQL totalmente gerenciados (PaaS)</strong></li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/6rs/5.png" alt="Opções de modernização de bancos de dados no Azure" />

<h3 id="4-retire-desativar">4. Retire (Desativar)</h3>

<p>À medida que as organizações evoluem, nem todas as aplicações continuam a agregar valor. Em alguns casos, a estratégia mais eficiente é desativar ou aposentar uma aplicação. O processo de <strong>Retire</strong> envolve a desativação de aplicações que não são mais necessárias ou que foram substituídas por soluções mais modernas e eficientes. Essa abordagem simplifica a infraestrutura de TI e otimiza os recursos, redirecionando esforços e investimentos para áreas que realmente necessitam de suporte.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/6rs/retire.png" alt="Diagrama da estratégia Retire de desativação de aplicações" />

<strong>Quando usar Retire:</strong>

<ul>
<li><strong>Substituição por Alternativas Modernas:</strong> Quando a aplicação foi substituída por uma solução mais moderna que oferece maior eficiência e alinhamento com as metas de negócios.</li>
<li><strong>Manutenção Injustificável:</strong> Quando a aplicação exige um esforço de manutenção desproporcional aos benefícios que oferece.</li>
<li><strong>Redução de Complexidade:</strong> Quando a simplificação da infraestrutura é uma prioridade, aposentando sistemas legados para melhorar a agilidade da TI.</li>
</ul>

<h4>Processo de Retire: Passos para Desativação Eficiente</h4>

<p>1. <strong>Avaliação de Aplicações:</strong> Análise da relevância e do custo de manutenção da aplicação para o negócio.</p>
<p>2. <strong>Planejamento de Desativação:</strong> Documentação completa e comunicação clara com stakeholders sobre o processo de desativação.</p>
<p>3. <strong>Execução da Desativação:</strong> Realização de backups, arquivamento de dados e desativação controlada da aplicação.</p>
<p>4. <strong>Revisão Pós-Desativação:</strong> Monitoramento do ambiente após a desativação e preparação de um relatório final.</p>

<strong>Benefícios de Retirar Aplicações:</strong>

<ul>
<li><strong>Simplificação da Infraestrutura:</strong> Reduz a complexidade operacional e os custos associados.</li>
<li><strong>Otimização Financeira (FinOps):</strong> Otimiza a utilização e o custo dos recursos na nuvem.</li>
<li><strong>Sustentabilidade (GreenOps):</strong> Reduz o consumo de energia e promove práticas de TI mais verdes.</li>
</ul>

<h2 id="conclusao">Conclusão</h2>

<p>A modernização de aplicações na nuvem é um processo que exige uma análise cuidadosa de cada aplicação em relação às necessidades do negócio e às capacidades da nuvem. As estratégias agrupadas em <strong>Innovate</strong>, <strong>Migrate</strong>, <strong>Modernize</strong> e <strong>Retire</strong> fornecem um framework flexível para orientar as decisões de modernização. Ao aplicar essas estratégias, as organizações não apenas migram para a nuvem, mas também garantem que suas aplicações estejam otimizadas para o futuro, oferecendo o máximo valor ao negócio.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/6rs/2.png" alt="Resumo dos 6Rs de modernização de aplicações na nuvem" />

<p>Este artigo oferece uma visão clara das opções disponíveis para a modernização de aplicações, auxiliando você a tomar decisões importantes e a planejar uma transição bem-sucedida para a nuvem.</p>



]]></content:encoded>
    </item>
    <item>
      <title>Guia de Criação de Máquinas Virtuais no Microsoft Azure</title>
      <link>https://www.orafaelferreira.com/artigos/guia-criacao-vms-azure</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/guia-criacao-vms-azure</guid>
      <pubDate>Fri, 26 Jul 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Guia introdutório para criar máquinas virtuais Linux e Windows no Azure, cobrindo Resource Groups, Virtual Networks, NSGs e acesso via SSH e RDP.</description>
      <category>Artigos</category>
      <category>Redes</category>
      <category>Segurança</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example1.png" length="0" type="image/png" />
      <content:encoded><![CDATA[<h2 id="introducao">Introdução</h2>

<p>Este artigo será uma base introdutória essencial para os próximos conteúdos que virão, onde exploraremos mais a fundo a criação e gerenciamento de máquinas virtuais no Microsoft Azure. Aqui, abordaremos os passos iniciais para criar máquinas virtuais tanto para Linux quanto para Windows, fornecendo um fundamento para as futuras discussões e tutoriais.</p>

<p>Criar máquinas virtuais no Microsoft Azure pode parecer uma tarefa complicada, mas com este guia passo a passo, você verá que é mais simples do que parece. Vamos explorar a criação de máquinas virtuais tanto para Linux quanto para Windows. Vamos começar!</p>

<h2 id="passo-1-criacao-do-resource-group">Passo 1: Criação do Resource Group</h2>

<p>Antes de criar qualquer recurso no Azure, precisamos de um Resource Group, que funciona como um contêiner lógico para todos os recursos relacionados. Vamos criar um Resource Group chamado <code>rg-example</code>.</p>

<p>1. Acesse o portal do Azure.</p>
<p>2. Vá para "Resource Groups" e clique em "Create".</p>
<p>3. Nomeie seu Resource Group como <code>rg-example</code>.</p>
<p>4. Selecione a região desejada.</p>
<p>5. Clique em "Review + Create" e, em seguida, "Create".</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example1.png" alt="rg-example" />

<h2 id="passo-2-criacao-da-virtual-network">Passo 2: Criação da Virtual Network</h2>

<p>A próxima etapa é criar uma Virtual Network (VNet), que permite a comunicação entre recursos do Azure.</p>

<p>1. Vá para "Virtual Networks" e clique em "Create".</p>
<p>2. Nomeie a VNet como <code>vnet-example</code>.</p>
<p>3. Selecione o Resource Group <code>rg-example</code>.</p>
<p>4. Configure o endereço IP e as sub-redes conforme necessário.</p>
<p>5. Clique em "Review + Create" e, em seguida, "Create".</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example2.png" alt="vnet-example" />

<h2 id="passo-3-criacao-da-nsg-network-security-group">Passo 3: Criação da NSG (Network Security Group)</h2>

<p>O Network Security Group (NSG) é responsável por controlar o tráfego de rede para as VMs. Vamos criar um NSG chamado <code>nsg-example</code>.</p>

<p>1. Vá para "Network Security Groups" e clique em "Create".</p>
<p>2. Nomeie o NSG como <code>nsg-example</code>.</p>
<p>3. Selecione o Resource Group <code>rg-example</code>.</p>
<p>4. Clique em "Review + Create" e, em seguida, "Create".</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example3.png" alt="nsg-example" />

<h2 id="passo-4-anexar-o-nsg-a-subnet">Passo 4: Anexar o NSG à Subnet</h2>

<p>Depois de criar o NSG, precisamos anexá-lo à Subnet <code>default</code> da nossa VNet <code>vnet-example</code>.</p>

<p>1. Acesse o NSG <code>nsg-example</code> e selecione a settings > Subnet.</p>
<p>2. Associate, selecione a subnet <code>default</code> e salve as alterações.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example19.png" alt="nsg-example" />

<h2 id="passo-5-criacao-da-virtual-machine-linux">Passo 5: Criação da Virtual Machine Linux</h2>

<p>Vamos criar a VM com nome vm-example dentro do rg-example com o tipo de segurança: Standard.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example4.png" alt="lnx-example" />

<p>1. Vá para "Virtual Machines" e clique em "Create".</p>
<p>2. Selecione o Resource Group <code>rg-example</code>.</p>
<p>3. Nomeie a VM como <code>vm-example</code>.</p>
<p>4. Altere o tipo de segurança para Standard.</p>
<p>5. Selecione "Ubuntu Server 20.04 LTS ARM64 Gen2" como a imagem.</p>
<p>6. Selecione "Arm64" como a arquitetura (para maior eficiência energética e de processamento).</p>
<p>7. Configure a VM com o tamanho <code>Standard_D2ps_v5</code>.</p>
<p>8. Escolha a autenticação por senha e defina uma senha.</p>
<p>9. Certifique-se de que a VM não tenha portas de entrada públicas configuradas.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example5.png" alt="lnx-example" />

<strong>Saiba Mais:</strong> <a href="https://azure.microsoft.com/pt-br/updates/generally-available-new-azure-virtual-machines-with-ampere-altra-armbased-processors/" target="_blank" rel="noopener noreferrer">Máquinas Virtuais do Azure com processadores baseados em Arm do Ampere Altra</a>

<p>10. Na seção "Networking", certifique-se de que a VM esteja na VNet <code>vnet-example</code> e na Subnet <code>default</code>.</p>
<p>11. Selecione "Review + Create" e, em seguida, "Create".</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example6.png" alt="lnx-example" />

<p>Após a criação, precisamos liberar a porta SSH 22 no NSG <code>nsg-example</code> para acessar a VM.</p>

<p>1. Acesse o NSG <code>nsg-example</code>.</p>
<p>2. Adicione uma regra de entrada para permitir o tráfego na porta 22.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example7.png" alt="nsg-example" />

<h3 id="conectando-se-a-vm-linux">Conectando-se à VM Linux</h3>

<p>Após a VM estar em execução verifique qual IP público foi atribuído à VM , copie o IP público e conecte-se via SSH:</p>

<div data-lang="bash"><pre><code>ssh usuario@IPX.XXX.XXX.XX</code></pre></div>
<p>No meu caso: </p>

<div data-lang="bash"><pre><code>ssh raafel@172.210.28.194</code></pre></div>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example8.png" alt="Terminal exibindo a conexão SSH com a VM Linux no Azure" />

<p>De preferência, atualize os pacotes do sistema:</p>

<div data-lang="bash"><pre><code>sudo apt-get update
sudo apt-get upgrade -y</code></pre></div>

<h2 id="criacao-da-virtual-machine-windows-11">Criação da Virtual Machine Windows 11</h2>

<p>Vamos criar uma VM com Windows 11 dentro do nosso <code>rg-example</code>, com o nome <code>vm-example-win</code>, tipo de segurança <code>Standard</code> e imagem <code>Windows 11 Pro</code>.</p>

<p>1. Vá para "Virtual Machines" e clique em "Create".</p>
<p>2. Selecione o Resource Group <code>rg-example</code>.</p>
<p>3. Nomeie a VM como <code>vm-example-win</code>.</p>
<p>4. Altere o tipo de segurança para Standard.</p>
<p>5. Selecione "Windows 11 Pro" como a imagem.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example13.png" alt="Portal do Azure com a seleção da imagem Windows 11 Pro" />

<p>6. Configure a VM com o tamanho <code>Standard_B4ms</code> para testes mais rápidos.</p>
<p>7. Escolha a autenticação por senha e defina uma senha de sua preferência (não se esqueça de anotar a senha).</p>
<p>8. Certifique-se de que a VM não tenha portas de entrada públicas configuradas. Confirme a licença.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example14.png" alt="Configuração de portas de entrada e licença da VM Windows" />

<p>9. Na seção "Networking", certifique-se de que a VM esteja na VNet <code>vnet-example</code> e na Subnet <code>default</code>, e que não seja atribuído um NSG à NIC.</p>
<p>10. Selecione "Review + Create" e, em seguida, "Create".</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example15.png" alt="Tela Review + Create da VM Windows 11 no Portal do Azure" />

<p>Após a criação, precisamos liberar a porta RDP no NSG <code>nsg-example</code> para acessar a VM.</p>

<p>1. Acesse o NSG <code>nsg-example</code>.</p>
<p>2. Adicione uma regra de entrada para permitir o tráfego na porta RDP.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example16.png" alt="Regra de entrada RDP adicionada ao NSG no Portal do Azure" />

<h3 id="conectando-se-a-vm-windows">Conectando-se à VM Windows</h3>

<p>1. No seu computador com Windows, abra o aplicativo "Remote Desktop Connection" (procure por "Remote" no menu Iniciar).</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example22.png" alt="Aplicativo Remote Desktop Connection no Windows" />

<p>2. Copie o IP público atribuído à VM <code>vm-example-win</code>, digite no Remote Desktop Connection, clique no botão conectar, escolha "Use another account", e digite o usuário e senha que foram criados anteriormente. Clique em "OK".</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example17.png" alt="Remote Desktop Connection com o IP público da VM Windows" />

<p>3. Confirme o certificado de segurança quando solicitado:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example18.png" alt="Confirmação do certificado de segurança na conexão RDP" />

<p>---</p>

<h2 id="conclusao">Conclusão</h2>

<p>Criar máquinas virtuais no Azure é um processo estruturado que envolve a criação de vários componentes, como Resource Groups, Virtual Networks e Network Security Groups. Seguindo este guia, você pode configurar rapidamente VMs Linux e Windows para atender às suas necessidades. Lembre-se de sempre garantir a segurança das suas VMs e otimizar suas configurações para o melhor desempenho.</p>

<p>A flexibilidade e o poder do Azure permitem que você adapte a infraestrutura de TI às demandas específicas do seu projeto, seja ele para desenvolvimento, teste ou produção. Utilize as práticas recomendadas para maximizar a eficiência e a segurança de suas VMs.</p>

<p>Se tiver dúvidas ou precisar de mais detalhes, não hesite em entrar em contato. Espero que este guia tenha sido útil para você!</p>]]></content:encoded>
    </item>
    <item>
      <title>Explorando a Inteligência Artificial Generativa</title>
      <link>https://www.orafaelferreira.com/artigos/ia-gen</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/ia-gen</guid>
      <pubDate>Thu, 25 Jul 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>O que é IA generativa, suas aplicações e impacto econômico, efeitos na produtividade dos desenvolvedores, preocupações éticas e o caminho até a AGI.</description>
      <category>Artigos</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/IA-Gen/1.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<h2 id="introducao">Introdução</h2>

<p>A inteligência artificial (IA) tem transformado diversos setores e aspectos da vida cotidiana, e a chegada da IA generativa marca uma nova era de inovação e possibilidades. Desde o lançamento do ChatGPT pela OpenAI, em novembro de 2022, a IA generativa ganhou destaque global, impactando tanto o mercado quanto a sociedade. Este artigo explora o que é a IA generativa, suas aplicações e as implicações éticas e econômicas que acompanham essa tecnologia emergente.</p>

<h2 id="o-que-e-ia-generativa">O Que é IA Generativa?</h2>

<p>IA generativa refere-se a sistemas de inteligência artificial capazes de criar conteúdo de alta qualidade, como texto, imagens e áudio. Esses sistemas utilizam modelos avançados, conhecidos como grandes modelos de linguagem (LLMs), para prever e gerar conteúdo com base em grandes volumes de dados. O ChatGPT, por exemplo, pode gerar respostas detalhadas e contextualizadas para perguntas, criar textos criativos e até mesmo produzir recomendações personalizadas.</p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/IA-Gen/1.png" alt="Ilustração do conceito de IA generativa" />

<h2 id="aplicacoes-e-impacto-economico">Aplicações e Impacto Econômico</h2>

<p>As aplicações de IA generativa são vastas e variadas. Empresas como Google e Microsoft possuem seus produtos, como o Gemini e o Copilot, respectivamente. Essas ferramentas permitem que os usuários gerem textos e imagens a partir de comandos simples, chamados de prompts. Além disso, a IA generativa está revolucionando o desenvolvimento de software, tornando a criação de aplicações de IA mais velozes e menos custosa.</p>

<p>Estudos indicam que a IA generativa pode adicionar entre 2,6 a 4,4 trilhões de dólares à economia global anualmente. <a href="https://blog.mackenzie.br/vestibular/3-carreiras-para-trabalhar-com-inteligencia-artificial-ia/" target="_blank" rel="noopener noreferrer">A Goldman Sachs estima que essa tecnologia pode aumentar o Produto Interno Bruto (PIB) global em 7% na próxima década</a>. Contudo, também há preocupações sobre o impacto na força de trabalho, <a href="https://pt.euronews.com/next/2023/03/24/estes-sao-os-postos-de-trabalho-que-poderao-ser-mais-afetados-pela-inteligencia-artificial" target="_blank" rel="noopener noreferrer">com estimativas de que cerca de 10% das tarefas realizadas por mais de 80% dos trabalhadores nos Estados Unidos poderiam ser afetadas pela IA generativa</a>.</p>

<h2 id="como-a-ia-generativa-funciona">Como a IA Generativa Funciona?</h2>

<p>O funcionamento da IA generativa é baseado em aprendizado supervisionado, onde modelos são treinados para prever a próxima palavra ou imagem em uma sequência com base em dados anteriores. Este processo envolve grandes volumes de dados textuais e de imagens que ajudam os modelos a aprender padrões e gerar conteúdo coerente e relevante.</p>

<p>Por exemplo, ao solicitar a criação de uma imagem de "uma maçã vermelha", o modelo usa técnicas de aprendizado profundo para gerar uma imagem que corresponde à descrição fornecida. Este processo pode ser refinado através de ajustes nos prompts e parâmetros do modelo, permitindo a geração de conteúdos altamente específicos e detalhados.</p>

<h2 id="desafios-e-limitacoes">Desafios e Limitações</h2>

<p>Apesar do potencial, a IA generativa enfrenta desafios significativos. Um dos principais problemas é a questão das "alucinações", onde o modelo pode gerar informações incorretas ou fictícias de forma convincente. Além disso, a IA tem limitações de conhecimento, pois só pode acessar dados até o momento em que foi treinada, o que pode levar à desatualização de informações.</p>

<p>Outro aspecto crucial é a questão ética, especialmente no que diz respeito ao viés e ao uso responsável da tecnologia. Como os modelos são treinados com dados disponíveis na internet, eles podem refletir e perpetuar preconceitos existentes na sociedade. Portanto, é fundamental que desenvolvedores e usuários estejam cientes dessas questões e trabalhem para mitigá-las.</p>

<h2 id="aplicando-ia-generativa-em-aplicacoes-de-software">Aplicando IA Generativa em Aplicações de Software</h2>

<p>A construção de aplicações de software com IA generativa tem se tornado mais fácil e eficaz, graças aos avanços dessa tecnologia. Por exemplo, a criação de sistemas para leitura de avaliações de restaurantes para monitoramento de reputação antes exigia um grande esforço de engenharia de machine learning, incluindo a coleta de dados, o treinamento de modelos e a implantação em nuvem. Esse processo, que poderia levar meses, agora pode ser simplificado com a IA generativa.</p>

<p>Hoje, com o desenvolvimento baseado em prompts, a criação de um classificador de sentimentos pode ser reduzida a apenas algumas linhas de código. Um exemplo clássico é o uso de prompts para classificar uma avaliação de restaurante como positiva ou negativa. Anteriormente, esse processo envolvia rotular centenas ou milhares de exemplos para treinar um modelo. Agora, com uma simples chamada a um grande modelo de linguagem (LLM), é possível obter uma classificação de sentimento com precisão e eficiência.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/IA-Gen/4.png" alt="Exemplo de classificador de sentimentos com prompts" />

<h2 id="impacto-na-produtividade-e-desenvolvimento">Impacto na Produtividade e Desenvolvimento</h2>

<p>A redução da barreira para a construção de aplicações com IA generativa está permitindo uma alta demanda de novos aplicativos. Tarefas que antes levavam de 6 a 12 meses para serem desenvolvidas agora podem ser concluídas em dias ou semanas. Isso é especialmente benéfico para empresas que precisam de soluções rápidas e eficazes para problemas complexos.</p>

<h2 id="desafios-e-solucoes">Desafios e Soluções</h2>

<p>Apesar das vantagens, a IA generativa ainda enfrenta desafios, como a precisão em cálculos e a execução de ações críticas. Por exemplo, ao responder a uma pergunta sobre juros compostos, um LLM pode não fornecer uma resposta precisa sem o auxílio de ferramentas adicionais, como uma calculadora. Nesse contexto, a utilização de ferramentas auxiliares se torna essencial para aumentar a precisão e a funcionalidade das respostas.</p>

<p>Além disso, a verificação das ações sugeridas pela IA é crucial para evitar erros custosos. Em sistemas de atendimento ao cliente, por exemplo, é importante implementar mecanismos de confirmação antes de concluir transações, garantindo assim que as respostas geradas sejam precisas e seguras.</p>

<h2 id="avancos-futuramente-possiveis">Avanços Futuramente Possíveis</h2>

<p>O futuro da IA generativa em software está repleto de possibilidades empolgantes. Pesquisadores estão explorando o uso de agentes baseados em LLMs que podem tomar decisões complexas e executar sequências de ações. Embora essa tecnologia ainda esteja em fase experimental, ela promete transformar a maneira como interagimos com sistemas de IA, possibilitando uma automação ainda mais avançada e personalizada.</p>

<h2 id="objetivos-de-aprendizagem">Objetivos de Aprendizagem</h2>

<p>1. Analisar fluxos de trabalho e identificar novas oportunidades de negócios que surgem do potencial da IA generativa para melhorar a eficiência, produtividade e geração de valor.</p>
<p>2. Reconhecer que a IA automatiza principalmente tarefas dentro dos trabalhos, não funções inteiras, e avaliar tarefas para o potencial da IA generativa com base em dois critérios principais: viabilidade técnica e valor comercial.</p>
<p>3. Discutir as principais preocupações que surgem da adoção da IA generativa e dos grandes modelos de linguagem (LLMs), incluindo perda de empregos, amplificação dos piores impulsos da humanidade e extinção humana.</p>
<p>4. Listar os princípios da IA responsável, incluindo justiça, transparência, privacidade, segurança e uso ético, e aprender estratégias para garantir o desenvolvimento e a implantação de IA de forma ética e socialmente responsável.</p>

<h2 id="uso-cotidiano-de-llms-em-interfaces-web">Uso Cotidiano de LLMs em Interfaces Web</h2>

<p>Com o avanço da IA generativa, muitas profissões têm integrado essa tecnologia em suas atividades diárias, utilizando interfaces web para acessar LLMs. Profissionais de marketing, por exemplo, utilizam essas ferramentas para gerar ideias de campanhas de e-mail, enquanto recrutadores podem resumir avaliações de candidatos. Programadores também se beneficiam ao gerar rascunhos iniciais de códigos, embora muitas vezes seja necessário corrigir erros. A versatilidade dos LLMs permite sua aplicação em diversas funções, servindo como assistentes de escrita ou editores de texto, e até mesmo como parceiros de pensamento para explorar ideias e soluções.</p>

<h2 id="analise-de-tarefas-de-trabalhos">Análise de Tarefas de Trabalhos</h2>

<p>Uma abordagem eficaz para implementar a IA generativa é identificar tarefas específicas dentro de funções de trabalho que podem ser automatizadas ou aprimoradas. Em vez de substituir empregos inteiros, a IA geralmente se concentra em automatizar tarefas. A viabilidade técnica e o valor comercial dessas tarefas são critérios fundamentais para avaliar o potencial da IA generativa. Por exemplo, a automatização de respostas de chat pode ser viável e valiosa, enquanto a realização de conversas telefônicas complexas ainda pode ser desafiadora.</p>

<h2 id="exemplos-de-analise-de-tarefas-em-diferentes-funcoes">Exemplos de Análise de Tarefas em Diferentes Funções</h2>

<p>Ao analisar diferentes funções de trabalho, pode-se descobrir que as melhores oportunidades para a IA generativa não são necessariamente as mais óbvias. Programadores, por exemplo, fazem mais do que apenas escrever código; eles também documentam e revisam códigos. Cada tarefa tem diferente grau de potencial para automação ou aprimoramento com IA, e uma análise sistemática pode ajudar a identificar onde a IA pode ser mais útil.</p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/IA-Gen/2.png" alt="Análise de tarefas com potencial para IA generativa em diferentes funções" />

<h2 id="novos-fluxos-de-trabalho-e-oportunidades-de-crescimento">Novos Fluxos de Trabalho e Oportunidades de Crescimento</h2>

<p>A implementação da IA generativa não só pode economizar custos, mas também criar novas oportunidades de crescimento. Por exemplo, ao tornar a redação de cópias para websites mais eficiente, os profissionais de marketing podem testar múltiplas versões de conteúdo para identificar a mais eficaz. Além disso, empresas podem explorar a automatização de tarefas realizadas por seus clientes, oferecendo produtos ou serviços mais eficazes e personalizados. Este replanejamento de fluxos de trabalho pode resultar em modelos de negócios inovadores e maior valor agregado.</p>

<h2 id="preocupacoes-com-a-ia-e-implicacoes-eticas">Preocupações com a IA e Implicações Éticas</h2>

<p>Com o uso crescente da IA, surgem preocupações sobre seu impacto na sociedade. Isso inclui o potencial de amplificação dos piores impulsos humanos, como preconceitos e desinformação, bem como a ameaça de perda de empregos devido à automação. A questão ética é central, destacando a necessidade de desenvolver e usar IA de maneira justa, transparente, segura e ética. Técnicas como o aprendizado por reforço com feedback humano (RLHF) estão sendo usadas para tornar os LLMs menos tendenciosos e mais alinhados com valores humanos.</p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/IA-Gen/3.png" alt="Ilustração sobre preocupações éticas da inteligência artificial" />

<h2 id="inteligencia-artificial-geral-agi-e-o-futuro-da-ia">Inteligência Artificial Geral (AGI) e o Futuro da IA</h2>

<p>A IA Geral (AGI) é um conceito de inteligência artificial capaz de realizar qualquer tarefa intelectual que um humano possa. Apesar do entusiasmo, estamos ainda longe de alcançar a AGI. Entretanto, a IA generativa já está provocando transformações significativas, especialmente entre trabalhadores do conhecimento. As estimativas indicam que a AGI poderá revolucionar setores inteiros, criando novos empregos e oportunidades de crescimento, ao mesmo tempo em que levanta questões sobre seu impacto potencial na sociedade e na economia.</p>

<h2 id="conclusao">Conclusão</h2>

<p>A IA generativa oferece vastas oportunidades para melhorar a eficiência e criar novos valores nos negócios. No entanto, é crucial abordar suas implicações éticas e sociais para garantir que a tecnologia seja usada de maneira responsável e benéfica. Empresas e profissionais devem se preparar para integrar a IA generativa em seus processos, aproveitando seu potencial para inovação e crescimento, ao mesmo tempo em que garantem o desenvolvimento responsável e ético da IA.</p>


]]></content:encoded>
    </item>
    <item>
      <title>Organizador – Azure Floripa</title>
      <link>https://www.orafaelferreira.com/artigos/azure-floripa</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/azure-floripa</guid>
      <pubDate>Sun, 21 Jul 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>A comunidade Azure Floripa evoluiu para o Azure User Group Florianópolis, ligado ao Azure User Groups Brasil, com foco em conteúdo prático sobre Azure.</description>
      <category>Organizador Grupo de Comunidade</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/azurefloripa.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<h2 id="introducao">Introdução</h2>

<p>Nossa comunidade tem o objetivo principal de explorar e apresentar as diversas soluções e serviços disponíveis na nuvem da Microsoft. Nosso objetivo é claro: compartilhar conhecimento através das experiências vividas e contadas por nossos palestrantes, enriquecendo o grupo com insights valiosos e práticos sobre o que há de mais inovador no mundo Azure.</p>
<p>Além claro, de fortalecer a comunidade Azure em Florianópolis, visando fomentar o aprendizado e networking entre os participantes da comunidade.</p>

<h2 id="evolucao-da-comunidade">Evolução da comunidade</h2>

<p>O <strong>Azure Floripa</strong> cresceu e hoje faz parte de uma iniciativa maior: o <strong>Azure User Group Florianópolis</strong>, conectado ao movimento nacional do <strong>Azure User Groups Brasil</strong>.</p>

<p>Na prática, a comunidade local continua com o mesmo propósito de fortalecer o ecossistema Azure na região, mas agora dentro de uma estrutura mais ampla, integrada a outras branches pelo Brasil.</p>

<p>Para acompanhar essa nova fase da comunidade, veja também o artigo:</p>

<ul>
<li><a href="https://www.orafaelferreira.com/artigos/azure-user-groups-brasil" target="_blank" rel="noopener noreferrer"><strong>Organizador – Azure User Groups Brasil</strong></a></li>
</ul>

<p>Juntou curiosidade + vontade de ajudar? Então o grupo é pra você! 🎉</p>

<h2 id="azure-floripa">Azure Floripa</h2>

<a href="https://www.youtube.com/@AzureFloripa" target="_blank" rel="noopener noreferrer"><img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/azurefloripa.png" alt="Azure Floripa" /></a>

<ul>
<li>🌐 <a href="https://azurefloripa.com.br/" target="_blank" rel="noopener noreferrer">Site - Azure Floripa</a></li>
</ul>

<ul>
<li>🔗 <a href="https://linktr.ee/AzureFloripa" target="_blank" rel="noopener noreferrer">Nossos links</a></li>
</ul>

<ul>
<li>▶️ <a href="https://www.youtube.com/channel/UCXgiLXOwNL33-86Xl_2KMgg" target="_blank" rel="noopener noreferrer">Youtube - Azure Floripa</a></li>
</ul>


<h2 id="eventos-organizados">Eventos Organizados</h2>
<div><table><thead><tr><th>Data</th><th>Evento</th><th>Formato</th></tr></thead><tbody><tr><td>02 set 2024</td><td><a href="https://www.orafaelferreira.com/artigos/curso-dp-900" target="_blank" rel="noopener noreferrer"><strong>DP‑900: Fundamentos de Dados do Azure</strong></a></td><td>Presencial</td></tr><tr><td>10 jun 2024</td><td><a href="https://www.orafaelferreira.com/artigos/curso-az-900" target="_blank" rel="noopener noreferrer"><strong>AZ‑900: Fundamentos do Azure</strong></a></td><td>Presencial</td></tr><tr><td>10 abr 2024</td><td><a href="https://www.orafaelferreira.com/artigos/global-azure24" target="_blank" rel="noopener noreferrer"><strong>Global Azure 2024 feat. Azure Floripa</strong></a></td><td>Online</td></tr><tr><td>10 abr 2025</td><td><a href="https://www.orafaelferreira.com/artigos/global-azure25" target="_blank" rel="noopener noreferrer"><strong>Global Azure 2025 feat. Azure Floripa</strong></a></td><td>Online</td></tr><tr><td>10 abr 2025</td><td><a href="https://www.meetup.com/azure-floripa/events/306207034/?eventOrigin=group_upcoming_events" target="_blank" rel="noopener noreferrer"><strong>Global Azure 2025 – Azure Floripa</strong></a></td><td>Presencial</td></tr></tbody></table></div>
<p>---</p>
<h2 id="conhecendo-as-vertentes-do-copilot-e-o-que-ele-pode-fazer-no-azure-com-marcelo-s">Conhecendo as vertentes do Copilot e o que ele pode fazer no Azure com Marcelo Souza</h2>
<a href="https://www.youtube.com/watch?v=R9lFLWeNlbU" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/R9lFLWeNlbU/0.jpg" alt="Conhecendo as vertentes do Copilot e o que ele pode fazer no Azure com Marcelo Souza" /></a>

<h2 id="governanca-azure-voce-precisa-estar-atento-com-osanam-giordane">Governança Azure: Você Precisa Estar Atento! com Osanam Giordane</h2>
<a href="https://www.youtube.com/watch?v=oLDXUuOyIjA" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/oLDXUuOyIjA/0.jpg" alt="Governança Azure: Você Precisa Estar Atento! com Osanam Giordane" /></a>

<h2 id="azure-workbooks-para-otimizacao-de-custos-com-finops">Azure Workbooks para Otimização de Custos com FinOps</h2>
<a href="https://www.youtube.com/watch?v=TWGizKIBOXc" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/TWGizKIBOXc/0.jpg" alt="Azure Workbooks para Otimização de Custos com FinOps" /></a>

<h2 id="como-implantar-uma-infraestrutura-em-larga-escala-com-azure-devops-e-terraform">Como implantar uma infraestrutura em larga escala com Azure DevOps e Terraform</h2>
<a href="https://www.youtube.com/watch?v=Pb-rL-Mz-sI" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/Pb-rL-Mz-sI/0.jpg" alt="Como implantar uma infraestrutura em larga escala com Azure DevOps e Terraform" /></a>

<h2 id="desvendando-o-service-principal-x-managed-identities-no-entra-id">Desvendando o Service Principal x Managed Identities no Entra ID</h2>
<a href="https://www.youtube.com/watch?v=lxxyxDwvsDU" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/lxxyxDwvsDU/0.jpg" alt="Desvendando o Service Principal x Managed Identities no Entra ID" /></a>

<h2 id="trajetoria-internacional-do-queijo-minas-ao-queijo-gouda">Trajetória Internacional - Do queijo minas ao queijo Gouda</h2>
<a href="https://www.youtube.com/watch?v=Ne-76V9XvxA" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/Ne-76V9XvxA/0.jpg" alt="Trajetória Internacional - Do queijo minas ao queijo Gouda" /></a>

<h2 id="mesa-redonda-transicao-de-carreira-e-possivel-carreira-de-ti-alem-da-area-tecnic">Mesa Redonda - Transição de carreira é possível? + Carreira de TI, além da área técnica</h2>
<a href="https://www.youtube.com/watch?v=6drxvyPhmMc" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/6drxvyPhmMc/0.jpg" alt="Mesa Redonda - Transição de carreira é possível? + Carreira de TI, além da área técnica" /></a>

<h2 id="superlive-vamos-apoiar-o-rio-grande-do-sul">#SuperLive Vamos apoiar o Rio Grande do Sul</h2>
<a href="https://www.youtube.com/watch?v=F-cLo4f3Hew&ab_channel=AzureFloripa" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/F-cLo4f3Hew/0.jpg" alt="#SuperLive Vamos apoiar o Rio Grande do Sul" /></a>

<h2 id="a-importancia-de-implementar-microsoft-purview-para-nao-ter-vazamento-de-dados-n">A importância de implementar Microsoft Purview para não ter vazamento de dados no Copilot</h2>
<a href="https://www.youtube.com/watch?v=X3EV4zdh8BA" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/X3EV4zdh8BA/0.jpg" alt="A importância de implementar Microsoft Purview para não ter vazamento de dados no Copilot" /></a>

<h2 id="migrando-logic-apps-com-juliano-custodio">Migrando Logic Apps com Juliano Custodio</h2>
<a href="https://www.youtube.com/watch?v=UhZ6abo-kYk" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/UhZ6abo-kYk/0.jpg" alt="Migrando Logic Apps com Juliano Custodio" /></a>

<h2 id="azure-openai-vision-novas-perspectivas-com-a-ia-generativa-com-osvaldo-alves">Azure OpenAI + Vision Novas Perspectivas com a IA Generativa com Osvaldo Alves</h2>
<a href="https://www.youtube.com/watch?v=9QXbtDhygz8&t" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/9QXbtDhygz8/0.jpg" alt="Azure OpenAI + Vision Novas Perspectivas com a IA Generativa com Osvaldo Alves" /></a>

<h2 id="mesa-redonda-como-consegui-trabalhar-somente-com-azure-certificacoes">Mesa Redonda - Como consegui trabalhar somente com Azure + Certificações</h2>
<a href="https://www.youtube.com/watch?v=SEz3UgW3dMM&t" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/SEz3UgW3dMM/0.jpg" alt="Mesa Redonda - Como consegui trabalhar somente com Azure + Certificações" /></a>

<strong>Curtiu?</strong>  
<p>Fica o convite: participe, compartilhe e ajude a comunidade a crescer. 🚀  </p>
<p>Nos vemos no próximo encontro!</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/azurefloripa.png" alt="Logo da comunidade Azure Floripa" />
]]></content:encoded>
    </item>
    <item>
      <title>Organizador – Cloud Native Santa Catarina</title>
      <link>https://www.orafaelferreira.com/artigos/cncfsc</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/cncfsc</guid>
      <pubDate>Sun, 21 Jul 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Minha atuação como organizador do Cloud Native Santa Catarina, comunidade oficial da CNCF que promove tecnologias cloud native e open source na região.</description>
      <category>Organizador Grupo de Comunidade</category>
      <category>Kubernetes</category>
      <category>Cloud Native</category>
      <category>Comunidade</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/cncfsc_cover.jpg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/cncfsc_cover.jpg" alt="Cloud Native Santa Catarina" />

<h2 id="sobre-o-capitulo">Sobre o capítulo</h2>

<p>O <strong>Cloud Native Santa Catarina</strong> é uma comunidade oficial apoiada pela <strong>Cloud Native Computing Foundation (CNCF)</strong>, criada para promover tecnologias cloud native, cultura open source e discussões técnicas conectadas à realidade de quem constrói e opera plataformas modernas.</p>

<p>A comunidade reúne profissionais interessados em temas como <strong>Kubernetes, observabilidade, platform engineering, containers, service mesh e arquiteturas cloud native</strong>, criando um espaço contínuo de aprendizado, networking e troca de experiências.</p>

<p>Atuo como organizer da comunidade <strong>desde janeiro de 2025</strong>, apoiando o planejamento e a execução dos meetups, a curadoria dos encontros e o crescimento consistente da comunidade em Santa Catarina.</p>

<p>Atuamos com base em <strong>Florianópolis</strong>, mas também ajudamos a expandir a presença da comunidade com iniciativas em outras cidades da região.</p>

<a href="https://community.cncf.io/cloud-native-santa-catarina/" target="_blank" rel="noopener noreferrer">Site oficial do grupo:</a>

<p>Comunidades técnicas encurtam a curva de aprendizado, aproximam profissionais com interesses parecidos e ajudam a transformar conhecimento disperso em experiências compartilhadas.</p>

<p>No caso do <strong>Cloud Native Santa Catarina</strong>, isso significa criar um ambiente em que pessoas possam aprender com implementações reais, discutir boas práticas e se aprofundar em tecnologias open source que hoje são fundamentais para times de plataforma, infraestrutura e desenvolvimento.</p>

<p>Também é uma forma concreta de apoiar a evolução profissional de quem está começando e de quem já atua na área, seja através de networking, troca de referências, oportunidades de palestrar ou participação em eventos presenciais.</p>

<h2 id="cloud-native-santa-catarina">Cloud Native Santa Catarina</h2>

<p>Se você curte o universo cloud native, open source e engenharia de plataformas, vale acompanhar e participar da comunidade.</p>

<ul>
<li>🌐 <a href="https://linktr.ee/cloudnativesc" target="_blank" rel="noopener noreferrer">Linktree oficial</a></li>
<li>🤝 <a href="https://community.cncf.io/cloud-native-santa-catarina/" target="_blank" rel="noopener noreferrer">Community Group no Bevy</a></li>
<li>📸 <a href="https://www.instagram.com/cncf.sc/" target="_blank" rel="noopener noreferrer">Instagram</a></li>
<li>💼 <a href="https://www.linkedin.com/company/cncfsc/" target="_blank" rel="noopener noreferrer">LinkedIn</a></li>
<li>▶️ <a href="https://www.youtube.com/@cloudnativesc" target="_blank" rel="noopener noreferrer">YouTube</a></li>
</ul>

<p>Esse esforço contínuo fortalece o ecossistema local, amplia o alcance da comunidade e incentiva a adoção de tecnologias open source com base em experiências reais de mercado.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/cncfsc_logo.jpg" alt="Cloud Native Santa Catarina" />

]]></content:encoded>
    </item>
    <item>
      <title>Organizador – DevOpsDays Florianópolis</title>
      <link>https://www.orafaelferreira.com/artigos/comu-dod-floripa</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/comu-dod-floripa</guid>
      <pubDate>Sun, 21 Jul 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Minha atuação desde 2023 na organização do DevOpsDays Florianópolis: coordenação de eventos, suporte a speakers e engajamento da comunidade DevOps local.</description>
      <category>Organizador Grupo de Comunidade</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/logo-dod.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/logo-dod.png" alt="Logo da comunidade DevOpsDays Florianópolis" />

<h2 id="sobre-a-comunidade">Sobre a comunidade</h2>

<p>Faço parte do time de organização do <strong>DevOpsDays Florianópolis</strong> desde <strong>2023</strong>, contribuindo para a continuidade e o fortalecimento da comunidade local em torno de práticas DevOps, colaboração entre times e troca de experiências reais de mercado.</p>

<p>O <strong>DevOpsDays</strong> é uma série global de conferências guiadas pela comunidade, focada em desenvolvimento de software, operações de TI, automação, cultura e nos pontos de interseção entre pessoas, processos e tecnologia.</p>

<p>Como organizer, apoio diferentes frentes para manter a comunidade ativa e relevante entre uma edição e outra, ajudando a transformar o evento em um ponto de encontro recorrente para profissionais da região.</p>

<p>Além do evento em si, também contribuo para manter a comunidade engajada, incentivar novas participações e apoiar a entrada de novos palestrantes e colaboradores.</p>

<h2 id="edicoes-organizadas">Edições organizadas</h2>

<ul>
<li>📅 <a href="https://www.orafaelferreira.com/artigos/eventodod-floripa" target="_blank" rel="noopener noreferrer"><strong>DevOpsDays Florianópolis 2024</strong></a>, 16 de novembro de 2024</li>
<li>📅 <a href="https://www.orafaelferreira.com/artigos/devopsdays-florianopolis-2025" target="_blank" rel="noopener noreferrer"><strong>DevOpsDays Florianópolis 2025</strong></a>, 6 de dezembro de 2025</li>
</ul>

<h2 id="por-que-isso-importa">Por que isso importa</h2>

<p>Esse envolvimento contínuo ajuda a sustentar uma comunidade DevOps forte na região, promovendo compartilhamento de conhecimento, colaboração entre profissionais e crescimento técnico em torno de temas que impactam diretamente a forma como times entregam software.</p>

<p>Também cria espaço para conversas mais práticas sobre cultura, automação, confiabilidade, observabilidade e melhoria contínua, aproximando pessoas com desafios semelhantes em contextos reais.</p>

<h2 id="conecte-se">Conecte-se</h2>

<ul>
<li>🔗 <a href="https://linktr.ee/devopsdaysfln" target="_blank" rel="noopener noreferrer"><strong>Linktree</strong></a></li>
<li>🌐 <a href="https://devopsdays.org/" target="_blank" rel="noopener noreferrer"><strong>Site DevOpsDays</strong></a></li>
<li>📷  <a href="https://www.instagram.com/devopsdaysfln/" target="_blank" rel="noopener noreferrer"><strong>Instagram</strong></a></li>
<li>💼  <a href="https://www.linkedin.com/company/12596194/admin/dashboard/" target="_blank" rel="noopener noreferrer"><strong>LinkedIn</strong></a></li>
</ul>

<p>Estamos sempre procurando <strong>voluntários, patrocinadores e novos palestrantes</strong>.</p>

<p>Participar da organização do <strong>DevOpsDays Florianópolis</strong> desde 2023 significa ajudar a manter viva uma comunidade técnica local conectada a uma iniciativa global, com foco em troca de experiências, colaboração e evolução profissional.</p>

<p>Esse trabalho contínuo contribui para o crescimento do ecossistema regional e para a formação de um espaço cada vez mais aberto a novas conexões, novos speakers e novas discussões.</p>

<p>> <em>“Compartilhar é multiplicar.”</em> – cultura DevOps</p>
]]></content:encoded>
    </item>
    <item>
      <title>DevOpsDays Florianópolis 2024</title>
      <link>https://www.orafaelferreira.com/artigos/eventodod-floripa</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/eventodod-floripa</guid>
      <pubDate>Sun, 21 Jul 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Relato do DevOpsDays Florianópolis 2024, que reuniu mais de 150 participantes em um dia inteiro de talks, open spaces e networking sobre cultura DevOps.</description>
      <category>Organização de Eventos</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod/0.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<p>O <strong>DevOpsDays</strong> é uma conferência global que une desenvolvimento, operações e cultura DevOps.  </p>
<p>Em <strong>16 de novembro de 2024</strong>, Floripa recebeu +150 participantes para um dia inteiro de talks, open‑spaces e networking.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod/0.png" alt="Banner do DevOpsDays Florianópolis 2024" />

<p>🌐 <strong>Site oficial:</strong> <a href="https://devopsdays.org/events/2024-florianopolis/welcome/" target="_blank" rel="noopener noreferrer">DevOpsDays Florianópolis 2024</a>  </p>
<p>📲 <strong>Siga-nos nas redes sociais:</strong> <a href="https://linktr.ee/devopsdaysfln" target="_blank" rel="noopener noreferrer">Linktree</a>  </p>

<h2 id="galeria">Galeria 📸</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod/1.jpg" alt="Público reunido no DevOpsDays Florianópolis 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod/2.jpg" alt="Palestra no palco principal do DevOpsDays Floripa" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod/3.jpg" alt="Participantes durante os open spaces do DevOpsDays Floripa" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/dod/4.jpg" alt="Equipe de voluntários e organização do DevOpsDays Florianópolis 2024" />

<strong>Obrigado!</strong> A mágica só acontece graças a voluntários, patrocinadores e à comunidade DevOps que compareceu em peso.  
<p>Nos vemos no <strong>DevOpsDays Floripa 2025</strong>! 🚀</p>


]]></content:encoded>
    </item>
    <item>
      <title>KCD Floripa Brazil 2024</title>
      <link>https://www.orafaelferreira.com/artigos/kcd-floripa24</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/kcd-floripa24</guid>
      <pubDate>Sun, 21 Jul 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Relato do KCD Floripa Brazil 2024, evento da comunidade Cloud Native Santa Catarina que reuniu profissionais de Kubernetes e código aberto em Florianópolis.</description>
      <category>Organização de Eventos</category>
      <category>Kubernetes</category>
      <category>Cloud Native</category>
      <category>Comunidade</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/KCD/0.png" length="0" type="image/png" />
      <content:encoded><![CDATA[<h2 id="introducao">Introdução</h2>

<p>Os <strong>Kubernetes Community Days (KCDs)</strong> são eventos organizados pela comunidade que reúnem entusiastas e profissionais interessados no universo nativo da nuvem e de código aberto. Promovendo educação, colaboração e networking, os KCDs são oficialmente apoiados pela <strong>Cloud Native Computing Foundation (CNCF)</strong> e realizados localmente para fortalecer as comunidades regionais.  </p>

<p>Em 2024, Florianópolis foi palco do <strong>KCD Floripa</strong>! Foi uma oportunidade única de aprender, se conectar com especialistas e explorar as tendências mais recentes do mundo Cloud Native.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/KCD/0.png" alt="Banner do KCD Floripa Brazil 2024" />

<p>🌐 <strong>Site oficial:</strong> <a href="https://community.cncf.io/events/details/cncf-kcd-brasil-presents-kcd-floripa-brasil-2024/" target="_blank" rel="noopener noreferrer">KCD Floripa 2024</a>  </p>
<p>👉 <strong>Acesse nossos links:</strong> <a href="https://linktr.ee/cloudnativesc" target="_blank" rel="noopener noreferrer">Linktree do evento</a></p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/KCD/1.jpg" alt="Abertura do KCD Floripa 2024 em Florianópolis" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/KCD/2.jpg" alt="Público reunido no KCD Floripa Brazil 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/KCD/3.jpg" alt="Palestrante no palco do KCD Floripa 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/KCD/4.jpg" alt="Participantes acompanhando as sessões do KCD Floripa" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/KCD/5.jpg" alt="Networking entre participantes do KCD Floripa 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/KCD/6.jpg" alt="Equipe organizadora da Cloud Native Santa Catarina no KCD Floripa" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/KCD/7.jpg" alt="Estandes de patrocinadores no KCD Floripa 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/KCD/8.jpg" alt="Comunidade Cloud Native reunida no KCD Floripa" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/KCD/9.jpg" alt="Rafael Ferreira com a organização do KCD Floripa 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/KCD/10.jpg" alt="Encerramento do KCD Floripa Brazil 2024" />

<a href="https://www.credly.com/badges/7091a4a1-5ab1-4a3d-a91a-8eb6407e72d5/public_url" target="_blank" rel="noopener noreferrer"><img src="https://images.credly.com/size/680x680/images/baf493ca-d548-435b-9811-5c3385a674be/image.png" alt="Organizer: 2024 KCD Floripa" /></a>

<p>---</p>




]]></content:encoded>
    </item>
    <item>
      <title>Utilizando Azure Workbooks para Otimização de Custos com FinOps</title>
      <link>https://www.orafaelferreira.com/artigos/azure-workbooks</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/azure-workbooks</guid>
      <pubDate>Tue, 16 Jul 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>A gestão eficaz dos custos na nuvem é um algo real e impactante para muitas organizações que adotaram a computação em nuvem.</description>
      <category>Artigos</category>
      <category>GreenOps</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/azure-workbooks/Arte-Logo.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/azure-workbooks/Arte-Logo.png" alt="Arte de capa do artigo sobre Azure Workbooks e FinOps" />

<h2 id="introducao">Introdução</h2>

<p>A gestão eficaz dos custos na nuvem é um algo real e impactante para muitas organizações que adotaram a computação em nuvem. O FinOps (<a href="https://www.orafaelferreira.com/artigos/finops-foundation-cloud" target="_blank" rel="noopener noreferrer">Caso queira saber mais sobre FinOps, visite o meu artigo anterior</a>), ou Operações Financeiras, é um conjunto de práticas que combinam Finanças e DevOps para otimizar a utilização e o custo dos recursos na nuvem. Uma ferramenta poderosa que a Microsoft Azure oferece para ajudar nessa tarefa é o Azure Workbooks. Neste artigo, irei utilizar o Azure Workbooks. Mas o que são Azure Workbooks?</p>

<h2 id="o-que-sao-azure-workbooks">O que são <a href="https://learn.microsoft.com/pt-br/azure/azure-monitor/visualize/workbooks-overview" target="_blank" rel="noopener noreferrer">Azure Workbooks</a>?</h2>

<p>Azure Workbook são dashboards interativos e modulares que são usados para criar relatórios e visualizações no Azure Monitor. Eles permitem criar visões personalizadas que podem incluir métricas, logs e dados de outras fontes do Azure, proporcionando uma visão consolidada e interativa do ambiente de nuvem.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/azure-workbooks/15.webp" alt="Dashboard interativo do Azure Workbooks no Azure Monitor" />

<h2 id="principais-beneficios-do-azure-workbooks">Principais Benefícios do Azure Workbooks</h2>

<ul>
<li><strong>Visualizações Interativas:</strong> Crie gráficos, tabelas e relatórios interativos que podem ser personalizados para atender às necessidades específicas do negócios e operações.</li>
<li><strong>Integração com Dados do Azure:</strong> Combine dados de várias fontes do Azure, incluindo logs de atividades, métricas de desempenho e informações de faturamento.</li>
<li><strong>Compartilhamento e Colaboração:</strong> Os Workbooks podem ser compartilhados com diferentes equipes, facilitando a colaboração entre finanças, operações e TI.</li>
<li><strong>Automação e Atualização Contínua:</strong> Configure atualizações automáticas para garantir que os dados exibidos estejam sempre atualizados.</li>
</ul>

<h2 id="como-azure-workbooks-apoia-o-finops">Como Azure Workbooks Apoia o FinOps</h2>

<p>1. <strong>Monitoramento de Custos em Tempo Real</strong></p>
<ul>
<li>Utilize Azure Workbooks para criar dashboards que monitoram os custos em tempo real. Isso permite uma resposta rápida a quaisquer desvios ou aumentos inesperados de custo.</li>
</ul>

<p>2. <strong>Análise de Tendências de Consumo</strong></p>
<ul>
<li>Análises históricas de consumo de recursos podem ser visualizadas através de gráficos de tendência. Isso ajuda a identificar padrões de uso que podem ser otimizados.</li>
</ul>

<p>3. <strong>Alocação de Custos</strong></p>
<ul>
<li>Crie relatórios detalhados para alocação de custos entre diferentes departamentos ou projetos. Isso é essencial para entender quais áreas estão consumindo mais recursos e como otimizar a alocação.</li>
</ul>

<p>4. <strong>Identificação de Recursos Subutilizados</strong></p>
<ul>
<li>Utilize relatórios de utilização de recursos para identificar instâncias e serviços subutilizados que podem ser redimensionados ou desligados para economizar custos.</li>
</ul>

<p>5. <strong>Planejamento e Orçamentação</strong></p>
<ul>
<li>Utilize dados históricos e previsões para ajudar no planejamento de orçamentos futuros. Azure Workbooks pode integrar dados de várias fontes para fornecer uma visão abrangente para o planejamento financeiro.</li>
</ul>

<p>6. <strong>Gerenciamento de Recursos Órfãos</strong></p>
<ul>
<li>Recursos órfãos são aqueles que não estão mais sendo utilizados ativamente, mas continuam a gerar custos. Identificar e gerenciar recursos órfãos ajuda a economizar dinheiro, prevenir configurações incorretas e simplificar a gestão operacional do ambiente Azure.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/azure-workbooks/12.webp" alt="Azure Workbooks apoiando práticas de FinOps e gestão de custos" />


<h2 id="exemplo-pratico-1-cost-optimization-workbook">Exemplo Prático 1: Cost Optimization Workbook</h2>

<h3 id="configuracao-inicial">Configuração Inicial</h3>
<ul>
<li><a href="https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2Fazure-quickstart-templates%2Fmaster%2Fquickstarts%2Fmicrosoft.costmanagement%2Foptimization-workbook%2Fazuredeploy.json/createUIDefinitionUri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2Fazure-quickstart-templates%2Fmaster%2Fquickstarts%2Fmicrosoft.costmanagement%2Foptimization-workbook%2FcreateUiDefinition.json" target="_blank" rel="noopener noreferrer">Deploy to Azure</a></li>
<li>Acesse o Azure Portal e navegue até o Monitor.</li>
<li>Selecione "Workbooks" no menu e verifique se a sua assinatura está selecionada no filtro de assinaturas.</li>
<li>Selecione o "Cost Optimization Workbook".</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/azure-workbooks/1.png" alt=" Cost Optimization Workbook" />


<h3 id="principais-componentes-do-workbook">Principais Componentes do Workbook</h3>

<ul>
<li><strong>Visão Geral:</strong> Baseado no Microsoft Azure Well-Architected Framework (WAF) (<a href="https://www.orafaelferreira.com/artigos/well-architect-foundation-cloud" target="_blank" rel="noopener noreferrer">Caso queira saber mais sobre o WAF, visite o meu artigo anterior</a>), fornece princípios para equilibrar objetivos de negócios com necessidades tecnológicas, reduzindo desperdícios e melhorando a eficiência operacional.</li>
<li><strong>Recursos e Governança:</strong> Indica funcionalidades implementadas que seguem os princípios de Otimização de Custos e Governança de Custos.</li>
<li><strong>Pré-requisitos:</strong> Requer funções mínimas de Reader e Workbook Contributor para importar e salvar o workbook, além de ações de "Quick Fix" documentadas com permissões específicas.</li>
</ul>

<p>Na aba Usage optimization, temos a opção Top 10 services:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/azure-workbooks/2.png" alt="Top 10 services" />

<h2 id="exemplo-pratico-2-azure-orphaned-resources-workbook">Exemplo Prático 2: Azure Orphaned Resources Workbook</h2>

<p>O Azure Orphaned Resources Workbook centraliza recursos órfãos em ambientes Azure, ajudando a melhorar a eficiência através da economia de dinheiro, prevenção de configurações incorretas e simplificação operacional.</p>

<h3 id="como-utilizar-o-azure-orphaned-resources-workbook">Como Utilizar o <a href="https://github.com/dolevshor/azure-orphan-resources" target="_blank" rel="noopener noreferrer">Azure Orphaned Resources Workbook</a></h3>

<p>1. <strong>Importação do Workbook</strong></p>
<ul>
<li>Acesse o Azure Portal e vá para 'Azure Workbooks'.</li>
<li>Clique em '+ Create' e depois em '+ New'.</li>
<li>Abra o Editor Avançado usando o botão '</>' na barra de ferramentas.</li>
<li>Selecione o 'Gallery Template'.</li>
<li>Substitua o código JSON pelo código fornecido para <a href="https://github.com/dolevshor/azure-orphan-resources/tree/main/Workbook" target="_blank" rel="noopener noreferrer">'Azure Orphaned Resources v2.0'</a> <strong>OBS: Deixei o link para você copiar o código e sempre utilizar a versão mais atual</strong></li>
<li>Clique em 'Apply' e depois em 'Save'.</li>
<li>Insira um título, assinatura, grupo de recursos e localização para o workbook.</li>
<li>Clique em 'Save'.</li>
</ul>

<p>2. <strong>Visualização do Workbook</strong></p>
<ul>
<li>Navegue até 'Workbooks' e clique no workbook 'Orphaned Resources'.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/azure-workbooks/3.png" alt="Orphaned App Service Plans" />

<h3 id="principais-componentes-do-workbook-2">Principais Componentes do Workbook</h3>

<ul>
<li><strong>Tipos de Recursos Incluídos:</strong></li>
<li>Compute</li>
<li>App Service Plans</li>
<li>Storage</li>
<li>Managed Disks</li>
<li>Public IPs</li>
<li>Load Balancers</li>
<li>Application Gateways</li>
<li>Virtual Networks</li>
<li>Private Endpoints</li>
<li>Virtual Network Gateways</li>
<li>Outros (Resource Groups, API Connections, Certificates)</li>
</ul>

<h3 id="beneficios-do-workbook">Benefícios do Workbook</h3>

<ul>
<li><strong>Economia de Dinheiro:</strong> Identifica recursos órfãos que ainda geram custos desnecessários.</li>
<li><strong>Prevenção de Misconfiguração:</strong> Ajuda a evitar configurações incorretas mantendo a infraestrutura organizada.</li>
<li><strong>Simplificação Operacional:</strong> Centraliza a visualização de recursos órfãos, facilitando a gestão e manutenção do ambiente Azure.</li>
</ul>

<h3 id="abaixo-seguem-alguns-exemplos">Abaixo seguem alguns exemplos:</h3>

<p>Orphaned App Service Plans:</p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/azure-workbooks/4.png" alt="Orphaned App Service Plans" />
<p>Orphaned Application Gateway:</p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/azure-workbooks/5.png" alt="Orphaned Application Gateway" />
<p>Orphaned Managed Disks, podemos fazer o download do conteúdo conforme imagem: </p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/azure-workbooks/6.png" alt="Orphaned Managed Disks" />

<p>Esse é um exemplo da planilha que é exportada, podemos então apresentar aos times responsáveis para possível exclusão dos recursos.</p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/azure-workbooks/7.png" alt="export_data" />

<h2 id="exemplo-pratico-3-azure-finops-workbook">Exemplo Prático 3: Azure FinOps Workbook</h2>

<p>O Azure FinOps Workbook fornece insights, documentos chaves e orientações sobre a implementação de FinOps e otimização de custos no Azure. Ele visualiza os dados do seu ambiente Azure junto com recomendações e guias relevantes, incentivando uma abordagem orientada por dados.</p>

<h3 id="como-utilizar-o-azure-finops-workbook">Como Utilizar o <a href="https://github.com/ms-sambell/azure-finops-workbook/tree/main?tab=readme-ov-file" target="_blank" rel="noopener noreferrer">Azure FinOps Workbook</a></h3>

<p>1. <strong>Importação do Workbook</strong></p>
<ul>
<li>Copie o <a href="https://github.com/ms-sambell/azure-finops-workbook/blob/main/workbook.json" target="_blank" rel="noopener noreferrer">conteúdo</a> do arquivo <code>workbook.json</code>.</li>
<li>Acesse a página de Azure Workbooks e clique em "New".</li>
<li>Clique no botão de código <code></></code>.</li>
<li>Cole o conteúdo copiado na página e clique em "Apply".</li>
<li>Salve o workbook (se tiver permissões) e clique em "Done Editing".</li>
</ul>

<h3 id="principais-componentes-do-workbook-3">Principais Componentes do Workbook</h3>

<ul>
<li><strong>Inclusões:</strong></li>
<li>Auditoria de Licença Híbrida</li>
<li>Auditoria de Tagging</li>
<li>Exemplos práticos de FinOps / Automação</li>
<li>Insights de otimização de custos para Storage Accounts, AKS, Log Analytics, recursos órfãos, Recovery Services, App Services e VMs.</li>
</ul>

<h3 id="requisitos-para-utilizacao">Requisitos para Utilização</h3>

<ul>
<li><strong>Permissões:</strong> Acesso de leitura aos recursos que você está investigando no Azure. Para salvar o workbook, você precisa de permissões para criar um Azure Workbook.</li>
<li><strong>AKS:</strong> Informações de AKS requerem o uso do Container Insights.</li>
<li><strong>Recomendação:</strong> Acesso de leitura sobre toda a assinatura/grupos de gerenciamento para ativar todos os painéis do workbook.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/azure-workbooks/8.png" alt="FinOps Insights - Workbook" />

<p>Na sessão de Governance temos Tag:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/azure-workbooks/9.png" alt="Tags" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/azure-workbooks/10.png" alt="Tags" />

<p>E essa que considere uma das melhoras melhor: Cost Optimization</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/azure-workbooks/11.png" alt="Recursos órfãos" />

<h2 id="reflexao">Reflexão</h2>
<p>Mas você deve estar se perguntando, a mas vou utilizar somente um, por exemplo, o último do FinOps que possui todas as informações. Mas lembre-se sempre, nenhum remédio irá te curar de todas as dores, nada melhor que usar algo específico para a sua dor!</p>

<h2 id="greenops-como-azure-workbooks-e-um-aliado-na-gestao-sustentavel">GreenOps: Como Azure Workbooks é um Aliado na Gestão Sustentável</h2>

<p>Azure Workbooks pode ser um aliado poderoso para práticas de GreenOps, fornecendo dashboards e insights que facilitam a gestão sustentável nas operações de TI. Para mais informações sobre GreenOps, visite meu artigo completo <a href="https://www.orafaelferreira.com/artigos/finops-foundation-cloud" target="_blank" rel="noopener noreferrer">aqui</a>. Aqui estão algumas formas de como Azure Workbooks pode ajudar:</p>

<p>1. <strong>Identificação de Recursos Subutilizados</strong></p>
<ul>
<li>Azure Workbooks ajuda a identificar recursos subutilizados, permitindo ajustes ou desativações para reduzir o consumo de energia e os custos operacionais.</li>
</ul>

<p>2. <strong>Análise de Padrões de Uso</strong></p>
<ul>
<li>Fornece gráficos e análises que permitem observar padrões de uso, possibilitando ajustes operacionais para otimizar o uso de energia.</li>
</ul>

<p>3. <strong>Otimização de Custos e Recursos</strong></p>
<ul>
<li>Facilita a identificação de áreas para redução de custos, alinhando a gestão de recursos com os objetivos de sustentabilidade.</li>
</ul>

<p>4. <strong>Implementação de Práticas Sustentáveis</strong></p>
<ul>
<li>Com os insights obtidos, é possível implementar práticas que promovam a sustentabilidade, como a escolha de recursos energeticamente eficientes.</li>
</ul>

<p>Ao integrar Azure Workbooks em suas práticas de GreenOps, você pode melhorar a sustentabilidade e a eficiência de suas operações de TI.</p>

<h2 id="conclusao">Conclusão</h2>

<p>Azure Workbooks é uma ferramenta poderosa que pode ser utilizada para apoiar práticas de FinOps, proporcionando uma melhor visibilidade e controle sobre os custos na nuvem. Ao integrar dados de diversas fontes e criar visualizações interativas, as organizações podem otimizar sua utilização de recursos, melhorar o planejamento financeiro e garantir uma operação de nuvem mais eficiente e econômica.</p>

<p>---</p>


]]></content:encoded>
    </item>
    <item>
      <title>Antes do Cloud Native: Construindo uma Fundação Sólida para a Nuvem Impactando um Futuro Sustentável</title>
      <link>https://www.orafaelferreira.com/artigos/antes-cloud-native-fundacao-solida</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/antes-cloud-native-fundacao-solida</guid>
      <pubDate>Sun, 14 Jul 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Como Green Computing, Cloud Foundation, DevOps, FinOps e Observabilidade constroem uma base sólida para a nuvem e impactam a sustentabilidade ambiental.</description>
      <category>Artigos</category>
      <category>GreenOps</category>
      <category>Terraform</category>
      <category>Azure</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-24-green-computing-foundation-cloud01.png" length="0" type="image/png" />
      <content:encoded><![CDATA[<h2 id="introducao">Introdução</h2>
<p>Em um mundo cada vez mais digital, inovações em tecnologias Cloud Native não são apenas uma questão de avanço tecnológico, mas também impactam mudança social e ambiental. Esta jornada começou com a compreensão de como uma Cloud Foundation, DevOps, FinOps, e a Observabilidade não apenas definem o futuro de uma empresa, mas impactam diretamente em uma responsabilidade social e sustentabilidade ambiental.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-24-green-computing-foundation-cloud01.png" alt="Ilustração sobre Green Computing e fundação sólida para a nuvem" />

<h2 id="o-papel-da-computacao-verde">O Papel da Computação Verde</h2>
<p>A Green Computing vai além da eficiência energética, englobando a escolha de materiais sustentáveis, redução de resíduos eletrônicos e promoção da reciclagem. Em data centers, práticas como uso de energia renovável e otimização de servidores são fundamentais para reduzir o impacto ambiental.</p>

<h2 id="impacto-ambiental">Impacto Ambiental</h2>
<p>A conscientização sobre o impacto ambiental da tecnologia é crucial para promover práticas sustentáveis no setor de TI. Aqui estão alguns dados que destacam a importância da eficiência energética e da gestão ambiental responsável em tecnologias de TI:</p>

<p>1. <strong>Resíduos Eletrônicos Globais</strong>: Em 2019, aproximadamente 54 milhões de toneladas de resíduos eletrônicos foram gerados mundialmente, mas somente 17% receberam reciclagem adequada.</p>

<p>2. <strong>Exportação de Resíduos Eletrônicos dos EUA</strong>: As regulamentações federais norte-americanas atualmente permitem a exportação de lixo eletrônico, o que representa uma ameaça global à saúde humana. Estima-se que entre 5% a 30% dos 40 milhões de computadores usados nos EUA foram exportados para países em desenvolvimento em 2010. Em 2016, a Basel Action Network descobriu que 34% do lixo eletrônico monitorado nos EUA foi enviado para o exterior, quase todo para países em desenvolvimento.</p>

<p>3. <strong>Eficiência Energética em Data Centers</strong>: Em 2014, os data centers dos EUA consumiram 70 bilhões de kWh de eletricidade, As tecnologias e estratégias de design eficientes existentes podem reduzir o uso de energia dos servidores em 25% ou mais, enquanto as melhores práticas de gerenciamento e consolidação de servidores podem diminuir o consumo de energia em até 20%. A eletricidade utilizada por servidores e data centers nos EUA resulta na emissão de 28,4 milhões de toneladas métricas de CO2e anualmente. </p>

<p>4. <strong>Teletrabalho e Consumo de Energia</strong>: O teletrabalho durante a pandemia de COVID-19 em 2020 levou a uma redução de 13% no consumo de energia relacionado ao trabalho e a uma diminuição de 14% nas emissões de gases de efeito estufa.</p>

<p>5. <strong>Redução de Energia em Equipamentos de Escritório</strong>: Em 2018, computadores e equipamentos de escritório foram responsáveis por 13% do consumo total de eletricidade (227 bilhões de kWh) em edifícios de escritórios. A implementação de modos de baixo consumo de energia em equipamentos de escritório poderia reduzir seu consumo energético em 23%. Se todos os computadores desktop e impressoras fossem desligados à noite, o consumo de energia poderia ser reduzido em mais 9%.</p>

<p>Estas estatísticas destacam a necessidade de práticas sustentáveis no uso e gestão de tecnologias de TI, reforçando a importância de estratégias conscientes em computação verde e sustentabilidade ambiental.</p>

<a href="https://css.umich.edu/factsheets/green-it-factsheet" target="_blank" rel="noopener noreferrer">Fonte: Center for Sustainable Systems</a>

<h2 id="padroes-de-software-verde">Padrões de Software Verde</h2>
<p>A Green Software Foundation estabeleceu um banco de dados de padrões de software verde, que são mantidos e revisados por especialistas. Estes padrões são essenciais para garantir que a aplicação diminua emissões de carbono. O catálogo de padrões disponibilizado é amplo e abrange uma variedade de categorias, garantindo que profissionais de software encontrem práticas aplicáveis aos seus respectivos campos, tecnologias ou domínios.</p>

<ul>
<li><strong>Green Software Foundation:</strong> <a href="https://greensoftware.foundation/" target="_blank" rel="noopener noreferrer">Informações sobre padrões e práticas sustentáveis</a></li>
</ul>

<ul>
<li><strong>Green Software Patterns:</strong> <a href="https://patterns.greensoftware.foundation/" target="_blank" rel="noopener noreferrer">Documentação sobre padrões de software verde.</a></li>
</ul>

<h2 id="principios-padroes-e-praticas">Princípios, Padrões e Práticas</h2>
<p>Os princípios de software verde fornecem um conjunto fundamental de competências necessárias para definir, executar e construir software sustentável. Já os padrões oferecem exemplos práticos de como aplicar esses princípios em cenários do mundo real, de forma neutra em relação a fornecedores. As práticas são padrões aplicados a produtos específicos de fornecedores, orientando os profissionais sobre como usar esses produtos de maneira mais sustentável.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-24-green-computing-foundation-cloud06.png" alt="Princípios, padrões e práticas de software verde" />

<h2 id="estrategias-de-implementacao">Estratégias de Implementação</h2>
<p>Na implementação de infraestruturas Cloud Native bem desenhadas, a adoção de frameworks bem-estruturados, como o Cloud Adoption Framework e o Well-Architected Framework, são essenciais. Esses frameworks auxiliam na criação de sistemas que são eficientes e performáticos, mas também ambientalmente responsáveis.</p>

<h3 id="cargas-de-trabalho-sustentaveis-no-azure">Cargas de Trabalho Sustentáveis no Azure</h3>
<p>Abordando a sustentabilidade dentro do Azure, existe uma seção do Microsoft Azure Well-Architected Framework destinada a oferecer diretrizes para enfrentar os desafios de criação de ambientes com cargas de trabalho sustentáveis. Essas diretrizes aplicam práticas recomendadas com uma base técnica para construir e operar soluções sustentáveis, atendendo às necessidades comerciais e promovendo práticas ambientalmente responsáveis no Azure.</p>

<h4>O que é uma carga de trabalho sustentável?</h4>
<p>Refere-se a uma coleção de softwares que suportam um objetivo comercial comum, focando no impacto ambiental destas cargas de trabalho. Uma carga de trabalho sustentável descreve como prática de criar soluções que maximizam a utilização, minimizando o desperdício e a pegada ambiental. A eficiência das cargas de trabalho na nuvem combina otimização de custos, redução das emissões de carbono e otimização do consumo de energia.</p>

<h4>Desafios Comuns na Implementação de Cargas de Trabalho Sustentáveis</h4>
<p>Ao implementar cargas de trabalho sustentáveis, especialmente no contexto do Azure, enfrentamos desafios únicos:</p>
<ul>
<li><strong>Alinhamento com Metas de Sustentabilidade:</strong> Avaliar e ajustar cargas de trabalho existentes para garantir que estejam em conformidade com os objetivos ambientais estabelecidos.</li>
<li><strong>Design Otimizado para o Meio Ambiente:</strong> Criar cargas de trabalho que sejam eficientes e ecologicamente corretas por natureza, minimizando o impacto ambiental.</li>
<li><strong>Medição das Emissões:</strong> Monitorar e acompanhar rigorosamente as emissões de carbono associadas às cargas de trabalho para avaliar o progresso em direção às metas de sustentabilidade.</li>
</ul>

<h4>Principais Áreas de Design para Sustentabilidade</h4>
<p>Ao considerar a sustentabilidade em cargas de trabalho, focamos nas seguintes áreas principais de design:</p>
<p>1. <strong>Design do Aplicativo:</strong> Incorporar padrões de nuvem sustentáveis para desenvolver cargas de trabalho ecologicamente corretas.</p>
<p>2. <strong>Plataforma de Aplicativos:</strong> Escolher ambientes de hospedagem e dependências que priorizem a eficiência energética e a sustentabilidade.</p>
<p>3. <strong>Testes:</strong> Implementar estratégias de CI/CD e automação para realizar testes de software de forma mais sustentável.</p>
<p>4. <strong>Procedimentos Operacionais:</strong> Estabelecer processos que suportem operações sustentáveis e redução do impacto ambiental.</p>

<ul>
<li><strong>Sustentabilidade Além de Desempenho e Custo</strong></li>
</ul>
<p>Além da eficiência de desempenho e otimização de custos, outras áreas como segurança, confiabilidade e excelência operacional são essenciais para criar cargas de trabalho sustentáveis de longo prazo no Azure. </p>

<ul>
<li><strong>Benefícios do Carbono da Computação em Nuvem:</strong> <a href="https://info.microsoft.com/ww-landing-Carbon-Benefits-of-Cloud-Computing.html?lcid=pt-br" target="_blank" rel="noopener noreferrer">Um estudo da Nuvem da Microsoft</a> sobre eficiência energética e de carbono do Azure.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-24-green-computing-foundation-cloud03.png" alt="Principais áreas de design para sustentabilidade no Azure" />

<h4>Azure Carbon Optimization</h4>
<p>O Azure Carbon Optimization é uma ferramenta inovadora da Microsoft que capacita organizações a medir e reduzir o impacto de carbono de sua infraestrutura na nuvem. Oferecendo dados detalhados de emissões por recursos, assinaturas e localizações, esta ferramenta integra-se perfeitamente ao portal do Azure, permitindo um acesso simplificado e baseado em permissões RBAC do Azure. Com recomendações práticas para otimização de recursos, o Azure Carbon Optimization não apenas ajuda a alcançar metas de sustentabilidade, mas também promove uma gestão de recursos mais eficiente e econômica. Este serviço destaca o compromisso da Microsoft com a responsabilidade ambiental, fornecendo insights valiosos e ações concretas para reduzir a pegada de carbono na nuvem. Outras ofertas de sustentabilidade da Microsoft <a href="https://learn.microsoft.com/en-us/industry/sustainability/sustainability-manager-overview" target="_blank" rel="noopener noreferrer">Microsoft Sustainability Manager,</a> <a href="https://learn.microsoft.com/en-us/power-bi/connect-data/service-connect-to-emissions-impact-dashboard?toc=%2Findustry%2Fsustainability%2Ftoc.json&bc=%2Findustry%2Fbreadcrumb%2Ftoc.json" target="_blank" rel="noopener noreferrer">Painel de Impacto de Emissões</a> e <a href="https://learn.microsoft.com/en-us/industry/sustainability/sustainability-data-solutions-overview" target="_blank" rel="noopener noreferrer">Os insights de emissões do Microsoft Azure (versão prévia)</a></p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-24-green-computing-foundation-cloud09.png" alt="Painel do Azure Carbon Optimization com emissões de carbono" />


<h2 id="o-que-e-green-software">O que é Green Software?</h2>
<p>Podemos dizer que Green Software é uma disciplina emergente que está diretamente envolvida por ciência climática, design de software, mercados de eletricidade, hardware e design de data centers. É focada na criação de software que seja eficiente em termos de carbono, emitindo o mínimo possível de carbono.</p>

<h2 id="como-ser-um-praticante-de-green-software">Como Ser um Praticante de Green Software</h2>
<p>O que um praticante de Green Software deve conhecer:</p>

<ul>
<li><strong>Eficiência de Carbono:</strong> Emitir a menor quantidade de carbono possível.</li>
<li><strong>Eficiência Energética:</strong> Usar a menor quantidade de energia possível.</li>
<li><strong>Consciência de Carbono:</strong> Fazer mais quando a eletricidade for mais limpa e menos quando for mais suja.</li>
<li><strong>Eficiência de Hardware:</strong> Usar a menor quantidade de carbono incorporado possível.</li>
<li><strong>Medição:</strong> O que não pode ser medido, não pode ser melhorado.</li>
<li><strong>Compromissos Climáticos:</strong> Entender o mecanismo exato de redução de carbono.</li>
</ul>

<h2 id="iniciativas-para-um-impacto-ambiental-positivo">Iniciativas para um Impacto Ambiental Positivo</h2>
<p>Na busca pela sustentabilidade e redução da pegada de carbono, várias estratégias podem ser empregadas, sendo as mais comuns o abatimento, a compensação e a neutralização de carbono. Vamos explorar cada uma delas:</p>

<p>1. <strong>Abatimento:</strong> Esta estratégia foca na redução direta das emissões de gases de efeito estufa. Isso pode ser alcançado através da implementação de tecnologias mais limpas, mudança de comportamentos e práticas operacionais, como a utilização de fontes de energia renováveis e a otimização da eficiência energética em processos e edifícios.</p>

<p>2. <strong>Compensação:</strong> A compensação envolve o investimento em projetos externos que reduzem as emissões de carbono, como projetos de reflorestamento ou de energia renovável. Esses projetos geram créditos de carbono, que podem ser utilizados para "compensar" as emissões que não podem ser eliminadas internamente.</p>

<p>3. <strong>Neutralização:</strong> A neutralização de carbono é o processo de alcançar um equilíbrio líquido zero nas emissões de carbono, combinando abatimento com compensações para neutralizar completamente o impacto de carbono de uma organização ou produto. Isso é frequentemente referido como alcançar "carbono neutro" ou "net zero".</p>

<p>Cada uma dessas estratégias desempenha um papel importante na mitigação das mudanças climáticas e na transição para uma economia de baixo carbono. No contexto de Cloud Native e Green Software, esses compromissos orientam as decisões e práticas, desde o planejamento e design de software até a escolha de fornecedores e tecnologias. </p>

<p>Explorando novas fronteiras em sustentabilidade, a Microsoft testou um <a href="https://news.microsoft.com/pt-br/no-fundo-do-mar-a-microsoft-testa-um-datacenter-rapido-de-implantar-que-pode-fornecer-conectividade-a-internet-por-anos/" target="_blank" rel="noopener noreferrer">Datacenter Subaquático</a>, visando uma implementação rápida e um menor impacto ambiental. Este projeto demonstra o potencial de soluções inovadoras em data centers para alcançar uma maior sustentabilidade.</p>

<p>Para entender melhor como a eficiência energética é implementada na prática, confira este <a href="https://news.microsoft.com/pt-br/microsoft-revela-tour-virtual-em-um-de-seus-datacenters/#:~:text=A%20Microsoft%20disponibilizou%20hoje%20um,hardware%20e%20software%20que%20mant%C3%AAm" target="_blank" rel="noopener noreferrer">Tour virtual em um dos datacenters da Microsoft</a>, onde são empregadas tecnologias inovadoras para otimizar o uso de energia.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-24-green-computing-foundation-cloud02.png" alt="Iniciativas da Microsoft para impacto ambiental positivo em datacenters" />

<h2 id="importancia-da-medicao-e-avaliacao">Importância da Medição e Avaliação</h2>

<p>Uma medição das emissões de gases de efeito estufa é ideal para compreender e melhorar o impacto ambiental das organizações. Abaixado dois exemplos de métricas:</p>

<ul>
<li><strong>Protocolo de Gases de Efeito Estufa (GHG Protocol):</strong> Uma ferramenta internacionalmente reconhecida para a contabilização e relatório de emissões de GEE, oferecendo um quadro abrangente para medir emissões diretas e indiretas.</li>
<li><strong>Intensidade de Carbono de Software (SCI):</strong> Uma métrica específica para avaliar a quantidade de emissões de GEE por unidade de funcionalidade em aplicações de software, ajudando desenvolvedores e organizações de tecnologia a otimizarem o impacto ambiental de suas soluções.</li>
</ul>

<h2 id="acoes-para-reducao-de-carbono">Ações para Redução de Carbono</h2>
<p>Três ações essenciais para reduzir as emissões de carbono do software:</p>

<p>1. <strong>Utilizar menos recursos físicos:</strong> Reduzindo a necessidade de hardware e energia para sua produção e funcionamento.</p>
<p>2. <strong>Reduzir o consumo de energia:</strong> Otimizando o software para ser mais eficiente em termos de energia.</p>
<p>3. <strong>Uso inteligente de energia:</strong> Preferindo fontes de energia de baixo carbono.</p>

<h2 id="cultura-devops-e-finops">Cultura DevOps e FinOps</h2>
<p>A cultura DevOps, com seu foco em eficiência e automação, está alinhada com os objetivos de sustentabilidade. O FinOps, concentrando-se na otimização de custos e recursos, permitindo criar infraestruturas que maximizam a eficiência e minimizam o desperdício, apoiando a sustentabilidade no longo prazo.</p>

<h2 id="observabilidade-e-sustentabilidade">Observabilidade e Sustentabilidade</h2>
<p>A observabilidade detalhada é um componente crítico para a construção de sistemas Cloud Native sustentáveis. Ela envolve a coleta, monitoramento e análise de dados, permitindo uma compreensão profunda do comportamento do sistema e o uso dos recursos. Ao aplicar práticas de observabilidade, as equipes de TI podem identificar e mitigar ineficiências, reduzir o consumo de energia e melhorar a performance, alinhando-se assim aos princípios de sustentabilidade.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-24-green-computing-foundation-cloud05.png" alt="Observabilidade aplicada à sustentabilidade em sistemas Cloud Native" />

<h2 id="computacao-verde-e-cloud-native">Computação Verde e Cloud Native</h2>
<p>A integração da computação verde no Cloud Native reflete uma mudança cultural significativa, onde cada dado processado, leva em conta seu impacto ambiental. Ao implementar padrões de software verde, como os propostos pela Green Software Foundation, estamos garantindo que o caminho para inovações, respeitem o nosso meio ambiente, demonstrando que é possível alcançar excelência tecnológica sem comprometer a saúde do nosso planeta.</p>

<h2 id="contribuicao-para-o-ecosistema-open-source">Contribuição para o Ecosistema Open Source</h2>
<p>A adoção de práticas sustentáveis oferece uma oportunidade para contribuir de volta ao ecosistema Open Source. Desenvolvendo melhorias e plugins baseados em observações detalhadas e compartilhando conhecimento e melhores práticas, as organizações não apenas se beneficiam, mas também enriquecem o Open Source. Esta colaboração e compartilhamento são fundamentais para fortalecer a comunidade e promover um futuro promissor para tecnologias Cloud Native.</p>

<h2 id="greenops-o-futuro-ja-chegou">GreenOps: o futuro já chegou?</h2>
<p>Pesquisas da Gartner revelam que as tecnologias voltadas para a sustentabilidade estão entre as três principais tendências para 2024. A projeção é que, até 2027, cerca de 25% da remuneração dos CIOs será determinada pelo impacto de suas iniciativas tecnológicas sustentáveis.</p>

<h2 id="conclusao-um-chamado-para-a-mudanca">Conclusão: Um Chamado para a Mudança</h2>
<p>Como profissionais de tecnologia, temos a possibilidade de liderar a transformação para práticas sustentáveis. Podemos adotar princípios de sustentabilidade, contribuindo ativamente para um futuro mais verde. Este artigo serve como auxílio para todos os profissionais de TI e todas áreas que tem interesse em integrar a sustentabilidade em suas práticas, promovendo um avanço tecnológico que proteja nosso planeta para as futuras gerações.</p>

<p>Ao adotar práticas sustentáveis e responsáveis, não estamos apenas moldando o futuro da tecnologia, mas também o futuro do nosso planeta e da humanidade. Cada passo em direção à sustentabilidade é um passo em direção a um legado duradouro que beneficiará não apenas a nossa geração, mas muitas que virão.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-24-green-computing-foundation-cloud04.png" alt="Chamado à mudança rumo a uma tecnologia sustentável" />

<h3 id="ferramenta-de-revisao-de-avaliacao">Ferramenta de Revisão de Avaliação</h3>

<p>Avalie sua aplicação do Microsoft Sustainability Manager em diferentes estágios do processo de implementação, examinando várias categorias para orientar um deployment bem estruturado.</p>

<strong>Em qual fase ou etapa você gostaria de avaliar a implementação da sua solução Microsoft Sustainability Manager?</strong>

<p>Inicie sua avaliação com a <a href="https://learn.microsoft.com/pt-br/assessments/333d9326-e34c-40e1-88d9-8342afceec36/" target="_blank" rel="noopener noreferrer">Microsoft Sustainability Manager - Avaliação Bem-Estruturada</a>.</p>

<ul>
<li><strong>Planejamento:</strong> Avalie a prontidão do planejamento do MVP do seu Sustainability Manager.</li>
<li><strong>Design:</strong> Avalie as considerações de design do seu Sustainability Manager.</li>
<li><strong>Go-Live:</strong> Avalie a prontidão para implantação e entrada em funcionamento do seu Sustainability Manager.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-24-green-computing-foundation-cloud08.png" alt="Ferramenta de avaliação de sustentabilidade do Microsoft Learn" />

<p>Existem um segunda opção de avaliação. Examine sua carga de trabalho por meio da lente de sustentabilidade.</p>

<p>Inicie sua avaliação com a <a href="https://learn.microsoft.com/pt-br/assessments/f236012a-0070-45db-b94c-fe8de0799f38/" target="_blank" rel="noopener noreferrer">Sustentabilidade - Revisão Bem Arquitetada</a>.</p>

<p>---</p>

<a href="https://www.credly.com/badges/11e2e57b-47a9-48ca-af23-41cbb45c01ef/public_url" target="_blank" rel="noopener noreferrer"><img src="https://images.credly.com/images/f28a92f1-2837-4770-add0-70008be15e89/image.png" alt="LFC131: Green Software for Practitioners" /></a>]]></content:encoded>
    </item>
    <item>
      <title>Plataformização de Arquitetura de Dados com Backstage.io e IAC - TDC Florianópolis - Trilha Arquitetura de Dados 2024</title>
      <link>https://www.orafaelferreira.com/artigos/talk-tdc</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/talk-tdc</guid>
      <pubDate>Tue, 25 Jun 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>No TDC Florianópolis 2024, tive a honra de palestrar na Trilha de Arquitetura de Dados, ao lado de meu amigo Cláudio Filipe Lima Rapôso.</description>
      <category>Palestras</category>
      <category>Platform Engineering</category>
      <category>Terraform</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tdc/00.jpg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[
<h4>Introdução</h4>
<p>No TDC Florianópolis 2024, tive a honra de palestrar na <a href="https://thedevconf.com/tdc/2024/florianopolis/trilha-arquitetura-de-dados" target="_blank" rel="noopener noreferrer">Trilha de Arquitetura de Dados</a>, ao lado de meu amigo <a href="https://www.linkedin.com/in/cfraposo/" target="_blank" rel="noopener noreferrer">Cláudio Filipe Lima Rapôso</a>. Nossa palestra focou na Plataformização de Arquitetura de Dados utilizando Backstage.io e IaC (Infrastructure as Code), trazendo a importância de uma gestão eficiente e automatizada na infraestrutura.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tdc/00.jpg" alt="Rafael Ferreira e Cláudio Rapôso na Trilha Arquitetura de Dados do TDC" />

<h4>Data e Local</h4>
<ul>
<li><strong>Data:</strong> Sexta-feira, 14 de Junho de 2024</li>
<li><strong>Local:</strong> CentroSul, Av. Governador Gustavo Richard, 850 / Centro Florianópolis - SC</li>
</ul>

<h4>O Evento</h4>
<p>O <a href="https://thedevconf.com/tdc/2024/index.html" target="_blank" rel="noopener noreferrer">TDC</a> é um evento de destaque no cenário tecnológico brasileiro, oferecendo um local para profissionais de TI compartilharem conhecimentos, experiências e inovações.</p>

<h4>O Tema da Palestra</h4>
<p>Nossa apresentação abordou a plataformização da arquitetura de dados com Backstage.io e Terraform, ferramentas essenciais para a centralização e automação dos serviços relacionados aos dados.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tdc/01.jpg" alt="Slide de abertura da palestra sobre Plataformização de Arquitetura de Dados" />

<h4>Análise da Palestra</h4>
<p>A palestra explorou a visão e os desafios da criação de uma plataforma unificada para gerenciar infraestruturas de cloud, destacando a complexidade crescente dessas arquiteturas e a necessidade de consistência e eficiência entre múltiplas equipes. Demonstramos como o uso de Infraestrutura como Código (IaC) com ferramentas como Terraform e Backstage.io pode facilitar essa unificação e governança centralizada.</p>

<p>Os principais pontos abordados foram:</p>
<ul>
<li><strong>Visão e Desafios</strong>: Planejamento eficiente para integração na nuvem.</li>
<li><strong>Ferramentas Mágicas</strong>: Integração do Backstage.io com Terraform para suporte multi-cloud, automação e eficiência.</li>
<li><strong>Escolha do Ferramental</strong>: Plataforma open-source que facilita a criação de templates dinâmicos para desenvolvimento, infraestruturas e DevOps.</li>
<li><strong>Benefícios</strong>: Aumento na produtividade, redução de erros humanos, aceleração no time-to-market e satisfação do cliente.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tdc/03.JPG" alt="Rafael Ferreira apresentando Backstage.io e Terraform no TDC Floripa" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tdc/04.JPG" alt="Cláudio Rapôso apresentando a plataformização de dados no TDC Floripa" />

<ul>
<li><i></i> <strong>Slides da Apresentação:</strong> <a href="https://stoblobcertificados011.blob.core.windows.net/palestras/TDC.pdf" target="_blank" rel="noopener noreferrer">Plataformização de Arquitetura de Dados com Backstage.io e IAC</a></li>
</ul>

<h4>Momentos Destacados</h4>
<p>Durante a palestra, demonstramos casos práticos de como essas ferramentas podem simplificar e otimizar o fluxo de trabalho em projetos de dados. Compartilhamos insights sobre a integração de Backstage.io com Terraform para criar uma infraestrutura robusta e escalável, que pode ser gerida de forma eficiente.  E para quem se perguntou da qualidade das fotos, sim, é isso, tivemos um fotógrafo profissional (<a href="https://www.linkedin.com/in/erivaldolopes/" target="_blank" rel="noopener noreferrer">Erivaldo Lopes</a>)!</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tdc/05.JPG" alt="Demonstração prática de Backstage.io e IaC durante a palestra" />

<h4>Reflexões e Aprendizados</h4>
<p>Palestrar no TDC Floripa foi uma experiência enriquecedora. Além de compartilhar conhecimento, tive a oportunidade de aprender com outros profissionais e expandir minha rede de contatos. A interação com o público foi dinâmica, com perguntas que geraram discussões profundas sobre os desafios e oportunidades na arquitetura de dados. </p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tdc/06.JPG" alt="Palestra sobre Backstage.io e IaC no palco do TDC Florianópolis 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tdc/07.JPG" alt="Público da Trilha Arquitetura de Dados no TDC Floripa 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tdc/08.JPG" alt="Rafael Ferreira e Cláudio Rapôso palestrando no TDC Floripa 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tdc/09.JPG" alt="Momento da palestra sobre plataformização de dados no TDC Floripa" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tdc/10.JPG" alt="Palestra sobre Backstage.io e IaC no palco do TDC Florianópolis 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tdc/11.JPG" alt="Público da Trilha Arquitetura de Dados no TDC Floripa 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tdc/12.jpg" alt="Rafael Ferreira e Cláudio Rapôso palestrando no TDC Floripa 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tdc/13.JPG" alt="Momento da palestra sobre plataformização de dados no TDC Floripa" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tdc/14.JPG" alt="Palestra sobre Backstage.io e IaC no palco do TDC Florianópolis 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tdc/15.JPG" alt="Público da Trilha Arquitetura de Dados no TDC Floripa 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tdc/16.JPG" alt="Rafael Ferreira e Cláudio Rapôso palestrando no TDC Floripa 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tdc/17.jpg" alt="Momento da palestra sobre plataformização de dados no TDC Floripa" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tdc/18.JPG" alt="Palestra sobre Backstage.io e IaC no palco do TDC Florianópolis 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tdc/19.JPG" alt="Público da Trilha Arquitetura de Dados no TDC Floripa 2024" />

<h4>Certificado</h4>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tdc/20.png" alt="Certificado de palestrante do TDC Florianópolis 2024" />

<h4>Conclusão</h4>
<p>Eventos como o TDC são cruciais para o avanço da tecnologia no Brasil, oferecendo uma plataforma para troca de conhecimentos e experiências. A trilha de Arquitetura de Dados, em particular, destacou-se por sua relevância e pelos insights valiosos compartilhados pelos palestrantes.</p>

<p>Que venham os próximos desafios e oportunidades!</p>

<p>---</p>

]]></content:encoded>
    </item>
    <item>
      <title>Episódio Especial do Podcast LowOpsCast no TDC</title>
      <link>https://www.orafaelferreira.com/artigos/podcast</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/podcast</guid>
      <pubDate>Sun, 23 Jun 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Gravei um episódio especial do LowOpsCast no TDC Florianópolis 2024, com apoio da Ambev Tech, entrevistando profissionais da comunidade sobre cloud e DevOps.</description>
      <category>Registro Eventos Presenciais</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/00.JPG" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[
<h2 id="introducao">Introdução</h2>

<p>No maior evento de desenvolvimento de software da América Latina, The Developer’s Conference (TDC), tive a oportunidade de gravar um episódio especial do meu podcast <a href="https://open.spotify.com/show/0U4kcZT2Cwn4CqQGg4Ywcj?si=f725a4c467144597" target="_blank" rel="noopener noreferrer">LowOpsCast</a>. Com o apoio da Ambev Tech, entrevistei profissionais incríveis que compartilharam suas experiências e insights sobre a sensação de palestrar no TDC e coordenar as trilhas, além de discussões sobre edições passadas. Neste artigo, vou contar como foi essa experiência.</p>

<h2 id="o-que-e-the-developers-conference">O que é The Developer’s Conference?</h2>

<p>O The Developer’s Conference <a href="https://thedevconf.com/tdc/2024/index.html" target="_blank" rel="noopener noreferrer">TDC</a>é o maior encontro de profissionais de tecnologia do Brasil. Este evento dinâmico conecta organizadores de meetups, palestrantes, empresas e patrocinadores, criando uma plataforma única que empodera o ecossistema tecnológico local. Durante o TDC, são apresentadas as tendências mais atuais e relevantes por meio de mais de dez trilhas paralelas diárias, cada uma organizada por especialistas da área.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/00.JPG" alt="Estúdio da Ambev Tech no TDC Florianópolis 2024" />

<h2 id="a-experiencia-de-gravacao">A Experiência de Gravação</h2>

<p>Foi criado um espaço de estúdio de gravação no evento. Durante o episódio, entrevistei duas turmas de participantes, cada uma composta por três convidados. O bate-papo foi repleto de histórias inspiradoras e insights para futuros palestrantes do TDC.</p>

<h3 id="primeira-entrevista-erivaldo-claudio-e-marina">Primeira Entrevista: Erivaldo, Claudio e Marina</h3>

<p>Na segunda parte do nosso episódio, conversei com Amin, Rafael e Thiago.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/02.JPG" alt="Rafael Ferreira entrevistando Erivaldo, Claudio e Marina no LowOpsCast" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/03.JPG" alt="Bancada do LowOpsCast durante a primeira entrevista no TDC" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/04.JPG" alt="Gravação do LowOpsCast com Erivaldo, Claudio e Marina no TDC 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/05.JPG" alt="Convidados da primeira entrevista do LowOpsCast no estúdio da Ambev Tech" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/06.JPG" alt="Rafael Ferreira entrevistando Erivaldo, Claudio e Marina no LowOpsCast" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/07.JPG" alt="Bancada do LowOpsCast durante a primeira entrevista no TDC" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/08.JPG" alt="Gravação do LowOpsCast com Erivaldo, Claudio e Marina no TDC 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/09.JPG" alt="Convidados da primeira entrevista do LowOpsCast no estúdio da Ambev Tech" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/10.JPG" alt="Rafael Ferreira entrevistando Erivaldo, Claudio e Marina no LowOpsCast" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/12.JPG" alt="Bancada do LowOpsCast durante a primeira entrevista no TDC" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/13.JPG" alt="Gravação do LowOpsCast com Erivaldo, Claudio e Marina no TDC 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/14.JPG" alt="Convidados da primeira entrevista do LowOpsCast no estúdio da Ambev Tech" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/15.JPG" alt="Rafael Ferreira entrevistando Erivaldo, Claudio e Marina no LowOpsCast" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/16.JPG" alt="Bancada do LowOpsCast durante a primeira entrevista no TDC" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/17.JPG" alt="Gravação do LowOpsCast com Erivaldo, Claudio e Marina no TDC 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/18.JPG" alt="Convidados da primeira entrevista do LowOpsCast no estúdio da Ambev Tech" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/20.JPG" alt="Rafael Ferreira entrevistando Erivaldo, Claudio e Marina no LowOpsCast" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/21.JPG" alt="Bancada do LowOpsCast durante a primeira entrevista no TDC" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/22.JPG" alt="Gravação do LowOpsCast com Erivaldo, Claudio e Marina no TDC 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/23.JPG" alt="Convidados da primeira entrevista do LowOpsCast no estúdio da Ambev Tech" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/24.JPG" alt="Rafael Ferreira entrevistando Erivaldo, Claudio e Marina no LowOpsCast" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/25.JPG" alt="Bancada do LowOpsCast durante a primeira entrevista no TDC" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/26.JPG" alt="Gravação do LowOpsCast com Erivaldo, Claudio e Marina no TDC 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/27.JPG" alt="Convidados da primeira entrevista do LowOpsCast no estúdio da Ambev Tech" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/28.JPG" alt="Rafael Ferreira entrevistando Erivaldo, Claudio e Marina no LowOpsCast" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/29.JPG" alt="Bancada do LowOpsCast durante a primeira entrevista no TDC" />

<p>Nesta primeira rodada, contou com Erivaldo, Claudio e Marina.</p>

<h3 id="segunda-entrevista-amin-rafael-e-thiago">Segunda Entrevista: Amin, Rafael e Thiago</h3>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/32.JPG" alt="Rafael Ferreira entrevistando Amin, Rafael e Thiago no LowOpsCast" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/30.JPG" alt="Bancada do LowOpsCast durante a segunda entrevista no TDC" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/31.JPG" alt="Gravação do LowOpsCast com Amin, Rafael e Thiago no TDC 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/33.JPG" alt="Convidados da segunda entrevista do LowOpsCast no estúdio da Ambev Tech" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/34.JPG" alt="Rafael Ferreira entrevistando Amin, Rafael e Thiago no LowOpsCast" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/35.JPG" alt="Bancada do LowOpsCast durante a segunda entrevista no TDC" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/36.JPG" alt="Gravação do LowOpsCast com Amin, Rafael e Thiago no TDC 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/37.JPG" alt="Convidados da segunda entrevista do LowOpsCast no estúdio da Ambev Tech" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/38.JPG" alt="Rafael Ferreira entrevistando Amin, Rafael e Thiago no LowOpsCast" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/39.JPG" alt="Bancada do LowOpsCast durante a segunda entrevista no TDC" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/40.JPG" alt="Gravação do LowOpsCast com Amin, Rafael e Thiago no TDC 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/41.JPG" alt="Convidados da segunda entrevista do LowOpsCast no estúdio da Ambev Tech" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/42.JPG" alt="Rafael Ferreira entrevistando Amin, Rafael e Thiago no LowOpsCast" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/43.JPG" alt="Bancada do LowOpsCast durante a segunda entrevista no TDC" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/44.JPG" alt="Gravação do LowOpsCast com Amin, Rafael e Thiago no TDC 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/45.JPG" alt="Convidados da segunda entrevista do LowOpsCast no estúdio da Ambev Tech" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/46.JPG" alt="Rafael Ferreira entrevistando Amin, Rafael e Thiago no LowOpsCast" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/47.JPG" alt="Bancada do LowOpsCast durante a segunda entrevista no TDC" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/49.JPG" alt="Gravação do LowOpsCast com Amin, Rafael e Thiago no TDC 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/50.JPG" alt="Convidados da segunda entrevista do LowOpsCast no estúdio da Ambev Tech" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/51.JPG" alt="Rafael Ferreira entrevistando Amin, Rafael e Thiago no LowOpsCast" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/52.JPG" alt="Bancada do LowOpsCast durante a segunda entrevista no TDC" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/53.JPG" alt="Gravação do LowOpsCast com Amin, Rafael e Thiago no TDC 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/54.JPG" alt="Convidados da segunda entrevista do LowOpsCast no estúdio da Ambev Tech" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/55.JPG" alt="Rafael Ferreira entrevistando Amin, Rafael e Thiago no LowOpsCast" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/58.JPG" alt="Bancada do LowOpsCast durante a segunda entrevista no TDC" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/59.JPG" alt="Gravação do LowOpsCast com Amin, Rafael e Thiago no TDC 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/60.JPG" alt="Convidados da segunda entrevista do LowOpsCast no estúdio da Ambev Tech" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/61.JPG" alt="Rafael Ferreira entrevistando Amin, Rafael e Thiago no LowOpsCast" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/62.JPG" alt="Bancada do LowOpsCast durante a segunda entrevista no TDC" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/63.JPG" alt="Gravação do LowOpsCast com Amin, Rafael e Thiago no TDC 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/65.JPG" alt="Convidados da segunda entrevista do LowOpsCast no estúdio da Ambev Tech" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/66.JPG" alt="Rafael Ferreira entrevistando Amin, Rafael e Thiago no LowOpsCast" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/67.JPG" alt="Bancada do LowOpsCast durante a segunda entrevista no TDC" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/69.JPG" alt="Gravação do LowOpsCast com Amin, Rafael e Thiago no TDC 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/70.JPG" alt="Convidados da segunda entrevista do LowOpsCast no estúdio da Ambev Tech" />

<p>Na segunda parte do nosso episódio, conversei com Amin, Rafael e Thiago.</p>

<h2 id="bastidores-e-momentos-marcantes">Bastidores e Momentos Marcantes</h2>

<p>As fotos dos bastidores dizem por si só. A energia do TDC e o suporte da Ambev Tech criaram um ambiente perfeito para a troca de conhecimentos e ideias. Cada momento foi capturado em fotos, que ilustram a dedicação e entusiasmo de todos os envolvidos.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/71.JPG" alt="Bastidores da gravação do LowOpsCast no estúdio da Ambev Tech" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/72.JPG" alt="Equipe nos bastidores do episódio especial do LowOpsCast no TDC" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/73.JPG" alt="Preparação do estúdio para a gravação do LowOpsCast no TDC" />

<h2 id="apoiadores-e-parceiros">Apoiadores e Parceiros</h2>

<p>Gostaria de agradecer à Ambev Tech e toda equipe do TDC pelo seu apoio. Eles não apenas patrocinaram o estúdio de gravação, mas também contribuíram para a qualidade e o alcance do nosso conteúdo.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Podcast-Ambev-Tech/01.JPG" alt="Equipe da Ambev Tech e do TDC no estúdio de gravação" />

<h2 id="conclusao">Conclusão</h2>

<p>O episódio especial do podcast gravado no The Developer’s Conference foi uma experiência única e enriquecedora. Agradeço a todos os nossos convidados e apoiadores que tornaram isso possível. Fique atento para mais episódios e continue nos acompanhando para insights sobre como alavancar sua carreira.</p>

<p>---</p>

]]></content:encoded>
    </item>
    <item>
      <title>Plataformização da Cloud Foundation com Backstage: Desvendando os Segredos da Eficiência na Nuvem com Developer Experience - Esquenta TDC - KuberTENes Birthday Bash Santa Catarina + Azure Floripa + API Floripa</title>
      <link>https://www.orafaelferreira.com/artigos/kubertenes</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/kubertenes</guid>
      <pubDate>Mon, 17 Jun 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>No dia 11 de junho de 2024, rolou o KuberTENes Birthday Bash Santa Catarina, um evento organizado pela comunidade Cloud Native Santa Catarina.</description>
      <category>Palestras</category>
      <category>Platform Engineering</category>
      <category>Kubernetes</category>
      <category>Cloud Native</category>
      <category>Comunidade</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/01.JPG" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[
<p>No dia 11 de junho de 2024, rolou o <a href="https://community.cncf.io/events/details/cncf-cloud-native-santa-catarina-presents-6o-kubertenes-birthday-bash-santa-catarina/" target="_blank" rel="noopener noreferrer"><strong>KuberTENes Birthday Bash Santa Catarina</strong></a>, um evento organizado pela comunidade <a href="https://community.cncf.io/cloud-native-santa-catarina/" target="_blank" rel="noopener noreferrer"><strong>Cloud Native Santa Catarina</strong></a>. Este evento híbrido foi realizado para comemorar os 10 anos do Kubernetes, uma tecnologia que revolucionou o mundo da computação em nuvem e continua a ser um pilar essencial para arquiteturas modernas.</p>

<p>O evento não apenas celebrou uma década de Kubernetes, mas também serviu como um pré-esquenta para o The Developer's Conference (TDC), que aconteceu nos dias seguintes. Tivemos uma agenda repleta de palestras.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/01.JPG" alt="Público reunido no KuberTENes Birthday Bash Santa Catarina" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/02.JPG" alt="Participantes chegando ao KuberTENes Birthday Bash em Florianópolis" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/03.JPG" alt="Abertura do KuberTENes Birthday Bash Santa Catarina" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/04.JPG" alt="Plateia acompanhando o evento da comunidade Cloud Native SC" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/05.JPG" alt="Comunidade Cloud Native Santa Catarina reunida no evento" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/06.JPG" alt="Momento de networking entre participantes do KuberTENes" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/07.JPG" alt="Participantes do KuberTENes Birthday Bash durante a abertura" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/08.JPG" alt="Vista do auditório lotado no KuberTENes Birthday Bash" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/038.JPG" alt="Registro do público no KuberTENes Birthday Bash Santa Catarina" />

<h2 id="agenda-do-meetup">Agenda do Meetup</h2>

<h3 id="kubernetes-10-anos-hacking-kubernetes-v100">Kubernetes 10 Anos: Hacking Kubernetes v1.0.0</h3>
<p>A abertura do evento trouxe uma retrospectiva dos 10 anos de Kubernetes, onde <a href="https://www.linkedin.com/in/amim/" target="_blank" rel="noopener noreferrer">Amim Knabben</a> subiu uma versão do Kubernetes 1.0.0 ao vivo, mostrando na prática a evolução da plataforma.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/09.JPG" alt="Amim Knabben apresentando a retrospectiva dos 10 anos de Kubernetes" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/10.JPG" alt="Amim Knabben subindo o Kubernetes v1.0.0 ao vivo" />    
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/11.JPG" alt="Slide da palestra Hacking Kubernetes v1.0.0" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/12.JPG" alt="Público acompanhando a palestra sobre os 10 anos de Kubernetes" />


<h3 id="plataformizacao-da-cloud-foundation-com-backstage-desvendando-os-segredos-da-efi">Plataformização da Cloud Foundation com Backstage: Desvendando os Segredos da Eficiência na Nuvem com Developer Experience</h3>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/00.png" alt="Banner da palestra Plataformização da Cloud Foundation com Backstage" />

<p>Uma palestra do <strong>Azure Floripa</strong> (<a href="https://www.linkedin.com/in/orafaelferreiraa/" target="_blank" rel="noopener noreferrer">eu</a> e o <a href="https://www.linkedin.com/in/cfraposo/" target="_blank" rel="noopener noreferrer">Cláudio Raposo</a>), que abordou como a plataformização da Cloud Foundation com Backstage pode otimizar a eficiência na nuvem, melhorando a experiência dos desenvolvedores.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/13.JPG" alt="Rafael Ferreira e Cláudio Raposo palestrando sobre Backstage" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/14.jpg" alt="Rafael Ferreira apresentando a Cloud Foundation com Backstage" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/15.jpg" alt="Cláudio Raposo apresentando no KuberTENes Birthday Bash" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/16.jpg" alt="Slide sobre Developer Experience na palestra do Azure Floripa" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/17.jpg" alt="Público assistindo à palestra do Azure Floripa sobre Backstage" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/18.jpg" alt="Rafael Ferreira explicando a plataformização da Cloud Foundation" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/19.jpg" alt="Demonstração do Backstage durante a palestra do Azure Floripa" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/20.jpg" alt="Cláudio Raposo explicando Developer Experience na nuvem" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/21.JPG" alt="Rafael Ferreira interagindo com o público durante a palestra" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/22.jpg" alt="Slide da palestra sobre eficiência na nuvem com Backstage" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/23.JPG" alt="Rafael Ferreira e Cláudio Raposo no palco do KuberTENes" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/24.JPG" alt="Plateia durante a sessão do Azure Floripa sobre Backstage" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/25.JPG" alt="Rafael Ferreira palestrando no KuberTENes Birthday Bash Santa Catarina" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/26.JPG" alt="Cláudio Raposo falando sobre Cloud Foundation no evento" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/27.JPG" alt="Momento da apresentação do Azure Floripa no KuberTENes" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/28.JPG" alt="Rafael Ferreira detalhando a arquitetura da plataforma com Backstage" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/29.JPG" alt="Slide de encerramento da palestra do Azure Floripa" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/48.JPG" alt="Rafael Ferreira e Cláudio Raposo após a palestra sobre Backstage" />

<h3 id="envoy-explorando-edge-proxy-service-proxy-e-api-gateway">Envoy: Explorando Edge Proxy, Service Proxy e API Gateway</h3>
<p>Apresentação do <strong>API Floripa</strong> com <a href="https://www.linkedin.com/in/rafaelbmateus/" target="_blank" rel="noopener noreferrer">Rafael Mateus</a> sobre o Envoy, detalhando suas funcionalidades como Edge Proxy, Service Proxy e API Gateway, e como ele pode ser integrado a arquiteturas modernas de microsserviços.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/30.jpg" alt="Rafael Mateus apresentando o Envoy no KuberTENes" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/31.jpg" alt="Slide da palestra sobre Envoy como Edge Proxy e API Gateway" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/32.jpg" alt="Público acompanhando a apresentação do API Floripa sobre Envoy" />

<h3 id="aws-party-rock">AWS Party Rock</h3>
<p>Apresentação do <a href="https://www.linkedin.com/in/flaap/" target="_blank" rel="noopener noreferrer">Flávio Pimenta</a> sobre a ferramenta open source da AWS Party Rock, destacando suas funcionalidades e benefícios para projetos com IA.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/33.JPG" alt="Flávio Pimenta apresentando a ferramenta AWS Party Rock" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/34.JPG" alt="Slide da palestra sobre AWS Party Rock" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/35.JPG" alt="Flávio Pimenta demonstrando o AWS Party Rock ao público" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/36.JPG" alt="Público acompanhando a palestra sobre AWS Party Rock" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/37.JPG" alt="Flávio Pimenta encerrando a apresentação sobre AWS Party Rock" />

<h3 id="comemoracao-do-aniversario-do-kubernetes">Comemoração do Aniversário do Kubernetes</h3>
<p>Teve a comemoração do aniversário do Kubernetes, onde cantamos parabéns e cortamos o bolo, devorando todas essas delicias.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/38.JPG" alt="Bolo de aniversário dos 10 anos do Kubernetes" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/39.JPG" alt="Participantes cantando parabéns para o Kubernetes" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/40.JPG" alt="Corte do bolo na comemoração do aniversário do Kubernetes" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/41.JPG" alt="Comunidade celebrando os 10 anos do Kubernetes" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/42.JPG" alt="Mesa de doces da comemoração do aniversário do Kubernetes" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/43.JPG" alt="Participantes confraternizando na festa de 10 anos do Kubernetes" />

<h3 id="eficiencia-em-logs-com-grafana-loki-e-kubernetes">Eficiência em Logs com Grafana Loki e Kubernetes</h3>
<a href="https://www.linkedin.com/in/erivaldolopes/" target="_blank" rel="noopener noreferrer">Erivaldo Lopes</a> nos levou a uma exploração profunda de como o Grafana Loki pode ser utilizado em conjunto com Kubernetes para gerenciamento eficiente de logs, uma ferramenta crucial para monitoramento e observabilidade.

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/44.JPG" alt="Erivaldo Lopes apresentando Grafana Loki com Kubernetes" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/045.JPG" alt="Slide da palestra sobre eficiência em logs com Grafana Loki" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/46.jpg" alt="Erivaldo Lopes explicando a arquitetura do Grafana Loki" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/47.JPG" alt="Público acompanhando a palestra sobre Grafana Loki" />

<p>E para quem se perguntou da qualidade das fotos, sim, é isso, tivemos um fotógrafo profissional!</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/49.jpg" alt="Foto profissional dos participantes do KuberTENes Birthday Bash" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/50.jpg" alt="Registro profissional da comunidade Cloud Native Santa Catarina" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/CloudNativeSC-KuberTENes/51.jpg" alt="Foto oficial do KuberTENes Birthday Bash Santa Catarina 2024" />

<h3 id="encerramento">Encerramento </h3>
<p>Seguimos com um animado happy hour, proporcionando uma excelente oportunidade para networking e risadas. Um ambiente descontraído e divertido, permitindo uma troca de ideias mais informal e a formação de novas conexões profissionais.</p>

<p>Se você não teve a oportunidade de comparecer a este evento, não se preocupe, você pode conferir a gravação no Youtube:</p>

<a href="https://www.youtube.com/watch?v=iACjUNbhnaM" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/iACjUNbhnaM/0.jpg" alt="CNCF SC - 6 Meetup + KuberTENes - 10 anos" /></a>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/Logo2.png">

]]></content:encoded>
    </item>
    <item>
      <title>Curso AZ-900 - Fundamentos da Azure 2024</title>
      <link>https://www.orafaelferreira.com/artigos/curso-az-900</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/curso-az-900</guid>
      <pubDate>Mon, 10 Jun 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Agradecimento pelo Sucesso do Evento AZ-900: Fundamentos do Azure 📢</description>
      <category>Organização de Eventos</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/az-900/0.jpeg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[
<p>Agradecimento pelo Sucesso do Evento AZ-900: Fundamentos do Azure 📢</p>

<p>Gostaríamos de expressar nossa mais sincera gratidão a todos que participaram do evento AZ-900: Fundamentos do Azure, realizado 08 de junho de 2024, na Igreja Batista de Forquilhinhas que cedeu toda infraestrutura para acontecer o evento.</p>

<p>Foi uma oportunidade incrível para explorar os conceitos fundamentais da computação em nuvem e os serviços da plataforma Azure da Microsoft. A presença e o entusiasmo de cada um de vocês foram essenciais para o sucesso do evento.</p>


<p>Durante o curso, abordamos tópicos cruciais como os modelos de serviço (IaaS, PaaS, SaaS), alta disponibilidade, escalabilidade, resiliência, e muitos outros. A dedicação dos alunos e a qualidade das interações foram destacáveis, enriquecendo o aprendizado e preparando todos para o exame de certificação AZ-900.</p>

<p>Agradecemos a todos os participantes por tornarem este evento memorável. Estamos ansiosos para vê-los avançar em suas carreiras de TI e explorar novas certificações no ecossistema do Azure.</p>

<ul>
<li><i></i> <strong>Saiba mais:</strong> <a href="https://www.eventbrite.com.br/e/az-900-tickets-885187528727" target="_blank" rel="noopener noreferrer">AZ-900 - Fundamentos da Azure</a></li>
</ul>

<ul>
<li><i></i> <a href="https://www.linkedin.com/posts/rafaelmaferreira_ai900-fundamentos-az900-activity-7205901535577300992-nB1S?utm_source=share&utm_medium=member_desktop" target="_blank" rel="noopener noreferrer"><strong>Post Linkedin</strong></a></li>
</ul>

<ul>
<li><i></i> <strong>Slides da Apresentação:</strong> Utilizado Material Oficial da Microsoft fornecido para MCT's.</li>
</ul>

<p>Até o próximo evento!</p>
<p>Spoilers: Será o DP900 #Fundamentos de Dados do Azure</p>

<p>Instrutores:</p>

<p>👨‍🏫 <a href="https://www.linkedin.com/in/cfraposo/" target="_blank" rel="noopener noreferrer">Cláudio Raposo</a> - [Msc Degree at MUST University | Microsoft MVP | Microsoft MCT ]</p>
<p>Especialista em Desenvolvimento de Software, com mais de 10 anos de experiência e formação em Análise de Sistemas e Engenharia.</p>

<p>👨‍🏫 <a href="https://www.linkedin.com/in/orafaelferreiraa/" target="_blank" rel="noopener noreferrer">Rafael Martin Alves Ferreira</a> (eu) - [Microsoft MCT]</p>
<p>Senior DevOps Engineer com especialização arquiteturas em nuvem Azure com mais de uma década de experiência em TI, 17 certificações técnicas e formado em Ciência da Computação.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/az-900/0.jpeg" alt="Turma do curso AZ-900 Fundamentos do Azure na Igreja Batista Forquilhinhas" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/az-900/1.jpg" alt="Rafael Ferreira ministrando o curso AZ-900 Fundamentos do Azure" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/az-900/2.jpg" alt="Participantes acompanhando a aula do curso AZ-900" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/az-900/3.jpg" alt="Slide da aula sobre fundamentos do Microsoft Azure" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/az-900/4.jpg" alt="Alunos do curso AZ-900 durante a atividade prática" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/az-900/5.jpg" alt="Rafael Ferreira explicando conceitos de computação em nuvem" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/az-900/6.jpg" alt="Momento de perguntas dos participantes do curso AZ-900" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/az-900/7.jpg" alt="Turma reunida ao final do curso AZ-900 Fundamentos do Azure" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/az-900/8.jpg" alt="Participantes do curso AZ-900 em momento de networking" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/az-900/9.jpg" alt="Entrega de certificados aos alunos do curso AZ-900" />

<p>#AZ900 #AzureFundamentals #CloudComputing #MicrosoftAzure #Certificação #ConectaCloud #TI #Agradecimento #Evento #IgrejaBatistaForquilhinhas #MicrosoftMVP #MicrosoftMCT #mvp #mvpbuzz #mvpbr</p>

]]></content:encoded>
    </item>
    <item>
      <title>Configuração de um repositório no Github</title>
      <link>https://www.orafaelferreira.com/artigos/config-repository</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/config-repository</guid>
      <pubDate>Thu, 06 Jun 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Este artigo serve como uma base introdutória para futuros tutoriais relacionados à configuração de repositórios no GitHub.</description>
      <category>Artigos</category>
      <category>Open Source</category>
      <category>CI/CD</category>
      <category>DevOps</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example9.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<h2 id="introducao">Introdução</h2>

<p>Este artigo serve como uma base introdutória para futuros tutoriais relacionados à configuração de repositórios no GitHub. Vamos abordar os passos iniciais para criar e configurar um repositório no GitHub, adicionar uma chave SSH para autenticação segura e realizar operações básicas de Git.</p>

<h3 id="primeiramente-o-que-e-git">Primeiramente, O que é Git?</h3>

<p>Git é um sistema de controle de versão distribuído, amplamente utilizado por desenvolvedores em todo o mundo para gerenciar e acompanhar mudanças no código-fonte durante o desenvolvimento de software. Ele permite que múltiplos desenvolvedores trabalhem no mesmo projeto simultaneamente, mantendo um histórico completo de todas as alterações e facilitando a colaboração e o gerenciamento de versões.</p>

<h3 id="o-github-e-de-comer">O GitHub é de comer?</h3>

<p>GitHub é uma plataforma de hospedagem de repositórios Git na nuvem. Ele fornece uma interface web amigável e uma série de ferramentas e funcionalidades que facilitam o gerenciamento de projetos de software, colaboração entre desenvolvedores, revisão de código e integração contínua. Além disso, GitHub é um ponto de encontro para desenvolvedores de todo o mundo compartilharem projetos open source, contribuírem com melhorias e colaborarem em projetos de interesse comum.</p>

<p>Neste artigo, vamos guiá-lo através dos passos necessários para começar a utilizar Git e GitHub, desde a criação de um repositório até a configuração de chaves SSH e a execução de operações básicas de Git.</p>


<h2 id="passo-1-criacao-de-um-novo-repositorio-no-github">Passo 1: Criação de um novo repositório no GitHub</h2>

<p>1. Acesse GitHub e faça login na sua conta.</p>
<p>2. Clique no ícone "+" no canto superior direito e selecione "New repository".</p>
<p>3. Nomeie seu repositório como example.</p>
<p>4. Selecione a opção "Public" para tornar o repositório acessível a todos.</p>
<p>5. Não adicione um README, pois vamos seguir com comandos para criar e configurar um manualmente.</p>
<p>6. Clique em "Create repository".</p>

<strong>GitHub:</strong> <a href="https://github.com/orafaelferreiraa/example" target="_blank" rel="noopener noreferrer">example</a>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example9.png" alt="example" />

<h2 id="passo-2-adicionar-chave-ssh-ao-github">Passo 2: Adicionar chave SSH ao GitHub</h2>

<p>1. No GitHub, clique na sua foto no canto superior direito e vá para "Settings".</p>
<p>2. No menu lateral, selecione "SSH and GPG keys".</p>
<p>3. Clique em "New SSH key".</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example11.png" alt="SSH Key" />

<h2 id="passo-3-gerar-uma-chave-ssh">Passo 3: Gerar uma chave SSH</h2>

<p>Abra o terminal e gere uma chave SSH com o comando:</p>

<div data-lang="bash"><pre><code>ssh-keygen</code></pre></div>

<p>OBS: Para fins didáticos, estou gerando uma chave sem senha para facilitar nosso laboratório. Crianças, nunca façam isso em produção :D</p>

<div data-lang="bash"><pre><code>cat /home/raafel/.ssh/id_rsa.pub</code></pre></div>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example11.png" alt="Terminal exibindo a chave SSH pública gerada com o comando cat" />

<p>Copie toda a informação que e exibida após o comando cat e retorne para o GitHub.</p>

<p>Na mesma tela que paramos, coloque o nome do seu computador, por exemplo: vm-example no titulo e copie o conteúdo da chave, conforme imagem abaixo:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example12.png" alt="Tela do GitHub para adicionar a nova chave SSH" />

<h2 id="passo-4-configuracao-minima-para-o-git">Passo 4: Configuração mínima para o Git</h2>

<p>Realize a configurção mínima para o git, lembre-se de alterar suas informações:</p>

<div data-lang="bash"><pre><code>git config --global user.name "orafaelferreira"
git config --global user.email rafael.low1@gmail.com</code></pre></div>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example20.png" alt="Terminal com a configuração de user.name e user.email do Git" />


<h2 id="passo-5-fazer-o-push-dos-arquivos-para-o-repositorio">Passo 5: Fazer o push dos arquivos para o repositório</h2>

<p>Vamos agora fazer o push dos arquivos do seu projeto para o repositório. Conforme a dica do próprio GitHub, não se esqueça de mudar: "git add README.md" para "git add .":</p>

<div data-lang="bash"><pre><code>echo "# example" &gt;&gt; README.md
git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:orafaelferreira/example.git
git push -u origin main</code></pre></div>
<p>Dando um Check no GitHub:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example21.png" alt="Repositório no GitHub com os arquivos enviados pelo push" />

<h2 id="curiosidades-e-dicas-extras">Curiosidades e Dicas Extras</h2>

<h3 id="historia-do-github">História do GitHub</h3>

<ul>
<li><strong>Fundação</strong>: O GitHub foi fundado em 2008 por Tom Preston-Werner, Chris Wanstrath, PJ Hyett e Scott Chacon. Desde então, cresceu exponencialmente e se tornou a plataforma de hospedagem de código mais popular do mundo.</li>
<li><strong>Aquisição pela Microsoft</strong>: Em 2018, o GitHub foi adquirido pela Microsoft por 7,5 bilhões de dólares. A aquisição ajudou a expandir ainda mais a base de usuários e as funcionalidades da plataforma.</li>
</ul>

<h3 id="por-que-usar-ssh-para-autenticacao">Por que usar SSH para autenticação?</h3>

<ul>
<li><strong>Segurança</strong>: O uso de chaves SSH para autenticação é mais seguro do que senhas tradicionais. As chaves SSH são criptograficamente mais robustas e difíceis de serem comprometidas.</li>
<li><strong>Facilidade de uso</strong>: Uma vez configurada, a autenticação SSH facilita o processo de clonagem e push para repositórios sem a necessidade de inserir senhas repetidamente.</li>
</ul>

<h3 id="boas-praticas-para-commits-no-github">Boas práticas para commits no GitHub</h3>

<ul>
<li><strong>Commits frequentes e significativos</strong>: Faça commits frequentes com mensagens claras e descritivas. Isso ajuda a manter o histórico de alterações organizado e facilita o rastreamento de mudanças.</li>
<li><strong>Mensagens de commit</strong>: Escreva mensagens de commit detalhadas que expliquem o que foi alterado e por quê. Por exemplo: "Adiciona função de login com autenticação OAuth para melhorar a segurança do usuário".</li>
</ul>

<h3 id="usando-arquivos-readme">Usando arquivos README</h3>

<ul>
<li><strong>Informações essenciais</strong>: Um arquivo README.md bem escrito é fundamental para qualquer repositório. Ele deve conter uma visão geral do projeto, instruções de instalação, exemplos de uso e informações sobre como contribuir.</li>
<li><strong>Markdown</strong>: Aproveite o poder do Markdown para formatar seu README com títulos, listas, links e imagens. Um README bem formatado torna o projeto mais acessível e fácil de entender.</li>
</ul>

<h3 id="integracao-com-cicd">Integração com CI/CD</h3>

<ul>
<li><strong>GitHub Actions</strong>: Use GitHub Actions para configurar pipelines de CI/CD diretamente no seu repositório. Isso permite automações como testes automatizados, linting, deployments e muito mais.</li>
</ul>

<h3 id="ferramentas-e-extensoes-uteis">Ferramentas e Extensões Úteis</h3>

<ul>
<li><strong>GitHub Desktop</strong>: Uma aplicação oficial do GitHub que facilita a utilização de Git e GitHub através de uma interface gráfica amigável.</li>
<li><strong>Extensões de Navegador</strong>: Extensões como "Refined GitHub" para Chrome e Firefox melhoram a interface do GitHub com recursos adicionais e melhorias de usabilidade.</li>
</ul>

<h3 id="comunidade-e-colaboracao">Comunidade e Colaboração</h3>

<ul>
<li><strong>Contribuição Open Source</strong>: Contribuir para projetos open source no GitHub é uma excelente maneira de ganhar experiência prática, aprender novas habilidades e fazer networking com outros desenvolvedores.</li>
<li><strong>GitHub Discussions</strong>: Use as discussões do GitHub para colaborar com outros desenvolvedores, resolver problemas e compartilhar ideias sobre o projeto.</li>
</ul>

<h2 id="conclusao">Conclusão</h2>

<p>Configurar um repositório no GitHub é uma tarefa essencial para desenvolvedores e profissionais de TI. Este guia introdutório abordou os passos necessários para criar e configurar um repositório, adicionar uma chave SSH para autenticação segura e realizar operações básicas de Git. Esta base servirá como referência para futuros tutoriais mais avançados.</p>

]]></content:encoded>
    </item>
    <item>
      <title>Guia de Criação de Maquinas Virtuais no Microsoft Azure</title>
      <link>https://www.orafaelferreira.com/artigos/criacao-vm</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/criacao-vm</guid>
      <pubDate>Wed, 05 Jun 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Passo a passo para criar máquinas virtuais Linux e Windows no Microsoft Azure, com Resource Group, VNet, NSG e conexão via SSH e Remote Desktop.</description>
      <category>Artigos</category>
      <category>Segurança</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example1.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<h2 id="introducao">Introdução</h2>

<p>Este artigo será uma base introdutória essencial para os próximos conteúdos que virão, onde exploraremos mais a fundo a criação e gerenciamento de máquinas virtuais no Microsoft Azure. Aqui, abordaremos os passos iniciais para criar máquinas virtuais tanto para Linux quanto para Windows, fornecendo um fundamento para as futuras discussões e tutoriais.</p>

<p>Criar máquinas virtuais no Microsoft Azure pode parecer uma tarefa complicada, mas com este guia passo a passo, você verá que é mais simples do que parece. Vamos explorar a criação de máquinas virtuais tanto para Linux quanto para Windows. Vamos começar!</p>

<h2 id="passo-1-criacao-do-resource-group">Passo 1: Criação do Resource Group</h2>

<p>Antes de criar qualquer recurso no Azure, precisamos de um Resource Group, que funciona como um contêiner lógico para todos os recursos relacionados. Vamos criar um Resource Group chamado <code>rg-example</code>.</p>

<p>1. Acesse o portal do Azure.</p>
<p>2. Vá para "Resource Groups" e clique em "Create".</p>
<p>3. Nomeie seu Resource Group como <code>rg-example</code>.</p>
<p>4. Selecione a região desejada.</p>
<p>5. Clique em "Review + Create" e, em seguida, "Create".</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example1.png" alt="rg-example" />

<h2 id="passo-2-criacao-da-virtual-network">Passo 2: Criação da Virtual Network</h2>

<p>A próxima etapa é criar uma Virtual Network (VNet), que permite a comunicação entre recursos do Azure.</p>

<p>1. Vá para "Virtual Networks" e clique em "Create".</p>
<p>2. Nomeie a VNet como <code>vnet-example</code>.</p>
<p>3. Selecione o Resource Group <code>rg-example</code>.</p>
<p>4. Configure o endereço IP e as sub-redes conforme necessário.</p>
<p>5. Clique em "Review + Create" e, em seguida, "Create".</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example2.png" alt="vnet-example" />

<h2 id="passo-3-criacao-da-nsg-network-security-group">Passo 3: Criação da NSG (Network Security Group)</h2>

<p>O Network Security Group (NSG) é responsável por controlar o tráfego de rede para as VMs. Vamos criar um NSG chamado <code>nsg-example</code>.</p>

<p>1. Vá para "Network Security Groups" e clique em "Create".</p>
<p>2. Nomeie o NSG como <code>nsg-example</code>.</p>
<p>3. Selecione o Resource Group <code>rg-example</code>.</p>
<p>4. Clique em "Review + Create" e, em seguida, "Create".</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example3.png" alt="nsg-example" />

<h2 id="passo-4-anexar-o-nsg-a-subnet">Passo 4: Anexar o NSG à Subnet</h2>

<p>Depois de criar o NSG, precisamos anexá-lo à Subnet <code>default</code> da nossa VNet <code>vnet-example</code>.</p>

<p>1. Acesse o NSG <code>nsg-example</code> e selecione a settings > Subnet.</p>
<p>2. Associate, selecione a subnet <code>default</code> e salve as alterações.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example19.png" alt="nsg-example" />

<h2 id="passo-5-criacao-da-virtual-machine-linux">Passo 5: Criação da Virtual Machine Linux</h2>

<p>Vamos criar a VM com nome vm-example dentro do rg-example com o tipo de segurança: Standard.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example4.png" alt="lnx-example" />

<p>1. Vá para "Virtual Machines" e clique em "Create".</p>
<p>2. Selecione o Resource Group <code>rg-example</code>.</p>
<p>3. Nomeie a VM como <code>vm-example</code>.</p>
<p>4. Altere o tipo de segurança para Standard.</p>
<p>5. Selecione "Ubuntu Server 20.04 LTS ARM64 Gen2" como a imagem.</p>
<p>6. Selecione "Arm64" como a arquitetura (para maior eficiência energética e de processamento).</p>
<p>7. Configure a VM com o tamanho <code>Standard_D2ps_v5</code>.</p>
<p>8. Escolha a autenticação por senha e defina uma senha.</p>
<p>9. Certifique-se de que a VM não tenha portas de entrada públicas configuradas.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example5.png" alt="lnx-example" />

<strong>Saiba Mais:</strong> <a href="https://azure.microsoft.com/pt-br/updates/generally-available-new-azure-virtual-machines-with-ampere-altra-armbased-processors/" target="_blank" rel="noopener noreferrer">Máquinas Virtuais do Azure com processadores baseados em Arm do Ampere Altra</a>

<p>10. Na seção "Networking", certifique-se de que a VM esteja na VNet <code>vnet-example</code> e na Subnet <code>default</code>.</p>
<p>11. Selecione "Review + Create" e, em seguida, "Create".</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example6.png" alt="lnx-example" />

<p>Após a criação, precisamos liberar a porta SSH 22 no NSG <code>nsg-example</code> para acessar a VM.</p>

<p>1. Acesse o NSG <code>nsg-example</code>.</p>
<p>2. Adicione uma regra de entrada para permitir o tráfego na porta 22.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example7.png" alt="nsg-example" />

<h3 id="conectando-se-a-vm-linux">Conectando-se à VM Linux</h3>

<p>Após a VM estar em execução verifique qual IP público foi atribuído à VM , copie o IP público e conecte-se via SSH:</p>

<div data-lang="bash"><pre><code>ssh usuario@IPX.XXX.XXX.XX</code></pre></div>
<p>No meu caso: </p>

<div data-lang="bash"><pre><code>ssh raafel@172.210.28.194</code></pre></div>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example8.png" alt="Terminal exibindo a conexão SSH com a VM Linux no Azure" />

<p>De preferência, atualize os pacotes do sistema:</p>

<div data-lang="bash"><pre><code>sudo apt-get update
sudo apt-get upgrade -y</code></pre></div>

<h2 id="criacao-da-virtual-machine-windows-11">Criação da Virtual Machine Windows 11</h2>

<p>Vamos criar uma VM com Windows 11 dentro do nosso <code>rg-example</code>, com o nome <code>vm-example-win</code>, tipo de segurança <code>Standard</code> e imagem <code>Windows 11 Pro</code>.</p>

<p>1. Vá para "Virtual Machines" e clique em "Create".</p>
<p>2. Selecione o Resource Group <code>rg-example</code>.</p>
<p>3. Nomeie a VM como <code>vm-example-win</code>.</p>
<p>4. Altere o tipo de segurança para Standard.</p>
<p>5. Selecione "Windows 11 Pro" como a imagem.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example13.png" alt="Portal do Azure com a seleção da imagem Windows 11 Pro" />

<p>6. Configure a VM com o tamanho <code>Standard_B4ms</code> para testes mais rápidos.</p>
<p>7. Escolha a autenticação por senha e defina uma senha de sua preferência (não se esqueça de anotar a senha).</p>
<p>8. Certifique-se de que a VM não tenha portas de entrada públicas configuradas. Confirme a licença.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example14.png" alt="Configuração de portas de entrada e licença da VM Windows" />

<p>9. Na seção "Networking", certifique-se de que a VM esteja na VNet <code>vnet-example</code> e na Subnet <code>default</code>, e que não seja atribuído um NSG à NIC.</p>
<p>10. Selecione "Review + Create" e, em seguida, "Create".</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example15.png" alt="Tela Review + Create da VM Windows 11 no Portal do Azure" />

<p>Após a criação, precisamos liberar a porta RDP no NSG <code>nsg-example</code> para acessar a VM.</p>

<p>1. Acesse o NSG <code>nsg-example</code>.</p>
<p>2. Adicione uma regra de entrada para permitir o tráfego na porta RDP.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example16.png" alt="Regra de entrada RDP adicionada ao NSG no Portal do Azure" />

<h3 id="conectando-se-a-vm-windows">Conectando-se à VM Windows</h3>

<p>1. No seu computador com Windows, abra o aplicativo "Remote Desktop Connection" (procure por "Remote" no menu Iniciar).</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example22.png" alt="Aplicativo Remote Desktop Connection no Windows" />

<p>2. Copie o IP público atribuído à VM <code>vm-example-win</code>, digite no Remote Desktop Connection, clique no botão conectar, escolha "Use another account", e digite o usuário e senha que foram criados anteriormente. Clique em "OK".</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example17.png" alt="Remote Desktop Connection com o IP público da VM Windows" />

<p>3. Confirme o certificado de segurança quando solicitado:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/example/example18.png" alt="Confirmação do certificado de segurança na conexão RDP" />

<p>---</p>

<h2 id="conclusao">Conclusão</h2>

<p>Criar máquinas virtuais no Azure é um processo estruturado que envolve a criação de vários componentes, como Resource Groups, Virtual Networks e Network Security Groups. Seguindo este guia, você pode configurar rapidamente VMs Linux e Windows para atender às suas necessidades. Lembre-se de sempre garantir a segurança das suas VMs e otimizar suas configurações para o melhor desempenho.</p>

<p>A flexibilidade e o poder do Azure permitem que você adapte a infraestrutura de TI às demandas específicas do seu projeto, seja ele para desenvolvimento, teste ou produção. Utilize as práticas recomendadas para maximizar a eficiência e a segurança de suas VMs.</p>

<p>Se tiver dúvidas ou precisar de mais detalhes, não hesite em entrar em contato. Espero que este guia tenha sido útil para você!</p>

]]></content:encoded>
    </item>
    <item>
      <title>GreenOps na Cloud: Construindo o Futuro com Sustentabilidade - Tech Connection Balneário Camburiú 2024</title>
      <link>https://www.orafaelferreira.com/artigos/tc-bc24</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/tc-bc24</guid>
      <pubDate>Sun, 02 Jun 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>No Tech Connection 2024, realizado em Balneário Camboriú, trouxe uma palestra com tema crucial para o futuro da tecnologia e do planeta: GreenOps na Cloud.</description>
      <category>Palestras</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tc.bc/00.jpg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[
<p>No Tech Connection 2024, realizado em Balneário Camboriú, trouxe uma palestra com tema crucial para o futuro da tecnologia e do planeta: <strong>GreenOps na Cloud</strong>. Este conceito, ainda emergente, tem como foco a sustentabilidade no uso de recursos em ambientes de nuvem, conectando práticas de DevOps com objetivos ambientais.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tc.bc/00.jpg" alt="Rafael Ferreira palestrando sobre GreenOps no Tech Connection 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tc.bc/1.jpg" alt="Público do Tech Connection Balneário Camboriú 2024" />

<h2 id="o-que-e-greenops">O Que é GreenOps?</h2>

<p>GreenOps, ou "Operações Verdes", é uma abordagem que integra práticas de eficiência ambiental na gestão de infraestrutura e operações de TI. No contexto da computação em nuvem, isso significa otimizar o uso de recursos como energia, armazenamento e processamento, reduzindo desperdícios e a pegada de carbono associada.</p>

<h2 id="a-conexao-com-a-cloud">A Conexão com a Cloud</h2>

<p>A computação em nuvem é um motor poderoso para a inovação, mas também consome uma quantidade significativa de energia. Data centers globais, especialmente os que operam serviços de nuvem, já representam mais de 1% do consumo global de eletricidade.</p>

<p>Por outro lado, a nuvem também oferece uma oportunidade única para a sustentabilidade, graças à:</p>
<ul>
<li><strong>Elasticidade</strong>: Permite ajustar recursos dinamicamente para evitar desperdícios.</li>
<li><strong>Escala</strong>: Grandes provedores como Microsoft Azure, AWS e Google Cloud utilizam data centers com eficiência energética de ponta.</li>
<li><strong>Automação</strong>: Ferramentas podem monitorar e ajustar a utilização automaticamente.</li>
</ul>

<p>A palestra destacou como esses fatores podem ser explorados por meio de práticas GreenOps para reduzir custos e impulsionar a sustentabilidade.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tc.bc/2.jpg" alt="Slide sobre a conexão entre GreenOps e Cloud" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tc.bc/3.jpg" alt="Rafael Ferreira explicando práticas GreenOps na Cloud" />

<h2 id="praticas-de-greenops-na-cloud">Práticas de GreenOps na Cloud</h2>

<p>Durante a apresentação, foram discutidas várias práticas que podem ser implementadas para incorporar GreenOps no dia a dia de times de TI. Entre elas:</p>

<ul>
<li><strong>Monitoramento de Métricas Ambientais</strong>: Ferramentas de nuvem como Azure Sustainability Calculator e AWS Carbon Footprint permitem medir o impacto ambiental do uso da nuvem.</li>
<li><strong>Configuração de Escalabilidade Automatizada</strong>: Configurar auto-scaling para evitar servidores subutilizados.</li>
<li><strong>Gerenciamento de Workloads</strong>: Agendar workloads de menor prioridade para horários de baixa demanda energética nos data centers.</li>
<li><strong>Uso de Zonas de Energia Renovável</strong>: Escolher regiões de data centers que utilizam fontes de energia limpa.</li>
<li><strong>Desligamento de Recursos Ociosos</strong>: Automatizar o desligamento de VMs e recursos não utilizados.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tc.bc/4.jpg" alt="Slide com práticas de GreenOps para reduzir custos e emissões" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tc.bc/5.jpg" alt="Rafael Ferreira apresentando práticas de GreenOps no Tech Connection" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/tc.bc/6.jpg" alt="Encerramento da palestra GreenOps na Cloud em Balneário Camboriú" />

<h2 id="conclusao-a-importancia-da-acao">Conclusão: A Importância da Ação</h2>

<p>O GreenOps na Cloud é mais do que uma tendência; é uma necessidade. Empresas que adotam práticas sustentáveis podem não apenas reduzir custos, mas também melhorar sua reputação e contribuir para um futuro mais verde. </p>

<p>---</p>


]]></content:encoded>
    </item>
    <item>
      <title>Simplificando a Utilização do Static Web Apps no Azure</title>
      <link>https://www.orafaelferreira.com/artigos/azure-static-web-apps</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/azure-static-web-apps</guid>
      <pubDate>Fri, 24 May 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Os Azure Static Web Apps são um serviço que cria e implanta automaticamente aplicativos Web full stack no Azure a partir de um repositório de códigos.</description>
      <category>Artigos</category>
      <category>GitHub Actions</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa000.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa000.png" alt="Capa do artigo sobre Azure Static Web Apps" />

<h2 id="introducao">Introdução</h2>

<p>Os <a href="https://learn.microsoft.com/pt-br/azure/static-web-apps/" target="_blank" rel="noopener noreferrer">Azure Static Web Apps</a> são um serviço que cria e implanta automaticamente aplicativos Web full stack no Azure a partir de um repositório de códigos. Este serviço é personalizado para o fluxo de trabalho diário de um desenvolvedor, criando e implantando aplicativos baseados em alterações de código feitas em repositórios GitHub ou Azure DevOps.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa00.png" alt="Diagrama de funcionamento do Azure Static Web Apps" />

<p>Ao criar um recurso dos <a href="https://learn.microsoft.com/pt-br/azure/static-web-apps/overview" target="_blank" rel="noopener noreferrer">Azure Static Web Apps</a>, o Azure monitora um branch de sua escolha e, Sempre que você faz push de commits ou aceita pull requests, um build é executado automaticamente e seu aplicativo juntamente com sua API é implantado no Azure.</p>

<p>Este serviço é ideal para aplicativos Web que utilizam bibliotecas e frameworks como Angular, React, Svelte, Vue ou Blazor, onde a renderização do lado do servidor não é necessária. Os arquivos estáticos (HTML, CSS, JavaScript, imagens) são distribuídos globalmente, proporcionando um fornecimento de arquivos rápido e eficiente, enquanto os pontos de extremidade da API são hospedados usando uma arquitetura serverless.</p>

<h3 id="principais-recursos">Principais Recursos:</h3>

<ul>
<li><strong>Hospedagem para conteúdo estático</strong>: HTML, CSS, JavaScript e imagens.</li>
<li><strong>Suporte integrado à API</strong>: Usando Azure Functions gerenciado, com opções de integração com aplicações de funções existentes, aplicativos Web, contêineres ou instâncias do Gerenciamento de API.</li>
<li><strong>Integração com GitHub e Azure DevOps</strong>: Alterações no repositório disparam compilações e implantações.</li>
<li><strong>Distribuição global</strong>: Conteúdo estático colocado mais perto dos usuários (edge computing).</li>
<li><strong>Certificados SSL gratuitos</strong>: Renovados automaticamente.</li>
<li><strong>Domínios personalizados</strong>: Para personalizações da marca no aplicativo.</li>
<li><strong>Modelo de segurança contínua</strong>: Proxy reverso ao chamar APIs, sem necessidade de configuração de CORS.</li>
<li><strong>Integrações do provedor de autenticação</strong>: Com Microsoft Entra ID e GitHub.</li>
<li><strong>Regras de roteamento de back-end</strong>: Controle total sobre conteúdo e rotas.</li>
<li><strong>Versões de preparo</strong>: Alimentadas por pull requests para pré-visualização antes da publicação.</li>
<li><strong>Suporte da CLI</strong>: Via CLI do Azure para criar recursos de nuvem e CLI de Azure Static Web Apps para desenvolvimento local.</li>
</ul>

<h2 id="documentacao-de-api">Documentação de API</h2>

<p>No desenvolvimento de software, a documentação desempenha um papel crucial para garantir que as APIs sejam compreensíveis e utilizáveis por outros desenvolvedores. Ferramentas como Doxygen oferecem abordagens diferentes para documentar APIs, cada uma com suas vantagens. Neste artigo, vamos explorar como configurar uma API simples utilizando Doxygen para documentação técnica detalhada, e hospedar a documentação no Azure Static Web Apps.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa01.png" alt="rg-swa" />

<h2 id="objetivo">Objetivo</h2>

<p>O objetivo deste artigo é fornecer um guia passo a passo para:</p>

<p>1. Criar uma API simples com Python e Flask.</p>
<p>2. Documentar o código utilizando Doxygen.</p>
<p>3. Criação simplificada do Static Web Apps.</p>

<h2 id="pre-requisitos">Pré-requisitos</h2>

<p>Antes de começarmos, você precisará ter:</p>
<ul>
<li>Uma conta no Azure com permissões para criar recursos.</li>
<li>Uma conta no GitHub.</li>
</ul>

<h2 id="passo-1-criacao-do-resource-group">Passo 1: Criação do Resource Group</h2>

<p>Criando o Resource Group com nome <code>rg-swa</code>, Review + Criar.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa1.png" alt="rg-swa" />

<h2 id="passo-2-criacao-da-virtual-network">Passo 2: Criação da Virtual Network</h2>

<p>Criando a Virtual Network com nome <code>vnet-swa</code> dentro do Resource Group <code>rg-swa</code> com as opções padrão.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa2.png" alt="vnet-swa" />

<h2 id="passo-3-criacao-da-nsg-network-security-group">Passo 3: Criação da NSG (Network Security Group)</h2>

<p>Seguindo, criação do NSG <code>nsg-swa</code> com as opções padrão dentro do Resource Group <code>rg-swa</code>. </p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa3.png" alt="nsg-swa" />

<h2 id="passo-4-anexar-o-nsg-a-subnet">Passo 4: Anexar o NSG à Subnet</h2>

<p>Após finalizar, acesse o recurso, e anexe o NSG à Subnet <code>default</code> que está dentro da <code>vnet-example</code> para liberações de portas de forma centralizada e facilitada:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa4.png" alt="nsg-swa" />

<h2 id="passo-5-criacao-da-virtual-machine-linux">Passo 5: Criação da Virtual Machine Linux</h2>

<p>Vamos criar a VM com nome <code>lnx-swa</code> dentro do <code>rg-swa</code> com o tipo de segurança: <code>Standard</code>.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa5.png" alt="lnx-swa" />

<p>A imagem será uma <code>Ubuntu Server 20.04 LTS ARM64 Gen2</code>. A arquitetura da VM será <code>Arm64</code> para maior eficiência energética e de processamento. O tamanho será uma <code>Standard_D2ps_v5</code> compatível com a arquitetura. A autenticação será feita por senha, de acordo com a preferência de cada um e sem portas de entradas públicas.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa6.png" alt="lnx-swa" />

<strong>Saiba Mais:</strong> <a href="https://azure.microsoft.com/pt-br/updates/generally-available-new-azure-virtual-machines-with-ampere-altra-armbased-processors/" target="_blank" rel="noopener noreferrer">Máquinas Virtuais doß Azure com processadores baseados em Arm do Ampere Altra</a>

<p>Certifique-se de que não seja criado um novo NSG e selecione a opção para apagar o IP público e a NIC junto com a VM.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa7.png" alt="lnx-swa" />

<p>Depois seguimos com a instalação padrão.</p>

<p>Precisamos liberar a porta SSH 22 dentro do nsg-swa para seguir com os procedimentos:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa8.png" alt="nsg-swa" />

<p>Verifique qual IP público foi atribuído à VM <code>vm-lnx</code>, copie e abra um terminal para conexão ssh:</p>

<div data-lang="bash"><pre><code>ssh usuario@IPX.XXX.XXX.XX</code></pre></div>
<p>No meu caso: </p>

<div data-lang="bash"><pre><code>ssh rafael@172.203.234.14</code></pre></div>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa9.png" alt="Terminal conectado via SSH à VM Linux no Azure" />

<p>De preferência, atualize os pacotes do sistema:</p>

<div data-lang="bash"><pre><code>sudo apt-get update
sudo apt-get upgrade -y</code></pre></div>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa10.png" alt="sudo apt-get upgrade -y" />

<h2 id="passo-6-configurar-a-api-com-python-e-flask">Passo 6: Configurar a API com Python e Flask</h2>

<h4>Instale o Python:</h4>

<div data-lang="bash"><pre><code>sudo apt-get install python3 python3-pip -y</code></pre></div>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa11.png" alt="Terminal mostrando a instalação do Python na VM Linux" />

<h4>Estrutura do Projeto</h4>

<p>Vamos estruturar nosso projeto da seguinte forma:</p>

<div data-lang="yaml"><pre><code>/meu_projeto
    /docs
      /doxygen_docs
    /src
        Doxyfile
        app.py</code></pre></div>

<p>Crie um diretório para o projeto e navegue até ele:</p>

<div data-lang="bash"><pre><code>mkdir -p meu_projeto/docs
mkdir -p meu_projeto/src
cd meu_projeto/src</code></pre></div>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa12.png" alt="Estrutura de diretórios do projeto criada no terminal" />

<h3 id="criando-a-api-com-flask">Criando a API com Flask</h3>

<p>Primeiramente instale o Flaks:</p>

<div data-lang="bash"><pre><code>pip install Flask</code></pre></div>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa13.png" alt="pip install Flask" />

<p>Crie e edite o arquivo <code>app.py</code> com o seguinte conteúdo:</p>

<div data-lang="bash"><pre><code>vim app.py</code></pre></div>

<div data-lang="yaml"><pre><code>from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/')
def home():
    return "Bem-vindo à API!"

@app.route('/hello', methods=['GET'])
def hello():
    name = request.args.get('name', 'Mundo')
    return jsonify(message=f"Olá, {name}!")

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)</code></pre></div>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa15.png" alt="Editor Vim com o código da API Flask" />

<p>OBS1: IMPORTANTE - Para sair do Vim Aperte a tecla ESC depois <code>:wq</code> para sair salvando (write + quit (eu acho que seja isso)) e tecla ENTER.</p>

<p>OBS2: Você que é da área de Infra/DevOps/Cloud, não se atente ao código, estamos usando um código fake para subirmos a infra.</p>

<p>Vamos testar a API:</p>

<div data-lang="bash"><pre><code>python3 app.py</code></pre></div>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa14.png" alt="Terminal executando a aplicação Flask na porta 5000" />

<p>Inicie a aplicação e acesse <code>http://172.203.234.14:5000/</code> no navegador. Porém a página não irá carregar, porque não liberamos a porta <code>5000</code> dentro do <code>nsg-swa</code>. Vamos lá!</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa16.png" alt="Regra de entrada liberando a porta 5000 no NSG" />

<p>E como mágica, teremos:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa17.png" alt="Navegador exibindo a resposta da API Flask" />

<p>OBS: Para sair aperte com as teclas <code>CTRL + C</code>.</p>

<h2 id="passo-7-adicionar-doxygen-para-documentacao-do-codigo-fonte">Passo 7: Adicionar Doxygen para Documentação do Código-Fonte</h2>

<p>O Doxygen é uma ferramenta de documentação que gera documentação em vários formatos (como HTML, PDF, etc.) a partir de comentários anotados no código-fonte. Vamos entender como ele funciona e como você pode usá-lo:</p>

<h3 id="passos-basicos-para-usar-o-doxygen">Passos Básicos para Usar o Doxygen</h3>
<h4>Instalação do Doxygen:</h4>

<ul>
<li>Windows: Baixe o instalador do site oficial do Doxygen e siga as instruções de instalação.</li>
<li>Linux/MacOS: Utilize um gerenciador de pacotes. Por exemplo, no Ubuntu, você pode usar:</li>
</ul>

<p>``<code> bash </p>
<p>sudo apt-get install doxygen</p>
<div data-lang="code"><pre><code>
![Terminal mostrando a instalação do Doxygen](https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa21.png)

### Configuração do Doxygen

Primeiramente criamos o arquivo Doxyfile com o comando `doxygen -g Doxyfile`, dentro da pasta src:
</code></pre></div> bash 
<p>doxygen -g Doxyfile</p>
<div data-lang="code"><pre><code>![Terminal gerando o arquivo Doxyfile de configuração](https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa18.png)

Seguindo, atualize o Doxyfile com as seguintes configurações:
</code></pre></div>bash
<p>vim Doxyfile</p>
<div data-lang="code"><pre><code></code></pre></div>bash
<p>PROJECT_NAME           = "Minha API Flask"</p>
<p>OUTPUT_DIRECTORY       = ../docs/doxygen_docs</p>
<p>INPUT                  = ./app.py</p>
<p>RECURSIVE              = NO</p>
<p>GENERATE_HTML          = YES</p>
<p>GENERATE_LATEX         = NO</p>
<div data-lang="code"><pre><code>
Para facilitar a edição, você pode procurar uma palavra especifica saindo do modo INSERT, apertando a tecla ESC e digitar: `/` seguido da palavra que procurar no documento e apertando a tecla ENTER. Por exemplo:
</code></pre></div>bash
<p>/INPUT</p>
<div data-lang="code"><pre><code>
Assim você consegue encontrar determinadas palavras de forma facilitada no editor vim :D.

Não se esqueça, para sair do Vim Aperte a tecla ESC depois `:wq` para sair salvando

### Instalando o Graphviz

O Doxygen usa o Graphviz para gerar gráficos de dependência e diagramas de classes. Vou orientá-lo na instalação do Graphviz:
</code></pre></div>bash
<p>sudo apt-get install graphviz -y</p>
<div data-lang="code"><pre><code>
### Geração da Documentação do Doxygen

Execute o comando para gerar a documentação:
</code></pre></div>bash
<p>doxygen Doxyfile</p>
<div data-lang="code"><pre><code>
![Terminal exibindo a geração da documentação com Doxygen](https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa19.png)

A documentação será gerada no diretório ~/meu_projeto/docs/doxygen_docs.

## Passo 8: Fazer o Deploy no Azure Static Web Apps

No portal da Azure, crie um Static Web App dentro do RG que estamos usando para o laboratório: `rg-swa`. O tipo de Plano será: `Standard`. Vamos simular um ambiente de produção, iremos criar um Static Web Apps com private endpoint. Deixe a opção Deployment details como outros, conforme imagem abaixo:

![Portal do Azure criando o Static Web App no plano Standard](https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa24.png)


### Adição de um Private Endpoint
Vá até a seção de "Settings" do seu Static Web App. Selecione a opção Add, e Express:

![Seção de Private Endpoints do Static Web App no portal do Azure](https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa25.png)

Aparecerá uma nova janela, onde iremos nomear o Private Endpoint como: `pvt-swa` e associa-lo a subnet `default` da `vnet-swa`. Será criado automaticamente um DNS para resolver o nome do Static Web App para o endereço IP privado do Private Endpoint.

![Configuração do Private Endpoint pvt-swa na vnet-swa](https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa26.png)

## Passo 9: Criação de um Repositório no GitHub
Crie um novo repositório no GitHub, irei deixar público para quem tiver interesse em visitar e conhecer mais, selecionei a criação de um readme nomeei como: `static-web-app`, não vamos adicionar README para seguir com os futuros.

**Github:** [static-web-app](https://github.com/orafaelferreiraa/static-web-app)

![Repositório static-web-app criado no GitHub](https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa27.png)

Precisamos adicionar a chave ssh da VM linux ao teu GitHub, clique na sua foto no canto superior direito, settings, SSH and GPG Keys:

![Menu de configurações SSH and GPG Keys do GitHub](https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa28.png)

Add SSH Key:

![Tela Add SSH Key do GitHub](https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa29.png)

Agora, precisamos retornar à VM-lnx e gerar uma nova chave SSH:
</code></pre></div>bash
<p>ssh-keygen</p>
<div data-lang="code"><pre><code>
OBS: Para fins didáticos, estou gerando uma chave sem senha para facilitar nosso laboratório. Crianças, nunca façam isso em produção :D
</code></pre></div>bash
<p>cat /home/rafael/.ssh/id_rsa.pub</p>
<div data-lang="code"><pre><code>
![Terminal exibindo a chave SSH pública gerada na VM](https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa30.png)

Copie toda a informação que e exibida após o comando cat e retorne para o GitHub.

Na mesma tela que paramos, coloque o nome da VM, por exemplo: `lnx-swa` no titulo e copie o conteúdo da chave, conforme imagem abaixo:

![Chave SSH da VM lnx-swa cadastrada no GitHub](https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa31.png)

Retorne a VM e faça a configurção mínima para o git, lembre-se de alterar suas informações:
</code></pre></div>bash
<p>git config --global user.name "orafaelferreira"</p>
<p>git config --global user.email rafael.low1@gmail.com</p>
<div data-lang="code"><pre><code>![Terminal com a configuração inicial do Git](https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa32.png)

Vamos entrar no diretório html para fazer o push dos arquivos para o GitHub:
</code></pre></div>bash
<p>cd meu_projeto/docs/doxygen_docs/html/</p>
<div data-lang="code"><pre><code>
![Terminal dentro do diretório html do projeto](https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa20.png)

E então vamos fazer o push dos arquivos do seu projeto para o repositório, conforme dica do proprio GitHub, não se esqueça de mudar: `git add README.md` para `git add .`:
</code></pre></div>bash
<p>echo "# static-web-app" >> README.md</p>
<p>git init</p>
<p>git add .</p>
<p>git commit -m "first commit"</p>
<p>git branch -M main</p>
<p>git remote add origin git@github.com:orafaelferreira/static-web-app.git</p>
<p>git push -u origin main</p>
<div data-lang="code"><pre><code>
![Terminal fazendo push dos arquivos para o GitHub](https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa33.png)

Dando um Check no GitHub:

![Repositório GitHub com os arquivos do projeto enviados](https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa34.png)

### Criação de Secret no GitHub

Pensando sempre em segurança com zero trust, vamos criar um segredo no repositório para armazenar o token de deployment.

No portal da Azure, no swa - Static Web App, clique em Manage deployment token e copie o token.

![Portal do Azure exibindo o Manage deployment token do Static Web App](https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa44.png)

De volta ao GitHub, clique em Settings, Secrets and variables, actions, new repository secret:

![Tela de Secrets and variables do repositório no GitHub](https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa45.png)

Digite o nome conforme exemplo:
</code></pre></div>bash
<p>AZURE_STATIC_WEB_APPS_API_TOKEN</p>
<div data-lang="code"><pre><code>
e cole o Deployment token:

![Criação do secret com o deployment token no GitHub](https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa46.png)

Adicionar

### Configuração do Workflow do GitHub Actions

No seu repositório GitHub, vá até a aba "Actions" e selecione a opcão: "Crie um workflow você mesmo":

![Aba Actions do GitHub com a opção de criar um workflow](https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa23.png)

Crie um arquivo `.github/workflows/deploy.yml` com o seguinte conteúdo **OBS: apague os espaços após o $ entre as { { e } }**
</code></pre></div>yaml
<p>name: Deploy Static Web App</p>

<p>on:</p>
<p>  push:</p>
<p>    branches:</p>
<ul>
<li>main</li>
</ul>

<p>jobs:</p>
<p>  build-and-deploy:</p>
<p>    runs-on: ubuntu-latest</p>
<p>    steps:</p>
<ul>
<li>name: Checkout repository content</li>
</ul>
<p>        uses: actions/checkout@v2</p>

<ul>
<li>name: Deploy Static Web App</li>
</ul>
<p>        uses: Azure/static-web-apps-deploy@v1</p>
<p>        with:</p>
<p>          azure_static_web_apps_api_token: ${ { secrets.AZURE_STATIC_WEB_APPS_API_TOKEN } }</p>
<p>          repo_token: ${ { secrets.GITHUB_TOKEN } }</p>
<p>          action: "upload"</p>
<p>          app_location: "/"</p>
<p>          output_location: "docs/doxygen_docs/html"</p>
</code>`<code>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa35.png" alt="Arquivo deploy.yml do workflow no editor do GitHub" />

<p>Não se esqueça de clicar no botão: </code>commit changes<code>:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa47.png" alt="Botão commit changes do workflow no GitHub" />

<p>E voilá, pipeline executando:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa48.png" alt="Pipeline do GitHub Actions em execução" />

<h2 id="passo-11-criacao-da-virtual-machine-windows-11">Passo 11: Criação da Virtual Machine Windows 11</h2>

<p>Já que não colocamos o Static Web App na internet, ele está apenas acessível na nossa rede interna. Precisamos criar uma VM, por exemplo, com Windows 11 para visualizar o deploy do Static Web App no navegador.</p>

<p>Dentro do nosso </code>rg-swa<code>, com o nome: </code>win-swa<code>, com tipo de segurança </code>Standard<code> e imagem </code>Windows 11 Pro<code>.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa36.png" alt="Portal do Azure criando a VM Windows 11 win-swa" />

<p>Escolhi o tamanho </code>Standard_B4ms<code> para ser mais rápido nos testes. Criei um usuário e senha de sua preferência (não se esqueça de anotar a senha rs).</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa37.png" alt="Seleção do tamanho Standard_B4ms e credenciais da VM Windows" />

<p>Sem porta de entrada pública, iremos configurar depois manualmente. Confirme a licença.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa38.png" alt="Configuração de portas de entrada e licença da VM Windows" />

<p>Certifique-se de que esteja na Vnet correta: </code>vnet-swa<code>, na subnet: </code>default<code>, e que não seja atribuído um NSG à NIC:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa39.png" alt="Configuração de rede da VM Windows na vnet-swa" />

<p>Depois opções default. Finalizando precisamos liberar a porta RDP no </code>nsg-swa<code>, settings, Inbound security rules, add, Services, RDP:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa40.png" alt="Regra de entrada liberando RDP no nsg-swa" />

<p>Estou usando Windows, portanto, procure no Iniciar </code>Remote` e abra o Remote Desktop Connection:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa41.png" alt="Remote Desktop Connection aberto no Windows" />

<p>Copie o IP público, digite no Remote Desktop Connection, clique no botão conectar, escolha uma conta diferente, digite o usuário e senha que foram criados anteriormente e clique em ok:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa42.png" alt="Tela de credenciais do Remote Desktop Connection" />

<p>Confirme o certificado:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa43.png" alt="Confirmação do certificado na conexão RDP" />

<h2 id="finalizando-verificacao-do-deploy">Finalizando: Verificação do Deploy</h2>
<p>Vamos testar via navegador web. Acesse a URL do seu Static Web App, retorne ao portal da Azure e copie o endereço de domínio para colar na VM Windows 11:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa49.png" alt="Portal do Azure exibindo a URL do Static Web App" />

<ul>
<li>https://black-sand-0051c0f0f.5.azurestaticapps.net</li>
</ul>

<strong>OBS: Esse é o nome padrão que vem. Podemos alterá-lo validando nosso domínio externo e configurando ainda mais nossa aplicação dentro do nosso recurso Azure Static Web App.</strong>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa50.png" alt="API Flask acessada pela VM Windows via Private Endpoint" />

<p>E se testarmos fora da nossa rede interna, por exemplo, utilizando a rede externa do nosso computador:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa51.png" alt="Acesso negado ao Static Web App fora da rede interna" />

<p>Acesso negado, conforme o esperado :D</p>

<p>Podemos ainda configurar senhas de visitantes. Por exemplo, se fosse uma API para consultar holerites, com dados sensíveis, dentro do portal da Azure na seção de configurações do Static Web App:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa52.png" alt="Configuração de senha de visitantes no Static Web App" />

<p>E então:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa53.png" alt="Tela de senha exibida ao acessar o Static Web App" />

<p>Digitando a senha conseguimos acessar a API:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa50.png" alt="API acessada após digitar a senha de visitante" />

<h2 id="desenho-arquitetura">Desenho Arquitetura</h2>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/swa/swa.png" alt="Desenho da arquitetura da solução com Static Web App e Private Endpoint" />

<h2 id="conclusao">Conclusão</h2>
<p>Neste artigo, aprendemos como configurar uma Virtual Machine no Azure (Resource Group, Virtual Network, Network Security Group, Disco, Network Interface, Public IP address). Configuramos uma API simples utilizando Python e Flask, documentamos a API com Doxygen e hospedamos a documentação no Azure Static Web Apps (Private Endpoint + Private DNS). Utilizamos o GitHub para hospedar o código e implementamos pipelines com GitHub Actions para realizar o deploy automático no Azure Static Web Apps. Este guia fornece uma abordagem abrangente para garantir que sua API seja bem documentada e acessível, utilizando o provedor de nuvem Azure. Se você tiver dúvidas estou à disposição para ajudar.</p>

]]></content:encoded>
    </item>
    <item>
      <title>Global Azure feat Azure Floripa 2024</title>
      <link>https://www.orafaelferreira.com/artigos/global-azure24</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/global-azure24</guid>
      <pubDate>Sat, 18 May 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Como foi o Global Azure 2024 com o Azure Floripa: um evento global para aprender e compartilhar conhecimento sobre a plataforma de cloud computing da Microsoft.</description>
      <category>Organização de Eventos</category>
      <enclosure url="https://img.youtube.com/vi/ql5zFgKBLzo/0.jpg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[
<h2 id="global-azure-2024-feat-azure-floripa-um-evento-incrivel">Global Azure 2024 feat. Azure Floripa: Um Evento Incrível!</h2>

<p>Estamos entusiasmados em compartilhar que o Global Azure 2024 foi um sucesso e o Azure Floripa marcou presença! Este evento global foi uma oportunidade incrível para aprender e compartilhar conhecimentos sobre a plataforma de Cloud Computing da Microsoft, o Azure. Com a participação de desenvolvedores, arquitetos e IT-pros, o evento foi totalmente gratuito e proporcionou uma experiência enriquecedora para todos os participantes.</p>

<h2 id="organizadores">Organizadores</h2>

<ul>
<li><strong><a href="https://www.linkedin.com/in/orafaelferreiraa/" target="_blank" rel="noopener noreferrer">Rafael Martin Alves Ferreira</a></strong></li>
<li><strong><a href="https://www.linkedin.com/in/viniciusdeschamps/" target="_blank" rel="noopener noreferrer">Vinicius Deschamps</a></strong></li>
</ul>

<h2 id="o-que-foi-o-global-azure">O que foi o Global Azure?</h2>

<p>O Global Azure foi um evento anual que ocorreu simultaneamente em várias partes do mundo, com o objetivo de disseminar conteúdos sobre o Microsoft Azure entre a comunidade técnica. O evento incentivou o uso da plataforma Azure e promoveu a troca de conhecimentos e experiências entre os participantes. Este ano, o evento aconteceu nos dias 18, 19 e 20 de abril de 2024.</p>

<h2 id="por-que-conferir">Por que Conferir?</h2>

<ul>
<li><strong>Conteúdo de Qualidade:</strong> Aprendemos com líderes de comunidades técnicas de classe mundial.</li>
<li><strong>Networking:</strong> Conecte-se com outros profissionais de TI e desenvolvedores que compartilham o mesmo interesse em Azure.</li>
<li><strong>Flexibilidade:</strong> Participamos de eventos locais ou online, de acordo com nossa conveniência.</li>
</ul>

<h2 id="palestras-e-sessoes">Palestras e Sessões</h2>

<h3 id="azure-copilot">Azure Copilot</h3>
<a href="https://www.youtube.com/watch?v=ql5zFgKBLzo" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/ql5zFgKBLzo/0.jpg" alt="Azure Copilot" /></a>

<h3 id="purview-e-copilot">Purview e Copilot</h3>
<a href="https://www.youtube.com/watch?v=O-IUocsjkpo" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/O-IUocsjkpo/0.jpg" alt="Purview e Copilot" /></a>

<h3 id="usando-o-servico-azure-open-ai-com-suas-aplicacoes">Usando o serviço Azure Open AI com suas aplicações</h3>
<a href="https://www.youtube.com/watch?v=8Xug8yks1hI" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/8Xug8yks1hI/0.jpg" alt="Usando o serviço Azure Open AI com suas aplicações" /></a>

<h3 id="potencializando-a-inclusao-digital-com-azure-ai-services">Potencializando a Inclusão Digital com Azure AI Services</h3>
<a href="https://www.youtube.com/watch?v=XXgXG8izo-A" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/XXgXG8izo-A/0.jpg" alt="Potencializando a Inclusão Digital com Azure AI Services" /></a>

<h3 id="projetando-arquiteturas-seguras-no-azure">Projetando arquiteturas seguras no Azure</h3>
<a href="https://www.youtube.com/watch?v=z09q03ccba0" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/z09q03ccba0/0.jpg" alt="Projetando arquiteturas seguras no Azure" /></a>

<h3 id="vpn-no-azure-com-autenticacao-pelo-entra-id-e-acesso-condicional">VPN no Azure com Autenticação pelo Entra ID e Acesso Condicional</h3>
<a href="https://www.youtube.com/watch?v=P-kyMJJ-C30" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/P-kyMJJ-C30/0.jpg" alt="VPN no Azure com Autenticação pelo Entra ID e Acesso Condicional" /></a>

<h3 id="protegendo-suas-aplicacoes-web-com-application-gateway-e-waf">Protegendo suas aplicações web com Application Gateway e WAF</h3>
<a href="https://www.youtube.com/watch?v=sdvIPY9uo7M" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/sdvIPY9uo7M/0.jpg" alt="Protegendo suas aplicações web com Application Gateway e WAF" /></a>

<h3 id="protegendo-identidades-e-acessos-em-uma-escala-empresarial-global">Protegendo identidades e acessos em uma escala empresarial global</h3>
<a href="https://www.youtube.com/watch?v=TvhCgo_PD88" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/TvhCgo_PD88/0.jpg" alt="Protegendo identidades e acessos em uma escala empresarial global" /></a>

<h3 id="abordagens-praticas-para-a-seguranca-na-nuvem">Abordagens Práticas para a Segurança na Nuvem</h3>
<a href="https://www.youtube.com/watch?v=uc8B4wpq5c8" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/uc8B4wpq5c8/0.jpg" alt="Abordagens Práticas para a Segurança na Nuvem" /></a>

<h3 id="ataque-de-ransomware-com-defender-for-endpoint-microsoft-sentinel">Ataque de Ransomware Com Defender for Endpoint & Microsoft Sentinel</h3>
<a href="https://www.youtube.com/watch?v=M4B9C_uI1kM" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/M4B9C_uI1kM/0.jpg" alt="Ataque de Ransomware Com Defender for Endpoint & Microsoft Sentinel" /></a>

<h3 id="estendendo-seguranca-e-gestao-de-workloads-multi-cloud-com-azure-arc">Estendendo segurança e gestão de workloads multi-cloud com Azure Arc</h3>
<a href="https://www.youtube.com/watch?v=xxcq-oSyHJc" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/xxcq-oSyHJc/0.jpg" alt="Estendendo segurança e gestão de workloads multi-cloud com Azure Arc" /></a>

<h3 id="pontos-de-atencao-fundamentais-em-finops">Pontos de Atenção Fundamentais em FinOps</h3>
<a href="https://www.youtube.com/watch?v=UbCX-wDQQls" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/UbCX-wDQQls/0.jpg" alt="Pontos de Atenção Fundamentais em FinOps" /></a>

<h3 id="azure-a-servico-da-saude-transformacao-digital-de-um-dos-pilares-do-sus">Azure a Serviço da Saúde, Transformação digital de um dos pilares do SUS</h3>
<a href="https://www.youtube.com/watch?v=wQsQk9iO65E" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/wQsQk9iO65E/0.jpg" alt="Azure a Serviço da Saúde, Transformação digital de um dos pilares do SUS" /></a>

<h3 id="plataformizando-solucoes-com-azure-e-terraform">Plataformizando Soluções com Azure e Terraform</h3>
<a href="https://www.youtube.com/watch?v=fgwbfLrKT74" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/fgwbfLrKT74/0.jpg" alt="Plataformizando Soluções com Azure e Terraform" /></a>

<h3 id="servicos-de-mensageria-do-azure-e-a-integracao-com-a-plataforma-do-azure-iot">Serviços de mensageria do Azure e a integração com a plataforma do Azure IoT</h3>
<a href="https://www.youtube.com/watch?v=Se77jzrj4lc" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/Se77jzrj4lc/0.jpg" alt="Serviços de mensageria do Azure e a integração com a plataforma do Azure IoT" /></a>

<h3 id="governanca-no-azure-recursos-e-praticas-para-organizar-seu-ambiente-em-nuvem">Governança no Azure - Recursos e práticas para organizar seu ambiente em Nuvem</h3>
<a href="https://www.youtube.com/watch?v=w1b4uv_XRdQ" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/w1b4uv_XRdQ/0.jpg" alt="Governança no Azure - Recursos e práticas para organizar seu ambiente em Nuvem" /></a>

<h3 id="greenops-da-fundacao-a-inovacao-sustentavel-na-cloud-azure">GreenOps: Da Fundação à Inovação Sustentável na Cloud Azure</h3>
<a href="https://www.youtube.com/watch?v=etnQCHbIg2I" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/etnQCHbIg2I/0.jpg" alt="GreenOps: Da Fundação à Inovação Sustentável na Cloud Azure" /></a>

<h2 id="por-que-fizemos-isso">Por Que Fizemos Isso?</h2>

<p>A resposta é simples: somos apaixonados por aprendizado e tecnologia! O Global Azure foi uma oportunidade de reunir pessoas de todo o mundo para aprender e compartilhar conhecimento sobre Azure.</p>

<h2 id="destaques-e-premiacoes">Destaques e Premiações</h2>

<p>Devido ao grande impacto que o Azure Floripa teve no Global Azure e como forma de incentivar os compartilhadores de conteúdo e grandes responsáveis pela entrega de conhecimento, selecionamos as palestras com mais visualizações por trilha e presenteamos com gift cards do iFood!</p>

<p>Gostaríamos de presentear todos os palestrantes, mas como ainda não é possível, espero que se sintam representados pelos ganhadores:</p>

<ul>
<li><strong>Rafael Alves Amaral</strong>, primeiro dia, trilha de Inteligência Artificial (<a href="https://lnkd.in/dQJEWc5k" target="_blank" rel="noopener noreferrer">Azure Copilot</a>)</li>
<li><strong>Raphael Custódio</strong>, segundo dia, trilha de Segurança (<a href="https://lnkd.in/drwJpPGa" target="_blank" rel="noopener noreferrer">Ataque de Ransomware com Defender for Endpoint & Microsoft Sentinel</a>)</li>
<li><strong>Rodrigo Paliosa</strong>, terceiro dia, trilha de Overview (<a href="https://lnkd.in/dqPBTZFn" target="_blank" rel="noopener noreferrer">Pontos de Atenção Fundamentais em FinOps</a>)</li>
</ul>

<h2 id="quer-fazer-parte-da-comunidade-azure-floripa">Quer Fazer Parte da Comunidade Azure Floripa?</h2>

<p>Então acesse e se inscreva em nossas redes sociais:</p>

<ul>
<li><strong><a href="https://chat.whatsapp.com/HSpFnNyo9ZLD4RJrvEcrrl" target="_blank" rel="noopener noreferrer">WhatsApp</a></strong></li>
<li><strong><a href="https://lnkd.in/dtX9uKEk" target="_blank" rel="noopener noreferrer">YouTube</a></strong></li>
<li><strong><a href="https://lnkd.in/d8vBRFpm" target="_blank" rel="noopener noreferrer">Visite nosso site</a></strong></li>
</ul>

<p>Saiba mais: <a href="https://globalazure.net/" target="_blank" rel="noopener noreferrer">Global Azure</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Antes do Cloud Native: Construindo uma Fundação Sólida para a Nuvem Impactando um Futuro Sustentável - KCD São Paulo - Brasil 2024</title>
      <link>https://www.orafaelferreira.com/artigos/kcdsp24</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/kcdsp24</guid>
      <pubDate>Sun, 25 Feb 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>No dia 24 de fevereiro de 2024, tive a oportunidade de palestrar no Kubernetes Community Days (KCD) Brasil, realizado na Natura NASP, em São Paulo.</description>
      <category>Palestras</category>
      <category>GreenOps</category>
      <category>Cloud Native</category>
      <category>Comunidade</category>
      <category>Observabilidade</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/kcdsp24/00.jpg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[
<p>No dia 24 de fevereiro de 2024, tive a oportunidade de palestrar no <strong>Kubernetes Community Days (KCD) Brasil</strong>, realizado na Natura NASP, em São Paulo. Esse evento híbrido foi um marco no cenário Cloud Native no Brasil, reunindo especialistas, entusiastas e líderes da área para dois dias de aprendizado, troca de ideias e networking.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/kcdsp24/00.jpg" alt="Rafael Ferreira palestrando no KCD São Paulo 2024 na Natura NASP" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/kcdsp24/1.jpg" alt="Público do Kubernetes Community Days Brasil 2024" />


<h2 id="minha-palestra-antes-do-cloud-native-construindo-uma-fundacao-solida-para-a-nuve">Minha Palestra: "Antes do Cloud Native: Construindo uma Fundação Sólida para a Nuvem Impactando um Futuro Sustentável"</h2>


<p>Com base na importância de uma base robusta para adoção da nuvem, minha palestra trouxe insights práticos e estratégicos sobre:</p>

<ul>
<li><strong>Framework de Adoção da Nuvem (CAF):</strong> Uma abordagem estruturada para ajudar organizações a planejar, adotar e gerenciar sua migração para a nuvem.</li>
</ul>

<ul>
<li><strong>Landing Zones:</strong> A construção de ambientes otimizados para crescimento sustentável na nuvem, com governança, segurança e escalabilidade em mente.</li>
</ul>

<ul>
<li><strong>DevOps e Sustentabilidade:</strong> Mostrei como práticas de DevOps e observabilidade se integram a esforços de sustentabilidade, como <strong>GreenOps</strong>, para maximizar eficiência e reduzir impactos ambientais.</li>
</ul>

<p>Os pontos altos foram os debates sobre o impacto de práticas sustentáveis e as ferramentas disponíveis para viabilizar um futuro verde no mundo tecnológico.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/kcdsp24/2.jpg" alt="Rafael Ferreira apresentando Antes do Cloud Native no KCD São Paulo" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/kcdsp24/3.jpg" alt="Slide da palestra sobre fundação sólida para a nuvem sustentável" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/kcdsp24/4.jpg" alt="Público acompanhando a palestra sobre Cloud Native sustentável" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/kcdsp24/5.jpg" alt="Rafael Ferreira no palco do KCD Brasil 2024" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/kcdsp24/6.jpg" alt="Momento da palestra sobre sustentabilidade em Cloud Native" />

<a href="https://www.credly.com/badges/a6940f87-b34a-497e-8c1e-93545075c0ee/public_url" target="_blank" rel="noopener noreferrer"><img src="https://images.credly.com/images/57fa51c3-4942-4fc7-ade4-0f729b43bfbd/image.png" alt="Contributor - KCD São Paulo, Brazil 2024" /></a>

<h2 id="destaques-do-kcd-brasil-2024">Destaques do KCD Brasil 2024</h2>

<p>Além da minha contribuição, o evento contou com uma agenda diversificada e de alto nível:</p>

<ul>
<li><strong>Palestras Impactantes:</strong> Tópicos como GitOps, DevSecOps, monitoramento em containers e transformação digital foram abordados por especialistas renomados, incluindo apresentações de organizações como Grafana, AWS, Red Hat, Sysdig e ThoughtWorks.</li>
</ul>

<ul>
<li><strong>Participação Híbrida:</strong> O modelo híbrido permitiu que participantes de todo o Brasil (e do mundo) acompanhassem as sessões virtuais e presenciais.</li>
</ul>

<ul>
<li><strong>Mentorias e Conexões:</strong> Sessões de mentoria e networking proporcionaram uma troca rica entre palestrantes e participantes, fortalecendo a comunidade Cloud Native.</li>
</ul>

<h2 id="reflexoes-e-proximos-passos">Reflexões e Próximos Passos</h2>

<p>Palestrar em eventos como o KCD Brasil é sempre uma experiência transformadora. Compartilhar conhecimento, aprender com outros e discutir as tendências que moldam o futuro da tecnologia é algo que fortalece nossa comunidade e impulsiona inovações.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/kcdsp24/7.jpg" alt="Palestrantes e comunidade reunidos no KCD São Paulo 2024" />

<p>Se você não participou deste ano, recomendo acompanhar as próximas edições. E, claro, considere submeter sua palestra, o KCD é uma plataforma incrível para amplificar sua voz e ideias no cenário Cloud Native.</p>

<strong>Nos vemos nos próximos eventos!</strong> 🚀

<p>---</p>


]]></content:encoded>
    </item>
    <item>
      <title>Antes do Cloud Native: Construindo uma Fundação Sólida para a Nuvem Impactando um Futuro Sustentáve - Cloud Native Floripa - 2º Edição</title>
      <link>https://www.orafaelferreira.com/artigos/2meetcncf</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/2meetcncf</guid>
      <pubDate>Thu, 22 Feb 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Palestrei no 2º Cloud Native Floripa Meetup sobre como construir uma fundação sólida para a nuvem com foco em sustentabilidade, na A Fábrica Working Bar.</description>
      <category>Palestras</category>
      <category>GreenOps</category>
      <category>Kubernetes</category>
      <category>Cloud Native</category>
      <category>Comunidade</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2cloudnative/1.jpg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[
<p>No dia 21 de fevereiro de 2024, tive o prazer de palestrar no 2º Cloud Native Floripa Meetup, organizado pelo Community Group Cloud Native Santa Catarina. O evento realizado na "<a href="https://www.afabricaworkingbar.com/coworking" target="_blank" rel="noopener noreferrer">A Fábrica Working Bar</a>".</p>

<h2 id="minha-palestra-antes-do-cloud-native-construindo-uma-fundacao-solida-para-a-nuve">Minha Palestra: "Antes do Cloud Native: Construindo uma Fundação Sólida para a Nuvem Impactando um Futuro Sustentável"</h2>

<p>Falei sobre como construir uma base sólida para adoção da nuvem. A palestra abordou conceitos como:</p>

<ul>
<li><strong>Cloud Adoption Framework (CAF):</strong> Um framework que ajuda organizações a estruturar sua transição para a nuvem de maneira eficiente e segura, destacando a importância de pilares como governança, segurança e gestão operacional.</li>
</ul>

<ul>
<li><strong>Landing Zones:</strong> Criar ambientes Cloud escaláveis e organizados, preparando empresas para o crescimento sustentado.</li>
</ul>

<ul>
<li><strong>FinOps e Sustentabilidade:</strong> Explorei práticas financeiras em Cloud Native, aliadas a conceitos de GreenOps, podem maximizar o valor obtido da nuvem, reduzindo o impacto ambiental e os custos.</li>
</ul>

<p>A interação com o público foi sensacional, explorar maneiras de incorporar práticas sustentáveis no dia a dia das organizações e as oportunidades que tecnologias emergentes, como Kubernetes, oferecem para amplificar esses esforços.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2cloudnative/1.jpg" alt="Rafael Ferreira palestrando no 2º Cloud Native Floripa Meetup" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2cloudnative/2.jpg" alt="Público do Cloud Native Floripa Meetup na A Fábrica Working Bar" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2cloudnative/3.jpg" alt="Slide da palestra Antes do Cloud Native no meetup Cloud Native Floripa" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2cloudnative/4.jpg" alt="Rafael Ferreira apresentando práticas sustentáveis para a nuvem" />
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2cloudnative/5.jpg" alt="Participantes acompanhando a palestra no Cloud Native Floripa Meetup" />

<h2 id="o-que-torna-um-meetup-diferente">O Que Torna um Meetup Diferente?</h2>

<p>O meetup não foi apenas uma oportunidade de aprender e compartilhar conhecimento técnico, mas também de conectar pessoas com diferentes trajetórias na área de tecnologia.</p>

<strong>Destaques do evento incluem:</strong>
<ul>
<li><strong>Palestras de alto nível:</strong> Além da minha, tivemos a excelente apresentação de <strong>Erivaldo Lopes</strong>, que trouxe insights sobre escalabilidade no Kubernetes com Cluster API e Cluster Autoscaler.</li>
<li><strong>Ambiente descontraído:</strong> O local, um coworking-bar, criou uma atmosfera que estimulou networking e troca de ideias de forma natural.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2cloudnative/6.jpg" alt="Networking entre participantes no coworking-bar após o meetup" />

<h2 id="reflexoes-finais">Reflexões Finais</h2>

<p>Eventos como o Cloud Native Floripa são mais do que encontros técnicos, eles simbolizam o crescimento e a força das comunidades de tecnologia locais. Participar em meetups como esse, podemos ver o poder da colaboração e o impacto que podemos causar juntos ao compartilhar conhecimento.</p>

<p>Se você também é apaixonado por tecnologia, recomendo participar desses eventos e quem sabe, contribuir como palestrante. Afinal, cada voz conta na construção de um futuro mais conectado e sustentável!</p>

<p>---</p>


]]></content:encoded>
    </item>
    <item>
      <title>Construindo uma Fundação Sólida para a Nuvem: Monitoria e Observabilidade para Performance e Eficiência em Ambientes Cloud Native</title>
      <link>https://www.orafaelferreira.com/artigos/observabilidade-foundation-cloud</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/observabilidade-foundation-cloud</guid>
      <pubDate>Wed, 17 Jan 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Monitoria e observabilidade em ambientes Cloud Native: diferenças, pilares, SLIs, SLOs e SLAs, quatro sinais de ouro, custo dos logs e melhoria contínua.</description>
      <category>Artigos</category>
      <category>Kubernetes</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-17-observabilidade-foundation-cloud01.png" length="0" type="image/png" />
      <content:encoded><![CDATA[<h2 id="introducao">Introdução</h2>

<p>No contexto atual de tecnologias Cloud Native e microsserviços, exige uma abordagem robusta necessária de monitoria e observabilidade como componentes fundamentais para a garantia de eficiência operacional e performance. Este artigo, explora como a observabilidade detalhada pode fornecer insights valiosos para otimizar o desempenho e a sustentabilidade em ambientes Cloud Native.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-17-observabilidade-foundation-cloud01.png" alt="Ilustração de monitoria e observabilidade em ambientes Cloud Native" />

<h2 id="o-papel-da-monitoria-e-observabilidade">O Papel da Monitoria e Observabilidade</h2>

<p>A monitoria e observabilidade são essenciais no ciclo de vida do software, especialmente em ambientes complexos de microsserviços. Elas não apenas facilitam o diagnóstico e a resolução de problemas, mas também ajudam na otimização de recursos e na tomada de decisões baseadas em dados. Veremos como essas práticas se somam e se complementam, proporcionando uma visão mais profunda dos sistemas.</p>

<h3 id="o-que-sao-e-por-que-sao-importantes">O Que São e Por Que São Importantes?</h3>
<ul>
<li><strong>Monitoria:</strong> Refere-se ao ato de coletar, processamento e exibição de dados quantitativos de sistemas: CPU, memória e tráfego de rede.</li>
<li><strong>Observabilidade:</strong> Evolução da monitoria, permite compreender sistemas complexos a partir de dados externos, abrangendo métricas, tracings e logs.</li>
</ul>

<h3 id="diferenca-entre-monitoria-e-observabilidade">Diferença entre Monitoria e Observabilidade</h3>
<ul>
<li>Enquanto a monitoria fornece dados quantitativos, a observabilidade permite compreender a complexidade e os detalhes das informações obtidas, permitindo perguntas detalhadas sobre o comportamento do sistema.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-17-observabilidade-foundation-cloud02.png" alt="Comparativo entre monitoria e observabilidade" />

<h2 id="a-importancia-da-observabilidade">A Importância da Observabilidade</h2>

<p>A observabilidade vai além da simples monitoria de sistemas. Ela envolve uma análise aprofundada e contínua do comportamento e performance de sistemas em nuvem</p>

<ul>
<li><strong>Identificação Proativa de Problemas:</strong> A observabilidade permite diagnósticos rápidos e precisos, reduzindo o tempo de inatividade e melhorando a confiabilidade do sistema.</li>
<li><strong>Otimização de Recursos:</strong> Insights detalhados sobre o uso dos recursos ajudam a aprimorar a eficiência e reduzir os custos operacionais.</li>
<li><strong>Tomada de Decisão Baseada em Dados:</strong> Decisões estratégicas são embasadas em dados concretos, garantindo a sustentabilidade e eficiência a longo prazo.</li>
</ul>

<h2 id="pilares-da-observabilidade">Pilares da Observabilidade</h2>

<ul>
<li><strong>Metricas:</strong> Avaliam o desempenho dos sistemas e hosts, fornecendo dados para otimização.</li>
<li><strong>Logs:</strong> Revelam padrões ocultos e ajudam na resolução de problemas.</li>
<li><strong>Trace:</strong> Rastreiam requisições e transações em microsserviços, identificando gargalos e otimizando a performance.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-17-observabilidade-foundation-cloud03.png" alt="Os três pilares da observabilidade: logs, métricas e traces" />

<h2 id="ferramentas-em-destaque">Ferramentas em Destaque</h2>

<ul>
<li><strong>Prometheus:</strong> Utilizada para coleta e armazenamento de métricas. O Prometheus é uma ferramenta poderosa para o monitoramento de sistemas e serviços, oferecendo uma robusta plataforma para a coleta e análise de dados em tempo real.</li>
</ul>

<ul>
<li><strong>Elasticsearch, Logstash, e Kibana (ELK Stack):</strong> Amplamente utilizada para o gerenciamento e análise de logs. Esta combinação de ferramentas permite a coleta, enriquecimento, armazenamento e análise visual de logs de diversos sistemas e aplicações.</li>
</ul>

<ul>
<li><strong>Jaeger:</strong> Uma ferramenta de rastreamento distribuído que ajuda na monitoração e solução de problemas em arquiteturas de microsserviços. O Jaeger coleta, armazena e visualiza rastreamentos de transações, facilitando a identificação e a análise de problemas de desempenho em sistemas complexos.</li>
</ul>

<ul>
<li><strong>Grafana:</strong> Essencial para visualização de dados e criação de dashboards. Grafana permite transformar dados de várias fontes em representações visuais ricas, facilitando a análise e interpretação de métricas complexas.</li>
</ul>

<ul>
<li><strong>OpenTelemetry:</strong> Focada na coleta e exportação de dados de telemetria. OpenTelemetry veio para fornece uma padronização de exportar dados para observar métricas, rastreamentos e logs, facilitando a integração e a análise de dados.</li>
</ul>

<ul>
<li><strong>Kube-Prometheus:</strong> Uma coleção de componentes Open Source para o monitoramento nativo de Kubernetes, incluindo Prometheus, Grafana e Alertmanager, juntamente com as configurações necessárias para sua implementação. Kube-Prometheus facilita o monitoramento abrangente dos clusters Kubernetes, integrando-se de maneira eficiente com o ecossistema do Kubernetes.</li>
</ul>

<p>Estas ferramentas, conseguem formar um ecossistema completo para a implementação eficaz da observabilidade, desde a coleta de dados até a análise e visualização, facilitando o monitoramento e a tomada de decisão baseada em dados concretos.</p>

<h2 id="importancia-dos-slis-slos-e-slas">Importância dos SLIs, SLOs e SLAs</h2>

<p>Estes indicadores são cruciais para medir e estabelecer metas claras de qualidade, alinhando o desempenho e a disponibilidade do produto com as expectativas dos usuários.</p>

<h2 id="implementando-slis-slos-e-slas">Implementando SLIs, SLOs e SLAs</h2>
<ul>
<li><strong>SLIs (Service Level Indicators):</strong> Métricas quantitativas que medem o desempenho do serviço em relação ao SLO estabelecido.</li>
<li><strong>SLOs (Service Level Objectives):</strong> Metas de desempenho específicas que um serviço se compromete a alcançar para atender ao SLA.</li>
<li><strong>SLAs (Service Level Agreements):</strong> Acordos formais sobre os níveis de serviço entre provedores e clientes.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-17-observabilidade-foundation-cloud04.png" alt="Relação entre SLIs, SLOs e SLAs" />

<h2 id="os-quatro-sinais-de-ouro">Os Quatro Sinais de Ouro</h2>

<p>Com a observabilidade conseguimos manter a saúde e a eficiência dos sistemas. The Four Golden Signals ajudam a entender o comportamento de uma aplicação ou serviço. Vamos detalhar cada um desses sinais:</p>

<h3 id="latencia">Latência</h3>
<ul>
<li><strong>Descrição:</strong> Mede o tempo de resposta das requisições e seu impacto na experiência do usuário.</li>
<li><strong>Métodos de Medição:</strong></li>
<li>Tempo de respostas das requisições.</li>
<li>Separando a latência de requisições bem e malsucedidas.</li>
</ul>

<h3 id="trafego">Tráfego</h3>
<ul>
<li><strong>Descrição:</strong> Refere-se ao volume de demanda do serviço ou aplicação, essencial para entender padrões de uso.</li>
<li><strong>Métodos de Medição:</strong></li>
<li>Quantidade de requisições por segundo.</li>
<li>Agrupamento de requisições em grupos específicos para análise mais detalhada.</li>
</ul>

<h3 id="erros">Erros</h3>
<ul>
<li><strong>Descrição:</strong> Tipos de falhas no sistema, fundamentais para a detecção de problemas.</li>
<li><strong>Métodos de Medição e Categorização:</strong></li>
<li>Categorização de códigos de status HTTP (404, 500, etc.).</li>
<li>Identificação de exceções lançadas pela aplicação.</li>
</ul>

<h3 id="saturacao">Saturação</h3>
<ul>
<li><strong>Descrição:</strong> Indica o nível de utilização dos recursos, sinalizando sobrecarga e a necessidade de escalabilidade.</li>
<li><strong>Métodos de Medição:</strong></li>
<li>Medição da sobrecarga de recursos (CPU, memória, disco, rede).</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-17-observabilidade-foundation-cloud05.png" alt="Os quatro sinais de ouro: latência, tráfego, erros e saturação" />

<p>Cada um destes sinais oferece insights valiosos sobre diferentes aspectos do sistema e, quando monitorados juntos, proporcionam uma visão abrangente da saúde e desempenho da aplicação ou serviço.</p>

<h2 id="logs-sao-caros">Logs São Caros</h2>

<p>O gerenciamento de logs é uma parte crítica da observabilidade, mas pode se tornar inviável se não for feito de maneira estratégica. A eficácia e o custo dos logs dependem de como são utilizados e gerenciados dentro de uma organização.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-17-observabilidade-foundation-cloud06.png" alt="Ilustração sobre o custo do gerenciamento de logs" />

<h3 id="caro-para-quem-nao-sabe-o-que-fazer-com-eles">Caro para Quem Não Sabe o Que Fazer com Eles</h3>
<ul>
<li><strong>Definição de Objetivos:</strong> Sem uma compreensão clara do que se pretende alcançar com os logs, eles podem se tornar apenas um amontoado de dados sem valor agregado.</li>
<li><strong>Coleta Seletiva:</strong> É essencial definir o que é importante coletar. A coleta indiscriminada de logs pode levar a custos desnecessários e a um excesso de informações.</li>
</ul>

<h3 id="logs-sem-analise-dinheiro-gasto-a-toa">Logs Sem Análise: Dinheiro Gasto à Toa</h3>
<ul>
<li><strong>Análise de Logs:</strong> Logs que não são regularmente revistos ou analisados podem representar um gasto inútil. É crucial ter alguém que monitore e analise os logs para extrair insights valiosos.</li>
<li><strong>Ação Baseada em Logs:</strong> A verdadeira utilidade dos logs vem da ação tomada com base nas informações coletadas. Sem ação, os logs não passam de dados sem uso.</li>
</ul>

<h3 id="estrategias-para-gerenciamento-de-custos-de-logs">Estratégias para Gerenciamento de Custos de Logs</h3>
<ul>
<li><strong>Ferramentas Eficientes:</strong> O uso de ferramentas apropriadas para o gerenciamento de logs pode ajudar a reduzir custos, fornecendo análise e armazenamento eficientes.</li>
<li><strong>Políticas de Retenção:</strong> Definir políticas de retenção adequadas ajuda a manter apenas os logs necessários, reduzindo o armazenamento e os custos associados.</li>
</ul>

<p>Ao abordar os logs com uma estratégia clara, focada na coleta seletiva e na análise eficaz, as organizações podem transformar o que seria um custo em um investimento valioso que apoia a tomada de decisão baseada em dados e melhora contínua dos sistemas.</p>

<h2 id="observabilidade-um-ciclo-infinito-de-melhoria">Observabilidade: Um Ciclo Infinito de Melhoria</h2>
<ul>
<li><strong>Fundamental para o Negócio:</strong> A ausência de observabilidade em uma aplicação sugere que ela pode não ser considerada vital para o negócio. A observabilidade contínua garante que os sistemas sejam confiáveis e performáticos.</li>
<li><strong>Equipe Dedicada:</strong> Idealmente, cada aplicação deve ter uma equipe dedicada focada em sua observabilidade, garantindo atenção contínua e melhorias constantes.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-17-observabilidade-foundation-cloud07.png" alt="Ciclo contínuo de melhoria da observabilidade" />

<h3 id="quem-nao-mede-nao-gerencia">Quem Não Mede, Não Gerencia</h3>
<ul>
<li><strong>Maturidade Organizacional:</strong> Implementar a observabilidade exige maturidade organizacional. É um processo complexo que necessita de uma abordagem detalhada e dedicada.</li>
<li><strong>Desafios da Implementação:</strong> A implantação de sistemas de observabilidade não é trivial. Exige um entendimento profundo dos sistemas e uma integração efetiva com as práticas de DevOps.</li>
</ul>

<h2 id="cultura-de-observabilidade">Cultura de Observabilidade</h2>

<p>A criação de uma cultura que valoriza a observabilidade é crucial para o sucesso em ambientes dinâmicos e competitivos.</p>

<h3 id="incentivando-a-colaboracao">Incentivando a Colaboração</h3>
<ul>
<li><strong>Colaboração Interfuncional:</strong> Desenvolvedores, operações e equipes de QA devem trabalhar juntos para identificar e resolver problemas de forma rápida e eficaz.</li>
<li><strong>Resolução Rápida de Problemas:</strong> Uma cultura focada na observabilidade permite que problemas sejam identificados e resolvidos rapidamente, minimizando o impacto negativo no desempenho e na experiência do usuário.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-17-observabilidade-foundation-cloud08.png" alt="Cultura de colaboração em torno da observabilidade" />

<p>Uma cultura de observabilidade robusta não só melhora a confiabilidade e a performance dos sistemas,</p>

<h2 id="o-lento-e-o-novo-parado">"O Lento é o Novo Parado"</h2>

<p>No mundo dinâmico da tecnologia atual, onde a eficiência e a rapidez são cruciais, "o lento é o novo parado". A observabilidade permite identificar rapidamente áreas onde o sistema está operando de forma mais lenta do que o ideal, possibilitando correções antes que se tornem problemas maiores.</p>

<h3 id="implicacoes-para-o-desempenho-do-sistema">Implicações para o Desempenho do Sistema</h3>
<ul>
<li><strong>Expectativas de Desempenho:</strong> Em uma era onde tudo é instantâneo, um sistema lento pode ser tão prejudicial quanto um sistema inoperante. Usuários e clientes esperam respostas rápidas e eficientes.</li>
<li><strong>Percepção do Usuário:</strong> Atrasos, mesmo que breves, podem afetar negativamente a percepção do usuário sobre a aplicação, levando à insatisfação e possível perda de clientes.</li>
</ul>

<h2 id="computacao-verde-e-observabilidade">Computação Verde e Observabilidade</h2>

<ul>
<li>A relação entre práticas de observabilidade e computação verde, destaca-sem práticas de monitoramento que contribuem para a redução de poder de processamento sem utilização, gerando uma redução no impacto ambiental.</li>
<li>Implementação de soluções de monitoramento avançado para uma análise contínua e detalhada dos sistemas.</li>
<li>Utilização de observabilidade alinhada com as operações de TI junto com os princípios de sustentabilidade, reduzindo a pegada de carbono.</li>
</ul>

<h2 id="conclusao-e-chamado-a-acao">Conclusão e Chamado à Ação</h2>

<p>Destaco a importância de adotar práticas de monitoria e observabilidade desde o início do desenvolvimento do projeto. Encorajo os iniciantes não apenas aprendam, mas também contribuam ativamente com a comunidade, compartilhando suas descobertas e melhores práticas.</p>

<p>Este artigo destina-se a servir como uma referência abrangente e ponto de partida para aqueles que estão começando sua jornada em ambientes Cloud Native, focando na importância crítica da monitoria e observabilidade para garantir sistemas eficientes, confiáveis e sustentáveis.</p>

]]></content:encoded>
    </item>
    <item>
      <title>Azure Backup should be enabled for Virtual Machines</title>
      <link>https://www.orafaelferreira.com/artigos/azure-backup-virtual-machines</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/azure-backup-virtual-machines</guid>
      <pubDate>Mon, 15 Jan 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Por que a policy Azure Backup should be enabled for Virtual Machines é essencial em ambientes corporativos e os riscos de não ter backup automático em VMs.</description>
      <category>Artigos</category>
      <category>Terraform</category>
      <category>Governança</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/AzureBackupshouldbeenabledforVirtualMachines/00.png" length="0" type="image/png" />
      <content:encoded><![CDATA[<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/AzureBackupshouldbeenabledforVirtualMachines/00.png" alt="Azure Backup" />

<h2 id="visao-geral">Visão Geral</h2>
<p>Vamos explorar por que a policy <strong>"Azure Backup should be enabled for Virtual Machines"</strong> (ID: 013e242c-8828-4970-87b3-ab247555486d) é essencial em ambientes corporativos. Como continuação dos fundamentos de Azure Policy, vamos detalhar os riscos de não ter backup automático em VMs, o funcionamento técnico dessa policy, sua relação com boas práticas e compliance (Azure Security Benchmark, ISO 27001, LGPD, GDPR, CMMC) e como aplicá-la na prática para melhorar a continuidade de negócios. Também abordaremos mecanismos de remediação – desde habilitar backup manualmente, com IAC (Infraestrutura como código) e via Azure Policy.</p>

<h2 id="riscos-de-nao-habilitar-backup-em-maquinas-virtuais">Riscos de não habilitar backup em máquinas virtuais</h2>
<p>Não realizar backups automáticos de máquinas virtuais pode ocasionar riscos significativos. Em caso de falhas, erro humano ou ataque cibernético, uma VM sem backup pode resultar em <strong>perda irreversível de dados</strong>, comprometendo a integridade e disponibilidade das informações e interrompendo operações críticas do negócio. Por exemplo, se um servidor de banco de dados em produção for perdido e não possuia backup, a empresa irá enfrentar <strong>horas (ou dias) de indisponibilidade</strong> e perda de dados transacionais importantes.</p>

<strong>Alguns riscos reais de não ter backup habilitado em VMs incluem:</strong>
<ul>
<li><strong>Perda de Dados e Impacto Financeiro:</strong> Dados armazenados apenas no disco da VM ficam suscetíveis a falhas. Um colapso de disco ou exclusão acidental pode significar perda permanente de informações valiosas, gerando prejuízos financeiros e operacionais.</li>
<li><strong>Continuidade do Negócio Comprometida:</strong> Sem backups, a recuperação de uma VM crítica pode ser inviável, resultando em <strong>downtime prolongado</strong> e possíveis violações de SLAs.</li>
<li><strong>Ataques de Ransomware:</strong> VMs sem backup tornam a empresa mais vulnerável. Em um ataque de ransomware, se não houver cópias de segurança recentes, a única opção pode ser pagar resgate (sem garantia de sucesso) ou perder os dados. Com backups, é possível restaurar o sistema ao estado pré-ataque. Além disso, o Azure Backup oferece recursos de segurança como <em>Soft Delete</em> e <em>MFA</em> no ato da exclusão, protegendo as cópias contra tentativas maliciosas de apagá-las.</li>
<li><strong>Compliance e Reputação:</strong> A ausência de backup pode gerar não-conformidade com normas de proteção de dados e continuidade. Um incidente de perda definitiva de informações pode resultar em multas regulatórias e danificar a reputação da empresa.</li>
</ul>

<h2 id="como-funciona-a-azure-policy-azure-backup-should-be-enabled-for-virtual-machines">Como funciona a Azure Policy "Azure Backup should be enabled for Virtual Machines"</h2>
<p>Essa Azure Policy é uma definição <em>built-in</em> da Microsoft criada para garantir que as VMs tenham backup habilitado. Trata-se de uma policy do tipo <strong>AuditIfNotExists</strong> (modo <strong>Indexed</strong>), ou seja, <strong>não</strong> impede a criação da VM, mas <strong>audita</strong> o ambiente e <strong>marca como não conformes</strong> as VMs que não possuam item de backup registrado em um <strong>Recovery Services Vault</strong>.</p>

<h3 id="detalhes-tecnicos-principais">Detalhes técnicos principais</h3>
<ul>
<li><strong>Modo e Efeito:</strong> Funciona em modo Indexed e o efeito padrão é AuditIfNotExists. Para cada recurso do tipo Microsoft.Compute/virtualMachines, a policy verifica a existência de um recurso de backup (Microsoft.RecoveryServices/vaults/backupProtectedItems). Se não houver, marca a VM como não conforme.</li>
<li><strong>Condição (rule):</strong> Aplica-se a todas as VMs, <strong>exceto</strong> VMs geradas por serviços gerenciados como Azure Databricks e Azure OpenShift, onde o backup tradicional do Azure VM não se aplica.</li>
<li><strong>Checagem de Compliance:</strong> Caso a VM não esteja em um cofre de backup, a policy gera a não-conformidade. A severidade é listada como "Low" no portal, mas, do ponto de vista de continuidade de negócios, o risco é alto.</li>
<li><strong>Aplicação em Escala:</strong> Ao atribuí-la no nível de <em>Subscription</em> ou <em>Resource Group</em>, a policy auditará continuamente VMs novas e existentes. Se a VM for criada sem backup, aparecerá como <strong>non-compliant</strong>.</li>
</ul>

<p>Em um ambiente corporativo enterprise, com muitas VMs, essa Azure Policy dá visibilidade proativa, permitindo identificar instâncias não protegidas pelo Azure Backup.</p>

<h2 id="alinhamento-com-melhores-praticas-e-benchmarks-de-seguranca">Alinhamento com melhores práticas e benchmarks de segurança</h2>
<p>Habilitar backups automáticos em VMs é tanto uma recomendação de boas práticas quanto um requisito em diversos frameworks de segurança e conformidade. Confira alguns exemplos:</p>
<div><table><thead><tr><th><strong>Padrão/Benchmark</strong></th><th><strong>Controle/Norma</strong></th><th><strong>Requisito relacionado a backup</strong></th></tr></thead><tbody><tr><td><strong>Azure Security Benchmark (v3)</strong></td><td><strong>BR-1 – Backup and Recovery</strong></td><td>"Ensure backup of business-critical resources, either during resource creation or enforced through policy." O ASB recomenda habilitar backup em VMs e cita Azure Policy.</td></tr><tr><td><strong>ISO/IEC 27001:2013</strong></td><td><strong>A.12.3.1 – Backup de informações</strong></td><td>Requer cópias de segurança periódicas e testadas regularmente. O backup de VMs garante disponibilidade de dados após incidentes.</td></tr><tr><td><strong>LGPD (Lei 13.709/2018)</strong></td><td><strong>Art. 46 – Segurança da Informação</strong></td><td>Exige medidas para proteger dados pessoais contra destruição ou perda acidental/ilícita. Manter backups de VMs que tratam dados pessoais ajuda a prevenir perda total.</td></tr><tr><td><strong>GDPR (Regulamento Geral de Proteção de Dados)</strong></td><td><strong>Art. 32(1)(c)</strong> – Segurança do Processamento</td><td>Determina a capacidade de restabelecer a disponibilidade de dados pessoais em caso de incidente. Backups de VMs são essenciais para cumprir essa obrigação.</td></tr><tr><td><strong>CMMC (Cybersecurity Maturity Model)</strong></td><td><strong>RE.2.137 & RE.3.139</strong> – Recovery</td><td>Exigem backups regulares e testados (Nível 2) e backups completos e resilientes (Nível 3). A Azure Policy garante que nenhuma VM fique sem backup.</td></tr></tbody></table></div>
<p>Manter backups automáticos suporta diretamente controles de continuidade de negócio e proteção de dados em vários âmbitos. Frameworks adicionais, como <em>CIS Controls v8</em> e <em>NIST SP 800-53 (CP-9)</em>, também exigem backups. Logo, habilitar backup em VMs contribui para uma postura de segurança robusta e alinhada aos principais padrões de segurança.</p>

<h2 id="continuidade-de-negocios-e-recuperacao-de-desastres">Continuidade de negócios e recuperação de desastres</h2>
<p>Em termos de <strong>Disaster Recovery (DR)</strong> e <strong>Business Continuity (BC)</strong>, ter backups habilitados para VMs é essencial. Essa policy automatiza a garantia de que as VMs tenham backup, alinhando-se a <strong>RTO</strong> (Recovery Time Objective) e <strong>RPO</strong> (Recovery Point Objective) definidos pela empresa.</p>

<ul>
<li><strong>RPO (Recovery Point Objective):</strong> Quantidade aceitável de perda de dados em termos de tempo. Com backups regulares, você mantém um RPO baixo, pois nenhum servidor fica fora do ciclo de backup.</li>
<li><strong>RTO (Recovery Time Objective):</strong> Tempo necessário para restaurar um sistema após falha. Com backups ativos, a restauração é mais rápida, reduzindo downtime.</li>
<li><strong>Recuperação Granular vs. Completa:</strong> O Azure Backup para VMs gera pontos de recuperação armazenados em cofres <em>Recovery Services</em>. É possível restaurar a VM inteira ou apenas arquivos específicos.</li>
<li><strong>Cross-Region Restore:</strong> O Azure Backup suporta restauração cruzada entre regiões (quando habilitado com GRS), garantindo recuperação mesmo se uma região inteira estiver indisponível.</li>
</ul>

<strong>Backups regulares e testados</strong> são parte de qualquer plano de continuidade de negócios. A policy "Backup should be enabled for VMs" garante a existência de backup, mas cabe à empresa testar as restaurações e validar RPO/RTO.

<h2 id="aplicacao-pratica-e-remediacao-habilitando-os-backups">Aplicação prática e remediação (habilitando os backups)</h2>
<p>Identificar VMs sem backup é só o primeiro passo. O próximo é <strong>habilitar o Azure Backup</strong>:</p>

<h3 id="1-habilitando-policy-via-portal-manual">1. Habilitando Policy via Portal (manual):</h3>
<ul>
<li>Acesse a VM no portal Azure e clique em <em>Policy</em>.</li>
<li>Vá até Definitions, Procure <em>Azure Backup should be enabled for Virtual Machines</em>.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/AzureBackupshouldbeenabledforVirtualMachines/1.png" alt="Policy Definition" />

<ul>
<li>Clique em <em>Assign policy</em>.</li>
<li>Selecione <em>Escopo</em> e a Subscription.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/AzureBackupshouldbeenabledforVirtualMachines/2.png" alt="Assign Policy" />

<ul>
<li>Review + Create.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/AzureBackupshouldbeenabledforVirtualMachines/3.png" alt="Review Create" />

<p>Ai só esperar e ir verificar:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/AzureBackupshouldbeenabledforVirtualMachines/4.png" alt="Verify" />

<h3 id="2-habilitando-backup-via-portal-manual">2. Habilitando backup via Portal (manual):</h3>
<ul>
<li>Acesse a VM no portal Azure e clique em <em>Backup</em>.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/AzureBackupshouldbeenabledforVirtualMachines/5.png" alt="Enable Backup" />

<ul>
<li>Escolha (ou crie) um <em>Recovery Services Vault</em>.</li>
<li>Configure a frequência e retenção (política de backup).</li>
<li>Clique em <em>Enable Backup</em>.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/AzureBackupshouldbeenabledforVirtualMachines/6.png" alt="Configure Backup" />

<p>Agora o vault vai ser criado, porém a policy ainda não estará em compliance, será necessário executar o job do backup:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/AzureBackupshouldbeenabledforVirtualMachines/7.png" alt="Vault Created" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/AzureBackupshouldbeenabledforVirtualMachines/8.png" alt="Job Status" />

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/AzureBackupshouldbeenabledforVirtualMachines/9.png" alt="Job Complete" />

<p>Agora ficando compliance:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/AzureBackupshouldbeenabledforVirtualMachines/11.png" alt="Compliance" />

<h3 id="3-habilitando-backup-via-azure-policy-automatizado">3. Habilitando backup via Azure Policy (automatizado):</h3>
<p>Use políticas do tipo <strong>DeployIfNotExists</strong> para configurar automaticamente o backup em VMs não protegidas. Exemplos:</p>
<ul>
<li><em>Configure backup on VMs of a location to an existing central vault</em></li>
<li><em>Configure backup on VMs with a given tag to a new Recovery Services vault</em></li>
</ul>

<p>Ao atribuir essas políticas, o Azure habilita o backup conforme o cofre definido.</p>

<h3 id="4-terraform">4. Terraform:</h3>

<p>No exemplo usando Terraform, dividimos a configuração em duas etapas. Primeiro, criamos a máquina virtual sem backup habilitado (para mostrar que a Azure Policy com efeito AuditIfNotExists não bloqueia a criação, apenas audita a conformidade). Em seguida, adicionamos os recursos de backup (Recovery Services Vault e a associação da VM a esse vault).</p>

<h4>Etapa 1: Criando VM sem backup habilitado</h4>

<p>Nesta etapa, definimos os recursos básicos: grupo de recursos, rede virtual, interface de rede e a máquina virtual em si, sem configurar backup. A Azure Policy de tipo AuditIfNotExists irá permitir a criação da VM, mas marcará esse recurso como não conforme por não ter backup habilitado. E vamos para os passos com terraform</p>

<p>OBS: lembre-se de estar autenticado com azure:</p>

<div data-lang="bash"><pre><code>az login</code></pre></div>

<p>Vamos criar o seguinte arquivo: "main.tf"</p>

<div data-lang="hcl"><pre><code>terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~&gt; 3.0"
    }
  }
  required_version = "&gt;= 1.1.0"
}

provider "azurerm" {
  features {}
}

# Definição do Resource Group
resource "azurerm_resource_group" "rg" {
  name     = "rg-exemplo-backup"
  location = "eastus"
}

# Rede virtual com uma sub-rede
resource "azurerm_virtual_network" "vnet" {
  name                = "vnet-exemplo"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
}

resource "azurerm_subnet" "subnet" {
  name                 = "subnet-exemplo"
  resource_group_name  = azurerm_resource_group.rg.name
  virtual_network_name = azurerm_virtual_network.vnet.name
  address_prefixes     = ["10.0.1.0/24"]
}

# Interface de rede para a VM
resource "azurerm_network_interface" "nic" {
  name                = "nic-exemplo"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name

  ip_configuration {
    name                          = "nic-ipcfg"
    subnet_id                     = azurerm_subnet.subnet.id
    private_ip_address_allocation = "Dynamic"
  }
}

# Máquina Virtual (Linux) sem backup habilitado
resource "azurerm_linux_virtual_machine" "vm" {
  name                = "vm-exemplo"
  resource_group_name = azurerm_resource_group.rg.name
  location            = azurerm_resource_group.rg.location
  size                = "Standard_B1s"
  
  admin_username      = "azureuser"
  admin_password      = "P@ssw0rd12345!"
  
  disable_password_authentication = false

  network_interface_ids = [
    azurerm_network_interface.nic.id
  ]

  os_disk {
    name                = "osdisk-exemplo"
    caching             = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

  source_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "18.04-LTS"
    version   = "latest"
  }
}</code></pre></div>

<p>Executar os seguintes comandos:</p>

<div data-lang="bash"><pre><code>terraform init</code></pre></div>

<div data-lang="bash"><pre><code>terraform validate</code></pre></div>

<div data-lang="bash"><pre><code>terraform plan</code></pre></div>

<div data-lang="bash"><pre><code>terraform apply --auto-approve</code></pre></div>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/AzureBackupshouldbeenabledforVirtualMachines/10.png" alt="Terraform Apply" />

<p>Podemos ver que ela ficou 'Non-compliant':</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/AzureBackupshouldbeenabledforVirtualMachines/12.png" alt="Non Compliant" />

<h4>Etapa 2: Habilitando backup na VM (Recovery Services Vault + Protected Item)</h4>

<p>Agora, adicionamos os recursos de backup via IaC. Vamos criar um Recovery Services Vault (cofre de backup) e então habilitar o backup da VM criando um Backup Protected Item. Esse item associa a VM ao vault, aplicando uma política de backup definida.</p>

<div data-lang="hcl"><pre><code># Recovery Services Vault para armazenar os backups
resource "azurerm_recovery_services_vault" "vault" {
  name                = "vault-backups-exemplo"
  resource_group_name = azurerm_resource_group.rg.name
  location            = azurerm_resource_group.rg.location
  sku                 = "Standard"
}

# Política de backup para VMs (diária às 23:00, retenção de 7 dias)
resource "azurerm_backup_policy_vm" "policy" {
  name                = "policy-diaria"
  resource_group_name = azurerm_resource_group.rg.name
  recovery_vault_name = azurerm_recovery_services_vault.vault.name

  backup {
    frequency = "Daily"
    time      = "23:00"
  }

  retention_daily {
    count = 7
  }
}

# Habilitando o backup na VM
resource "azurerm_backup_protected_vm" "backup_associacao" {
  resource_group_name = azurerm_resource_group.rg.name
  recovery_vault_name = azurerm_recovery_services_vault.vault.name
  source_vm_id        = azurerm_linux_virtual_machine.vm.id
  backup_policy_id    = azurerm_backup_policy_vm.policy.id
}</code></pre></div>

<p>No trecho acima, azurerm_backup_protected_vm cria a associação de backup. Ao aplicar essas configurações, a VM passa a ter backup ativado no cofre especificado, atendendo à exigência da Azure Policy.</p>

<p>Primeiro executamos:</p>

<div data-lang="bash"><pre><code>terraform plan</code></pre></div>

<p>Para validar se nada vai quebrar ou destruir a VM:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/AzureBackupshouldbeenabledforVirtualMachines/13.png" alt="Terraform Plan" />

<p>Depois executamos:</p>

<div data-lang="bash"><pre><code>terraform apply --auto-approve</code></pre></div>

<p>AGORA podemos ter certeza que não irá destruir nossa vm beta tester:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/AzureBackupshouldbeenabledforVirtualMachines/14.png" alt="Terraform Apply Success" />

<strong>Por que estamos fazendo isso?</strong>

<p>Imagine ter um ambiente com 10 vms, talvez seja simples. Mas em um caso onde temos mais de mil VMs? E se modificarmos o nosso "módulo" das VMs sem antes testar. Por isso é importante existir um versionamento de módulo, geração de TAGs!</p>

<p>Porém ela ainda vai ficar com status de 'Non-compliant', precisamos executar o job de backup:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/AzureBackupshouldbeenabledforVirtualMachines/15.png" alt="Execute Backup Job" />

<p>Podemos forçar o assessment da policy, para isso podemos usar o comando:</p>

<div data-lang="bash"><pre><code>az policy state trigger-scan --subscription &lt;subscription-id&gt;</code></pre></div>

<p>E assim depois podemos analisar que ela ficou em compliance:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/AzureBackupshouldbeenabledforVirtualMachines/17.png" alt="Compliance Achieved" />

<h3 id="5-bicep">5. Bicep 💪🏻</h3>

<p>A seguir, temos o mesmo cenário implementado em Bicep. Assim como no exemplo Terraform, primeiro definimos a VM sem backup e depois incluímos o Recovery Services Vault e a configuração de backup da VM. A sintaxe do Bicep permite aninhar recursos do Azure de forma declarativa.</p>

<h4>Etapa 1: Criando VM sem backup habilitado</h4>

<p>Nesta etapa inicial do Bicep, criamos a infraestrutura básica sem nenhum backup configurado para a VM. Novamente, a policy AuditIfNotExists apenas auditará a VM (não impedirá a criação).</p>

<div data-lang="bicep"><pre><code>@description('Local da implantação')
param location string = resourceGroup().location

@description('Nome de usuário administrador para a VM')
param adminUsername string = 'azureuser'

@description('Senha de administrador')
@secure()
param adminPassword string

// Rede virtual e sub-rede
resource vnet 'Microsoft.Network/virtualNetworks@2021-02-01' = {
  name: 'vnet-exemplo'
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [
        '10.0.0.0/16'
      ]
    }
    subnets: [
      {
        name: 'subnet-exemplo'
        properties: {
          addressPrefix: '10.0.1.0/24'
        }
      }
    ]
  }
}

resource nic 'Microsoft.Network/networkInterfaces@2021-02-01' = {
  name: 'nic-exemplo'
  location: location
  properties: {
    ipConfigurations: [
      {
        name: 'nic-ipcfg'
        properties: {
          subnet: {
            id: vnet.properties.subnets[0].id
          }
          privateIPAllocationMethod: 'Dynamic'
        }
      }
    ]
  }
}

resource virtualMachine 'Microsoft.Compute/virtualMachines@2022-03-01' = {
  name: 'vm-exemplo'
  location: location
  properties: {
    hardwareProfile: {
      vmSize: 'Standard_B1s'
    }
    osProfile: {
      computerName: 'vm-exemplo'
      adminUsername: adminUsername
      adminPassword: adminPassword
      linuxConfiguration: {
        disablePasswordAuthentication: false
      }
    }
    storageProfile: {
      osDisk: {
        createOption: 'FromImage'
        name: 'osdisk-exemplo'
        caching: 'ReadWrite'
        managedDisk: {
          storageAccountType: 'Standard_LRS'
        }
      }
      imageReference: {
        publisher: 'Canonical'
        offer: 'UbuntuServer'
        sku: '18.04-LTS'
        version: 'latest'
      }
    }
    networkProfile: {
      networkInterfaces: [
        {
          id: nic.id
        }
      ]
    }
  }
}</code></pre></div>

<p>Para fazer o deploy, primeiro criamos o RG pelo portal, e depois:</p>

<div data-lang="powershell"><pre><code>New-AzResourceGroupDeployment -Name main -TemplateFile main.bicep</code></pre></div>

<p>Precisamos passar o nome do ResourceGroup e adminPassword:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/AzureBackupshouldbeenabledforVirtualMachines/16.png" alt="Bicep Deploy" />

<p>E podemos atualizar a página de 'Compliance':</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/AzureBackupshouldbeenabledforVirtualMachines/18.png" alt="Bicep Non Compliant" />

<h4>Etapa 2: Habilitando backup na VM (Recovery Services Vault + Protected Item)</h4>

<div data-lang="bicep"><pre><code>// Recovery Services Vault para armazenar os backups
resource vault 'Microsoft.RecoveryServices/vaults@2024-10-01' = {
  name: 'vault-backups-exemplo'
  location: location
  sku: {
    name: 'Standard'
  }
  properties: {
    publicNetworkAccess: 'Enabled'
  }
}

// Política de backup para VMs
resource backupPolicy 'Microsoft.RecoveryServices/vaults/backupPolicies@2024-10-01' = {
  name: 'policy-diaria'
  parent: vault
  properties: {
    backupManagementType: 'AzureIaasVM'
    schedulePolicy: {
      schedulePolicyType: 'SimpleSchedulePolicy'
      scheduleRunFrequency: 'Daily'
      scheduleRunTimes: [
        '2023-01-01T23:00:00Z'
      ]
    }
    retentionPolicy: {
      retentionPolicyType: 'LongTermRetentionPolicy'
      dailySchedule: {
        retentionTimes: [
          '2023-01-01T23:00:00Z'
        ]
        retentionDuration: {
          count: 7
          durationType: 'Days'
        }
      }
    }
  }
}

// Associação da VM ao backup
var containerName = 'iaasvmcontainer;iaasvmcontainerv2;${resourceGroup().name};${virtualMachine.name}'
var protectedItemName = 'vm;iaasvmcontainerv2;${resourceGroup().name};${virtualMachine.name}'

resource vmBackup 'Microsoft.RecoveryServices/vaults/backupFabrics/protectionContainers/protectedItems@2024-10-01' = {
  name: '${vault.name}/Azure/${containerName}/${protectedItemName}'
  properties: {
    protectedItemType: 'Microsoft.Compute/virtualMachines'
    policyId: backupPolicy.id
    sourceResourceId: virtualMachine.id
  }
}</code></pre></div>

<p>Agora vamos executar o backup da VM manualmente para podermos ver a Policy em conformidade:</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/AzureBackupshouldbeenabledforVirtualMachines/19.png" alt="Manual Backup" />

<h3 id="6-excecoes-e-cenarios-especiais">6. Exceções e cenários especiais:</h3>
<p>Se VMs não precisam de backup (por design ou custo), use filtros ou <em>Not Scopes</em>. Porém, cada VM fora do backup é um ponto de falha em potencial; avalie bem as exceções.</p>

<p>Conforme as VMs passam a ter backup, a <strong>postura de compliance</strong> melhora. Você pode monitorar no <em>Azure Policy</em> ou no <em>Azure Security/Defender for Cloud</em> a métrica de conformidade subindo.</p>

<h2 id="conclusao">Conclusão</h2>
<p>A Azure Policy <strong>"Azure Backup should be enabled for Virtual Machines"</strong> age como o famoso "dedo duro", evitando que VMs fiquem desprotegidas. Ela permite que times de engenharia de nuvem e DevOps <strong>implementem de forma consistente a prática de backup</strong>, reduzindo riscos de perda de dados, interrupções prolongadas e exposição a ataques.</p>

<p>Para a empresa, ter essa política ativa <strong>facilita auditorias e compliance</strong>, evidenciando controles de continuidade alinhados a frameworks reconhecidos (Azure Security Benchmark, ISO 27001 etc.). Em auditorias ou certificações, backups ativos em todas as VMs indicam maturidade em <strong>governança de nuvem</strong>.</p>

<p>Lembre-se: <strong>backup não substitui outras camadas de segurança</strong> (replicação, failover, etc.), mas é a base de <strong>uma estratégia sólida de recuperação de desastres</strong>. Habilitar o Azure Backup em VMs (e usar Azure Policy para garantir isso) é uma decisão de <strong>baixo esforço</strong> e <strong>alto impacto</strong> para aumentar a resiliência.</p>

<h3 id="fontes-e-referencias">Fontes e Referências</h3>
<ul>
<li><a href="https://learn.microsoft.com/azure/backup/" target="_blank" rel="noopener noreferrer">Azure Backup</a></li>
<li><a href="https://learn.microsoft.com/azure/governance/policy/" target="_blank" rel="noopener noreferrer">Azure Policy</a></li>
<li><a href="https://www.iso.org/isoiec-27001-information-security.html" target="_blank" rel="noopener noreferrer">ISO 27001</a></li>
<li><a href="https://jusbrasil.com.br/artigos/731613780/lei-geral-de-protecao-de-dados" target="_blank" rel="noopener noreferrer">LGPD</a></li>
<li><a href="https://privacy-regulation.eu/" target="_blank" rel="noopener noreferrer">GDPR</a></li>
<li><a href="https://www.cmmcab.org/" target="_blank" rel="noopener noreferrer">CMMC</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>Construindo uma Fundação Sólida para a Nuvem com FinOps: Maximizando os Custos em Ambientes Cloud Native</title>
      <link>https://www.orafaelferreira.com/artigos/finops-foundation-cloud</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/finops-foundation-cloud</guid>
      <pubDate>Mon, 15 Jan 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>O que é FinOps, seus princípios, personas e primeiros passos de adoção, além de como integrar DevOps e Kubecost para governar custos em ambientes Cloud Native.</description>
      <category>Artigos</category>
      <category>GreenOps</category>
      <category>Azure</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-15-finops-foundation-cloud05.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<h2 id="o-que-e-finops">O que é FinOps?</h2>

<p>FinOps é uma estrutura operacional e prática cultural que maximiza o valor comercial da nuvem. Ela envolve a colaboração entre equipes de engenharia, finanças e negócios permitindo a tomada de decisões baseadas em dados afim de criar responsabilidade financeira. FinOps é a união de “Finanças” e “DevOps”, enfatizando a comunicação e colaboração entre as equipes.</p>

<p>Conselho Consultivo Técnico da Fundação FinOps define FinOps como uma mudança cultural, onde a responsabilidade pelo uso da nuvem é compartilhada por todos, apoiada por um grupo central de práticas recomendadas. Essa abordagem multifuncional permite uma entrega mais rápida de produtos com maior controle financeiro e previsibilidade.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-15-finops-foundation-cloud05.png" alt="Diagrama da definição de FinOps pela FinOps Foundation" />

<h3 id="estrutura-finops">Estrutura FinOps</h3>

<p>A estrutura FinOps é sobre trazer responsabilidade para gastos na nuvem. Independentemente de ser chamada de “Gestão Financeira em Nuvem”, “Engenharia Financeira em Nuvem”, ou outros nomes, a essência do FinOps é a responsabilidade financeira no modelo de gastos variáveis da nuvem. Isso envolve equipes distribuídas de engenharia e negócios trazendo compromissos e equilibrando entre velocidade, custo e qualidade nas decisões de arquitetura de nuvem e investimento.</p>

<p>Não trata-se apenas sobre economizar dinheiro, mas sobre como obter o máximo de valor da nuvem para impulsionar um crescimento de forma eficiente. Isso inclui a capacitação de equipes de engenharia para fornecer melhores recursos e aplicações mais rapidamente, e facilita uma conversa multifuncional sobre onde e quando investir.</p>

<h3 id="modelo-de-maturidade-finops">Modelo de Maturidade FinOps</h3>

<p>FinOps é uma prática iterativa, com a maturidade melhorando com a repetição. Uma organização no estágio inicial ("Crawl") é mais reativa, enquanto no estágio "Run", considera proativamente os custos nas escolhas de design de arquitetura e processos de engenharia.</p>

<h3 id="principais-partes-interessadas-do-gerenciamento-financeiro-em-nuvem">Principais Partes Interessadas do Gerenciamento Financeiro em Nuvem</h3>

<p>FinOps envolve várias partes interessadas, incluindo Executivos, Engenheiros, Praticantes de FinOps, Operações, Finanças e Aquisições, cada um desempenhando um papel diferente na prática de FinOps.</p>

<h2 id="principios-do-finops">Princípios do FinOps</h2>

<p>Os Princípios do FinOps atuam como uma bússola orientadora para as atividades da prática de FinOps. Desenvolvidos pelos membros da FinOps Foundation e aprimorados através da experiência, esses princípios cobrem múltiplas nuvens e podem evoluir ao longo do tempo com a aquisição de novas experiências.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-15-finops-foundation-cloud06.png" alt="Os seis princípios do FinOps" />

<p>Existem seis princípios norteadores na prática de FinOps, que guiam as atividades e decisões dentro dessa abordagem. Esses princípios devem ser considerados como um todo e praticados integralmente:</p>

<h3 id="1-colaboracao-entre-equipes">1. 🤝 Colaboração entre Equipes</h3>

<ul>
<li>Equipes de finanças, tecnologia, produto e negócios trabalham juntas em tempo quase real.</li>
<li>Colaboração contínua para eficiência e inovação.</li>
</ul>

<h3 id="2-decisoes-baseadas-no-valor-do-negocio">2. 📊 Decisões Baseadas no Valor do Negócio</h3>

<ul>
<li>Métricas baseadas em valor econômico unitário e valor demonstram melhor o impacto nos negócios do que o gasto agregado.</li>
<li>Decisões conscientes entre custo, qualidade e velocidade.</li>
<li>Visão da nuvem como um motor de inovação.</li>
</ul>

<h3 id="3-responsabilidade-compartilhada-pelo-uso-da-nuvem">3. 🔗 Responsabilidade Compartilhada pelo uso da Nuvem</h3>

<ul>
<li>Responsabilidade pelo uso e custo é descentralizada, com os engenheiros assumindo a propriedade dos custos desde o design da arquitetura até as operações contínuas.</li>
<li>Equipes de produto e funcionalidades gerenciam seu próprio uso da nuvem em relação ao seu orçamento.</li>
<li>Decisões descentralizadas sobre arquitetura econômica, uso de recursos e otimização.</li>
</ul>

<h3 id="4-relatorios-acessiveis-e-oportunos">4. 📈 Relatórios Acessíveis e Oportunos</h3>

<ul>
<li>Dados de FinOps devem ser processados e compartilhados assim que disponíveis.</li>
<li>Visibilidade em tempo real promove melhor utilização da nuvem.</li>
<li>Ciclos rápidos de feedback resultam em comportamento mais eficiente.</li>
</ul>

<h3 id="5-equipe-centralizada-no-finops">5. 🌐 Equipe Centralizada no FinOps</h3>

<ul>
<li>A equipe central incentiva, evangeliza e possibilita melhores práticas em um modelo de responsabilidade compartilhada.</li>
<li>Compra executiva do FinOps e suas práticas e processos é necessária.</li>
<li>Otimização de taxas, compromissos e descontos é centralizada para aproveitar as economias de escala.</li>
</ul>

<h3 id="6aproveitamento-do-modelo-de-custo-variavel">6.💡Aproveitamento do Modelo de Custo Variável</h3>

<ul>
<li>O modelo de custo variável da nuvem deve ser visto como uma oportunidade para entregar mais valor, não como um risco.</li>
<li>Preferência por planejamento iterativo ágil em vez de planos estáticos de longo prazo.</li>
<li>Design de sistema proativo com ajustes contínuos em otimização da nuvem.</li>
</ul>

<h2 id="adotando-finops-comecando">Adotando FinOps – Começando</h2>

<p>A adoção do FinOps em uma organização começa com a construção de uma apresentação informativa para outras equipes, colegas de trabalho e partes interessadas sobre os benefícios de construir uma prática de FinOps. É essencial obter suporte executivo amplo e compromisso para dedicar tempo e recursos necessários para a mudança cultural.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-15-finops-foundation-cloud01.png" alt="Etapas iniciais para adoção do FinOps na organização" />

<h3 id="os-direcionadores-do-finops-os-primeiros-passos">Os Direcionadores do FinOps: Os Primeiros Passos</h3>

<p>Um papel chave para a adoção do FinOps é o "Direcionador". Abaixo estão algumas etapas e marcos importantes:</p>

<h4>Etapa 1 – Planejando FinOps em uma Organização</h4>

<p>1. <strong>Faça sua pesquisa:</strong> Identifique as partes interessadas chaves dentro da organização. Isso inclui procurar um Patrocinador Executivo e apoiadores para construir a iniciativa.</p>

<p>2. <strong>Crie um plano:</strong> Desenvolva um plano de futuro estado e identifique requisitos de ferramentas e um "lar" organizacional para a função FinOps.</p>

<p>3. <strong>Apresente o roteiro:</strong> Obtenha feedback do patrocinador executivo e ajuste conforme necessário, incluindo tamanho inicial da equipe, orçamento e cronograma.</p>

<p>4. <strong>Efetuar a mobilização inicial de recursos:</strong> Recrute outros líderes executivos como patrocinadores e obtenha aprovação de orçamento e contratação.</p>

<h4>Etapa 2 – Socializando FinOps para Adoção na Organização</h4>

<ul>
<li><strong>Promova os valores centrais da mudança.</strong></li>
<li><strong>Crie conversas sobre FinOps com equipes impactadas.</strong></li>
<li><strong>Defina um modelo inicial de FinOps.</strong></li>
</ul>

<h4>Etapa 3 – Preparando a Organização para FinOps</h4>

<ul>
<li><strong>Avalie a prontidão para o FinOps.</strong></li>
<li><strong>Envolver as partes interessadas.</strong></li>
</ul>

<h3 id="personas">Personas</h3>

<p>Ao propor a adoção de uma função FinOps dentro de uma organização, é necessário informar uma variedade de personas entre a equipe executiva.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-15-finops-foundation-cloud02.png" alt="Personas envolvidas na prática de FinOps" />

<h3 id="responsabilidade-e-expectativas-por-equipe-modelagem-raci-daci">Responsabilidade e Expectativas por Equipe (Modelagem RACI / DACI)</h3>

<p>Definir expectativas e gerenciar a responsabilidade entre várias equipes e funções é fundamental para construir uma prática e cultura FinOps duradouras. Usando uma combinação de modelos RACI e DACI, podemos começar a mapear os princípios centrais do FinOps para as equipes e indicar melhor seu nível de envolvimento.</p>

<h3 id="apresentacao-adotando-finops-na-sua-organizacao">Apresentação Adotando FinOps na sua organização</h3>

<p>Para ajudar a colocar todos os pontos apresentados foi criado uma <a href="https://docs.google.com/presentation/d/17shQqIbmXMbjhAW26nD7qJeM9kqsbaDkTS9WzMk1okg/edit#slide=id.ged5e228ee8_0_0" target="_blank" rel="noopener noreferrer">Apresentação</a> aberto que qualquer praticante de FinOps pode usar como ponto de partida.</p>

<h2 id="the-azure-finops-guide">The Azure FinOps Guide</h2>

<p>Este guia centraliza informações e ferramentas de FinOps no Azure, permitindo uma melhor compreensão e otimização dos custos na nuvem. Os principais objetivos deste guia são:</p>

<p>1. <strong>Identificar oportunidades de economia de custos:</strong> Fornecendo insights detalhados sobre como os recursos podem ser otimizados para reduzir despesas desnecessárias.</p>
<p>2. <strong>Otimizar a eficiência da nuvem:</strong> Melhorando a utilização de recursos para maximizar o retorno sobre o investimento (ROI) em infraestrutura de nuvem.</p>
<p>3. <strong>Ganhar uma melhor compreensão e controle dos custos na nuvem:</strong> Ajudando as equipes a monitorar, relatar e controlar os gastos de forma eficaz, alinhando as decisões financeiras com os objetivos de negócios.</p>

<p>O guia é especialmente útil para organizações que utilizam serviços de nuvem do Azure e buscam otimizar seus custos, incluindo tomadores de decisão financeira, engenheiros de nuvem, profissionais de TI e fornecedores independentes de software (ISVs). Ele também incentiva a colaboração entre equipes de engenharia, finanças e negócios, promovendo uma prática cultural onde todos assumem responsabilidade pelo uso e custo da nuvem.</p>

<p>Para mais detalhes e acesso ao conteúdo completo, você pode visitar o <a href="https://techcommunity.microsoft.com/t5/fasttrack-for-azure/the-azure-finops-guide/ba-p/3704132" target="_blank" rel="noopener noreferrer">The Azure FinOps Guide</a>.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/azure-finops-guide.png" alt="https://techcommunity.microsoft.com/t5/fasttrack-for-azure/the-azure-finops-guide/ba-p/3704132" />

<h2 id="visao-geral">Visão Geral</h2>

<p>A adoção de tecnologias Cloud Native está se tornando cada vez mais essencial para as empresas que buscam inovação e agilidade. No entanto, para garantir uma transição bem-sucedida, é crucial estabelecer uma base sólida que não apenas suporte a eficiência técnica, mas que também promova a sustentabilidade. Vamos explorar o papel vital da FinOps e práticas sustentáveis na construção de uma infraestrutura robusta e responsável em ambientes Cloud Native.</p>

<h2 id="a-importancia-da-cultura-organizacional-e-tecnica">A Importância da Cultura Organizacional e Técnica</h2>

<p>A transformação digital transcende a mera adoção de novas tecnologias; ela exige uma mudança substancial na cultura organizacional. A forma como uma empresa abraça a cultura Cloud Native tem um impacto profundo na eficiência operacional e na sustentabilidade. Uma cultura organizacional bem desenvolvida é a base para uma adoção bem-sucedida e sustentável das tecnologias Cloud Native.</p>

<h2 id="a-revolucao-do-devops-e-a-eficiencia-do-finops">A Revolução do DevOps e a Eficiência do FinOps</h2>

<p>A integração de DevOps com FinOps abre um novo horizonte para as empresas, combinando eficiência técnica com sustentabilidade financeira. Esta sinergia permite que as organizações otimizem seus recursos, reduzam custos e, ao mesmo tempo, mantenham um alto padrão de inovação e eficiência operacional.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-15-finops-foundation-cloud04.png" alt="Integração entre DevOps e FinOps" />

<h2 id="governanca-de-custo-com-kubecost">Governança de Custo com <a href="https://www.kubecost.com/" target="_blank" rel="noopener noreferrer">Kubecost</a></h2>

<p>A governança de custos é crucial para gerenciar as finanças em ambientes de Kubernetes, como o Azure Kubernetes Service (AKS). O Kubecost é uma ferramenta poderosa que ajuda as organizações a entender, gerenciar e otimizar os custos de seus clusters Kubernetes. Suas principais funcionalidades incluem:</p>

<ul>
<li><strong>Alocação de Custos Detalhada:</strong> Permite atribuir custos a níveis como implantação, serviço, rótulo, pod ou namespace, facilitando uma visão precisa e detalhada das despesas.</li>
<li><strong>Monitoramento e Otimização:</strong> Fornece ferramentas para monitorar o uso de recursos e sugerir melhorias na infraestrutura para reduzir custos e aumentar a eficiência.</li>
<li><strong>Controle Proativo de Custos:</strong> Implementa políticas para garantir que o uso de recursos esteja alinhado com os objetivos financeiros da organização, prevenindo desperdícios e otimizando o orçamento.</li>
</ul>

<p>Para saber mais:</p>

<ul>
<li><a href="https://learn.microsoft.com/pt-br/azure/cloud-adoption-framework/scenarios/app-platform/aks/cost-governance-with-kubecost" target="_blank" rel="noopener noreferrer">Kubecost no Microsoft Learn</a></li>
<li><a href="https://www.finops.org/members/kubecost/" target="_blank" rel="noopener noreferrer">Kubecost na FinOps Foundation</a></li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/Kubecost.png" alt="https://www.kubecost.com/" />

<h2 id="maximizando-a-transparencia-com-observabilidade">Maximizando a Transparência com Observabilidade</h2>

<p>A observabilidade desempenha um papel crucial na maximização da eficiência operacional. Ao fornecer insights detalhados sobre o desempenho e as necessidades de um ambiente Cloud Native, as organizações podem identificar áreas para melhoria, otimizando tanto o desempenho quanto a sustentabilidade.</p>

<h2 id="beneficios-para-o-ecosistema-open-source">Benefícios para o Ecosistema Open Source</h2>

<p>A adoção de práticas robustas em Cloud Native beneficia imensamente a comunidade Open Source. Uma base sólida facilita a implementação de soluções Open Source de maneira eficiente e segura, enriquecendo o ecossistema com contribuições valiosas e promovendo uma cultura de inovação aberta e colaborativa.</p>

<h3 id="e-falando-de-open-source-temos-o-opencost">E falando de Open Source, temos o OpenCost</h3>

<p>E se você preferir uma ferramenta open source? O OpenCost é uma solução de código aberto para monitoramento e alocação de custos em tempo real em ambientes Kubernetes. Desenvolvido e suportado por uma comunidade de especialistas em Kubernetes, incluindo grandes players como AWS, Google Cloud, e Microsoft, o OpenCost oferece uma visão transparente dos gastos em Kubernetes.</p>

<p>Principais funcionalidades do OpenCost incluem:</p>

<ul>
<li><strong>Alocação de Custos em Tempo Real:</strong> Detalhamento de custos até o nível de contêiner, baseado em conceitos do Kubernetes.</li>
<li><strong>Precificação Dinâmica de Ativos:</strong> Integrações com APIs de faturamento de AWS, Azure, GCP, e suporte para clusters on-premises com preços personalizados.</li>
<li><strong>Monitoramento de Recursos em Cluster:</strong> Inclui CPU, GPU, memória, balanceadores de carga e volumes persistentes.</li>
<li><strong>Monitoramento de Custos Fora do Cluster:</strong> Rastreia custos de serviços gerenciados como armazenamento e bancos de dados.</li>
<li><strong>Integração com Ferramentas de Código Aberto:</strong> Exportação de dados para Prometheus e outras ferramentas open source.</li>
</ul>

<p>Para mais informações, acesse <a href="https://www.opencost.io/" target="_blank" rel="noopener noreferrer">OpenCost</a>.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/open-cost.png" alt="https://www.opencost.io/" />

<h2 id="conclusao-e-chamado-a-acao">Conclusão e Chamado à Ação</h2>

<p>Ao adotar tecnologias Cloud Native, práticas de FinOps e estratégias sustentáveis, as empresas se tornam líderes na promoção de um futuro Cloud Native sustentável. É um chamado à ação para todos os profissionais e líderes de TI: engajem-se, inovem e liderem o caminho para um futuro mais sustentável e eficiente.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-15-finops-foundation-cloud07.png" alt="Ciclo de maturidade da prática de FinOps" />

<h3 id="ferramenta-de-revisao-de-avaliacao">Ferramenta de revisão de avaliação</h3>

<p>Use as diretrizes de FinOps para avaliar as lacunas de recursos da sua organização. Obtenha recomendações para maximizar o valor dos negócios na nuvem usando boas práticas de FinOps.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-15-finops-foundation-cloud03.png" alt="Ferramenta de avaliação FinOps do Microsoft Learn" />

<p>Inicie sua avaliação com a <a href="https://learn.microsoft.com/pt-br/assessments/ad1c0f6b-396b-44a4-924b-7a4c778a13d3/" target="_blank" rel="noopener noreferrer">Revisão do FinOps</a>.</p>

<p>Para mais informações sobre <a href="https://www.finops.org/" target="_blank" rel="noopener noreferrer">O que é FinOps?</a> segue documentação que foi base desse artigo.</p>


]]></content:encoded>
    </item>
    <item>
      <title>Construindo uma Fundação Sólida para a Nuvem: A importancia da Cultura DevOps e sua Sinergia com Cloud Native na Fundação Cloud</title>
      <link>https://www.orafaelferreira.com/artigos/devops-foundation-cloud</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/devops-foundation-cloud</guid>
      <pubDate>Mon, 08 Jan 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Como a cultura DevOps e sua sinergia com Kubernetes e Cloud Native formam a base de uma fundação cloud sólida: práticas, prós, contras e avaliação.</description>
      <category>Artigos</category>
      <category>CI/CD</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-08-devops-foundation-cloud01.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<p>Em um mundo impulsionado pela tecnologia, a fundação cloud <em>robusta</em> se torna um pilar essencial. Este artigo explora a cultura DevOps e sua integração com Kubernetes, destacando como essas práticas revolucionam a entrega de software e fortalecem as práticas Cloud Native. Vamos mergulhar no universo de DevOps e Kubernetes para entender como eles moldam uma fundação cloud que suporta inovação contínua, promovendo operações sustentáveis e eficientes.</p>

<h2 id="o-que-e-devops">O Que é DevOps?</h2>
<p>DevOps representa a fusão entre desenvolvimento (Dev) e operações (Ops), unindo pessoas, processos e tecnologia para aprimorar o planejamento, desenvolvimento, entrega de produtos e operações de aplicativos. A cultura DevOps aumenta a confiança nos aplicativos criados, responde melhor às necessidades dos clientes e atinge as metas de negócios mais rapidamente. Permite a entrega contínua de valor aos clientes, criando produtos melhores e mais confiáveis.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-08-devops-foundation-cloud01.png" alt="Ilustração da fusão entre desenvolvimento e operações no DevOps" />

<h2 id="inovacao-atraves-da-cultura-devops">Inovação Através da Cultura DevOps</h2>
<p>A cultura DevOps é mais do que práticas e ferramentas, é um ecossistema que promove a colaboração, o aprendizado contínuo e a melhoria constante. Esta cultura quebra barreiras entre desenvolvimento e operações, acelerando o ciclo de vida do software e elevando a qualidade. Entre os benefícios, destacam-se a melhoria contínua, ciclos de lançamento mais rápidos, resposta ágil a mudanças e colaboração efetiva. Por outro lado, desafios como implementação, habilidades abrangentes, riscos de segurança e custos iniciais são reais e exigem atenção.</p>

<h2 id="devops-e-o-ciclo-de-vida-do-aplicativo">DevOps e o Ciclo de Vida do Aplicativo</h2>
<p>DevOps influencia todas as fases do ciclo de vida do aplicativo, desde o planejamento até as operações. Esta abordagem integrada garante que todas as funções participem em cada fase, promovendo uma entrega mais eficiente e de qualidade.</p>

<h2 id="a-sinergia-com-cloud-native">A Sinergia com Cloud Native</h2>
<p>Kubernetes não é apenas uma ferramenta de orquestração de contêineres, mas um complemento poderoso para o DevOps. Ele amplia os princípios do DevOps, fornecendo automação, escalabilidade e gestão desafiadora de infraestrutura, essenciais para práticas eficazes de Cloud Native.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-08-devops-foundation-cloud04.png" alt="Sinergia entre cultura DevOps e Kubernetes no Cloud Native" />

<h2 id="construindo-uma-fundacao-cloud-com-devops-e-cloud-native">Construindo uma Fundação Cloud com DevOps e Cloud Native</h2>
<p>Uma fundação cloud eficaz transcende a tecnologia, baseando-se em cultura e práticas que promovem crescimento e adaptação. A integração de DevOps e Kubernetes é essencial, fornecendo o framework necessário para uma transição eficiente para a nuvem e operação otimizada.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-08-devops-foundation-cloud05.png" alt="Fundação cloud construída sobre DevOps e Cloud Native" />

<h2 id="implementando-praticas-de-devops-no-ciclo-de-vida-do-aplicativo">Implementando Práticas de DevOps no Ciclo de Vida do Aplicativo</h2>
<p>A implementação do DevOps envolve práticas como CI/CD, controle de versão, desenvolvimento ágil, infraestrutura como código (IaC), gerenciamento de configuração e monitoramento contínuo. Essas práticas transformam a maneira como o software é planejado, desenvolvido, entregue e operado.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-08-devops-foundation-cloud02.png" alt="Práticas de DevOps ao longo do ciclo de vida do aplicativo" />

<h2 id="adotando-uma-cultura-de-devops">Adotando uma Cultura de DevOps</h2>
<p>Adotar uma cultura de DevOps requer mudanças profundas na forma como as equipes trabalham e colaboram. Esta cultura é marcada por colaboração, visibilidade, ciclos de lançamento mais curtos e aprendizagem contínua, fatores essenciais para equipes de alto desempenho.</p>

<p>O acrônimo CALMS é um framework que representa um conjunto de práticas e valores fundamentais para a adoção e sucesso do DevOps. Ele foi desenvolvido para fornecer uma estrutura abrangente que ajuda as organizações a avaliar e aprimorar suas iniciativas DevOps. Cada letra do acrônimo CALMS representa um aspecto-chave:</p>

<ul>
<li><strong>Cultura (Culture):</strong></li>
</ul>
<p>Refere-se à mudança de mentalidade dentro da organização, enfatizando a colaboração, a comunicação e a integração entre as equipes de desenvolvimento, operações e outras funções. A cultura DevOps prioriza a aprendizagem contínua, a responsabilidade compartilhada e a inovação.</p>

<ul>
<li><strong>Automação (Automation):</strong></li>
</ul>
<p>Foca na automação dos processos de desenvolvimento, testes, implantação e infraestrutura. Isso inclui a prática de integração e entrega contínuas (CI/CD), infraestrutura como código (IaC), e automação de testes, reduzindo o esforço manual e aumentando a eficiência.</p>

<ul>
<li><strong>Lean (Lean):</strong></li>
</ul>
<p>Adota princípios e práticas Lean para otimizar e agilizar processos, reduzir desperdícios e melhorar continuamente. O Lean incentiva a entrega incremental de valor, a eliminação de atividades desnecessárias e a maximização do fluxo de trabalho.</p>

<ul>
<li><strong>Medição (Measurement):</strong></li>
</ul>
<p>Enfatiza a importância de medir e monitorar o desempenho, a qualidade e a eficácia de processos, produtos e serviços. Métricas e feedbacks contínuos são fundamentais para entender o impacto das mudanças e para tomar decisões baseadas em dados.</p>

<ul>
<li><strong>Compartilhamento (Sharing):</strong></li>
</ul>
<p>Encoraja o compartilhamento de conhecimento, experiências e melhores práticas dentro e entre equipes. Isso pode incluir a colaboração em código, documentação, soluções de problemas e inovações, fortalecendo a cultura organizacional e promovendo a aprendizagem coletiva.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-08-devops-foundation-cloud07.png" alt="Colaboração e compartilhamento de conhecimento na cultura DevOps" />

<h3 id="pros-da-cultura-devops">Prós da Cultura DevOps:</h3>
<ul>
<li><strong>Melhoria Contínua</strong>: Ao adotar DevOps, as organizações incentivam o crescimento constante, resultando em produtos de alta qualidade e maior satisfação do cliente.</li>
<li><strong>Ciclos de Lançamento Mais Rápidos</strong>: Com a integração e entrega contínuas, novas funcionalidades e correções são lançadas com mais rapidez, mantendo a competitividade no mercado.</li>
<li><strong>Resposta Ágil a Mudanças</strong>: A capacidade de responder rapidamente às necessidades dos clientes e às mudanças do mercado é amplamente melhorada.</li>
<li><strong>Colaboração e Comunicação</strong>: DevOps quebra os silos tradicionais, promovendo uma colaboração efetiva que é fundamental para o sucesso em ambientes complexos.</li>
</ul>

<h3 id="contras-da-cultura-devops">Contras da Cultura DevOps:</h3>
<ul>
<li><strong>Desafios de Implementação</strong>: A mudança para uma cultura DevOps pode enfrentar resistência e exige uma mudança de mentalidade em toda a organização.</li>
<li><strong>Necessidade de Habilidades Abrangentes</strong>: Os profissionais podem precisar expandir suas habilidades para se adaptarem a um ambiente DevOps, o que requer investimento em treinamento.</li>
<li><strong>Riscos de Segurança</strong>: A frequência elevada de lançamentos pode introduzir vulnerabilidades se as práticas de segurança não estiverem integradas ao pipeline de desenvolvimento.</li>
<li><strong>Custos Iniciais</strong>: A adoção de DevOps pode ser cara a curto prazo, com investimentos necessários em ferramentas e reestruturação de equipes.</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-08-devops-foundation-cloud03.png" alt="Prós e contras da adoção da cultura DevOps" />

<h3 id="ferramenta-de-revisao-de-avaliacao">Ferramenta de revisão de avaliação</h3>

<p>Entenda as funcionalidades atuais em todo o ciclo de vida da versão do software e identifique rapidamente as oportunidades de aprimoramento com base nas práticas de DevOps da Microsoft.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-08-devops-foundation-cloud06.png" alt="Ferramenta de avaliação de capacidade de DevOps da Microsoft" />

<p>Inicie sua avaliação com a <a href="https://learn.microsoft.com/pt-br/assessments/56ec577c-acb6-4c7b-ad13-e224b0846153/" target="_blank" rel="noopener noreferrer">Avaliação de capacidade de DevOps</a>.</p>

<h2 id="conclusao">Conclusão</h2>
<p>A cultura DevOps e o Kubernetes são essenciais para qualquer organização que busca uma forte presença na nuvem. Este artigo discute não apenas o 'como', mas também o 'porquê' essas práticas são indispensáveis e como impactam positivamente a sustentabilidade e o sucesso a longo prazo na nuvem. Encorajamos a reflexão sobre como essas práticas podem ser aplicadas em sua jornada para a nuvem.</p>

<p>Para mais informações sobre <a href="https://learn.microsoft.com/pt-br/devops/what-is-devops" target="_blank" rel="noopener noreferrer">O que é DevOps?</a> em uma perspectiva da Microsoft, segue documentação que foi base desse artigo.</p>

]]></content:encoded>
    </item>
    <item>
      <title>Construindo uma Fundação Sólida para a Adoção da Nuvem: Integrando Landing Zones com Azure Cloud Foundation</title>
      <link>https://www.orafaelferreira.com/artigos/foundation-lz</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/foundation-lz</guid>
      <pubDate>Tue, 02 Jan 2024 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Como Landing Zones e o Azure Cloud Foundation estruturam a adoção da nuvem: áreas de design, princípios-chave, aceleradores e implementações de referência.</description>
      <category>Artigos</category>
      <category>Governança</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-02-foundation-lz04.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<p>No mundo acelerado da tecnologia, a adoção da nuvem evoluiu de uma tendência para uma necessidade estratégica. Enquanto empresas buscam agilidade e inovação, emerge a complexidade de construir uma infraestrutura de nuvem robusta e escalável. Aqui, exploramos a integração das Landing Zones com a Foundation de Cloud, descobrindo como essas estratégias moldam o sucesso na nuvem.</p>

<h2 id="a-essencia-das-landing-zones">A Essência das Landing Zones</h2>

<p>Imagine entrar em um território desconhecido sem um mapa ou um guia, é assim que se sente entrar em um ambiente de nuvem sem as Landing Zones. Landing Zones no Azure são como bases estratégicas, configuradas para acolher e gerenciar seus recursos de nuvem com eficiência. Elas são o ponto inicial onde a segurança, a conformidade e a governança se encontram, garantindo que cada componente da sua infraestrutura esteja alinhado com os melhores padrões e práticas.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-02-foundation-lz04.png" alt="Arquitetura conceitual de Landing Zones no Azure" />

<h2 id="landing-zones-o-inicio-de-uma-jornada-estruturada">Landing Zones: O Início de Uma Jornada Estruturada</h2>

<p>As Landing Zones são mais do que simples espaços de trabalho, elas definem o contexto para o seu ambiente de nuvem. Uma Landing Zone bem projetada no Azure significa:</p>

<ul>
<li><strong>Estrutura:</strong> Implementação de uma arquitetura modular e escalável.</li>
<li><strong>Segurança e Conformidade:</strong> Configurações de segurança desde o início, adaptando-se a padrões específicos da indústria.</li>
<li><strong>Governança:</strong> Estruturas de governança integradas para um controle eficiente.</li>
</ul>

<h2 id="entendo-mais-o-azure-cloud-foundation">Entendo mais o Azure Cloud Foundation</h2>
<p>Enquanto as Landing Zones são o ponto de partida, a Foundation Cloud no Azure é o alicerce sobre o qual seu ambiente digital é construído. É uma abordagem metodológica que engloba:</p>

<ul>
<li><strong>Estratégia e Planejamento:</strong> Definindo metas claras para sua jornada na nuvem.</li>
<li><strong>Operacionalização:</strong> Implementação de práticas para garantir operações eficientes e contínuas.</li>
<li><strong>Gerenciamento Otimizado:</strong> Foco na eficiência operacional e na otimização de custos.</li>
</ul>

<h2 id="integrando-landing-zones-com-azure-cloud-foundation">Integrando Landing Zones com Azure Cloud Foundation</h2>
<p>Quando Landing Zones e Azure Cloud Foundation trabalham em harmonia, elas criam uma sinergia poderosa. Esta combinação permite:</p>
<ul>
<li><strong>Agilidade e Escalabilidade:</strong> Adaptando-se rapidamente às mudanças e crescendo com as demandas do negócio.</li>
<li><strong>Inovação Sustentável:</strong> Fornecendo uma plataforma para inovação contínua.</li>
<li><strong>Resiliência e Confiabilidade:</strong> Construindo uma infraestrutura confiável e resiliente.</li>
</ul>

<h2 id="areas-de-design-de-ambiente">Áreas de Design de Ambiente</h2>
<p>Seja qual for a opção de implantação, você deve considerar cuidadosamente cada área de design. Suas decisões afetam a base da plataforma da qual cada zona de destino depende. As áreas de design são indicadas com as letras "A" até "I" para ilustrar a hierarquia da organização de recursos na arquitetura conceitual.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-02-foundation-lz02.png" alt="Áreas de design de ambiente da Azure Landing Zone" />

<ul>
<li><strong>A - Cobrança do Azure e tenants do Active Directory:</strong> Criação de tenants, registro e configuração de cobrança como etapas iniciais importantes.</li>
<li><strong>B - Gerenciamento de identidade e acesso:</strong> Fundamento para qualquer arquitetura segura e totalmente em conformidade na nuvem pública.</li>
<li><strong>E - Topologia de rede e conectividade:</strong> Aspectos fundamentais de qualquer arquitetura de nuvem.</li>
<li><strong>C - Organização do recurso:</strong> Considerações de design de assinatura e hierarquia de grupo de gerenciamento para governança, gerenciamento de operações e adoção.</li>
<li><strong>F - Segurança:</strong> Implementação de controles e processos para proteger ambientes de nuvem.</li>
<li><strong>D, G, H - Gerenciamento:</strong> Linha de base de gerenciamento para operações estáveis e contínuas.</li>
<li><strong>C, D - Governança:</strong> Automatização da auditoria e imposição de políticas de governança.</li>
<li><strong>I - Automação de plataforma e DevOps:</strong> Alinhamento das melhores ferramentas e modelos para implantação de zonas de aterrissagem e recursos de suporte.</li>
</ul>

<h2 id="processo-da-area-de-design">Processo da Área de Design</h2>
<p>Avalie cada área de design para compreender as alterações que talvez você precise fazer nas opções de implementação da zona de destino do Azure. A avaliação em sequencia das áreas de design simplifica o design de ambientes complexos, ajudando na tomada de decisões críticas sobre o seu ambiente.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-02-foundation-lz03.png" alt="Processo de avaliação das áreas de design da Landing Zone" />

<h2 id="cinco-principios-chave-para-construir-uma-landing-zone">Cinco Princípios-Chave para Construir uma Landing Zone</h2>

<h3 id="1-redes">1. Redes</h3>
<ul>
<li><strong>Objetivo:</strong> Manter conectividade e flexibilidade.</li>
<li><strong>Soluções Destacadas:</strong></li>
<li>Azure ExpressRoute</li>
<li>Qualidade de Serviço em Conectividade</li>
<li>Firewalls e DMZ em Roteamento</li>
<li>Mapeamento de Endereços IP</li>
</ul>

<h3 id="2-identidade">2. Identidade</h3>
<ul>
<li><strong>Objetivo:</strong> Assegurar acesso seguro através de gerenciamento de identidade robusto.</li>
<li><strong>Soluções Destacadas:</strong></li>
<li>Microsoft Entra ID</li>
<li>Autenticação Single Sign-on</li>
<li>Regras de Autenticação</li>
<li>Controle de Acesso Baseado em Funções (RBAC)</li>
</ul>

<h3 id="3-governanca">3. Governança</h3>
<ul>
<li><strong>Objetivo:</strong> Implementar governança eficaz com políticas de conformidade.</li>
<li><strong>Soluções Destacadas:</strong></li>
<li>Azure Policy</li>
<li>Políticas Aplicáveis</li>
<li>Ambientes em Conformidade</li>
<li>Gerenciamento de Assinaturas</li>
</ul>

<h3 id="4-seguranca">4. Segurança</h3>
<ul>
<li><strong>Objetivo:</strong> Proteger dados com controles de segurança avançados.</li>
<li><strong>Soluções Destacadas:</strong></li>
<li>Azure Sentinel</li>
<li>Detecção de Ameaças</li>
<li>Proteção integrada</li>
<li>Proteção de Dados</li>
</ul>

<h3 id="5-gerenciamento">5. Gerenciamento</h3>
<ul>
<li><strong>Objetivo:</strong> Monitorar desempenho e garantir resiliência do ambiente.</li>
<li><strong>Soluções Destacadas:</strong></li>
<li>Azure Monitor</li>
<li>Monitoramento Contínuo</li>
<li>Automação</li>
<li>Resiliência</li>
</ul>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-02-foundation-lz06.png" alt="Princípios de gerenciamento da Azure Landing Zone" />     

<h2 id="acelerador-de-landing-zones">Acelerador de Landing Zones</h2>

<p>O <a href="https://aka.ms/caf/ready/accelerator" target="_blank" rel="noopener noreferrer">Acelerador de Landing Zones</a> da Plataforma é uma ferramenta pronta para uso, conhecida como Acelerador do Portal da Landing Zones do Azure. Essa ferramenta implanta uma arquitetura conceitual e aplica configurações padrão a componentes chave, incluindo grupos de gerenciamento e políticas. Ela é ideal para organizações cuja arquitetura conceitual se alinha com o modelo operacional planejado e a estrutura de recursos.</p>

<p>Caso você opte gerenciar o ambiente através do portal do Azure, o Acelerador do Portal da Landing Zones do Azure é a escolha certa. Para aqueles que preferem trabalhar com Bicep ou Terraform, existem opções específicas de implantação disponíveis para estas ferramentas.</p>

<h2 id="implementacao-de-referencia">Implementação de Referência</h2>

<p>Se sua empresa está buscando uma implementação inicial de zonas de destino que incorporem governança, segurança e um plano de controle de operações totalmente integrados desde o começo, existem várias abordagens para configurar seu ambiente Azure. Essas abordagens incluem o uso do portal do Azure ou a implementação via infraestrutura como código, oferecendo a possibilidade de transição entre esses métodos conforme sua organização evolui.</p>

<p>A tabela abaixo apresenta exemplos de implementações de referência alinhadas à arquitetura de escala empresarial recomendada.</p>

<ul>
<li><strong>Base de Escala Empresarial:</strong> A fundação sugerida para adoção de escala empresarial. <a href="https://github.com/Azure/Enterprise-Scale/blob/main/docs/reference/wingtip/README.md" target="_blank" rel="noopener noreferrer">Exemplo no GitHub</a> | <a href="https://portal.azure.com/#blade/Microsoft_Azure_CreateUIDef/CustomDeploymentBlade/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FEnterprise-Scale%2Fmain%2FeslzArm%2FeslzArm.json/uiFormDefinitionUri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FEnterprise-Scale%2Fmain%2FeslzArm%2Feslz-portal.json" target="_blank" rel="noopener noreferrer">Implantar no Azure</a></li>
<li><strong>Hub e Spoke de Escala Empresarial:</strong> Adiciona um módulo de rede hub e spoke à base de escala empresarial. <a href="https://github.com/Azure/Enterprise-Scale/blob/main/docs/reference/adventureworks/README.md" target="_blank" rel="noopener noreferrer">Exemplo no GitHub</a> | <a href="https://portal.azure.com/#blade/Microsoft_Azure_CreateUIDef/CustomDeploymentBlade/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FEnterprise-Scale%2Fmain%2FeslzArm%2FeslzArm.json/uiFormDefinitionUri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FEnterprise-Scale%2Fmain%2FeslzArm%2Feslz-portal.json" target="_blank" rel="noopener noreferrer">Implantar no Azure</a></li>
<li><strong>WAN Virtual de Escala Empresarial:</strong> Incorpora um módulo de rede da WAN Virtual à base de escala empresarial. <a href="https://github.com/Azure/Enterprise-Scale/blob/main/docs/reference/contoso/Readme.md" target="_blank" rel="noopener noreferrer">Exemplo no GitHub</a> | <a href="https://portal.azure.com/#blade/Microsoft_Azure_CreateUIDef/CustomDeploymentBlade/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FEnterprise-Scale%2Fmain%2FeslzArm%2FeslzArm.json/uiFormDefinitionUri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FEnterprise-Scale%2Fmain%2FeslzArm%2Feslz-portal.json" target="_blank" rel="noopener noreferrer">Implantar no Azure</a></li>
<li><strong>Escala Empresarial para Pequenas Empresas:</strong> Oferece uma arquitetura de rede hub e spoke para pequenas organizações. <a href="https://github.com/Azure/Enterprise-Scale/blob/main/docs/reference/treyresearch/README.md" target="_blank" rel="noopener noreferrer">Exemplo no GitHub</a> | <a href="https://portal.azure.com/#blade/Microsoft_Azure_CreateUIDef/CustomDeploymentBlade/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FEnterprise-Scale%2Fmain%2Fdocs%2Freference%2Ftreyresearch%2FarmTemplates%2Fes-lite.json/uiFormDefinitionUri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FEnterprise-Scale%2Fmain%2Fdocs%2Freference%2Ftreyresearch%2FarmTemplates%2Fes-portal.json" target="_blank" rel="noopener noreferrer">Implantar no Azure</a></li>
<li><strong>Escala Empresarial para o Azure Government:</strong> Implementação de referência para o Azure Government, incluindo todas as opções em uma experiência unificada no portal. <a href="https://aka.ms/enterprisescale" target="_blank" rel="noopener noreferrer">Exemplo no GitHub</a> | <a href="https://portal.azure.us/#blade/Microsoft_Azure_CreateUIDef/CustomDeploymentBlade/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FEnterprise-Scale%2Fmain%2FeslzArm%2FeslzArm.json/uiFormDefinitionUri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FEnterprise-Scale%2Fmain%2FeslzArm%2Feslz-portal.json" target="_blank" rel="noopener noreferrer">Implantar no Azure Government</a></li>
</ul>

<p>Cada implementação de referência provisiona recursos de plataforma no ambiente de destino escolhido. Detalhes adicionais sobre cada implementação e uma visão geral dos recursos implantados estão disponíveis através dos links do GitHub mencionados na tabela.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-02-foundation-lz05.png" alt="Implementações de referência da Azure Landing Zone" />


<h3 id="ferramenta-de-revisao-de-avaliacao">Ferramenta de revisão de avaliação</h3>

<p>Examine a preparação da plataforma do Azure para que a adoção possa começar, avalie seu plano para criar uma zona de destino para hospedar cargas de trabalho que você planeja criar ou migrar para a nuvem. Esta avaliação foi desenvolvida para clientes com dois ou mais anos de experiência. Se você for novo no Azure, esta avaliação ajudará a identificar áreas de investimento para sua estratégia de adoção.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2024-01-02-foundation-lz01.png" alt="Ferramenta de revisão de avaliação da Landing Zone no Microsoft Learn" />

<p>Inicie sua avaliação com a <a href="https://learn.microsoft.com/pt-br/assessments/56ec577c-acb6-4c7b-ad13-e224b0846153/" target="_blank" rel="noopener noreferrer">Revisão da Landing Zone</a></p>

<p>Gostou do assunto? Quer saber mais com reviews e novidades técnicas sobre Landing Zones direto da fonte? Aqui vai um canal do Youtube da própria Microsoft: <a href="https://www.youtube.com/@MicrosoftCAE" target="_blank" rel="noopener noreferrer">Customer Architecture & Engineering</a></p>

<p>Tudo isso nos leva a entender que cada pilar e cada assunto abordado tem um potencial enorme para ser explorado em profundidade. Podemos destrinchar cada tema, trazendo mais informações e insights relevantes para o dia a dia. Vamos nos aprofundar nesses assuntos, explorando os detalhes que são essenciais no contexto da adoção da nuvem e da implementação de infraestruturas robustas. Nos próximos artigos, abordaremos cada um desses temas com maior detalhamento, oferecendo uma visão clara e prática de como eles se aplicam no mundo real.</p>

<p>Para mais informações sobre <a href="https://learn.microsoft.com/pt-br/azure/cloud-adoption-framework/ready/landing-zone/" target="_blank" rel="noopener noreferrer">O que é uma Landing Zone do Azure?</a> segue documentação que foi base desse artigo.</p>

]]></content:encoded>
    </item>
    <item>
      <title>Construindo uma Fundação Sólida para a Nuvem: Pilares do Well-Architected Framework e o Azure Cloud Adoption Framework</title>
      <link>https://www.orafaelferreira.com/artigos/well-architect-foundation-cloud</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/well-architect-foundation-cloud</guid>
      <pubDate>Mon, 11 Dec 2023 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Os pilares do Well-Architected Framework e sua integração com o Azure Cloud Adoption Framework para construir uma infraestrutura de nuvem robusta e planejada.</description>
      <category>Artigos</category>
      <category>Segurança</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2023-12-12-well-architect-foundation-cloud4.jpeg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[
<p>Com o avanço da tecnologia e a crescente adoção de soluções em nuvem, tornou-se essencial para as organizações construírem uma infraestrutura de TI robusta e bem planejada. O <a href="https://learn.microsoft.com/pt-br/azure/well-architected/" target="_blank" rel="noopener noreferrer">Well-Architected Framework</a> e o <a href="https://learn.microsoft.com/pt-br/azure/cloud-adoption-framework/" target="_blank" rel="noopener noreferrer">Azure Cloud Adoption Framework</a> são dois conjuntos de práticas recomendadas que ajudam as empresas a alcançar esse objetivo. Neste artigo, vamos explorar os pilares do Well-Architected Framework e discutir a importância desses princípios em conjunto com o Azure Cloud Adoption Framework na construção de uma fundação sólida para a adoção da nuvem.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2023-12-12-well-architect-foundation-cloud4.jpeg" alt="Ilustração de uma fundação sólida para a nuvem" />

<h2 id="pilares-do-well-architected-framework">Pilares do Well-Architected Framework</h2>

<p>O Well-Architected Framework é uma abordagem criada pela Amazon Web Services (AWS) que orienta a construção de sistemas seguros, de alto desempenho, resilientes e eficientes. Este framework é composto por cinco pilares fundamentais seguidos por Princípios de design:</p>
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2023-12-12-well-architect-foundation-cloud2.png" alt="Os pilares do Well-Architected Framework" />


<ul>
<li>### Excelência Operacional</li>
</ul>
<p>Como garantir operações eficientes e contínuas em sua infraestrutura na nuvem? Este pilar foca na capacidade de executar e monitorar sistemas para entregar valor comercial e melhorar continuamente processos e procedimentos. A automação de tarefas operacionais e o gerenciamento de incidentes são aspectos cruciais deste pilar.</p>

<ul>
<li>### Segurança</li>
</ul>
<p>Quais são as melhores práticas para proteger seus dados e recursos na nuvem? A segurança é a prioridade máxima, envolvendo a proteção de informações e sistemas. Aspectos como controle de acesso, criptografia de dados e conformidade com regulamentações são fundamentais para manter a integridade dos sistemas em nuvem.</p>

<ul>
<li>### Confiabilidade</li>
</ul>
<p>Como garantir que seus sistemas funcionem de maneira confiável e eficaz? A confiabilidade é sobre garantir que um sistema possa se recuperar de falhas e continuar operando. Isso inclui o design de sistemas tolerantes a falhas, com estratégias de backup e recuperação de desastres.</p>

<ul>
<li>### Eficiência de Performance</li>
</ul>
<p>O que fazer para otimizar o desempenho e usar eficientemente os recursos disponíveis? Este pilar enfatiza a seleção de recursos adequados para atender aos requisitos de desempenho, juntamente com a capacidade de se adaptar a mudanças na demanda e tecnologia sem excesso de provisionamento.</p>

<ul>
<li>### Otimização de Custos</li>
</ul>
<p>O objetivo aqui é evitar gastos desnecessários. Isso envolve compreender e controlar onde o dinheiro está sendo gasto, selecionar o modelo de preços mais econômico e analisar o consumo de recursos.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2023-12-12-well-architect-foundation-cloud3.jpeg" alt="Ilustração sobre otimização de custos na nuvem" />

<h2 id="importancia-dos-pilares-e-sua-integracao-com-o-azure-cloud-adoption-framework">Importância dos Pilares e sua Integração com o Azure Cloud Adoption Framework</h2>

<p>Os pilares do Well-Architected Framework são fundamentais para garantir que a fundação da infraestrutura de nuvem deve ser construída de maneira eficiente e eficaz. No entanto, para que a adoção da nuvem seja bem-sucedida, é necessário um planejamento estratégico abrangente, que é onde o Azure Cloud Adoption Framework (CAF) entra.</p>

<h3 id="ferramenta-de-revisao-de-avaliacao">Ferramenta de revisão de avaliação</h3>

<p>Avalie sua carga de trabalho usando os pilares principais para identificar e priorizar oportunidades para melhorar a postura de suas cargas de trabalho.</p>

<p>Inicie sua avaliação com a <a href="https://learn.microsoft.com/pt-br/assessments/azure-architecture-review/" target="_blank" rel="noopener noreferrer">Revisão de Well-Architected do Azure</a>.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2023-12-12-well-architect-foundation-cloud1.png" alt="Ferramenta de revisão Well-Architected do Azure" />

<h2 id="conclusao">Conclusão</h2>

<p>A adoção da nuvem é uma jornada complexa que requer uma estratégia bem pensada e uma arquitetura sólida. Os pilares do Well-Architected Framework, juntamente com as orientações do Azure Cloud Adoption Framework, fornecem um caminho estruturado para que as organizações possam construir e otimizar suas infraestruturas em nuvem. Ao se alinhar com essas práticas recomendadas, as empresas podem garantir que estão preparadas para os desafios de TI atuais e futuros, maximizando a eficiência, a segurança e a escalabilidade de suas soluções em nuvem.</p>

<p>Para mais informações sobre o Well-Architected Framework e o Azure Cloud Adoption Framework, visite a documentação oficial da Microsoft em <a href="https://learn.microsoft.com/pt-br/azure/well-architected/" target="_blank" rel="noopener noreferrer">Azure Well-Architected</a>.</p>

<p>Espero que este artigo ajude você a entender melhor a importância de seguir os pilares do Well-Architected Framework e como o Azure CAF pode apoiar a sua jornada para a nuvem.</p>

]]></content:encoded>
    </item>
    <item>
      <title>Construindo uma Fundação Sólida para a Adoção da Nuvem com o Azure Cloud Adoption Framework</title>
      <link>https://www.orafaelferreira.com/artigos/foundation-cloud</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/foundation-cloud</guid>
      <pubDate>Mon, 04 Dec 2023 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Como o Azure Cloud Adoption Framework ajuda a construir uma fundação sólida para adoção da nuvem, da estratégia e planejamento à migração e governança.</description>
      <category>Artigos</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2023-12-04-foundation-cloud1.jpeg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[<h2 id="introducao">Introdução</h2>
<p>A adoção da nuvem tornou-se crucial nas estratégias de transformação digital das organizações modernas. Com a promessa de escalabilidade, eficiência e inovação, a nuvem é uma força poderosa a ser considerada. No entanto, a migração para a nuvem sem uma estratégia coerente pode levar a desafios significativos. É aqui que o Azure Cloud Adoption Framework (CAF) aparece, fornecendo um roteiro estruturado para uma transição bem-sucedida ou (talvez) não?!</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2023-12-04-foundation-cloud1.jpeg" alt="Ilustração da adoção da nuvem com fundação sólida" />

<h2 id="por-que-uma-fundacao-solida-e-crucial">Por que uma Fundação Sólida é Crucial?</h2>
<p>Assim como a fundação de uma casa é crucial para a sua estabilidade e longevidade, uma fundação sólida é igualmente essencial para a adoção da nuvem. Sem uma base robusta, uma casa pode enfrentar rachaduras, infiltrações e até colapso sob condições adversas. Da mesma forma, sem uma estratégia bem definida e uma infraestrutura bem preparada, as iniciativas de nuvem podem se deparar com vulnerabilidades de segurança, sobrecarga de custos e um descompasso com as necessidades e objetivos do negócio. Uma abordagem estratégica e bem planejada é como um alicerce bem construído; ela suporta o peso dos seus projetos de TI e garante que sua transição para a nuvem seja tanto resiliente quanto capaz de se adaptar e crescer com as exigências futuras.  </p>

<h2 id="o-azure-cloud-adoption-framework">O Azure Cloud Adoption Framework</h2>
<p>O CAF do Azure é um guia abrangente que ajuda a garantir uma migração e operação bem-sucedidas na nuvem. Ele é dividido em seis etapas principais:</p>

<ul>
<li>🔑 <strong>Estratégia</strong>: Define o motivo e os objetivos da migração para a nuvem.</li>
<li>📈 <strong>Plano</strong>: Desenvolve um plano de ação detalhado alinhado com a estratégia.</li>
<li>🛡️ <strong>Pronto</strong>: Prepara o ambiente de nuvem para a adoção.</li>
<li>🚀 <strong>Adotar</strong>: Implementa e migra cargas de trabalho para a nuvem.</li>
<li>📋 <strong>Governar</strong>: Estabelece políticas e mecanismos de governança.</li>
<li>💼 <strong>Gerenciar</strong>: Gerencia e otimiza as operações de nuvem.</li>
<li>🔐 <strong>Segurança</strong>: Assegura que todas as etapas, estejam fundamentadas em práticas de segurança e conformidade regulatória.</li>
</ul>


<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2023-12-04-foundation-cloud4.png" alt="Diagrama das etapas do Azure Cloud Adoption Framework" />

<h2 id="estrategia-e-planejamento">Estratégia e Planejamento</h2>
<p>Uma estratégia de nuvem bem definida é o primeiro passo para uma adoção bem-sucedida. Por que quero ir para Cloud? O que irei ganhar com a Cloud? Definir os resultados desejados e o caso de negócios fornece uma base sólida para o planejamento subsequente.</p>

<h2 id="preparacao-e-conformidade">Preparação e Conformidade</h2>
<p>Antes de qualquer construção, um terreno deve ser preparado e nivelado, uma etapa que na arquitetura de nuvem é conhecida como a implementação de "landing zones". As "landing zones" são ambientes pré-configurados dentro da Azure que proporcionam uma estrutura modular e escalável para a implantação segura de recursos e serviços de nuvem. Elas são essenciais para a preparação do ambiente de nuvem, pois estabelecem as bases para a segurança, governança e conformidade desde o início. O Azure Cloud Adoption Framework fornece diretrizes detalhadas para configurar essas "landing zones" de acordo com as melhores práticas e padrões específicos da indústria. Ao seguir essas diretrizes, as organizações podem garantir que seu ambiente de nuvem esteja pronto para suportar os negócios de forma segura e eficiente. Em um artigo futuro, discutiremos a fundo as "landing zones", explorando como elas facilitam uma adoção de nuvem bem estruturada e ajudam a acelerar o valor entregue pela nuvem.</p>

<h2 id="migracao-e-inovacao">Migração e Inovação</h2>
<p>A migração para a nuvem oferece a oportunidade de reavaliar e otimizar as cargas de trabalho existentes, bem como inovar com novas soluções. O CAF fornece estratégias para ambos os cenários, ajudando a maximizar o valor da nuvem.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2023-12-04-foundation-cloud2.jpeg" alt="Migração e inovação de cargas de trabalho na nuvem" />

<h2 id="ferramentas-e-templates">Ferramentas e Templates</h2>
<p>O Cloud Adoption Framework oferece recursos como ferramentas, modelos e avaliações para facilitar e agilizar a implementação de mudanças técnicas e promover uma adoção da nuvem mais rápida. Estes recursos são úteis em diferentes etapas do processo de adoção.</p>

<a href="https://learn.microsoft.com/pt-br/azure/cloud-adoption-framework/resources/tools-templates" target="_blank" rel="noopener noreferrer">Link</a>

<h2 id="gerenciamento-otimizado-e-governanca-continua">Gerenciamento Otimizado e Governança Contínua</h2>
<p>Uma vez na nuvem, o gerenciamento contínuo e a governança são essenciais para manter a eficiência operacional e a conformidade. O CAF oferece práticas recomendadas para a gestão de recursos e a otimização de custos.</p>

<p>A adoção da nuvem é uma jornada transformadora que oferece oportunidades ilimitadas para inovação e crescimento. No entanto, a chave para desbloquear seu verdadeiro potencial reside na construção de uma fundação sólida que não apenas suporte suas cargas de trabalho atuais, mas também seja flexível o suficiente para se adaptar às necessidades futuras. </p>

<h3 id="ferramenta-de-revisao-de-avaliacao">Ferramenta de revisão de avaliação</h3>

<p>Avalie sua estratégia de adoção de nuvem e obtenha recomendações para criar ou avançar seu caso de negócios na nuvem.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2023-12-04-foundation-cloud05.png" alt="Ferramenta de avaliação da estratégia de adoção de nuvem" />

<p>Inicie sua avaliação com a <a href="https://learn.microsoft.com/pt-br/assessments/8fefc6d5-97ac-42b3-8e97-d82701e55bab/" target="_blank" rel="noopener noreferrer">Processo de estratégia de adoção de nuvem</a>.</p>

<h2 id="conclusao">Conclusão</h2>

<p>Tal como uma casa só perdura ao longo do tempo com uma fundação robusta e um planejamento cuidadoso, a adoção da nuvem requer uma base sólida para prosperar e se sustentar em um ambiente de TI em constante evolução. O Azure Cloud Adoption Framework é o alicerce sobre o qual você pode construir uma estratégia de nuvem resiliente, segura e alinhada aos objetivos da sua empresa. Desde a preparação do ambiente com "landing zones" até a implementação e gerenciamento contínuo, o CAF oferece um roteiro para navegar na complexidade da nuvem com confiança.</p>

<p>Fique atento para os próximos artigos, onde mergulharemos nas "landing zones" e exploraremos como elas desempenham um papel crucial na otimização da sua estratégia de nuvem. Se você está pronto para começar sua jornada na nuvem ou otimizar sua infraestrutura em nuvem existente, o Azure CAF pode ser o parceiro ideal para sua empresa. Vamos juntos construir uma arquitetura de nuvem que não é apenas funcional, mas também duradoura e escalável.</p>


]]></content:encoded>
    </item>
    <item>
      <title>Voluntariado no Projeto de Mentoria 3.0 do Canal da Cloud</title>
      <link>https://www.orafaelferreira.com/artigos/mentoriacloud23</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/mentoriacloud23</guid>
      <pubDate>Mon, 06 Nov 2023 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Minha experiência como mentor voluntário no Projeto de Mentoria de Carreira 3.0 do Canal da Cloud, entre agosto e dezembro de 2023, ajudando pessoas de TI.</description>
      <category>Posts</category>
      <category>DevOps</category>
      <category>Comunidade</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mentor.jpeg" length="0" type="image/jpeg" />
      <content:encoded><![CDATA[
<p>Estou empolgado para compartilhar minha experiência como voluntário no Projeto de Mentoria de Carreira do Canal da Cloud durante o período de Agosto de 2023 a Dezembro de 2023. Esta iniciativa, impulsionada pela paixão pela tecnologia, reúne a comunidade técnica de TI para apoiar indivíduos que desejam avançar em suas carreiras na indústria de tecnologia.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/mentor.jpeg" alt="Divulgação do Projeto de Mentoria 3.0 do Canal da Cloud" />

<p>O Projeto de Mentoria de Carreira do Canal da Cloud é uma iniciativa sem fins lucrativos que conta com a colaboração da comunidade técnica de TI para ajudar pessoas que desejam se desenvolver com tecnologia. Como voluntário neste projeto, eu me esforço para ajudar pessoas a traçar caminhos promissores na indústria de tecnologia. Através de orientação personalizada, compartilho conhecimentos, dicas e insights sobre tendências de mercado, ajudando os mentorados a desenvolver suas habilidades e alcançar seus objetivos profissionais.</p>

<p>Acredito que o acesso à educação e orientação é essencial para que todos possam prosperar no cenário tecnológico em constante evolução. Ao fazer parte deste projeto, tenho a oportunidade de dar um passo além e fazer a diferença na vida de indivíduos que buscam crescer e se destacar no mundo da tecnologia.</p>

<p>Se você estiver interessado em saber mais sobre este projeto ou gostaria de se envolver, sinta-se à vontade para entrar em contato. Juntos, podemos criar um futuro mais promissor na área de tecnologia!</p>

<ul>
<li><i></i> <strong>Saiba mais:</strong> <a href="https://www.linkedin.com/posts/rafaelmaferreira_devops-mentoria-canaldacloud-activity-7095080582841327616--vqv?utm_source=share&utm_medium=member_desktop" target="_blank" rel="noopener noreferrer">Post no LinkedIn sobre Mentoria</a></li>
</ul>

<h2 id="live-de-encerramento-da-mentoria-30">Live de Encerramento da Mentoria 3.0</h2>
<a href="https://www.youtube.com/watch?v=x9pifyHOkZI" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/x9pifyHOkZI/0.jpg" alt="Live de Encerramento da Mentoria 3.0" /></a>

<h2 id="devops-ep-11-monitoramento-e-observabilidade">DEVOPS - EP 11 - Monitoramento e Observabilidade</h2>
<a href="https://www.youtube.com/watch?v=-rYhXprMJO4&ab_channel=UnicastCloudLab" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/-rYhXprMJO4/0.jpg" alt="DEVOPS - EP 11 - Monitoramento e Observabilidade" /></a>

<h2 id="devops-ep-10-cicd-com-azure-devops-ou-github-actions">DEVOPS - EP 10 - CI/CD com Azure DevOps ou GitHub Actions</h2>
<a href="https://www.youtube.com/watch?v=hxiluSC8E_U&t=910s" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/hxiluSC8E_U/0.jpg" alt="DEVOPS - EP 10 - CI/CD com Azure DevOps ou GitHub Actions" /></a>

<h2 id="devops-ep-9-introducao-a-cicd-pipelines-jenkins">DEVOPS - EP 9 - Introdução a CI/CD (Pipelines, Jenkins)</h2>
<a href="https://www.youtube.com/watch?v=42-PW3dVF-Q&t=1s" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/42-PW3dVF-Q/0.jpg" alt="DEVOPS - EP 9 - Introdução a CI/CD (Pipelines, Jenkins)" /></a>

<h2 id="devops-ep-8-aprofundando-em-iac">DEVOPS - EP 8 - Aprofundando em IaC</h2>
<a href="https://www.youtube.com/watch?v=ObjlLPkrf1I&ab_channel=UnicastCloudLab" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/ObjlLPkrf1I/0.jpg" alt="DEVOPS - EP 8 - Aprofundando em IaC" /></a>

<h2 id="listao-dos-aprovados-mentoria-30">Listão dos Aprovados Mentoria 3.0</h2>
<a href="https://www.youtube.com/watch?v=aCDflhewrhI&t=568s" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/aCDflhewrhI/0.jpg" alt="Listão dos Aprovados Mentoria 3.0" /></a>
]]></content:encoded>
    </item>
    <item>
      <title>Lista dos eventos de Tecnologia Presenciais que eu já fui</title>
      <link>https://www.orafaelferreira.com/artigos/eventos</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/eventos</guid>
      <pubDate>Mon, 30 Oct 2023 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Lista dos eventos de tecnologia presenciais de que já participei: experiências de aprendizado, networking e atualização sobre as tendências do mercado.</description>
      <category>Registro Eventos Presenciais</category>
      <category>Carreira</category>
      <category>Comunidade</category>
      <content:encoded><![CDATA[
<p>Olá pessoal! Quero compartilhar com vocês algumas das incríveis experiências que tive participando de eventos de tecnologia presenciais. Esses eventos foram oportunidades únicas para aprender, fazer networking e me manter atualizado sobre as últimas tendências tecnológicas. Vamos lá!</p>

<h2 id="agenda-2026">Agenda 2026</h2>

<!-- AUTO-EVENTS:START:2026 --><div><table><thead><tr><th>Mês</th><th>Evento</th></tr></thead><tbody><tr><td>Set</td><td><a href="https://community2.cncf.io/events/details/cncf-kcd-brasil-presents-kcd-sao-paulo-2026/" target="_blank" rel="noopener noreferrer"><strong>KCD São Paulo 2026</strong></a></td></tr><tr><td>Set</td><td><a href="https://cloud.codeisland.com.br/" target="_blank" rel="noopener noreferrer"><strong>Code Island Cloud 2026</strong></a></td></tr><tr><td>Ago</td><td><a href="https://devopsdays.org/events/2026-curitiba/welcome/" target="_blank" rel="noopener noreferrer"><strong>DevOpsDays Curitiba 2026</strong></a></td></tr><tr><td>Ago</td><td><a href="https://www.mvpconf.com.br/regional/curitiba/agosto-2026" target="_blank" rel="noopener noreferrer"><strong>MVP Conf Regional Curitiba 2026</strong></a></td></tr><tr><td>Jul</td><td><a href="https://thedevconf.com/tdc/2026/florianopolis/trilha-software-security" target="_blank" rel="noopener noreferrer"><strong>TDC 2026 Florianópolis - Trilha Software Security</strong></a></td></tr><tr><td>Jun</td><td><a href="https://developer.microsoft.com/pt-br/reactor/events/27206/" target="_blank" rel="noopener noreferrer"><strong>Microsoft Build //localhost:florianópolis</strong></a></td></tr><tr><td>Mai</td><td><a href="https://ctrl-z.codeisland.com.br/" target="_blank" rel="noopener noreferrer"><strong>Ctrl-Z - Code Island</strong></a></td></tr><tr><td>Abr</td><td><a href="https://www.meetup.com/azureusergroupsbrasil/events/313851322/" target="_blank" rel="noopener noreferrer"><strong>Global Azure User Group Floripa 2026</strong></a></td></tr><tr><td>Abr</td><td><a href="https://sqlsaturday.com/2026-04-11-sqlsaturday1139/" target="_blank" rel="noopener noreferrer"><strong>SQL Saturday Joinville 2026</strong></a></td></tr><tr><td>Abr</td><td><a href="https://semservidor.com.br/sem-servidor-2026-edicao-floripa/" target="_blank" rel="noopener noreferrer"><strong>Sem Servidor Conf 2026 – Edição Floripa</strong></a></td></tr><tr><td>Fev</td><td><a href="https://eventos.codecon.dev/eventos/floripa-meetup-codecon-15" target="_blank" rel="noopener noreferrer"><strong>Floripa - Meetup Codecon - #15</strong></a></td></tr><tr><td>Jan</td><td><a href="https://www.meetup.com/pt-br/floripa-python-meetup/events/312978297/?eventOrigin=group_past_events" target="_blank" rel="noopener noreferrer"><strong>92 Python Florianópolis, SC</strong></a></td></tr></tbody></table></div><!-- AUTO-EVENTS:END:2026 -->

<!-- MANUAL-EVENTS:START:2026
<p>2026-09-26|KCD São Paulo 2026|https://community2.cncf.io/events/details/cncf-kcd-brasil-presents-kcd-sao-paulo-2026/</p>
<p>2026-09-13|Code Island Cloud 2026|https://cloud.codeisland.com.br/</p>
<p>MANUAL-EVENTS:END:2026 --></p>

<h2 id="2025">2025</h2>
<div><table><thead><tr><th>Mês</th><th>Evento</th></tr></thead><tbody><tr><td>Dez</td><td><a href="https://devopsdays.org/events/2025-florianopolis/welcome/" target="_blank" rel="noopener noreferrer"><strong>DevOpsDays Florianópolis</strong></a></td></tr><tr><td>Nov</td><td><a href="https://devopsdays.org/events/2025-porto-alegre/welcome/" target="_blank" rel="noopener noreferrer"><strong>DevOpsDays Porto Alegre</strong></a></td></tr><tr><td>Nov</td><td><a href="https://devopsdays.org/events/2025-sao-paulo/welcome/" target="_blank" rel="noopener noreferrer"><strong>DevOpsDays São Paulo</strong></a></td></tr><tr><td>Nov</td><td><a href="https://saads.framer.website/" target="_blank" rel="noopener noreferrer"><strong>1ª Semana Acadêmica de ADS - IFSC</strong></a></td></tr><tr><td>Out</td><td><a href="https://community.cncf.io/events/details/cncf-cloud-native-sao-paulo-city-presents-cloud-native-day-sao-paulo-2025-1/" target="_blank" rel="noopener noreferrer"><strong>Cloud Native Day - São Paulo 2025</strong></a></td></tr><tr><td>Out</td><td><a href="https://mvpconf.com.br/" target="_blank" rel="noopener noreferrer"><strong>MVP Conf - 2025 Brasil</strong></a></td></tr><tr><td>Out</td><td><a href="https://whitestonedev.com.br/#/eventos/8edicao" target="_blank" rel="noopener noreferrer"><strong>8ª Edição Cultura DevOps - White Stone Dev Pedra Branca</strong></a></td></tr><tr><td>Out</td><td><a href="https://www.hubingressos.com.br/evento/mvpconfcuritiba" target="_blank" rel="noopener noreferrer"><strong>Esquenta MVP CONF - Curitiba</strong></a></td></tr><tr><td>Set</td><td><a href="https://thedevconf.com/tdc/2025/sao-paulo/trilha-arquitetura-cloud" target="_blank" rel="noopener noreferrer"><strong>TDC São Paulo (Trilha ARQUITETURA CLOUD) 2025</strong></a></td></tr><tr><td>Set</td><td><a href="https://www.meetup.com/aws-user-group-floripa/events/310698392/?eventOrigin=group_events_list" target="_blank" rel="noopener noreferrer"><strong>Encontro das comunidades AWS User Group Floripa + DevOps Floripa 2025</strong></a></td></tr><tr><td>Set</td><td><a href="https://devopsdays.org/events/2025-curitiba/welcome/" target="_blank" rel="noopener noreferrer"><strong>devopsdays Curitiba 2025</strong></a></td></tr><tr><td>Ago</td><td><a href="https://www.sympla.com.br/evento/hnwd-florianopolis-2025/2960275?referrer=orafaelferreira.com" target="_blank" rel="noopener noreferrer"><strong>Hacking na Web Day Florianópolis 2025</strong></a></td></tr><tr><td>Jun</td><td><a href="https://community.cncf.io/events/details/cncf-cloud-native-santa-catarina-presents-8deg-meetup-cloud-native-santa-catarina/" target="_blank" rel="noopener noreferrer"><strong>8° Meetup Cloud Native Santa Catarina</strong></a></td></tr><tr><td>Jun</td><td><a href="https://www.meetup.com/gittogether-brasil/events/308158374/?slug=gittogether-brasil&eventId=308158374" target="_blank" rel="noopener noreferrer"><strong>Bio Hack em Floripa: ProgramEarth & GitHub</strong></a></td></tr><tr><td>Jun</td><td><a href="https://www.meetup.com/aws-user-group-floripa/events/308134123/?eventOrigin=group_upcoming_events" target="_blank" rel="noopener noreferrer"><strong>Encontro da comunidade AWS User Group Florianópolis - Edição de Junho</strong></a></td></tr><tr><td>Mai</td><td><a href="https://www.meetup.com/pt-BR/azure-floripa/events/306207034/" target="_blank" rel="noopener noreferrer"><strong>Global Azure 2025 – Edição Azure Floripa</strong></a></td></tr><tr><td>Abr</td><td><a href="https://www.sympla.com.br/evento/whitestone-dev-7-edicao-cripto-especial-fenix-a-retomada-da-comunidade-tech/2851067" target="_blank" rel="noopener noreferrer"><strong>WhiteStone_dev - 7ª Edição Cripto - Especial Fênix</strong></a></td></tr><tr><td>Abr</td><td><a href="https://www.hubingressos.com.br/evento/mvpconfb" target="_blank" rel="noopener noreferrer"><strong>Esquenta MVP Conf Blumenau</strong></a></td></tr><tr><td>Abr</td><td><a href="https://comunidado.com.br/" target="_blank" rel="noopener noreferrer"><strong>SQL Saturday 2025 by Comunidado</strong></a></td></tr></tbody></table></div>

<h2 id="2024">2024</h2>
<div><table><thead><tr><th>Mês</th><th>Evento</th></tr></thead><tbody><tr><td>Nov</td><td><a href="https://cloud.codeisland.com.br/" target="_blank" rel="noopener noreferrer"><strong>Code Island Cloud 2024</strong></a></td></tr><tr><td>Nov</td><td><a href="https://devopsdays.org/events/2024-florianopolis/welcome/" target="_blank" rel="noopener noreferrer"><strong>DevOpsDays Florianópolis</strong></a></td></tr><tr><td>Nov</td><td><a href="https://talkfloripa.com.br/" target="_blank" rel="noopener noreferrer"><strong>Tech Connection Floripa</strong></a></td></tr><tr><td>Out</td><td><a href="https://www.tftec.com.br/tftecaovivo-2024/" target="_blank" rel="noopener noreferrer"><strong>Tftec ao Vivo 2024</strong></a></td></tr><tr><td>Out</td><td><a href="https://community.cncf.io/events/details/cncf-cloud-native-sao-paulo-presents-27-cloud-native-sao-paulo-sustainability-day-na-aws/" target="_blank" rel="noopener noreferrer"><strong>Cloud Native SP #27 – Sustainability Day AWS</strong></a></td></tr><tr><td>Set</td><td><a href="https://codecon.dev/summit/programacao" target="_blank" rel="noopener noreferrer"><strong>Codecon Summit 2024</strong></a></td></tr><tr><td>Jun</td><td><a href="https://thedevconf.com/tdc/2024/florianopolis/trilha-devops-e-sre" target="_blank" rel="noopener noreferrer"><strong>TDC 2024 – Trilha DevOps & SRE</strong></a></td></tr><tr><td>Jun</td><td><a href="https://thedevconf.com/tdc/2024/florianopolis/trilha-cloud" target="_blank" rel="noopener noreferrer"><strong>TDC 2024 – Trilha Cloud</strong></a></td></tr><tr><td>Jun</td><td><a href="https://community.cncf.io/events/details/cncf-cloud-native-santa-catarina-presents-6o-kubertenes-birthday-bash-santa-catarina/" target="_blank" rel="noopener noreferrer"><strong>6º KuberTENes Birthday Bash SC</strong></a></td></tr><tr><td>Jun</td><td><a href="https://talkfloripa.com.br/grade" target="_blank" rel="noopener noreferrer"><strong>Tech Connection Balneário Camboriú</strong></a></td></tr><tr><td>Mai</td><td><a href="https://community.cncf.io/events/details/cncf-cloud-native-santa-catarina-presents-5o-cloud-native-santa-catarina-edicao-especial-floripa/" target="_blank" rel="noopener noreferrer"><strong>5º Cloud Native SC – Edição Floripa</strong></a></td></tr><tr><td>Mai</td><td><a href="https://www.sympla.com.br/evento/immersion-day-aws-e-ntt-data/2398471" target="_blank" rel="noopener noreferrer"><strong>Immersion Day AWS + NTT DATA</strong></a></td></tr><tr><td>Mar</td><td><a href="https://www.eventbrite.com/e/1o-meetup-2024-infosec-floripa-tickets-860860014477" target="_blank" rel="noopener noreferrer"><strong>1º Meetup 2024 – Infosec Floripa</strong></a></td></tr><tr><td>Mar</td><td><a href="https://eventos.codecon.dev/meetup-codecon-fln-02/" target="_blank" rel="noopener noreferrer"><strong>Meetup Codecon #02</strong></a></td></tr><tr><td>Fev</td><td><a href="https://community.cncf.io/events/details/cncf-kcd-brasil-presents-kcd-brasil-sao-paulo-2024/" target="_blank" rel="noopener noreferrer"><strong>KCD Brasil 2024</strong></a></td></tr><tr><td>Fev</td><td><a href="https://community.cncf.io/events/details/cncf-cloud-native-floripa-presents-2o-cloud-native-floripa-meetup/" target="_blank" rel="noopener noreferrer"><strong>2º Cloud Native Floripa Meetup</strong></a></td></tr><tr><td>Fev</td><td><a href="https://eventos.codecon.dev/meetup-codecon-floripa-01/" target="_blank" rel="noopener noreferrer"><strong>Meetup Codecon #01</strong></a></td></tr></tbody></table></div>

<h2 id="2023">2023</h2>
<div><table><thead><tr><th>Mês</th><th>Evento</th></tr></thead><tbody><tr><td>Dez</td><td><a href="https://www.youtube.com/live/RaMHnD3Ico4?app=desktop&si=s05HvlLHANQYv6bV" target="_blank" rel="noopener noreferrer"><strong>LINUXtips Meetup – Oracle</strong></a></td></tr><tr><td>Dez</td><td><a href="https://cloudfutures.tech/" target="_blank" rel="noopener noreferrer"><strong>Cloud Futures by Magalu Cloud</strong></a></td></tr><tr><td>Nov</td><td><a href="https://www.meetup.com/devops-florianopolis/events/297529400/" target="_blank" rel="noopener noreferrer"><strong>14º Meetup DevOps Floripa</strong></a></td></tr><tr><td>Nov</td><td><a href="https://summit.codeisland.com.br/" target="_blank" rel="noopener noreferrer"><strong>Code Island Summit 2023</strong></a></td></tr><tr><td>Nov</td><td><a href="https://www.sympla.com.br/evento/3-meetup-comunidade-api-floripa/2220166" target="_blank" rel="noopener noreferrer"><strong>3º Meetup API Floripa</strong></a></td></tr><tr><td>Nov</td><td><a href="https://devopsdays.org/events/2023-florianopolis/program" target="_blank" rel="noopener noreferrer"><strong>DevOpsDays Florianópolis 2023</strong></a></td></tr><tr><td>Nov</td><td><a href="https://www.proudtech.com.br/" target="_blank" rel="noopener noreferrer"><strong>Proud Tech by Softplan</strong></a></td></tr><tr><td>Out</td><td><a href="https://www.codecon.dev/feature" target="_blank" rel="noopener noreferrer"><strong>Codecon &lt;Feature&gt;</strong></a></td></tr><tr><td>Out</td><td><a href="https://community.cncf.io/events/details/cncf-cloud-native-floripa-presents-1o-cloud-native-floripa/" target="_blank" rel="noopener noreferrer"><strong>1º Cloud Native Floripa</strong></a></td></tr><tr><td>Set</td><td><a href="https://talkfloripa.com.br/tech-connection-fln" target="_blank" rel="noopener noreferrer"><strong>Tech Connection Florianópolis – TalkFloripa</strong></a></td></tr><tr><td>Ago</td><td><a href="https://www.linuxtips.io/platform-engineer-immersive-experience" target="_blank" rel="noopener noreferrer"><strong>Platform Engineer Immersive Experience – LINUXtips</strong></a></td></tr><tr><td>Ago</td><td><a href="https://aws.amazon.com/pt/events/summits/sao-paulo/" target="_blank" rel="noopener noreferrer"><strong>AWS Summit São Paulo</strong></a></td></tr><tr><td>Jun</td><td><a href="https://thedevconf.com/tdc/2023/innovation/trilha-cloud" target="_blank" rel="noopener noreferrer"><strong>TDC 2023 – Trilha Cloud</strong></a></td></tr><tr><td>Jun</td><td><a href="https://thedevconf.com/tdc/2023/innovation/trilha-cloud" target="_blank" rel="noopener noreferrer"><strong>TDC 2023 – Trilha DevOps & SRE</strong></a></td></tr></tbody></table></div>

<h2 id="eventos-anteriores">Eventos anteriores</h2>
<div><table><thead><tr><th>Data</th><th>Evento</th></tr></thead><tbody><tr><td>2019/04</td><td><a href="https://flisol.info/FLISOL2019/Brasil/Bauru" target="_blank" rel="noopener noreferrer"><strong>FLISoL Bauru</strong></a></td></tr><tr><td>2018/05</td><td><a href="https://unisagrado.edu.br/8jor-info" target="_blank" rel="noopener noreferrer"><strong>VIII Jornada de Informática – USC</strong></a></td></tr><tr><td>2018/02</td><td><a href="https://fibbauru.br/site/conteudo/462-hackathon-evento-inedito-em-bauru-comeca-hoje-.html" target="_blank" rel="noopener noreferrer"><strong>Hackathon DevTalks</strong></a></td></tr><tr><td>2017/10</td><td><a href="https://stoblobcertificados011.blob.core.windows.net/certificados/2017-10-Palestra.sobre.Liderança.Gestão.de.Pessoas-Finch.pdf" target="_blank" rel="noopener noreferrer"><strong>Circuito Finchers – Liderança & Gestão</strong></a></td></tr></tbody></table></div>

<p>---</p>

<p>Esses eventos foram fundamentais para meu desenvolvimento profissional, permitindo-me aprender novas habilidades, fazer networking com profissionais da área e me manter atualizado sobre as últimas tendências tecnológicas. Espero que essa lista inspire outros a participar de eventos de tecnologia e aproveitar as oportunidades que eles oferecem.</p>

<p>Se você tem alguma dúvida ou quer compartilhar suas próprias experiências em eventos de tecnologia, deixe um comentário abaixo. Vamos continuar aprendendo e crescendo juntos!</p>

<strong>#Eventos #Tecnologia #DesenvolvimentoProfissional #Networking</strong>
]]></content:encoded>
    </item>
    <item>
      <title>Participações em Lives</title>
      <link>https://www.orafaelferreira.com/artigos/participacoes</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/participacoes</guid>
      <pubDate>Sat, 28 Oct 2023 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Minhas participações em lives e podcasts sobre Green IT, IaC com Terraform e OpenTofu, segurança em nuvem Microsoft, certificações e carreira em DevOps.</description>
      <category>Colaborações Externas</category>
      <category>Carreira</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/2026/participa%C3%A7%C3%B5es/1.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<p>Olá, pessoal!</p>

<p>Estou empolgado para compartilhar com vocês um novo post onde destaco minhas participações em diversas lives na plataforma YouTube. Espero que este post seja informativo e inspire outros a buscar desenvolvimento profissional contínuo. Vamos lá!</p>

<h2 id="minhas-participacoes">Minhas Participações</h2>


<h3 id="green-it-o-futuro-da-sustentabilidade-na-nuvem">Green IT - O Futuro da Sustentabilidade na Nuvem</h3>
<a href="https://jovemnerd.com.br/podcasts/nerd-na-cloud/green-it-o-futuro-da-sustentabilidade-na-nuvem" target="_blank" rel="noopener noreferrer"><strong>Green IT - O Futuro da Sustentabilidade na Nuvem</strong></a> 
<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/posts/green.png" alt="Capa do podcast Nerd na Cloud sobre Green IT" />


<h3 id="iac-com-terraform-opentofu">IaC com Terraform & OpenTofu</h3>
<a href="https://www.youtube.com/watch?v=eBGb7TukdSs" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/eBGb7TukdSs/0.jpg" alt="IaC com Terraform & OpenTofu" /></a>

<h3 id="tech-floripa-cast-pythonfloripa-010-rafael-ferreira">Tech Floripa Cast (PythonFloripa) #010 - Rafael Ferreira</h3>
<a href="https://www.youtube.com/watch?v=yt6X_3M1Vi4" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/yt6X_3M1Vi4/0.jpg" alt="Tech Floripa Cast (PythonFloripa) #010 - Rafael Ferreira" /></a>

<h3 id="seguranca-em-nuvem-microsoft-estrategias-e-melhores-praticas">Segurança em Nuvem Microsoft: Estratégias e Melhores Práticas</h3>
<a href="https://www.youtube.com/watch?v=C7tKgg5uD9w" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/C7tKgg5uD9w/0.jpg" alt="Segurança em Nuvem Microsoft: Estratégias e Melhores Práticas" /></a>

<h3 id="mesa-redonda-protegendo-dado-na-era-das-inteligencia-artificial">Mesa Redonda: Protegendo dado na era das Inteligência Artificial</h3>
<a href="https://www.youtube.com/watch?v=56Jm6uPWV1w" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/56Jm6uPWV1w/0.jpg" alt="Mesa Redonda: Protegendo dado na era das Inteligência Artificial" /></a>

<h3 id="desvendando-certificacoes-o-caminho-real-ou-mito">Desvendando Certificações: O Caminho Real ou Mito?</h3>
<a href="https://www.youtube.com/watch?v=YF6yT04eR_s&ab_channel=CloudnaQuebrada%E2%98%81%EF%B8%8F" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/YF6yT04eR_s/0.jpg" alt="Desvendando Certificações: O Caminho Real ou Mito?" /></a>

<h3 id="live001-magalu-cloud-a-1-cloud-publica-do-brasil">LIVE001: Magalu Cloud - A 1ª Cloud Pública do Brasil</h3>
<a href="https://www.youtube.com/watch?v=Eg_Y3fa-Mv4&ab_channel=UnicastCloudLab" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/Eg_Y3fa-Mv4/0.jpg" alt="LIVE001: Magalu Cloud - A 1ª Cloud Pública do Brasil" /></a>

<h3 id="como-voce-pode-alavancar-a-sua-carreira-com-devops">Como você pode alavancar a sua carreira com DevOps</h3>
<a href="https://www.youtube.com/watch?v=eo2rHuanZiM&ab_channel=FabricioVeronez" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/eo2rHuanZiM/0.jpg" alt="Como você pode alavancar a sua carreira com DevOps" /></a>

<h3 id="live23-ressaca-tdc-innovation-2023">Live23 Ressaca TDC Innovation 2023</h3>
<a href="https://www.youtube.com/watch?v=jfZIjuze6nU&t=3s&ab_channel=Osert%C3%A3oser%C3%A1Cloud" target="_blank" rel="noopener noreferrer"><img src="https://img.youtube.com/vi/jfZIjuze6nU/0.jpg" alt="Live23 Ressaca TDC Innovation 2023" /></a>

<h2 id="agradecimento-especial">Agradecimento Especial</h2>

<p>Gostaria de expressar minha gratidão a todos os anfitriões das lives em que participei e a todos que acompanharam e interagiram. Cada experiência foi extremamente enriquecedora, e estou ansioso para continuar explorando novas oportunidades de compartilhar conhecimento e aprender com vocês.</p>

<p>Espero que tenham gostado deste post e que ele tenha inspirado vocês de alguma forma. Se tiverem alguma pergunta ou quiserem saber mais sobre minhas participações em lives, fiquem à vontade para entrar em contato. Vamos continuar crescendo juntos!</p>

<p>---</p>

<strong>#Participações #Lives #DesenvolvimentoProfissional #DevOps #Certificações #Tecnologia</strong>
]]></content:encoded>
    </item>
    <item>
      <title>Alertmanager no Prometheus: Simplificando o Gerenciamento de Alertas</title>
      <link>https://www.orafaelferreira.com/artigos/artigo-prometheus</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/artigo-prometheus</guid>
      <pubDate>Mon, 14 Aug 2023 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Entenda o Alertmanager do Prometheus: o que é, funcionalidades como agrupamento, silenciamento e roteamento de alertas, e por que usá-lo na observabilidade.</description>
      <category>Artigos</category>
      <category>Kubernetes</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2023-08-14-artigo-prometheus1.png" length="0" type="image/png" />
      <content:encoded><![CDATA[
<p>Em um mundo onde o monitoramento e a observabilidade tornaram-se cruciais para a operação eficiente de infraestruturas de TI, as ferramentas de alerta são mais importantes do que nunca. Uma dessas ferramentas que se destaca é o Alertmanager do Prometheus. Aqui está uma rápida visão geral de suas funcionalidades e benefícios.</p>

<h2 id="o-que-e-o-alertmanager">O Que é o Alertmanager?</h2>

<p>O Alertmanager é uma ferramenta especializada, integrada ao ecossistema do Prometheus, responsável por gerenciar os alertas. Quando o Prometheus detecta uma situação que atende a um critério de alerta predefinido, ele envia esses alertas para o Alertmanager. Em seguida, cabe ao Alertmanager decidir o que fazer com eles.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2023-08-14-artigo-prometheus1.png" alt="Arquitetura do Alertmanager integrado ao Prometheus" />

<h2 id="funcionalidades-principais">Funcionalidades Principais</h2>

<p>1. Agrupamento: O Alertmanager agrupa alertas semelhantes, reduzindo o ruído e facilitando a gestão e a resolução de incidentes.</p>
<p>2. Inibição: Alertas relacionados podem ser suprimidos com base em critérios definidos, evitando uma avalanche de notificações.</p>
<p>3. Silenciamento: Se você já está ciente de um problema e está trabalhando nele, o Alertmanager permite que você silencie alertas específicos.</p>
<p>4. Roteamento: Dependendo da gravidade ou do tipo do alerta, ele pode ser roteado para diferentes equipes ou canais, como email, Slack ou PagerDuty.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2023-08-14-artigo-prometheus2.png" alt="Fluxo de roteamento de alertas no Alertmanager" />

<h2 id="por-que-usar-o-alertmanager">Por Que Usar o Alertmanager?</h2>

<p>Em resumo, o Alertmanager ajuda as equipes a focarem nos alertas que realmente importam. Ao reduzir o ruído e fornecer ferramentas para gerenciar alertas de forma eficaz, as equipes podem responder mais rapidamente a incidentes críticos, melhorando a confiabilidade e a disponibilidade do sistema.</p>

<p>Para aqueles que buscam uma solução robusta de gerenciamento de alertas que integre perfeitamente ao Prometheus, o Alertmanager é, sem dúvida, uma escolha acertada.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2023-08-14-artigo-prometheus3.png" alt="Notificações de alertas do Alertmanager em canais como Slack" />

<p>Aqui vai o link da documentação caso você queira ler um pouco mais: <i></i> <a href="https://prometheus.io/docs/alerting/latest/alertmanager/" target="_blank" rel="noopener noreferrer">ALERTMANAGER</a></p>

<p>E se quiser saber mais sobre o treinamento que estou fazendo, da uma olhada no livro aberto a toda comunidade DescomplicandoPrometheus: <i></i> <a href="https://github.com/badtuxx/DescomplicandoPrometheus/tree/main" target="_blank" rel="noopener noreferrer">DescomplicandoPrometheus</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Kubernetes: Aproveitando o ACR como Repositório de Imagem Docker para Implementação de API</title>
      <link>https://www.orafaelferreira.com/artigos/artigo-aks-acr</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/artigo-aks-acr</guid>
      <pubDate>Sun, 05 Feb 2023 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Como usar o Azure Container Registry como repositório de imagens Docker para implantar uma API no Kubernetes, do build da imagem ao deploy no cluster.</description>
      <category>Artigos</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2023-02-05-artigo-aks-acr1.png" length="0" type="image/png" />
      <content:encoded><![CDATA[<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2023-02-05-artigo-aks-acr1.png" alt="Diagrama do Kubernetes com Azure Container Registry para deploy de API" />


<p>O Kubernetes é uma das tecnologias mais populares para gerenciamento de contêineres na nuvem. Ele permite a implantação, escalabilidade e gestão de aplicativos em contêineres de forma altamente automatizada e confiável. Além disso, o Kubernetes oferece recursos avançados de orquestração de contêineres, como balanceamento de carga, escalabilidade horizontal e garantia de disponibilidade.</p>

<p>Para maximizar a eficiência e o desempenho do Kubernetes, é importante que as imagens docker utilizadas nas implantações sejam armazenadas em um repositório centralizado, como o Azure Container Registry (ACR). O ACR é uma solução de repositório de imagem docker nativa do Azure, que oferece armazenamento seguro, escalável e de alta disponibilidade para as suas imagens docker. Além disso, o ACR oferece recursos adicionais, como garantia de integridade de imagem, controle de acesso baseado em roles e integração direta com o Kubernetes.</p>

<p>Neste artigo, vamos explorar como usar o ACR como repositório de imagem docker para implementar uma API. O objetivo é mostrar como aproveitar ao máximo as vantagens do Kubernetes e do ACR para implementar e gerenciar aplicativos em contêineres de forma eficiente e confiável.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2023-02-05-artigo-aks-acr2.png" alt="Fluxo de uso do ACR como repositório de imagens Docker" />

<p>Começamos criando uma nova API em uma linguagem de programação de sua escolha, como Node.js ou Python. Em seguida, criamos uma imagem docker da API, utilizando as diretrizes de Dockerfile e as ferramentas de build da plataforma. Em seguida, enviaremos a imagem docker para o ACR usando o comando "docker push".</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2023-02-05-artigo-aks-acr3.png" alt="Build e push da imagem Docker da API para o ACR" />

<p>Com a imagem docker armazenada no ACR, podemos prosseguir com a implantação da API no Kubernetes. Para isso, criamos um arquivo de descrição do deploy, que especifica as configurações de implantação, como número de réplicas, requisitos de recursos, etc. Em seguida, usamos o comando "kubectl apply" para aplicar as configurações de deploy no cluster do Kubernetes.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2023-02-05-artigo-aks-acr4.png" alt="Manifesto de deploy da API no Kubernetes usando imagem do ACR" />

<p>A partir daí, o Kubernetes se encarregará de gerenciar as réplicas</p>]]></content:encoded>
    </item>
    <item>
      <title>A importância do Persistent Volume no Kubernetes AKS: garantindo dados seguros e acessíveis</title>
      <link>https://www.orafaelferreira.com/artigos/artigo-aks-volume</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/artigo-aks-volume</guid>
      <pubDate>Sun, 05 Feb 2023 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>Por que Persistent Volume e Persistent Volume Claim são essenciais no Kubernetes AKS: persistência de dados, manifestos YAML e Azure Disk e Azure File.</description>
      <category>Artigos</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2023-02-05-artigo-aks-volume1.png" length="0" type="image/png" />
      <content:encoded><![CDATA[<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2023-02-05-artigo-aks-volume1.png" alt="Ilustração de Persistent Volume no Kubernetes AKS" />

<p>Olá, a todos!</p>
<p>Quando se trata de aplicações em containers, o uso de persistência de dados é fundamental para garantir a continuidade dos serviços. É por isso que o Persistent Volume (PV) e o Persistent Volume Claim (PVC) são recursos importantes do Kubernetes. E, no contexto do Azure Kubernetes Services (AKS), o uso de PV e PVC se torna ainda mais relevante.</p>
<p>No AKS, o Persistent Volume permite aos usuários armazenar dados de forma permanente, mesmo após a recriação de pods ou reinicialização de nós. Isto significa que, independentemente do status da aplicação, os dados serão preservados e disponíveis para uso quando necessário. Isso é extremamente importante para aplicações críticas, como banco de dados, que precisam garantir a disponibilidade e integridade dos dados em todos os momentos.</p>
<p>O Persistent Volume Claim, por sua vez, é um recurso que permite que os usuários solicitem espaço de armazenamento de forma simples e rápida. O PVC permite aos desenvolvedores especificar a quantidade de espaço de armazenamento necessária para suas aplicações, sem se preocupar com detalhes técnicos da infraestrutura. A partir daí, o Kubernetes se encarrega de alocar o espaço de armazenamento apropriado automaticamente.</p>
<p>Além do uso de Persistent Volumes no Kubernetes AKS, outro aspecto importante para garantir a disponibilidade de dados é o uso de Manifestos YAML. Manifestos YAML são arquivos que descrevem as configurações e recursos que um usuário deseja criar e gerenciar no cluster Kubernetes. Eles podem ser usados para declarar Persistent Volumes, Persistent Volume Claims, Deployments, Services e outros recursos importantes.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2023-02-05-artigo-aks-volume2.png" alt="Exemplo de manifesto YAML para PV e PVC no Kubernetes" />

<p>A vantagem do uso de Manifestos YAML é que ele permite a criação de recursos no cluster Kubernetes de forma programática e repetível, o que torna o processo de provisionamento muito mais eficiente e automatizado. Além disso, é possível versionar e controlar as mudanças realizadas nos Manifestos YAML, o que ajuda a manter o histórico e a rastreabilidade das configurações do cluster.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2023-02-05-artigo-aks-volume3.png" alt="Fluxo de criação de recursos no cluster via manifestos YAML" />

<p>O AKS permite a integração de PV com serviços de armazenamento da Azure, como o Azure Disk e o Azure File. Isso significa que, além de garantir a persistência de dados, os usuários também podem desfrutar de alta disponibilidade e escalabilidade dos serviços de armazenamento da Azure.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2023-02-05-artigo-aks-volume4.png" alt="Integração do AKS com Azure Disk e Azure File" />

<p>Em resumo, o uso de Persistent Volumes e Manifestos YAML são duas práticas importantes no desenvolvimento de aplicações no Kubernetes AKS, que ajudam a garantir a disponibilidade e persistência de dados, além de permitir a automatização e gestão eficiente da infraestrutura.</p>]]></content:encoded>
    </item>
    <item>
      <title>Pipelines CI/CD</title>
      <link>https://www.orafaelferreira.com/artigos/artigo-pipelines-ci-cd</link>
      <guid isPermaLink="true">https://www.orafaelferreira.com/artigos/artigo-pipelines-ci-cd</guid>
      <pubDate>Sun, 05 Feb 2023 12:00:00 GMT</pubDate>
      <dc:creator>Rafael Martin Alves Ferreira</dc:creator>
      <description>As metodologias ágeis têm mudado a forma como as empresas desenvolvem software, e o desenvolvimento contínuo é uma parte importante dessa mudança.</description>
      <category>Artigos</category>
      <category>Azure</category>
      <enclosure url="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2023-02-05-artigo-pipelines.ci.cd1.png" length="0" type="image/png" />
      <content:encoded><![CDATA[<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2023-02-05-artigo-pipelines.ci.cd1.png" alt="Ilustração de uma pipeline de CI/CD" />

<p>As metodologias ágeis têm mudado a forma como as empresas desenvolvem software, e o desenvolvimento contínuo é uma parte importante dessa mudança. As pipelines CI/CD (Integração Contínua e Entrega Contínua) são uma forma de automatizar o processo de entrega de software, permitindo que as empresas desenvolvam e entreguem software de forma rápida e eficiente.Cada vez mais, empresas de todos os tamanhos estão adotando práticas DevOps para agilizar seus processos de desenvolvimento e entrega de software. E um dos principais pilares dessa abordagem é a automação de pipelines de CI/CD.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2023-02-05-artigo-pipelines.ci.cd2.png" alt="Fluxo de integração e entrega contínua de software" />

<p>Existem diversas ferramentas disponíveis para ajudar a criar pipelines de CI/CD. Algumas das mais populares incluem o Jenkins, o GitHub Actions e o Azure DevOps.</p>

<p>O Jenkins é uma ferramenta de automação de código aberto que é amplamente utilizada em pipelines de CI/CD. Ele permite criar pipelines complexos que podem ser executados em ambientes diversos, desde servidores locais até ambientes na nuvem.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2023-02-05-artigo-pipelines.ci.cd3.png" alt="Logo e interface do Jenkins para automação de pipelines" />

<p>Já o GitHub Actions é um serviço de integração contínua e entrega contínua fornecido pelo GitHub. Ele permite criar pipelines de CI/CD diretamente no repositório de código, o que facilita bastante o processo.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2023-02-05-artigo-pipelines.ci.cd4.png" alt="Workflow do GitHub Actions executando uma pipeline" />

<p>O Azure DevOps é uma plataforma de colaboração e gerenciamento de projetos que também possui recursos para pipelines de CI/CD. Ele oferece ferramentas para gerenciamento de código, testes automatizados, implementação e monitoramento, permitindo a criação de pipelines completos. Ele é altamente integrado com outras ferramentas da Microsoft, como o Visual Studio, e oferece suporte para várias plataformas e linguagens de programação.</p>

<img src="https://stoblobcertificados011.blob.core.windows.net/imagens-blog/artigos/2023-02-05-artigo-pipelines.ci.cd5.png" alt="Pipeline de CI/CD no Azure DevOps" />

<p>Independentemente da ferramenta escolhida, a automação de pipelines de CI/CD é uma etapa crucial para acelerar a entrega de software e garantir a qualidade do código. Além disso, permite que as equipes se concentrem em tarefas mais importantes e estratégicas em vez de gastar tempo em atividades manuais repetitivas.</p>

<p>Independentemente da ferramenta escolhida, é importante lembrar que a criação de um pipeline CI/CD não é um processo único. É um processo contínuo que requer monitoramento e ajustes constantes. No entanto, investir tempo e esforço na criação de um pipeline CI/CD bem projetado pode levar a uma entrega de software mais rápida, de maior qualidade e com menos riscos.</p>

<p>Se você ainda não adotou práticas de CI/CD na sua empresa, vale a pena explorar as diversas ferramentas disponíveis e ver qual se encaixa melhor nas suas necessidades. O importante é não deixar de lado a automação de pipelines e buscar sempre melhorias contínuas no processo de desenvolvimento e entrega de software.</p>]]></content:encoded>
    </item>
  </channel>
</rss>
