<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Artigos on Fabio Lopes</title><link>https://fabiolopes.page/pt-br/post/</link><description>Recent content in Artigos on Fabio Lopes</description><generator>Hugo -- gohugo.io</generator><language>pt-BR</language><copyright>Fabio M. Lopes</copyright><lastBuildDate>Tue, 27 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://fabiolopes.page/pt-br/post/index.xml" rel="self" type="application/rss+xml"/><item><title>Automatizando a Previsão de Capacidade do Ceph com Grafana Mimir</title><link>https://fabiolopes.page/pt-br/p/automatizando-a-previs%C3%A3o-de-capacidade-do-ceph-com-grafana-mimir/</link><pubDate>Wed, 17 Sep 2025 00:00:00 +0000</pubDate><guid>https://fabiolopes.page/pt-br/p/automatizando-a-previs%C3%A3o-de-capacidade-do-ceph-com-grafana-mimir/</guid><description>&lt;img src="https://fabiolopes.page/p/automating-ceph-storage-forecasting-with-grafana-mimir/forecast_hu_998d1c8c3b592aac.png" alt="Featured image of post Automatizando a Previsão de Capacidade do Ceph com Grafana Mimir" /&gt;&lt;h2 id="contexto-e-decisões-na-época"&gt;&lt;a href="#contexto-e-decis%c3%b5es-na-%c3%a9poca" class="header-anchor"&gt;&lt;/a&gt;Contexto e decisões na época&#10;&lt;/h2&gt;&lt;p&gt;Nossa equipe precisava com urgência das informações geradas para o processo de aquisição de hardware, então construí o que era essencial e coloquei em funcionamento o mais rápido possível. Como não sou especialista em análises, um colega forneceu a lógica e inicialmente tudo foi desenvolvido em um Jupyter Notebook, sendo depois migrado para um ambiente com agendamento e acesso direto ao Mimir.&lt;/p&gt;&#10;&lt;p&gt;As decisões foram orientadas por essa necessidade: integrar coleta, tratamento, projeção e comunicação em um único fluxo; usar uma projeção simples e compreensível para apoiar o planejamento; e entregar os gráficos e resumos no Teams, sem depender de preparação manual a cada execução. Os modelos mais sofisticados e as demais evoluções ficaram para depois da entrega mais urgente.&lt;/p&gt;&#10;&lt;h2 id="introdução"&gt;&lt;a href="#introdu%c3%a7%c3%a3o" class="header-anchor"&gt;&lt;/a&gt;Introdução&#10;&lt;/h2&gt;&lt;p&gt;O planejamento de capacidade para clusters de armazenamento distribuído é um desafio constante, especialmente em ambientes onde o crescimento rápido de dados pode se transformar rapidamente em riscos de capacidade ou em cenários de aquisições urgentes. No SERPRO, desenvolvi uma solução baseada em Python que automatiza a coleta de métricas de uso do Ceph a partir do Grafana Mimir, analisa tendências históricas de utilização, aplica correção de outliers e projeta o consumo previsto até um ano à frente para múltiplos sites e classes de dispositivos. O sistema não apenas visualiza o uso da capacidade com tendências dinâmicas, robustas a outliers, e indicadores de limite, mas também gera blocos concisos de resumo — automaticamente postados em canais do Microsoft Teams em Adaptive Cards estruturados. Ao integrar ciência de dados com comunicação fluida entre equipes, esse fluxo oferece insights acionáveis que ajudam o time a atuar de forma proativa na gestão da previsão de capacidade de armazenamento.&lt;/p&gt;&#10;&lt;h2 id="o-que-foi-feito"&gt;&lt;a href="#o-que-foi-feito" class="header-anchor"&gt;&lt;/a&gt;O que foi feito&#10;&lt;/h2&gt;&lt;p&gt;O objetivo principal deste projeto é automatizar a previsão de capacidade para clusters de armazenamento Ceph, integrando recuperação, processamento, visualização e relatórios em um único fluxo de trabalho Python. O processo começa consultando o Grafana Mimir via sua API Prometheus para buscar métricas históricas e recentes de bytes brutos e usados, segmentados por classes de dispositivos e sites (neste caso, São Paulo e Brasília). O fluxo utiliza consultas PromQL estruturadas para coletar não só o uso de armazenamento, mas também a classificação dos dispositivos, para uma análise mais detalhada.&lt;/p&gt;&#10;&lt;p&gt;Após a coleta, os dados brutos são mesclados em um DataFrame unificado do pandas. A abordagem lida com lacunas e valores ausentes por interpolação diária, garantindo que a série temporal necessária para análise estatística e plotagem permaneça contínua e regularizada. O tratamento de outliers consiste no cálculo dos deltas diários e aplicação de um filtro baseado no desvio padrão móvel. Saltos repentinos e anômalos no uso diário, provavelmente causados por falhas temporárias ou eventos excepcionais, são substituídos pela mediana do delta diário, assegurando que as tendências de longo prazo não sejam distorcidas por artefatos momentâneos.&lt;/p&gt;&#10;&lt;p&gt;A previsão é realizada com um método simples e robusto: o sistema projeta o crescimento do uso para frente usando o aumento diário mediano histórico, assumindo crescimento linear para os próximos 365 dias. Isso se alinha às necessidades práticas do planejamento de capacidade, onde tendências rápidas e compreensíveis têm prioridade sobre modelos complexos e excessivamente ajustados.&lt;/p&gt;&#10;&lt;p&gt;Para cada dimensão (site e classe de dispositivo), o script gera gráficos de previsão utilizando matplotlib e seaborn, sobrepondo uso atual, projeções e limiares coloridos (75%, 85% e 100% da capacidade disponível) para melhor clareza visual. Juntamente com os gráficos, o fluxo prepara um resumo textual contendo métricas-chave como datas previstas de saturação, taxas de crescimento e tempos estimados para atingir limites críticos.&lt;/p&gt;&#10;&lt;p&gt;Por fim, todo o conteúdo é organizado e enviado ao Microsoft Teams via webhook, utilizando Adaptive Cards para dashboards estruturados e legíveis de forma inline. A automação garante que esses insights estejam sempre atualizados e disponíveis para stakeholders, sem necessidade de intervenção manual ou pipelines separados de relatórios.&lt;/p&gt;&#10;&lt;h2 id="tratamento-dos-dados-e-abordagem-de-previsão"&gt;&lt;a href="#tratamento-dos-dados-e-abordagem-de-previs%c3%a3o" class="header-anchor"&gt;&lt;/a&gt;Tratamento dos Dados e Abordagem de Previsão&#10;&lt;/h2&gt;&lt;p&gt;A fase de tratamento dos dados é fundamental para garantir que as previsões de uso sejam confiáveis e robustas. As métricas brutas recuperadas do Grafana Mimir geralmente contêm ruídos, valores ausentes e outliers ocasionais — picos ou quedas irregulares que não representam padrões típicos de uso, mas podem distorcer a análise de tendências se não corrigidos.&lt;/p&gt;&#10;&lt;p&gt;Para mitigar isso, o fluxo primeiro alinha as séries temporais reamostrando para frequência diária e preenche quaisquer pontos faltantes via interpolação linear. Isso garante uma linha do tempo contínua, essencial para cálculos estatísticos consistentes e modelagem de regressão.&lt;/p&gt;&#10;&lt;p&gt;O tratamento dos outliers foca nos incrementos diários de uso (a diferença entre dias consecutivos). O script calcula esses deltas para métricas de uso e aplica uma verificação estatística utilizando o desvio padrão móvel para identificar saltos anormais. Valores que ultrapassam essa faixa são considerados outliers e substituídos pela mediana dos deltas calculada a partir dos dados não anômalos. Esse método suaviza flutuações erráticas preservando a tendência subjacente de crescimento.&lt;/p&gt;&#10;&lt;p&gt;Ao corrigir os outliers no nível do delta, e não diretamente nos valores brutos, o modelo mantém a consistência cumulativa da métrica. Os deltas corrigidos são somados cumulativamente para reconstruir uma série temporal de uso corrigida. Essa abordagem mitiga efetivamente distorções causadas por pontos anômalos sem eliminar os sinais reais de crescimento.&lt;/p&gt;&#10;&lt;p&gt;Para a previsão, os incrementos históricos corrigidos são usados para projetar o crescimento futuro de forma linear ao longo de um horizonte definido (365 dias). O delta diário mediano serve como uma estimativa estável e robusta do aumento esperado de uso por dia. Embora existam modelos mais sofisticados, esse método combina simplicidade e praticidade, fornecendo resultados facilmente interpretáveis e úteis para o planejamento de capacidade. Evita o risco de sobreajuste que pode ocorrer com modelos complexos aplicados a dados operacionais reais ruidosos.&lt;/p&gt;&#10;&lt;p&gt;No geral, essa combinação de interpolação cuidadosa, correção estatística de outliers e previsão linear baseada em mediana cria uma base sólida para compreender e antecipar as tendências de consumo do Ceph com complexidade computacional mínima e alta transparência.&lt;/p&gt;&#10;&lt;h2 id="o-código"&gt;&lt;a href="#o-c%c3%b3digo" class="header-anchor"&gt;&lt;/a&gt;O Código&#10;&lt;/h2&gt;&lt;div class="code-example code-file"&gt;&#10; &lt;div class="code-toolbar"&gt;&lt;span&gt;forecast.py&lt;/span&gt;&lt;span class="code-language"&gt;python · 412 linhas&lt;/span&gt;&lt;a href="https://fabiolopes.page/p/automating-ceph-storage-forecasting-with-grafana-mimir/forecast.py" download&gt;Baixar&lt;/a&gt;&lt;/div&gt;&#10; &#10; &lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 10&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 11&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 12&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 13&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 14&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 15&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 16&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 17&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 18&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 19&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 20&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 21&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 22&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 23&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 24&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 25&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 26&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 27&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 28&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 29&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 30&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 31&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 32&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 33&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 34&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 35&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 36&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 37&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 38&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 39&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 40&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 41&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 42&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 43&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 44&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 45&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 46&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 47&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 48&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 49&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 50&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 51&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 52&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 53&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 54&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 55&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 56&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 57&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 58&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 59&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 60&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 61&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 62&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 63&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 64&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 65&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 66&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 67&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 68&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 69&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 70&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 71&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 72&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 73&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 74&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 75&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 76&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 77&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 78&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 79&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 80&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 81&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 82&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 83&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 84&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 85&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 86&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 87&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 88&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 89&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 90&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 91&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 92&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 93&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 94&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 95&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 96&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 97&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 98&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 99&#10;&lt;/span&gt;&lt;span class="lnt"&gt;100&#10;&lt;/span&gt;&lt;span class="lnt"&gt;101&#10;&lt;/span&gt;&lt;span class="lnt"&gt;102&#10;&lt;/span&gt;&lt;span class="lnt"&gt;103&#10;&lt;/span&gt;&lt;span class="lnt"&gt;104&#10;&lt;/span&gt;&lt;span class="lnt"&gt;105&#10;&lt;/span&gt;&lt;span class="lnt"&gt;106&#10;&lt;/span&gt;&lt;span class="lnt"&gt;107&#10;&lt;/span&gt;&lt;span class="lnt"&gt;108&#10;&lt;/span&gt;&lt;span class="lnt"&gt;109&#10;&lt;/span&gt;&lt;span class="lnt"&gt;110&#10;&lt;/span&gt;&lt;span class="lnt"&gt;111&#10;&lt;/span&gt;&lt;span class="lnt"&gt;112&#10;&lt;/span&gt;&lt;span class="lnt"&gt;113&#10;&lt;/span&gt;&lt;span class="lnt"&gt;114&#10;&lt;/span&gt;&lt;span class="lnt"&gt;115&#10;&lt;/span&gt;&lt;span class="lnt"&gt;116&#10;&lt;/span&gt;&lt;span class="lnt"&gt;117&#10;&lt;/span&gt;&lt;span class="lnt"&gt;118&#10;&lt;/span&gt;&lt;span class="lnt"&gt;119&#10;&lt;/span&gt;&lt;span class="lnt"&gt;120&#10;&lt;/span&gt;&lt;span class="lnt"&gt;121&#10;&lt;/span&gt;&lt;span class="lnt"&gt;122&#10;&lt;/span&gt;&lt;span class="lnt"&gt;123&#10;&lt;/span&gt;&lt;span class="lnt"&gt;124&#10;&lt;/span&gt;&lt;span class="lnt"&gt;125&#10;&lt;/span&gt;&lt;span class="lnt"&gt;126&#10;&lt;/span&gt;&lt;span class="lnt"&gt;127&#10;&lt;/span&gt;&lt;span class="lnt"&gt;128&#10;&lt;/span&gt;&lt;span class="lnt"&gt;129&#10;&lt;/span&gt;&lt;span class="lnt"&gt;130&#10;&lt;/span&gt;&lt;span class="lnt"&gt;131&#10;&lt;/span&gt;&lt;span class="lnt"&gt;132&#10;&lt;/span&gt;&lt;span class="lnt"&gt;133&#10;&lt;/span&gt;&lt;span class="lnt"&gt;134&#10;&lt;/span&gt;&lt;span class="lnt"&gt;135&#10;&lt;/span&gt;&lt;span class="lnt"&gt;136&#10;&lt;/span&gt;&lt;span class="lnt"&gt;137&#10;&lt;/span&gt;&lt;span class="lnt"&gt;138&#10;&lt;/span&gt;&lt;span class="lnt"&gt;139&#10;&lt;/span&gt;&lt;span class="lnt"&gt;140&#10;&lt;/span&gt;&lt;span class="lnt"&gt;141&#10;&lt;/span&gt;&lt;span class="lnt"&gt;142&#10;&lt;/span&gt;&lt;span class="lnt"&gt;143&#10;&lt;/span&gt;&lt;span class="lnt"&gt;144&#10;&lt;/span&gt;&lt;span class="lnt"&gt;145&#10;&lt;/span&gt;&lt;span class="lnt"&gt;146&#10;&lt;/span&gt;&lt;span class="lnt"&gt;147&#10;&lt;/span&gt;&lt;span class="lnt"&gt;148&#10;&lt;/span&gt;&lt;span class="lnt"&gt;149&#10;&lt;/span&gt;&lt;span class="lnt"&gt;150&#10;&lt;/span&gt;&lt;span class="lnt"&gt;151&#10;&lt;/span&gt;&lt;span class="lnt"&gt;152&#10;&lt;/span&gt;&lt;span class="lnt"&gt;153&#10;&lt;/span&gt;&lt;span class="lnt"&gt;154&#10;&lt;/span&gt;&lt;span class="lnt"&gt;155&#10;&lt;/span&gt;&lt;span class="lnt"&gt;156&#10;&lt;/span&gt;&lt;span class="lnt"&gt;157&#10;&lt;/span&gt;&lt;span class="lnt"&gt;158&#10;&lt;/span&gt;&lt;span class="lnt"&gt;159&#10;&lt;/span&gt;&lt;span class="lnt"&gt;160&#10;&lt;/span&gt;&lt;span class="lnt"&gt;161&#10;&lt;/span&gt;&lt;span class="lnt"&gt;162&#10;&lt;/span&gt;&lt;span class="lnt"&gt;163&#10;&lt;/span&gt;&lt;span class="lnt"&gt;164&#10;&lt;/span&gt;&lt;span class="lnt"&gt;165&#10;&lt;/span&gt;&lt;span class="lnt"&gt;166&#10;&lt;/span&gt;&lt;span class="lnt"&gt;167&#10;&lt;/span&gt;&lt;span class="lnt"&gt;168&#10;&lt;/span&gt;&lt;span class="lnt"&gt;169&#10;&lt;/span&gt;&lt;span class="lnt"&gt;170&#10;&lt;/span&gt;&lt;span class="lnt"&gt;171&#10;&lt;/span&gt;&lt;span class="lnt"&gt;172&#10;&lt;/span&gt;&lt;span class="lnt"&gt;173&#10;&lt;/span&gt;&lt;span class="lnt"&gt;174&#10;&lt;/span&gt;&lt;span class="lnt"&gt;175&#10;&lt;/span&gt;&lt;span class="lnt"&gt;176&#10;&lt;/span&gt;&lt;span class="lnt"&gt;177&#10;&lt;/span&gt;&lt;span class="lnt"&gt;178&#10;&lt;/span&gt;&lt;span class="lnt"&gt;179&#10;&lt;/span&gt;&lt;span class="lnt"&gt;180&#10;&lt;/span&gt;&lt;span class="lnt"&gt;181&#10;&lt;/span&gt;&lt;span class="lnt"&gt;182&#10;&lt;/span&gt;&lt;span class="lnt"&gt;183&#10;&lt;/span&gt;&lt;span class="lnt"&gt;184&#10;&lt;/span&gt;&lt;span class="lnt"&gt;185&#10;&lt;/span&gt;&lt;span class="lnt"&gt;186&#10;&lt;/span&gt;&lt;span class="lnt"&gt;187&#10;&lt;/span&gt;&lt;span class="lnt"&gt;188&#10;&lt;/span&gt;&lt;span class="lnt"&gt;189&#10;&lt;/span&gt;&lt;span class="lnt"&gt;190&#10;&lt;/span&gt;&lt;span class="lnt"&gt;191&#10;&lt;/span&gt;&lt;span class="lnt"&gt;192&#10;&lt;/span&gt;&lt;span class="lnt"&gt;193&#10;&lt;/span&gt;&lt;span class="lnt"&gt;194&#10;&lt;/span&gt;&lt;span class="lnt"&gt;195&#10;&lt;/span&gt;&lt;span class="lnt"&gt;196&#10;&lt;/span&gt;&lt;span class="lnt"&gt;197&#10;&lt;/span&gt;&lt;span class="lnt"&gt;198&#10;&lt;/span&gt;&lt;span class="lnt"&gt;199&#10;&lt;/span&gt;&lt;span class="lnt"&gt;200&#10;&lt;/span&gt;&lt;span class="lnt"&gt;201&#10;&lt;/span&gt;&lt;span class="lnt"&gt;202&#10;&lt;/span&gt;&lt;span class="lnt"&gt;203&#10;&lt;/span&gt;&lt;span class="lnt"&gt;204&#10;&lt;/span&gt;&lt;span class="lnt"&gt;205&#10;&lt;/span&gt;&lt;span class="lnt"&gt;206&#10;&lt;/span&gt;&lt;span class="lnt"&gt;207&#10;&lt;/span&gt;&lt;span class="lnt"&gt;208&#10;&lt;/span&gt;&lt;span class="lnt"&gt;209&#10;&lt;/span&gt;&lt;span class="lnt"&gt;210&#10;&lt;/span&gt;&lt;span class="lnt"&gt;211&#10;&lt;/span&gt;&lt;span class="lnt"&gt;212&#10;&lt;/span&gt;&lt;span class="lnt"&gt;213&#10;&lt;/span&gt;&lt;span class="lnt"&gt;214&#10;&lt;/span&gt;&lt;span class="lnt"&gt;215&#10;&lt;/span&gt;&lt;span class="lnt"&gt;216&#10;&lt;/span&gt;&lt;span class="lnt"&gt;217&#10;&lt;/span&gt;&lt;span class="lnt"&gt;218&#10;&lt;/span&gt;&lt;span class="lnt"&gt;219&#10;&lt;/span&gt;&lt;span class="lnt"&gt;220&#10;&lt;/span&gt;&lt;span class="lnt"&gt;221&#10;&lt;/span&gt;&lt;span class="lnt"&gt;222&#10;&lt;/span&gt;&lt;span class="lnt"&gt;223&#10;&lt;/span&gt;&lt;span class="lnt"&gt;224&#10;&lt;/span&gt;&lt;span class="lnt"&gt;225&#10;&lt;/span&gt;&lt;span class="lnt"&gt;226&#10;&lt;/span&gt;&lt;span class="lnt"&gt;227&#10;&lt;/span&gt;&lt;span class="lnt"&gt;228&#10;&lt;/span&gt;&lt;span class="lnt"&gt;229&#10;&lt;/span&gt;&lt;span class="lnt"&gt;230&#10;&lt;/span&gt;&lt;span class="lnt"&gt;231&#10;&lt;/span&gt;&lt;span class="lnt"&gt;232&#10;&lt;/span&gt;&lt;span class="lnt"&gt;233&#10;&lt;/span&gt;&lt;span class="lnt"&gt;234&#10;&lt;/span&gt;&lt;span class="lnt"&gt;235&#10;&lt;/span&gt;&lt;span class="lnt"&gt;236&#10;&lt;/span&gt;&lt;span class="lnt"&gt;237&#10;&lt;/span&gt;&lt;span class="lnt"&gt;238&#10;&lt;/span&gt;&lt;span class="lnt"&gt;239&#10;&lt;/span&gt;&lt;span class="lnt"&gt;240&#10;&lt;/span&gt;&lt;span class="lnt"&gt;241&#10;&lt;/span&gt;&lt;span class="lnt"&gt;242&#10;&lt;/span&gt;&lt;span class="lnt"&gt;243&#10;&lt;/span&gt;&lt;span class="lnt"&gt;244&#10;&lt;/span&gt;&lt;span class="lnt"&gt;245&#10;&lt;/span&gt;&lt;span class="lnt"&gt;246&#10;&lt;/span&gt;&lt;span class="lnt"&gt;247&#10;&lt;/span&gt;&lt;span class="lnt"&gt;248&#10;&lt;/span&gt;&lt;span class="lnt"&gt;249&#10;&lt;/span&gt;&lt;span class="lnt"&gt;250&#10;&lt;/span&gt;&lt;span class="lnt"&gt;251&#10;&lt;/span&gt;&lt;span class="lnt"&gt;252&#10;&lt;/span&gt;&lt;span class="lnt"&gt;253&#10;&lt;/span&gt;&lt;span class="lnt"&gt;254&#10;&lt;/span&gt;&lt;span class="lnt"&gt;255&#10;&lt;/span&gt;&lt;span class="lnt"&gt;256&#10;&lt;/span&gt;&lt;span class="lnt"&gt;257&#10;&lt;/span&gt;&lt;span class="lnt"&gt;258&#10;&lt;/span&gt;&lt;span class="lnt"&gt;259&#10;&lt;/span&gt;&lt;span class="lnt"&gt;260&#10;&lt;/span&gt;&lt;span class="lnt"&gt;261&#10;&lt;/span&gt;&lt;span class="lnt"&gt;262&#10;&lt;/span&gt;&lt;span class="lnt"&gt;263&#10;&lt;/span&gt;&lt;span class="lnt"&gt;264&#10;&lt;/span&gt;&lt;span class="lnt"&gt;265&#10;&lt;/span&gt;&lt;span class="lnt"&gt;266&#10;&lt;/span&gt;&lt;span class="lnt"&gt;267&#10;&lt;/span&gt;&lt;span class="lnt"&gt;268&#10;&lt;/span&gt;&lt;span class="lnt"&gt;269&#10;&lt;/span&gt;&lt;span class="lnt"&gt;270&#10;&lt;/span&gt;&lt;span class="lnt"&gt;271&#10;&lt;/span&gt;&lt;span class="lnt"&gt;272&#10;&lt;/span&gt;&lt;span class="lnt"&gt;273&#10;&lt;/span&gt;&lt;span class="lnt"&gt;274&#10;&lt;/span&gt;&lt;span class="lnt"&gt;275&#10;&lt;/span&gt;&lt;span class="lnt"&gt;276&#10;&lt;/span&gt;&lt;span class="lnt"&gt;277&#10;&lt;/span&gt;&lt;span class="lnt"&gt;278&#10;&lt;/span&gt;&lt;span class="lnt"&gt;279&#10;&lt;/span&gt;&lt;span class="lnt"&gt;280&#10;&lt;/span&gt;&lt;span class="lnt"&gt;281&#10;&lt;/span&gt;&lt;span class="lnt"&gt;282&#10;&lt;/span&gt;&lt;span class="lnt"&gt;283&#10;&lt;/span&gt;&lt;span class="lnt"&gt;284&#10;&lt;/span&gt;&lt;span class="lnt"&gt;285&#10;&lt;/span&gt;&lt;span class="lnt"&gt;286&#10;&lt;/span&gt;&lt;span class="lnt"&gt;287&#10;&lt;/span&gt;&lt;span class="lnt"&gt;288&#10;&lt;/span&gt;&lt;span class="lnt"&gt;289&#10;&lt;/span&gt;&lt;span class="lnt"&gt;290&#10;&lt;/span&gt;&lt;span class="lnt"&gt;291&#10;&lt;/span&gt;&lt;span class="lnt"&gt;292&#10;&lt;/span&gt;&lt;span class="lnt"&gt;293&#10;&lt;/span&gt;&lt;span class="lnt"&gt;294&#10;&lt;/span&gt;&lt;span class="lnt"&gt;295&#10;&lt;/span&gt;&lt;span class="lnt"&gt;296&#10;&lt;/span&gt;&lt;span class="lnt"&gt;297&#10;&lt;/span&gt;&lt;span class="lnt"&gt;298&#10;&lt;/span&gt;&lt;span class="lnt"&gt;299&#10;&lt;/span&gt;&lt;span class="lnt"&gt;300&#10;&lt;/span&gt;&lt;span class="lnt"&gt;301&#10;&lt;/span&gt;&lt;span class="lnt"&gt;302&#10;&lt;/span&gt;&lt;span class="lnt"&gt;303&#10;&lt;/span&gt;&lt;span class="lnt"&gt;304&#10;&lt;/span&gt;&lt;span class="lnt"&gt;305&#10;&lt;/span&gt;&lt;span class="lnt"&gt;306&#10;&lt;/span&gt;&lt;span class="lnt"&gt;307&#10;&lt;/span&gt;&lt;span class="lnt"&gt;308&#10;&lt;/span&gt;&lt;span class="lnt"&gt;309&#10;&lt;/span&gt;&lt;span class="lnt"&gt;310&#10;&lt;/span&gt;&lt;span class="lnt"&gt;311&#10;&lt;/span&gt;&lt;span class="lnt"&gt;312&#10;&lt;/span&gt;&lt;span class="lnt"&gt;313&#10;&lt;/span&gt;&lt;span class="lnt"&gt;314&#10;&lt;/span&gt;&lt;span class="lnt"&gt;315&#10;&lt;/span&gt;&lt;span class="lnt"&gt;316&#10;&lt;/span&gt;&lt;span class="lnt"&gt;317&#10;&lt;/span&gt;&lt;span class="lnt"&gt;318&#10;&lt;/span&gt;&lt;span class="lnt"&gt;319&#10;&lt;/span&gt;&lt;span class="lnt"&gt;320&#10;&lt;/span&gt;&lt;span class="lnt"&gt;321&#10;&lt;/span&gt;&lt;span class="lnt"&gt;322&#10;&lt;/span&gt;&lt;span class="lnt"&gt;323&#10;&lt;/span&gt;&lt;span class="lnt"&gt;324&#10;&lt;/span&gt;&lt;span class="lnt"&gt;325&#10;&lt;/span&gt;&lt;span class="lnt"&gt;326&#10;&lt;/span&gt;&lt;span class="lnt"&gt;327&#10;&lt;/span&gt;&lt;span class="lnt"&gt;328&#10;&lt;/span&gt;&lt;span class="lnt"&gt;329&#10;&lt;/span&gt;&lt;span class="lnt"&gt;330&#10;&lt;/span&gt;&lt;span class="lnt"&gt;331&#10;&lt;/span&gt;&lt;span class="lnt"&gt;332&#10;&lt;/span&gt;&lt;span class="lnt"&gt;333&#10;&lt;/span&gt;&lt;span class="lnt"&gt;334&#10;&lt;/span&gt;&lt;span class="lnt"&gt;335&#10;&lt;/span&gt;&lt;span class="lnt"&gt;336&#10;&lt;/span&gt;&lt;span class="lnt"&gt;337&#10;&lt;/span&gt;&lt;span class="lnt"&gt;338&#10;&lt;/span&gt;&lt;span class="lnt"&gt;339&#10;&lt;/span&gt;&lt;span class="lnt"&gt;340&#10;&lt;/span&gt;&lt;span class="lnt"&gt;341&#10;&lt;/span&gt;&lt;span class="lnt"&gt;342&#10;&lt;/span&gt;&lt;span class="lnt"&gt;343&#10;&lt;/span&gt;&lt;span class="lnt"&gt;344&#10;&lt;/span&gt;&lt;span class="lnt"&gt;345&#10;&lt;/span&gt;&lt;span class="lnt"&gt;346&#10;&lt;/span&gt;&lt;span class="lnt"&gt;347&#10;&lt;/span&gt;&lt;span class="lnt"&gt;348&#10;&lt;/span&gt;&lt;span class="lnt"&gt;349&#10;&lt;/span&gt;&lt;span class="lnt"&gt;350&#10;&lt;/span&gt;&lt;span class="lnt"&gt;351&#10;&lt;/span&gt;&lt;span class="lnt"&gt;352&#10;&lt;/span&gt;&lt;span class="lnt"&gt;353&#10;&lt;/span&gt;&lt;span class="lnt"&gt;354&#10;&lt;/span&gt;&lt;span class="lnt"&gt;355&#10;&lt;/span&gt;&lt;span class="lnt"&gt;356&#10;&lt;/span&gt;&lt;span class="lnt"&gt;357&#10;&lt;/span&gt;&lt;span class="lnt"&gt;358&#10;&lt;/span&gt;&lt;span class="lnt"&gt;359&#10;&lt;/span&gt;&lt;span class="lnt"&gt;360&#10;&lt;/span&gt;&lt;span class="lnt"&gt;361&#10;&lt;/span&gt;&lt;span class="lnt"&gt;362&#10;&lt;/span&gt;&lt;span class="lnt"&gt;363&#10;&lt;/span&gt;&lt;span class="lnt"&gt;364&#10;&lt;/span&gt;&lt;span class="lnt"&gt;365&#10;&lt;/span&gt;&lt;span class="lnt"&gt;366&#10;&lt;/span&gt;&lt;span class="lnt"&gt;367&#10;&lt;/span&gt;&lt;span class="lnt"&gt;368&#10;&lt;/span&gt;&lt;span class="lnt"&gt;369&#10;&lt;/span&gt;&lt;span class="lnt"&gt;370&#10;&lt;/span&gt;&lt;span class="lnt"&gt;371&#10;&lt;/span&gt;&lt;span class="lnt"&gt;372&#10;&lt;/span&gt;&lt;span class="lnt"&gt;373&#10;&lt;/span&gt;&lt;span class="lnt"&gt;374&#10;&lt;/span&gt;&lt;span class="lnt"&gt;375&#10;&lt;/span&gt;&lt;span class="lnt"&gt;376&#10;&lt;/span&gt;&lt;span class="lnt"&gt;377&#10;&lt;/span&gt;&lt;span class="lnt"&gt;378&#10;&lt;/span&gt;&lt;span class="lnt"&gt;379&#10;&lt;/span&gt;&lt;span class="lnt"&gt;380&#10;&lt;/span&gt;&lt;span class="lnt"&gt;381&#10;&lt;/span&gt;&lt;span class="lnt"&gt;382&#10;&lt;/span&gt;&lt;span class="lnt"&gt;383&#10;&lt;/span&gt;&lt;span class="lnt"&gt;384&#10;&lt;/span&gt;&lt;span class="lnt"&gt;385&#10;&lt;/span&gt;&lt;span class="lnt"&gt;386&#10;&lt;/span&gt;&lt;span class="lnt"&gt;387&#10;&lt;/span&gt;&lt;span class="lnt"&gt;388&#10;&lt;/span&gt;&lt;span class="lnt"&gt;389&#10;&lt;/span&gt;&lt;span class="lnt"&gt;390&#10;&lt;/span&gt;&lt;span class="lnt"&gt;391&#10;&lt;/span&gt;&lt;span class="lnt"&gt;392&#10;&lt;/span&gt;&lt;span class="lnt"&gt;393&#10;&lt;/span&gt;&lt;span class="lnt"&gt;394&#10;&lt;/span&gt;&lt;span class="lnt"&gt;395&#10;&lt;/span&gt;&lt;span class="lnt"&gt;396&#10;&lt;/span&gt;&lt;span class="lnt"&gt;397&#10;&lt;/span&gt;&lt;span class="lnt"&gt;398&#10;&lt;/span&gt;&lt;span class="lnt"&gt;399&#10;&lt;/span&gt;&lt;span class="lnt"&gt;400&#10;&lt;/span&gt;&lt;span class="lnt"&gt;401&#10;&lt;/span&gt;&lt;span class="lnt"&gt;402&#10;&lt;/span&gt;&lt;span class="lnt"&gt;403&#10;&lt;/span&gt;&lt;span class="lnt"&gt;404&#10;&lt;/span&gt;&lt;span class="lnt"&gt;405&#10;&lt;/span&gt;&lt;span class="lnt"&gt;406&#10;&lt;/span&gt;&lt;span class="lnt"&gt;407&#10;&lt;/span&gt;&lt;span class="lnt"&gt;408&#10;&lt;/span&gt;&lt;span class="lnt"&gt;409&#10;&lt;/span&gt;&lt;span class="lnt"&gt;410&#10;&lt;/span&gt;&lt;span class="lnt"&gt;411&#10;&lt;/span&gt;&lt;span class="lnt"&gt;412&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;json&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;base64&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;logging&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;urllib3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pandas&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timezone&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;seaborn&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;sns&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plt&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.dates&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;mdates&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.ticker&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;ticker&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;output_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/srv/scripts&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;TiB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1099511627776&lt;/span&gt; &lt;span class="c1"&gt;# Is this really necessary?&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%(asctime)s&lt;/span&gt;&lt;span class="s1"&gt; - &lt;/span&gt;&lt;span class="si"&gt;%(levelname)s&lt;/span&gt;&lt;span class="s1"&gt; - &lt;/span&gt;&lt;span class="si"&gt;%(message)s&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output_dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;capacidade-forecast.log&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;filemode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vm"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-----Inicio-----&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 1. Query Configuration&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1. Configuração da Query&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;urllib3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;disable_warnings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;urllib3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;InsecureRequestWarning&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://mimir-endpoint/prometheus/api/v1/query_range&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;X-Scope-OrgID&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;anonymous&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;queries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Capacidade SPO&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;sum by (device_class) (ceph_osd_stat_bytes{site=&amp;#39;spo&amp;#39;} + on(site,ceph_daemon) group_left(device_class) (0*ceph_osd_metadata{site=&amp;#39;spo&amp;#39;}))&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Capacidade BSA&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;sum by (device_class) (ceph_osd_stat_bytes{site=&amp;#39;bsa&amp;#39;} + on(site,ceph_daemon) group_left(device_class) (0*ceph_osd_metadata{site=&amp;#39;bsa&amp;#39;}))&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Uso SPO&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;sum by (device_class) ((ceph_osd_stat_bytes_used{site=&amp;#39;spo&amp;#39;}) + on(site,ceph_daemon) group_left(device_class) (0*ceph_osd_metadata{site=&amp;#39;spo&amp;#39;}))&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Uso BSA&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;sum by (device_class) ((ceph_osd_stat_bytes_used{site=&amp;#39;bsa&amp;#39;}) + on(site,ceph_daemon) group_left(device_class) (0*ceph_osd_metadata{site=&amp;#39;bsa&amp;#39;}))&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;current_utc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;end_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_utc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;minute&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;microsecond&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;start_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# No data prior to this date&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;params_template&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;%Y-%m-&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;T%H:%M:%SZ&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;end_date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;%Y-%m-&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;T%H:%M:%SZ&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;step&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1d&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 2. Query Execution&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2. Execução da Query&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;query_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;queries&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;params_template&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;verify&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;mimir_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;result&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;mimir_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;No data returned for query: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;query_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;mimir_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;device_class&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;metric&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;device_class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;metric&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;device_class&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;temp_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;values&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;timestamp&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;query_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;device_class&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;temp_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;timestamp&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temp_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;timestamp&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;temp_df&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;temp_df&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;timestamp&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;how&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;outer&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTTPError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;HTTP error for query &amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;query_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Response body: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;KeyError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Unexpected response format for query &amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;query_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Save as CSV&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#output_file = &amp;#39;device_data.csv&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#dataframe.to_csv(output_file, index=False)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 3. Treat the Data&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;3. Tratamento dos Dados&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Define the index&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;timestamp&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Time&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Time&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;inplace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Convert values to numeric&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;numeric_columns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Time&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Time&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;numeric_columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_numeric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;coerce&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Interpolate missing values&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;D&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;interpolate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;linear&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reset_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inplace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## Treat the Outliers&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cols_uso&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Uso&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std_dev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;medianas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Calculate Delta and Standard Deviation&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cols_uso&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;device_class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delta_col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Delta &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;device_class&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delta_corrigido_col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Delta Corrigido &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;device_class&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;uso_corrigido_col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Uso Corrigido &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;device_class&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Calculate Delta&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;delta_col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Calculate Standard Deviation&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;std_dev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;delta_col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Desvio Padrão &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;device_class&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;std_dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;TiB&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.2f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; TiB&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Apply the outlier correction&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;delta_corrigido_col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;delta_col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;delta_col&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;std_dev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Calculate the delta median without the outliers&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;medianas&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;delta_corrigido_col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;median&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Fill zero/empty values with the median&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;delta_corrigido_col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;delta_corrigido_col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;delta_corrigido_col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;medianas&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Calculate Corrected raw usage&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cols_delta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Delta Corrigido&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cols_delta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;device_class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;uso_col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Uso &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;device_class&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;corrigido_col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Uso Corrigido &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;device_class&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Initialize the &amp;#39;Corrected Usage&amp;#39; column with the first value from the &amp;#39;Usage&amp;#39; column&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;corrigido_col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;uso_col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Calculate the cumulative sum of the corrected delta, starting from the second row&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:,&lt;/span&gt; &lt;span class="n"&gt;corrigido_col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cumsum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Drop unecessary columns&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cols_drop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Delta&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;cols_drop&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Save to .csv&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# output_file = &amp;#39;device_data.csv&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# dataframe.to_csv(os.path.join(output_dir, output_file), index=False)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 4. Calculation of the Linear Regression&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;4. Cálculo da Regressão Linear&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Gerar o Horizonte da Previsão&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ultima_coleta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Time&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;data_inicial&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ultima_coleta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;minute&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;microsecond&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;forecast_horizonte&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;365&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;forecast_datas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date_range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data_inicial&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;periods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;forecast_horizonte&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;forecast_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Time&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;forecast_datas&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Generate Forecasts&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cols_uso&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;device_class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;forecast&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;forecast_horizonte&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;forecast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forecast&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;medianas&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;column_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;device_class&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;forecast_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;column_name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;forecast&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;forecast_df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 5. Generate the Summary&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;5. Geração do Resumo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;summary_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;current_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;minute&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;microsecond&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cols_uso&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;device_class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;forecast_col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;device_class&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Obtain the Capacity and calculate the Rate&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;capacidade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Capacidade &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;device_class&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;TiB&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;uso_atual&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;TiB&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;uso_final&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;forecast_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;forecast_col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;TiB&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;taxa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uso_final&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;uso_atual&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;forecast_horizonte&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Check the Threshold&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;threshold_mask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forecast_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;forecast_col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;TiB&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;capacidade&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;threshold_mask&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;any&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;threshold_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;forecast_df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;threshold_mask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Time&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s1"&gt;-%m-%Y&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;threshold_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Limite não atingido no período&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Calculate remaining Days&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;days_remaining&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;capacidade&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;uso_atual&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;taxa&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;years&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;months&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;days&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days_remaining&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;365&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;days_remaining&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;365&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mf"&gt;30.42&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;days_remaining&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;365&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mf"&gt;30.42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;doomsday&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Time&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;days_remaining&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s1"&gt;-%m-%Y&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;doomsday_f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;years&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; anos, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;months&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; meses e &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; dias&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Generate the Summary&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;summary_text&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;Resumo &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;device_class&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;Capacidade (75%): &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;capacidade&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.2f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; TiB&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;Uso em 31/12/2025: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;uso_final&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.2f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; TiB&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;Taxa de crescimento diária: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;taxa&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.2f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; TiB/dia&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;Quando atinge 75%: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;doomsday&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;Tempo até atingir 75%: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;doomsday_f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 6. Generate the Graphs&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;6. Geração dos Gráficos&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Obter Sites e Classes&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sites&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;device_classes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Uso&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sites&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;device_classes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Generate the Plots&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;plots&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sites&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;device_class&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;device_classes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Verify the columns&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;uso_col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Uso &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;device_class&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;uso_corrigido_col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Uso Corrigido &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;device_class&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;capacidade_col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Capacidade &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;device_class&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;forecast_col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;device_class&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nb"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;uso_col&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uso_corrigido_col&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;capacidade_col&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;forecast_col&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;forecast_df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Plot Lines&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sns&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lineplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Time&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;uso_col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;TiB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Uso Bruto&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;purple&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sns&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lineplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;forecast_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Time&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;forecast_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;forecast_col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;TiB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Previsão&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linestyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;--&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;navy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Plot Thresholds&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;capacity_tib&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;capacidade_col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;TiB&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;limits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;capacity_tib&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;75%&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;gold&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;capacity_tib&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.85&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;85%&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;darkorange&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;capacity_tib&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;100%&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;crimson&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;limits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axhline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linestyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Format&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gca&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_major_locator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mdates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MonthLocator&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gca&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_major_formatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mdates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DateFormatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%Y-%m&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xticks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rotation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;right&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gca&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_major_formatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ticker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FuncFormatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;,.1f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; TiB&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gca&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_major_locator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ticker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxNLocator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Previsão Ceph &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; - Classe &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;device_class&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Data&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelpad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Uso &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;device_class&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; (TiB)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labelpad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linestyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;--&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Configure Subtitles&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;handles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gca&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_legend_handles_labels&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;handles&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;upper left&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;frameon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shadow&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tight_layout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Save Graphs&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BytesIO&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dpi&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bbox_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;tight&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seek&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;plots&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;device_class&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getvalue&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Error generating plot for &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;device_class&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 7. Send to Teams&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7. Envio para o Teams&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Create the message&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_teams_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;summary_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;plots&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cards&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sections&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parse_summary_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;summary_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;SPO&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;BSA&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;card&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;message&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;attachments&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;contentType&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;application/vnd.microsoft.card.adaptive&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;$schema&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;http://adaptivecards.io/schemas/adaptive-card.json&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;AdaptiveCard&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1.2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;body&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;TextBlock&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;São Paulo&amp;#34;&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;SPO&amp;#34;&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Brasília&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;weight&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Bolder&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;size&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Large&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Accent&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;create_device_sections&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sections&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Add site-specific plots&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;site_plots&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;plots&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;())}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;plot_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;plot_data&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;site_plots&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;image_block&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Image&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;data:image/png;base64,&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;plot_data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;size&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;card&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;attachments&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;content&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;body&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cards&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;card&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;card&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;card&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cards&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Convert the Summary Text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;parse_summary_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sections&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;current_section&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Resumo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Resumo &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;site&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;device_class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;current_section&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setdefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;device_class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;current_section&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;key_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;key_value&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;key_value&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;current_section&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sections&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Create the Sections&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_device_sections&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;devices&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sections&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;device_class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;devices&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;section&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Container&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;style&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;emphasis&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;items&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;TextBlock&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Classe &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;device_class&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;weight&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Bolder&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;size&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Small&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;FactSet&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;facts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Capacidade (75%):&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Capacidade (75%)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;N/A&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Uso em 31/12/2025:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Uso em 31/12/2025&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;N/A&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Taxa de crescimento:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Taxa de crescimento diária&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;N/A&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Quando atinge 75%:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Quando atinge 75%&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;N/A&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Tempo até atingir 75%:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Tempo até atingir 75%&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;N/A&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sections&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;section&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sections&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Send to Teams&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;send_to_teams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payloads&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Chat Capacidade&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;WEBHOOK_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://corp.webhook.office.com/webhookb2/id&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;PROXIES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://proxy:3128&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;statuses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;payloads&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;WEBHOOK_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxies&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PROXIES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;verify&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;statuses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;statuses&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Create and send the message&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;create_teams_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;summary_text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;plots&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;send_to_teams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-----Fim-----&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10; &#10; &lt;/div&gt;&#10;&lt;h2 id="melhorias-futuras"&gt;&lt;a href="#melhorias-futuras" class="header-anchor"&gt;&lt;/a&gt;Melhorias Futuras&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Modelos de Previsão Avançados:&lt;/strong&gt; Em vez de uma extrapolação linear com medianas, incorporar métodos de séries temporais como ARIMA, Prophet, ou modelos de machine learning para capturar sazonalidade, tendências e padrões não lineares com maior precisão;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Processamento em Tempo Real ou Próximo disso:&lt;/strong&gt; Adaptar a coleta e previsão para suportar atualizações frequentes (ex.: horárias), permitindo reações mais rápidas a variações repentinas ou falhas;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Detecção de Anomalias e Alertas:&lt;/strong&gt; Integrar métodos automáticos para identificar picos inesperados ou degradações, combinados com alertas proativos em Teams ou outros canais para notificar imediatamente as equipes;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Parâmetros de Limite Configuráveis:&lt;/strong&gt; Permitir ajuste dinâmico dos limiares (75%, 85%, 100%) via arquivos de configuração ou variáveis de ambiente, aumentando a flexibilidade para diferentes ambientes ou políticas;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Visualizações Melhoradas:&lt;/strong&gt; Incluir intervalos de confiança nas previsões, dashboards interativos com Plotly Dash ou painéis Grafana, e suporte a cenários múltiplos de longo prazo (ex.: otimista, pessimista);&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Melhorias de Segurança e Autenticação:&lt;/strong&gt; Proteger chamadas de API com autenticação adequada (tokens OAuth, certificados) e gerenciar com segurança URLs de webhook e credenciais de proxy;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Extensibilidade para Outras Métricas:&lt;/strong&gt; Generalizar o pipeline para incorporar indicadores adicionais de saúde e performance do Ceph (latência, IOPS, status de recuperação) para dashboards mais completos de capacidade e saúde do cluster.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&#10;&#10;&lt;aside class="engineering-callout engineering-callout--note" aria-label="Sobre esta implementação histórica"&gt;&#10; &lt;p class="callout-label"&gt;Sobre esta implementação histórica&lt;/p&gt;&#10; &lt;div&gt;&lt;p&gt;O código acima documenta a implementação publicada em setembro de 2025 e foi preservado sem alterações de lógica. Configurações específicas daquele ambiente, integrações e limitações refletem essa versão histórica. Uma nova implantação exigiria uma revisão própria; as melhorias listadas acima não são apresentadas como já implementadas.&lt;/p&gt;&#10;&lt;p&gt;A expressão “desvio padrão móvel” no relato original descrevia a intenção do tratamento; o código publicado calcula o desvio na série coletada, sem uma janela móvel. Da mesma forma, o comentário “regressão linear” no código nomeia uma extrapolação pelos incrementos medianos. Esses esclarecimentos não alteram a implementação original.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/aside&gt;&#10;&#10;</description></item><item><title>Guia Exaustivo para o Exame AWS Certified Solutions Architect – Professional (SAP-C02)</title><link>https://fabiolopes.page/pt-br/p/guia-exaustivo-para-o-exame-aws-certified-solutions-architect-professional-sap-c02/</link><pubDate>Tue, 15 Jul 2025 00:00:00 +0000</pubDate><guid>https://fabiolopes.page/pt-br/p/guia-exaustivo-para-o-exame-aws-certified-solutions-architect-professional-sap-c02/</guid><description>&lt;img src="https://fabiolopes.page/p/the-ultimate-guide-to-the-aws-certified-solutions-architect-professional-sap-c02-exam/aws_hu_5331162b14fce82a.jpeg" alt="Featured image of post Guia Exaustivo para o Exame AWS Certified Solutions Architect – Professional (SAP-C02)" /&gt;&lt;h1 id="guia-exaustivo-para-o-exame-aws-certified-solutions-architect--professional-sap-c02"&gt;&lt;a href="#guia-exaustivo-para-o-exame-aws-certified-solutions-architect--professional-sap-c02" class="header-anchor"&gt;&lt;/a&gt;Guia Exaustivo para o Exame AWS Certified Solutions Architect – Professional (SAP-C02)&#10;&lt;/h1&gt;&lt;p&gt;Este documento tem como objetivo fornecer um guia completo e detalhado para o exame AWS Certified Solutions Architect – Professional (SAP-C02), cobrindo todos os tópicos e subdomínios conforme o guia oficial da AWS. O conteúdo será estruturado para facilitar o estudo, a consulta rápida e a compreensão aprofundada dos conceitos necessários para a certificação.&lt;/p&gt;&#10;&lt;h2 id="domínios-do-exame-e-pesos"&gt;&lt;a href="#dom%c3%adnios-do-exame-e-pesos" class="header-anchor"&gt;&lt;/a&gt;Domínios do Exame e Pesos&#10;&lt;/h2&gt;&lt;p&gt;O exame SAP-C02 é dividido em quatro domínios principais, cada um com um peso específico no conteúdo avaliado:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Domínio 1: Design de Soluções para Complexidade Organizacional&lt;/strong&gt; (26% do conteúdo)&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Domínio 2: Design para Novas Soluções&lt;/strong&gt; (29% do conteúdo)&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Domínio 3: Melhoria Contínua para Soluções Existentes&lt;/strong&gt; (25% do conteúdo)&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Domínio 4: Acelerar a Migração e Modernização de Workloads&lt;/strong&gt; (20% do conteúdo)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="domínio-1-design-de-soluções-para-complexidade-organizacional"&gt;&lt;a href="#dom%c3%adnio-1-design-de-solu%c3%a7%c3%b5es-para-complexidade-organizacional" class="header-anchor"&gt;&lt;/a&gt;Domínio 1: Design de Soluções para Complexidade Organizacional&#10;&lt;/h2&gt;&lt;p&gt;Este domínio foca na capacidade de projetar soluções que abordem os desafios de ambientes complexos e em larga escala, incluindo estratégias de rede, segurança, governança e gerenciamento de contas.&lt;/p&gt;&#10;&lt;h3 id="tópicos-e-subtópicos"&gt;&lt;a href="#t%c3%b3picos-e-subt%c3%b3picos" class="header-anchor"&gt;&lt;/a&gt;Tópicos e Subtópicos:&#10;&lt;/h3&gt;&lt;h4 id="11-arquitetar-estratégias-de-conectividade-de-rede"&gt;&lt;a href="#11-arquitetar-estrat%c3%a9gias-de-conectividade-de-rede" class="header-anchor"&gt;&lt;/a&gt;1.1. Arquitetar estratégias de conectividade de rede.&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;Conhecimento de:&#10;&lt;ul&gt;&#10;&lt;li&gt;Infraestrutura Global da AWS&lt;/li&gt;&#10;&lt;li&gt;Conceitos de rede AWS (por exemplo, Amazon Virtual Private Cloud [Amazon VPC], AWS Direct Connect, AWS VPN, roteamento transitivo, serviços de contêiner AWS)&lt;/li&gt;&#10;&lt;li&gt;Conceitos de DNS híbrido (por exemplo, Amazon Route 53 Resolver, integração de DNS on-premises)&lt;/li&gt;&#10;&lt;li&gt;Segmentação de rede (por exemplo, sub-redes, endereçamento IP, conectividade entre VPCs)&lt;/li&gt;&#10;&lt;li&gt;Monitoramento de tráfego de rede&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="12-arquitetar-estratégias-de-segurança-para-ambientes-complexos"&gt;&lt;a href="#12-arquitetar-estrat%c3%a9gias-de-seguran%c3%a7a-para-ambientes-complexos" class="header-anchor"&gt;&lt;/a&gt;1.2. Arquitetar estratégias de segurança para ambientes complexos.&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;Conhecimento de:&#10;&lt;ul&gt;&#10;&lt;li&gt;AWS Organizations e Unidades Organizacionais (OUs)&lt;/li&gt;&#10;&lt;li&gt;Service Control Policies (SCPs)&lt;/li&gt;&#10;&lt;li&gt;AWS Identity and Access Management (IAM) avançado (por exemplo, permission boundaries, ABAC, roles cross-account)&lt;/li&gt;&#10;&lt;li&gt;AWS Security Hub, Amazon GuardDuty, Amazon Detective, AWS Config, AWS Inspector&lt;/li&gt;&#10;&lt;li&gt;Gerenciamento de chaves (por exemplo, AWS Key Management Service [AWS KMS] multi-região)&lt;/li&gt;&#10;&lt;li&gt;Segurança de dados (por exemplo, criptografia em trânsito e em repouso, tokenização, mascaramento de dados)&lt;/li&gt;&#10;&lt;li&gt;Gerenciamento de segredos (por exemplo, AWS Secrets Manager)&lt;/li&gt;&#10;&lt;li&gt;Auditoria e log (por exemplo, AWS CloudTrail, Amazon CloudWatch Logs)&lt;/li&gt;&#10;&lt;li&gt;Princípio do menor privilégio&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="13-arquitetar-estratégias-de-governança-e-conformidade"&gt;&lt;a href="#13-arquitetar-estrat%c3%a9gias-de-governan%c3%a7a-e-conformidade" class="header-anchor"&gt;&lt;/a&gt;1.3. Arquitetar estratégias de governança e conformidade.&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;Conhecimento de:&#10;&lt;ul&gt;&#10;&lt;li&gt;AWS Control Tower&lt;/li&gt;&#10;&lt;li&gt;AWS Config e Conformance Packs&lt;/li&gt;&#10;&lt;li&gt;AWS Audit Manager&lt;/li&gt;&#10;&lt;li&gt;AWS License Manager&lt;/li&gt;&#10;&lt;li&gt;AWS Systems Manager&lt;/li&gt;&#10;&lt;li&gt;AWS Resource Access Manager (AWS RAM)&lt;/li&gt;&#10;&lt;li&gt;AWS Service Catalog&lt;/li&gt;&#10;&lt;li&gt;AWS Organizations e gerenciamento de contas&lt;/li&gt;&#10;&lt;li&gt;Tags e políticas de tagging&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="14-arquitetar-estratégias-de-gerenciamento-de-contas-e-multi-contas"&gt;&lt;a href="#14-arquitetar-estrat%c3%a9gias-de-gerenciamento-de-contas-e-multi-contas" class="header-anchor"&gt;&lt;/a&gt;1.4. Arquitetar estratégias de gerenciamento de contas e multi-contas.&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;Conhecimento de:&#10;&lt;ul&gt;&#10;&lt;li&gt;AWS Organizations e OUs&lt;/li&gt;&#10;&lt;li&gt;AWS Control Tower&lt;/li&gt;&#10;&lt;li&gt;AWS Single Sign-On (AWS SSO)&lt;/li&gt;&#10;&lt;li&gt;AWS IAM Identity Center&lt;/li&gt;&#10;&lt;li&gt;Landing Zones&lt;/li&gt;&#10;&lt;li&gt;AWS Resource Access Manager (AWS RAM)&lt;/li&gt;&#10;&lt;li&gt;Compartilhamento de recursos entre contas&lt;/li&gt;&#10;&lt;li&gt;Faturamento consolidado&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="domínio-2-design-para-novas-soluções"&gt;&lt;a href="#dom%c3%adnio-2-design-para-novas-solu%c3%a7%c3%b5es" class="header-anchor"&gt;&lt;/a&gt;Domínio 2: Design para Novas Soluções&#10;&lt;/h2&gt;&lt;p&gt;Este domínio aborda a capacidade de projetar novas soluções na AWS, focando na escolha de serviços, padrões de arquitetura, resiliência, escalabilidade e otimização de performance.&lt;/p&gt;&#10;&lt;h3 id="tópicos-e-subtópicos-1"&gt;&lt;a href="#t%c3%b3picos-e-subt%c3%b3picos-1" class="header-anchor"&gt;&lt;/a&gt;Tópicos e Subtópicos:&#10;&lt;/h3&gt;&lt;h4 id="21-arquitetar-soluções-de-computação"&gt;&lt;a href="#21-arquitetar-solu%c3%a7%c3%b5es-de-computa%c3%a7%c3%a3o" class="header-anchor"&gt;&lt;/a&gt;2.1. Arquitetar soluções de computação.&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;Conhecimento de:&#10;&lt;ul&gt;&#10;&lt;li&gt;Amazon EC2 (por exemplo, instâncias spot/mixed fleets, Auto Scaling)&lt;/li&gt;&#10;&lt;li&gt;AWS Lambda&lt;/li&gt;&#10;&lt;li&gt;Containers (por exemplo, Amazon Elastic Container Service [Amazon ECS], Amazon Elastic Kubernetes Service [Amazon EKS], AWS Fargate)&lt;/li&gt;&#10;&lt;li&gt;AWS Outposts&lt;/li&gt;&#10;&lt;li&gt;AWS Wavelength&lt;/li&gt;&#10;&lt;li&gt;AWS Local Zones&lt;/li&gt;&#10;&lt;li&gt;AWS Batch&lt;/li&gt;&#10;&lt;li&gt;AWS ParallelCluster&lt;/li&gt;&#10;&lt;li&gt;AWS Serverless Application Model (AWS SAM)&lt;/li&gt;&#10;&lt;li&gt;AWS Amplify&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="22-arquitetar-soluções-de-armazenamento"&gt;&lt;a href="#22-arquitetar-solu%c3%a7%c3%b5es-de-armazenamento" class="header-anchor"&gt;&lt;/a&gt;2.2. Arquitetar soluções de armazenamento.&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;Conhecimento de:&#10;&lt;ul&gt;&#10;&lt;li&gt;Amazon S3 (por exemplo, classes de armazenamento, pontos de acesso, políticas de ciclo de vida)&lt;/li&gt;&#10;&lt;li&gt;Amazon Elastic File System (Amazon EFS)&lt;/li&gt;&#10;&lt;li&gt;Amazon FSx (por exemplo, FSx for Lustre, FSx for Windows File Server, FSx for NetApp ONTAP)&lt;/li&gt;&#10;&lt;li&gt;Amazon Elastic Block Store (Amazon EBS)&lt;/li&gt;&#10;&lt;li&gt;AWS Backup&lt;/li&gt;&#10;&lt;li&gt;Amazon Glacier&lt;/li&gt;&#10;&lt;li&gt;AWS Storage Gateway&lt;/li&gt;&#10;&lt;li&gt;AWS Snow Family&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="23-arquitetar-soluções-de-banco-de-dados"&gt;&lt;a href="#23-arquitetar-solu%c3%a7%c3%b5es-de-banco-de-dados" class="header-anchor"&gt;&lt;/a&gt;2.3. Arquitetar soluções de banco de dados.&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;Conhecimento de:&#10;&lt;ul&gt;&#10;&lt;li&gt;Amazon Relational Database Service (Amazon RDS)&lt;/li&gt;&#10;&lt;li&gt;Amazon Aurora&lt;/li&gt;&#10;&lt;li&gt;Amazon DynamoDB&lt;/li&gt;&#10;&lt;li&gt;Amazon DocumentDB (com compatibilidade MongoDB)&lt;/li&gt;&#10;&lt;li&gt;Amazon Neptune&lt;/li&gt;&#10;&lt;li&gt;Amazon Redshift&lt;/li&gt;&#10;&lt;li&gt;Amazon ElastiCache&lt;/li&gt;&#10;&lt;li&gt;Amazon Quantum Ledger Database (Amazon QLDB)&lt;/li&gt;&#10;&lt;li&gt;Amazon Managed Blockchain&lt;/li&gt;&#10;&lt;li&gt;Amazon Keyspaces (para Apache Cassandra)&lt;/li&gt;&#10;&lt;li&gt;Amazon Timestream&lt;/li&gt;&#10;&lt;li&gt;Amazon Kinesis&lt;/li&gt;&#10;&lt;li&gt;AWS Database Migration Service (AWS DMS)&lt;/li&gt;&#10;&lt;li&gt;AWS Schema Conversion Tool (AWS SCT)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="24-arquitetar-soluções-de-rede"&gt;&lt;a href="#24-arquitetar-solu%c3%a7%c3%b5es-de-rede" class="header-anchor"&gt;&lt;/a&gt;2.4. Arquitetar soluções de rede.&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;Conhecimento de:&#10;&lt;ul&gt;&#10;&lt;li&gt;Amazon VPC (por exemplo, sub-redes, tabelas de rotas, gateways de internet, gateways NAT, endpoints de VPC)&lt;/li&gt;&#10;&lt;li&gt;AWS Transit Gateway&lt;/li&gt;&#10;&lt;li&gt;AWS PrivateLink&lt;/li&gt;&#10;&lt;li&gt;VPC Peering&lt;/li&gt;&#10;&lt;li&gt;AWS Direct Connect&lt;/li&gt;&#10;&lt;li&gt;AWS VPN&lt;/li&gt;&#10;&lt;li&gt;Amazon Route 53 (por exemplo, DNS multi-região, políticas de roteamento)&lt;/li&gt;&#10;&lt;li&gt;Amazon CloudFront (por exemplo, URLs assinadas, cookies assinados, geo-restrições)&lt;/li&gt;&#10;&lt;li&gt;AWS Global Accelerator&lt;/li&gt;&#10;&lt;li&gt;AWS App Mesh&lt;/li&gt;&#10;&lt;li&gt;AWS Cloud Map&lt;/li&gt;&#10;&lt;li&gt;VPC Lattice&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="25-arquitetar-soluções-de-mensageria-e-integração"&gt;&lt;a href="#25-arquitetar-solu%c3%a7%c3%b5es-de-mensageria-e-integra%c3%a7%c3%a3o" class="header-anchor"&gt;&lt;/a&gt;2.5. Arquitetar soluções de mensageria e integração.&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;Conhecimento de:&#10;&lt;ul&gt;&#10;&lt;li&gt;Amazon Simple Notification Service (Amazon SNS)&lt;/li&gt;&#10;&lt;li&gt;Amazon Simple Queue Service (Amazon SQS)&lt;/li&gt;&#10;&lt;li&gt;Amazon EventBridge&lt;/li&gt;&#10;&lt;li&gt;AWS Step Functions&lt;/li&gt;&#10;&lt;li&gt;Amazon Kinesis (por exemplo, Kinesis Data Streams, Kinesis Data Firehose, Kinesis Data Analytics)&lt;/li&gt;&#10;&lt;li&gt;Amazon Managed Streaming for Apache Kafka (Amazon MSK)&lt;/li&gt;&#10;&lt;li&gt;AWS AppSync&lt;/li&gt;&#10;&lt;li&gt;Amazon API Gateway&lt;/li&gt;&#10;&lt;li&gt;AWS IoT Core&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="domínio-3-melhoria-contínua-para-soluções-existentes"&gt;&lt;a href="#dom%c3%adnio-3-melhoria-cont%c3%adnua-para-solu%c3%a7%c3%b5es-existentes" class="header-anchor"&gt;&lt;/a&gt;Domínio 3: Melhoria Contínua para Soluções Existentes&#10;&lt;/h2&gt;&lt;p&gt;Este domínio concentra-se na otimização e aprimoramento de arquiteturas existentes para melhorar a performance, resiliência, segurança e eficiência operacional.&lt;/p&gt;&#10;&lt;h3 id="tópicos-e-subtópicos-2"&gt;&lt;a href="#t%c3%b3picos-e-subt%c3%b3picos-2" class="header-anchor"&gt;&lt;/a&gt;Tópicos e Subtópicos:&#10;&lt;/h3&gt;&lt;h4 id="31-arquitetar-soluções-para-alta-disponibilidade-e-resiliência"&gt;&lt;a href="#31-arquitetar-solu%c3%a7%c3%b5es-para-alta-disponibilidade-e-resili%c3%aancia" class="header-anchor"&gt;&lt;/a&gt;3.1. Arquitetar soluções para alta disponibilidade e resiliência.&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;Conhecimento de:&#10;&lt;ul&gt;&#10;&lt;li&gt;Estratégias de recuperação de desastres (por exemplo, RTO, RPO, padrões de DR: backup e restauração, piloto leve, multi-site ativo-ativo)&lt;/li&gt;&#10;&lt;li&gt;AWS Well-Architected Framework (Pilar de Confiabilidade)&lt;/li&gt;&#10;&lt;li&gt;Amazon Route 53 (por exemplo, failover, roteamento baseado em latência)&lt;/li&gt;&#10;&lt;li&gt;AWS Global Accelerator&lt;/li&gt;&#10;&lt;li&gt;Elastic Load Balancing (ELB)&lt;/li&gt;&#10;&lt;li&gt;Amazon EC2 Auto Scaling&lt;/li&gt;&#10;&lt;li&gt;Amazon CloudFront&lt;/li&gt;&#10;&lt;li&gt;AWS Shield, AWS WAF&lt;/li&gt;&#10;&lt;li&gt;Circuit Breaker pattern&lt;/li&gt;&#10;&lt;li&gt;Sagas pattern&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="32-arquitetar-soluções-para-otimização-de-performance"&gt;&lt;a href="#32-arquitetar-solu%c3%a7%c3%b5es-para-otimiza%c3%a7%c3%a3o-de-performance" class="header-anchor"&gt;&lt;/a&gt;3.2. Arquitetar soluções para otimização de performance.&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;Conhecimento de:&#10;&lt;ul&gt;&#10;&lt;li&gt;AWS Well-Architected Framework (Pilar de Performance Efficiency)&lt;/li&gt;&#10;&lt;li&gt;Otimização de computação (por exemplo, escolha de instâncias, otimização de containers, Lambda provisioned concurrency)&lt;/li&gt;&#10;&lt;li&gt;Otimização de armazenamento (por exemplo, escolha de classes de S3, otimização de EBS, EFS, FSx)&lt;/li&gt;&#10;&lt;li&gt;Otimização de banco de dados (por exemplo, escolha de tipo de DB, otimização de consultas, caching com ElastiCache)&lt;/li&gt;&#10;&lt;li&gt;Otimização de rede (por exemplo, Direct Connect, Global Accelerator, CloudFront)&lt;/li&gt;&#10;&lt;li&gt;Caching (por exemplo, Amazon CloudFront, Amazon ElastiCache, AWS Global Accelerator)&lt;/li&gt;&#10;&lt;li&gt;Content Delivery Networks (CDNs)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="33-arquitetar-soluções-para-monitoramento-e-observabilidade"&gt;&lt;a href="#33-arquitetar-solu%c3%a7%c3%b5es-para-monitoramento-e-observabilidade" class="header-anchor"&gt;&lt;/a&gt;3.3. Arquitetar soluções para monitoramento e observabilidade.&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;Conhecimento de:&#10;&lt;ul&gt;&#10;&lt;li&gt;Amazon CloudWatch (por exemplo, métricas, logs, alarmes, dashboards)&lt;/li&gt;&#10;&lt;li&gt;AWS X-Ray&lt;/li&gt;&#10;&lt;li&gt;AWS CloudTrail&lt;/li&gt;&#10;&lt;li&gt;AWS Config&lt;/li&gt;&#10;&lt;li&gt;Amazon Kinesis (para ingestão de logs e métricas)&lt;/li&gt;&#10;&lt;li&gt;AWS Systems Manager (por exemplo, OpsCenter, Explorer)&lt;/li&gt;&#10;&lt;li&gt;AWS Health Dashboard&lt;/li&gt;&#10;&lt;li&gt;AWS Trusted Advisor&lt;/li&gt;&#10;&lt;li&gt;Feature flags com CloudWatch Evidently&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="34-arquitetar-soluções-para-segurança-contínua"&gt;&lt;a href="#34-arquitetar-solu%c3%a7%c3%b5es-para-seguran%c3%a7a-cont%c3%adnua" class="header-anchor"&gt;&lt;/a&gt;3.4. Arquitetar soluções para segurança contínua.&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;Conhecimento de:&#10;&lt;ul&gt;&#10;&lt;li&gt;AWS Security Hub, Amazon GuardDuty, Amazon Detective, AWS Inspector&lt;/li&gt;&#10;&lt;li&gt;AWS WAF, AWS Shield&lt;/li&gt;&#10;&lt;li&gt;AWS Firewall Manager&lt;/li&gt;&#10;&lt;li&gt;AWS Certificate Manager (ACM)&lt;/li&gt;&#10;&lt;li&gt;AWS Secrets Manager&lt;/li&gt;&#10;&lt;li&gt;AWS Systems Manager Parameter Store&lt;/li&gt;&#10;&lt;li&gt;AWS Single Sign-On (AWS SSO) / AWS IAM Identity Center&lt;/li&gt;&#10;&lt;li&gt;Princípio do menor privilégio&lt;/li&gt;&#10;&lt;li&gt;Automação de segurança (por exemplo, AWS Security Hub, AWS Config Rules)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="domínio-4-acelerar-a-migração-e-modernização-de-workloads"&gt;&lt;a href="#dom%c3%adnio-4-acelerar-a-migra%c3%a7%c3%a3o-e-moderniza%c3%a7%c3%a3o-de-workloads" class="header-anchor"&gt;&lt;/a&gt;Domínio 4: Acelerar a Migração e Modernização de Workloads&#10;&lt;/h2&gt;&lt;p&gt;Este domínio aborda as estratégias e ferramentas para migrar e modernizar workloads para a AWS, incluindo a avaliação, planejamento e execução de migrações complexas.&lt;/p&gt;&#10;&lt;h3 id="tópicos-e-subtópicos-3"&gt;&lt;a href="#t%c3%b3picos-e-subt%c3%b3picos-3" class="header-anchor"&gt;&lt;/a&gt;Tópicos e Subtópicos:&#10;&lt;/h3&gt;&lt;h4 id="41-arquitetar-estratégias-de-migração"&gt;&lt;a href="#41-arquitetar-estrat%c3%a9gias-de-migra%c3%a7%c3%a3o" class="header-anchor"&gt;&lt;/a&gt;4.1. Arquitetar estratégias de migração.&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;Conhecimento de:&#10;&lt;ul&gt;&#10;&lt;li&gt;Estratégias de migração (por exemplo, 7 Rs: Rehost, Replatform, Refactor/Re-architect, Repurchase, Retain, Retire, Relocate)&lt;/li&gt;&#10;&lt;li&gt;AWS Migration Acceleration Program (MAP)&lt;/li&gt;&#10;&lt;li&gt;AWS Application Migration Service (AWS MGN)&lt;/li&gt;&#10;&lt;li&gt;AWS Database Migration Service (AWS DMS)&lt;/li&gt;&#10;&lt;li&gt;AWS Schema Conversion Tool (AWS SCT)&lt;/li&gt;&#10;&lt;li&gt;AWS DataSync&lt;/li&gt;&#10;&lt;li&gt;AWS Snow Family&lt;/li&gt;&#10;&lt;li&gt;AWS Transfer Family&lt;/li&gt;&#10;&lt;li&gt;AWS Direct Connect&lt;/li&gt;&#10;&lt;li&gt;AWS VPN&lt;/li&gt;&#10;&lt;li&gt;AWS CloudEndure Migration&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="42-arquitetar-estratégias-de-modernização"&gt;&lt;a href="#42-arquitetar-estrat%c3%a9gias-de-moderniza%c3%a7%c3%a3o" class="header-anchor"&gt;&lt;/a&gt;4.2. Arquitetar estratégias de modernização.&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;Conhecimento de:&#10;&lt;ul&gt;&#10;&lt;li&gt;Modernização de aplicações (por exemplo, microsserviços, serverless, containers)&lt;/li&gt;&#10;&lt;li&gt;Refatoração de código&lt;/li&gt;&#10;&lt;li&gt;Uso de serviços gerenciados (por exemplo, Amazon RDS, Amazon DynamoDB, AWS Lambda)&lt;/li&gt;&#10;&lt;li&gt;Integração de serviços (por exemplo, Amazon EventBridge, AWS Step Functions)&lt;/li&gt;&#10;&lt;li&gt;Padrões de modernização (por exemplo, Strangler Fig, Branch by Abstraction)&lt;/li&gt;&#10;&lt;li&gt;Ferramentas de modernização (por exemplo, AWS Migration Hub Refactor Spaces, AWS App2Container)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="43-arquitetar-estratégias-de-otimização-de-custos"&gt;&lt;a href="#43-arquitetar-estrat%c3%a9gias-de-otimiza%c3%a7%c3%a3o-de-custos" class="header-anchor"&gt;&lt;/a&gt;4.3. Arquitetar estratégias de otimização de custos.&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;Conhecimento de:&#10;&lt;ul&gt;&#10;&lt;li&gt;AWS Well-Architected Framework (Pilar de Otimização de Custos)&lt;/li&gt;&#10;&lt;li&gt;Modelos de precificação da AWS (por exemplo, On-Demand, Reserved Instances [RIs], Savings Plans, Spot Instances)&lt;/li&gt;&#10;&lt;li&gt;Otimização de recursos (por exemplo, dimensionamento correto, desligamento de recursos ociosos)&lt;/li&gt;&#10;&lt;li&gt;AWS Cost Explorer, AWS Budgets, AWS Cost Anomaly Detection&lt;/li&gt;&#10;&lt;li&gt;AWS Compute Optimizer&lt;/li&gt;&#10;&lt;li&gt;AWS Trusted Advisor (Otimização de Custos)&lt;/li&gt;&#10;&lt;li&gt;Políticas de ciclo de vida do Amazon S3&lt;/li&gt;&#10;&lt;li&gt;Otimização de rede (por exemplo, uso de CloudFront, Direct Connect)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="novidades-relevantes-exemplos"&gt;&lt;a href="#novidades-relevantes-exemplos" class="header-anchor"&gt;&lt;/a&gt;Novidades Relevantes (Exemplos)&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;IAM Roles Anywhere&lt;/li&gt;&#10;&lt;li&gt;VPC Lattice&lt;/li&gt;&#10;&lt;li&gt;CloudFront Signed URLs&lt;/li&gt;&#10;&lt;li&gt;Feature flags com CloudWatch Evidently&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="tabelas-comparativas-e-cenários-práticos"&gt;&lt;a href="#tabelas-comparativas-e-cen%c3%a1rios-pr%c3%a1ticos" class="header-anchor"&gt;&lt;/a&gt;Tabelas Comparativas e Cenários Práticos&#10;&lt;/h2&gt;&lt;p&gt;Esta seção será preenchida com tabelas comparativas detalhadas, exemplos de cenários práticos que caem na prova, decisões arquiteturais e armadilhas comuns, consolidando o aprendizado e facilitando a consulta rápida.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;Este documento será continuamente expandido e detalhado em cada um dos tópicos e subtópicos listados, fornecendo um guia completo para a preparação do exame SAP-C02.&lt;/p&gt;&#10;&lt;h3 id="11-arquitetar-estratégias-de-conectividade-de-rede-1"&gt;&lt;a href="#11-arquitetar-estrat%c3%a9gias-de-conectividade-de-rede-1" class="header-anchor"&gt;&lt;/a&gt;1.1. Arquitetar estratégias de conectividade de rede.&#10;&lt;/h3&gt;&lt;h4 id="conceitos-fundamentais-e-avançados"&gt;&lt;a href="#conceitos-fundamentais-e-avan%c3%a7ados" class="header-anchor"&gt;&lt;/a&gt;Conceitos Fundamentais e Avançados&#10;&lt;/h4&gt;&lt;p&gt;A conectividade de rede em um ambiente AWS complexo é a espinha dorsal de qualquer arquitetura bem-sucedida. Ela abrange desde a conectividade básica dentro de uma VPC até topologias de rede híbridas e globais. O exame SAP-C02 espera que o candidato tenha um profundo conhecimento sobre como projetar, proteger e otimizar essas conexões.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Infraestrutura Global da AWS:&lt;/strong&gt; A AWS possui uma infraestrutura global composta por Regiões, Zonas de Disponibilidade (AZs), Local Zones, Wavelength Zones e Pontos de Presença (PoPs). Compreender como esses componentes se interligam é fundamental. As Regiões são geograficamente isoladas, enquanto as AZs dentro de uma Região são conectadas com baixa latência. Local Zones e Wavelength Zones estendem os serviços da AWS para mais perto dos usuários finais ou de dispositivos 5G, respectivamente, para aplicações de latência ultrabaixa.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Amazon VPC:&lt;/strong&gt; A VPC é o bloco de construção fundamental para a rede na AWS. Permite provisionar uma seção logicamente isolada da Nuvem AWS, onde você pode lançar recursos da AWS em uma rede virtual que você define. Você tem controle total sobre seu ambiente de rede virtual, incluindo a seleção de seu próprio intervalo de endereços IP, criação de sub-redes e configuração de tabelas de rotas e gateways de rede.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Conectividade Híbrida:&lt;/strong&gt; A conectividade híbrida refere-se à conexão de sua rede on-premises com a sua VPC na AWS. As duas principais opções para isso são:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Direct Connect (DX):&lt;/strong&gt; Fornece uma conexão de rede privada e dedicada de seu data center para a AWS. O Direct Connect pode reduzir os custos de rede, aumentar a largura de banda e fornecer uma experiência de rede mais consistente do que as conexões baseadas na Internet.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Site-to-Site VPN:&lt;/strong&gt; Cria uma conexão segura entre sua rede on-premises e suas VPCs. As conexões VPN são estabelecidas através da Internet pública e são criptografadas com IPsec.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Roteamento Transitivo:&lt;/strong&gt; Em uma topologia de rede complexa com múltiplas VPCs e conexões on-premises, o roteamento transitivo torna-se essencial. O AWS Transit Gateway (TGW) é um serviço gerenciado que atua como um hub central para conectar suas VPCs e redes on-premises. Ele simplifica a topologia de rede, eliminando a necessidade de conexões de emparelhamento de VPC (VPC Peering) complexas e full-mesh.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;DNS Híbrido:&lt;/strong&gt; O Amazon Route 53 Resolver permite a resolução de DNS bidirecional entre suas redes on-premises e a AWS. Você pode criar endpoints do Route 53 Resolver em suas VPCs que encaminham consultas de DNS de seus sistemas on-premises para o Route 53 e vice-versa. Isso é crucial para que os aplicativos em ambos os ambientes possam se comunicar usando nomes de domínio familiares.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Segmentação de Rede:&lt;/strong&gt; A segmentação de rede é uma prática de segurança fundamental que envolve a divisão de uma rede em sub-redes menores e isoladas. Na AWS, isso é alcançado através do uso de VPCs, sub-redes, Network Access Control Lists (NACLs) e Security Groups. A segmentação ajuda a conter o impacto de uma violação de segurança e a aplicar políticas de segurança granulares.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Monitoramento de Tráfego de Rede:&lt;/strong&gt; Para garantir a segurança e a performance de sua rede, é essencial monitorar o tráfego. A AWS oferece várias ferramentas para isso, incluindo:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;VPC Flow Logs:&lt;/strong&gt; Captura informações sobre o tráfego IP que entra e sai das interfaces de rede em sua VPC.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS CloudTrail:&lt;/strong&gt; Registra todas as chamadas de API feitas em sua conta, incluindo as relacionadas a alterações na configuração da rede.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon CloudWatch:&lt;/strong&gt; Coleta e monitora métricas de rede de vários serviços da AWS, permitindo que você crie alarmes e dashboards.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="comparações-entre-serviços-e-quando-usar-cada-um"&gt;&lt;a href="#compara%c3%a7%c3%b5es-entre-servi%c3%a7os-e-quando-usar-cada-um" class="header-anchor"&gt;&lt;/a&gt;Comparações entre Serviços e Quando Usar Cada Um&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;AWS Transit Gateway vs. VPC Peering:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;VPC Peering:&lt;/strong&gt; É uma conexão de rede entre duas VPCs que permite que elas se comuniquem como se estivessem na mesma rede. O VPC Peering é ideal para um número pequeno de VPCs. No entanto, ele não suporta roteamento transitivo (ou seja, se a VPC A está emparelhada com a VPC B e a VPC B está emparelhada com a VPC C, a VPC A não pode se comunicar com a VPC C através da VPC B). Isso leva a uma topologia de malha complexa à medida que o número de VPCs aumenta.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Transit Gateway:&lt;/strong&gt; Atua como um hub central que conecta múltiplas VPCs e redes on-premises. Ele simplifica o gerenciamento da rede, pois cada VPC só precisa se conectar ao Transit Gateway. O TGW suporta roteamento transitivo e é a solução recomendada para arquiteturas com um grande número de VPCs.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;AWS Direct Connect vs. AWS Site-to-Site VPN:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Site-to-Site VPN:&lt;/strong&gt; É uma solução rápida e de baixo custo para estabelecer uma conexão segura entre sua rede on-premises e a AWS. No entanto, como a conexão é feita pela Internet pública, a performance pode ser inconsistente.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Direct Connect:&lt;/strong&gt; Oferece uma conexão privada e dedicada com alta largura de banda e performance consistente. É a escolha ideal para workloads que exigem alta performance, baixa latência e segurança aprimorada. O custo inicial do Direct Connect é maior do que o da VPN.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="configurações-limitações-boas-práticas-e-casos-de-uso"&gt;&lt;a href="#configura%c3%a7%c3%b5es-limita%c3%a7%c3%b5es-boas-pr%c3%a1ticas-e-casos-de-uso" class="header-anchor"&gt;&lt;/a&gt;Configurações, Limitações, Boas Práticas e Casos de Uso&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;AWS Transit Gateway:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configuração:&lt;/strong&gt; Crie um Transit Gateway em sua conta e anexe suas VPCs e conexões VPN/Direct Connect a ele. Configure as tabelas de rotas do Transit Gateway para controlar o fluxo de tráfego.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Existem limites para o número de anexos, tabelas de rotas e rotas por tabela de rotas. Consulte a documentação da AWS para obter os limites mais recentes.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Use uma conta de rede dedicada para hospedar o Transit Gateway. Use tabelas de rotas separadas para isolar diferentes ambientes (por exemplo, produção, desenvolvimento, teste). Monitore o tráfego do Transit Gateway usando o CloudWatch.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Redes corporativas com múltiplas VPCs, conectividade híbrida em escala, compartilhamento de serviços centralizados.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;AWS Direct Connect:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configuração:&lt;/strong&gt; Solicite uma conexão Direct Connect através do Console da AWS. Trabalhe com um parceiro da AWS para estabelecer a conexão física entre seu data center e um local do Direct Connect. Configure as Virtual Interfaces (VIFs) para se conectar às suas VPCs.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; A largura de banda é limitada pela porta que você provisiona (de 50 Mbps a 100 Gbps). A localização física de seu data center pode ser um fator limitante.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Use conexões redundantes do Direct Connect para alta disponibilidade. Use o Link Aggregation Group (LAG) para combinar várias conexões em uma única conexão lógica de maior largura de banda. Monitore a utilização da conexão.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Migração de grandes volumes de dados, workloads de baixa latência, aplicações que exigem alta largura de banda.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="modelos-de-arquitetura-recomendados-padrões-de-segurança-resiliência-e-governança"&gt;&lt;a href="#modelos-de-arquitetura-recomendados-padr%c3%b5es-de-seguran%c3%a7a-resili%c3%aancia-e-governan%c3%a7a" class="header-anchor"&gt;&lt;/a&gt;Modelos de Arquitetura Recomendados, Padrões de Segurança, Resiliência e Governança&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Arquitetura de Rede Hub-and-Spoke com Transit Gateway:&lt;/strong&gt; Este é o modelo de arquitetura mais comum para redes complexas na AWS. O Transit Gateway atua como o hub, e as VPCs e conexões on-premises são os spokes. Isso simplifica o gerenciamento da rede e melhora a escalabilidade.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Segurança:&lt;/strong&gt; Use NACLs e Security Groups para controlar o tráfego em nível de sub-rede e de instância, respectivamente. Use o AWS Network Firewall para inspecionar e filtrar o tráfego em sua VPC. Use o AWS Shield para proteção contra ataques de DDoS.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Resiliência:&lt;/strong&gt; Projete sua rede para ser altamente disponível, usando múltiplas AZs e Regiões. Use conexões redundantes de VPN e Direct Connect. Use o Route 53 para failover de DNS.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Governança:&lt;/strong&gt; Use o AWS Organizations para gerenciar centralmente suas contas e políticas de rede. Use o AWS Control Tower para provisionar um ambiente de várias contas seguro e bem arquitetado. Use o AWS Resource Access Manager (RAM) para compartilhar recursos de rede, como o Transit Gateway, entre contas.&lt;/p&gt;&#10;&lt;h4 id="estratégias-de-migração-e-modernização"&gt;&lt;a href="#estrat%c3%a9gias-de-migra%c3%a7%c3%a3o-e-moderniza%c3%a7%c3%a3o" class="header-anchor"&gt;&lt;/a&gt;Estratégias de Migração e Modernização&#10;&lt;/h4&gt;&lt;p&gt;Ao migrar para a AWS, comece com uma base de rede sólida. Use o Transit Gateway para conectar suas VPCs e sua rede on-premises. À medida que você moderniza suas aplicações, use serviços como o AWS PrivateLink para expor serviços de forma segura entre VPCs sem expô-los à Internet pública.&lt;/p&gt;&#10;&lt;h4 id="exemplos-de-cenários-práticos-que-caem-na-prova-decisões-arquiteturais-e-armadilhas-comuns"&gt;&lt;a href="#exemplos-de-cen%c3%a1rios-pr%c3%a1ticos-que-caem-na-prova-decis%c3%b5es-arquiteturais-e-armadilhas-comuns" class="header-anchor"&gt;&lt;/a&gt;Exemplos de Cenários Práticos que Caem na Prova, Decisões Arquiteturais e Armadilhas Comuns&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Cenário:&lt;/strong&gt; Uma empresa possui 50 VPCs em uma única Região e precisa que todas elas se comuniquem entre si. Qual a solução mais escalável e gerenciável?&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Decisão Arquitetural:&lt;/strong&gt; Usar o AWS Transit Gateway. O VPC Peering exigiria uma malha de quase 1225 conexões, o que seria impossível de gerenciar.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Armadilha Comum:&lt;/strong&gt; Não entender as implicações de custo do tráfego de dados entre AZs. O tráfego de dados entre AZs incorre em custos, o que pode ser significativo em arquiteturas com alto volume de tráfego. Otimize a localização de seus recursos para minimizar o tráfego entre AZs.&lt;/p&gt;&#10;&lt;h4 id="modelos-de-arquitetura-recomendados-padrões-de-segurança-resiliência-e-governança-1"&gt;&lt;a href="#modelos-de-arquitetura-recomendados-padr%c3%b5es-de-seguran%c3%a7a-resili%c3%aancia-e-governan%c3%a7a-1" class="header-anchor"&gt;&lt;/a&gt;Modelos de Arquitetura Recomendados, Padrões de Segurança, Resiliência e Governança&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Arquitetura de Rede Hub-and-Spoke com Transit Gateway:&lt;/strong&gt; Este é o modelo de arquitetura mais comum para redes complexas na AWS. O Transit Gateway atua como o hub, e as VPCs e conexões on-premises são os spokes. Isso simplifica o gerenciamento da rede e melhora a escalabilidade.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Segurança:&lt;/strong&gt; Use NACLs e Security Groups para controlar o tráfego em nível de sub-rede e de instância, respectivamente. Use o AWS Network Firewall para inspecionar e filtrar o tráfego em sua VPC. Use o AWS Shield para proteção contra ataques de DDoS.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Resiliência:&lt;/strong&gt; Projete sua rede para ser altamente disponível, usando múltiplas AZs e Regiões. Use conexões redundantes de VPN e Direct Connect. Use o Route 53 para failover de DNS.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Governança:&lt;/strong&gt; Use o AWS Organizations para gerenciar centralmente suas contas e políticas de rede. Use o AWS Control Tower para provisionar um ambiente de várias contas seguro e bem arquitetado. Use o AWS Resource Access Manager (RAM) para compartilhar recursos de rede, como o Transit Gateway, entre contas.&lt;/p&gt;&#10;&lt;h4 id="estratégias-de-migração-e-modernização-1"&gt;&lt;a href="#estrat%c3%a9gias-de-migra%c3%a7%c3%a3o-e-moderniza%c3%a7%c3%a3o-1" class="header-anchor"&gt;&lt;/a&gt;Estratégias de Migração e Modernização&#10;&lt;/h4&gt;&lt;p&gt;Ao migrar para a AWS, comece com uma base de rede sólida. Use o Transit Gateway para conectar suas VPCs e sua rede on-premises. À medida que você moderniza suas aplicações, use serviços como o AWS PrivateLink para expor serviços de forma segura entre VPCs sem expô-los à Internet pública.&lt;/p&gt;&#10;&lt;h4 id="exemplos-de-cenários-práticos-que-caem-na-prova-decisões-arquiteturais-e-armadilhas-comuns-1"&gt;&lt;a href="#exemplos-de-cen%c3%a1rios-pr%c3%a1ticos-que-caem-na-prova-decis%c3%b5es-arquiteturais-e-armadilhas-comuns-1" class="header-anchor"&gt;&lt;/a&gt;Exemplos de Cenários Práticos que Caem na Prova, Decisões Arquiteturais e Armadilhas Comuns&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Cenário:&lt;/strong&gt; Uma empresa possui 50 VPCs em uma única Região e precisa que todas elas se comuniquem entre si. Qual a solução mais escalável e gerenciável?&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Decisão Arquitetural:&lt;/strong&gt; Usar o AWS Transit Gateway. O VPC Peering exigiria uma malha de quase 1225 conexões, o que seria impossível de gerenciar.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Armadilha Comum:&lt;/strong&gt; Não entender as implicações de custo do tráfego de dados entre AZs. O tráfego de dados entre AZs incorre em custos, o que pode ser significativo em arquiteturas com alto volume de tráfego. Otimize a localização de seus recursos para minimizar o tráfego entre AZs.&lt;/p&gt;&#10;&lt;h4 id="detalhamento-sobre-políticas-de-iam-scps-redes-multi-vpc-e-multi-região-landing-zones-observabilidade-custos-e-otimização"&gt;&lt;a href="#detalhamento-sobre-pol%c3%adticas-de-iam-scps-redes-multi-vpc-e-multi-regi%c3%a3o-landing-zones-observabilidade-custos-e-otimiza%c3%a7%c3%a3o" class="header-anchor"&gt;&lt;/a&gt;Detalhamento sobre políticas de IAM, SCPs, redes multi-VPC e multi-região, landing zones, observabilidade, custos e otimização&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Estratégias Multi-Account e Landing Zones:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Uma estratégia multi-account é uma prática recomendada pela AWS para isolar workloads, gerenciar custos, aplicar segurança e governança de forma granular. O AWS Organizations permite que você gerencie centralmente várias contas AWS que você possui. Uma &lt;strong&gt;Landing Zone&lt;/strong&gt; é um ambiente AWS bem arquitetado e multi-account que é escalável e seguro, servindo como um ponto de partida para a implantação de workloads. O &lt;strong&gt;AWS Control Tower&lt;/strong&gt; é um serviço que automatiza a configuração de uma landing zone, aplicando as melhores práticas da AWS para identidade, acesso federado e estrutura de contas. Ele cria uma estrutura de Unidades Organizacionais (OUs) e contas pré-configuradas (como Log Archive e Audit), além de configurar &lt;em&gt;guardrails&lt;/em&gt; (políticas de prevenção e detecção).&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Service Control Policies (SCPs):&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;SCPs são um tipo de política que você pode usar para gerenciar permissões em sua organização no AWS Organizations. SCPs oferecem controle centralizado sobre as permissões máximas disponíveis para todas as contas em sua organização ou em OUs específicas. Eles não concedem permissões; em vez disso, eles definem os limites para as permissões que os usuários e funções do IAM podem ter. Por exemplo, você pode usar um SCP para impedir que qualquer conta em uma OU específica lance instâncias EC2 em uma região não aprovada. É uma boa prática testar SCPs em OUs de teste antes de aplicá-los em produção para evitar bloqueios acidentais.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;IAM Avançado:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Permission Boundaries:&lt;/strong&gt; Uma &lt;em&gt;permission boundary&lt;/em&gt; é uma política gerenciada pelo IAM que define as permissões máximas que uma política baseada em identidade pode conceder a uma entidade IAM (usuário ou função). Ela não concede permissões por si só, mas funciona como um filtro para as permissões efetivas. É útil para delegar a criação de funções e usuários sem conceder permissões excessivas.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Attribute-Based Access Control (ABAC):&lt;/strong&gt; ABAC é uma estratégia de autorização que define permissões com base em atributos. Na AWS, esses atributos são chamados de &lt;em&gt;tags&lt;/em&gt;. Você pode projetar permissões que permitem ou negam acesso a recursos com base em tags anexadas a esses recursos, ou tags anexadas ao principal que faz a solicitação. Isso simplifica o gerenciamento de permissões em ambientes dinâmicos e em larga escala.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Roles Cross-Account:&lt;/strong&gt; Funções IAM podem ser usadas para conceder acesso seguro entre contas AWS. Em vez de compartilhar credenciais de acesso de longo prazo, uma função IAM permite que uma conta confie em outra conta para assumir essa função e acessar seus recursos. Isso é fundamental para cenários como implantação de CI/CD, acesso de auditoria ou compartilhamento de recursos.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Redes Multi-VPC e Multi-Região:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Transit Gateway:&lt;/strong&gt; Conforme mencionado, o TGW é a solução preferencial para conectar múltiplas VPCs e redes on-premises, simplificando o roteamento e a conectividade em arquiteturas complexas. Ele suporta conectividade inter-regiões, permitindo que você crie uma rede global.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS PrivateLink:&lt;/strong&gt; Permite que você exponha serviços em sua VPC para outras VPCs (suas ou de outros clientes) ou para redes on-premises, sem expor o tráfego à Internet pública. Isso é ideal para criar conectividade privada e segura para serviços SaaS ou serviços internos compartilhados.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;VPC Peering:&lt;/strong&gt; Embora útil para um número limitado de conexões ponto a ponto, não é escalável para redes complexas devido à sua natureza não transitiva.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;DNS Multi-Região com Amazon Route 53:&lt;/strong&gt; O Route 53 oferece recursos avançados de roteamento de DNS, como roteamento baseado em latência, roteamento de failover e roteamento de geolocalização, que são cruciais para arquiteturas multi-região, garantindo alta disponibilidade e baixa latência para os usuários.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Observabilidade:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Em um ambiente multi-account e complexo, a observabilidade é vital. Ferramentas como &lt;strong&gt;Amazon CloudWatch&lt;/strong&gt; (para métricas e logs centralizados), &lt;strong&gt;AWS X-Ray&lt;/strong&gt; (para rastreamento de requisições distribuídas), &lt;strong&gt;AWS CloudTrail&lt;/strong&gt; (para auditoria de API calls) e &lt;strong&gt;AWS Config&lt;/strong&gt; (para monitoramento de conformidade da configuração dos recursos) são essenciais para ter uma visão unificada do comportamento e da saúde de suas aplicações e infraestrutura.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Custos e Otimização:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Gerenciar custos em um ambiente multi-account requer visibilidade e controle. O &lt;strong&gt;AWS Cost Explorer&lt;/strong&gt; e o &lt;strong&gt;AWS Budgets&lt;/strong&gt; ajudam a monitorar e controlar os gastos. A aplicação de tags consistentes em todos os recursos e contas é fundamental para alocar custos e identificar oportunidades de otimização. O &lt;strong&gt;AWS Compute Optimizer&lt;/strong&gt; fornece recomendações para otimizar o uso de recursos de computação, enquanto o &lt;strong&gt;AWS Trusted Advisor&lt;/strong&gt; oferece insights sobre otimização de custos, segurança, performance e tolerância a falhas.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="domínio-2-design-para-novas-soluções-1"&gt;&lt;a href="#dom%c3%adnio-2-design-para-novas-solu%c3%a7%c3%b5es-1" class="header-anchor"&gt;&lt;/a&gt;Domínio 2: Design para Novas Soluções&#10;&lt;/h2&gt;&lt;p&gt;Este domínio aborda a capacidade de projetar novas soluções na AWS, focando na escolha de serviços, padrões de arquitetura, resiliência, escalabilidade e otimização de performance. É crucial entender as características de cada serviço para tomar decisões arquiteturais informadas que atendam aos requisitos de negócios e técnicos.&lt;/p&gt;&#10;&lt;h3 id="tópicos-e-subtópicos-4"&gt;&lt;a href="#t%c3%b3picos-e-subt%c3%b3picos-4" class="header-anchor"&gt;&lt;/a&gt;Tópicos e Subtópicos:&#10;&lt;/h3&gt;&lt;h4 id="21-arquitetar-soluções-de-computação-1"&gt;&lt;a href="#21-arquitetar-solu%c3%a7%c3%b5es-de-computa%c3%a7%c3%a3o-1" class="header-anchor"&gt;&lt;/a&gt;2.1. Arquitetar soluções de computação.&#10;&lt;/h4&gt;&lt;h4 id="conceitos-fundamentais-e-avançados-1"&gt;&lt;a href="#conceitos-fundamentais-e-avan%c3%a7ados-1" class="header-anchor"&gt;&lt;/a&gt;Conceitos Fundamentais e Avançados&#10;&lt;/h4&gt;&lt;p&gt;A AWS oferece uma vasta gama de serviços de computação, cada um otimizado para diferentes tipos de workloads. A escolha do serviço de computação correto é uma decisão arquitetural crítica que impacta diretamente a escalabilidade, performance, custo e gerenciamento da solução.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon EC2 (Elastic Compute Cloud):&lt;/strong&gt; Fornece capacidade computacional segura e redimensionável na nuvem. É a base para muitas arquiteturas e oferece controle granular sobre as instâncias (tipo, sistema operacional, armazenamento, rede). O EC2 é ideal para workloads que exigem controle total sobre o ambiente de servidor, como aplicações legadas, bancos de dados específicos ou cargas de trabalho que precisam de GPUs.&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Instâncias Spot/Mixed Fleets:&lt;/strong&gt; Instâncias Spot permitem que você solicite capacidade EC2 não utilizada da AWS com grandes descontos. São ideais para workloads tolerantes a falhas, como processamento em lote, renderização ou testes. Mixed Fleets combinam instâncias On-Demand, Reserved Instances e Spot para otimizar custos e disponibilidade.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Auto Scaling:&lt;/strong&gt; Permite escalar automaticamente a capacidade do EC2 para cima ou para baixo de acordo com a demanda. Garante alta disponibilidade e otimização de custos, lançando ou encerrando instâncias automaticamente.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Lambda:&lt;/strong&gt; Um serviço de computação &lt;em&gt;serverless&lt;/em&gt; que permite executar código sem provisionar ou gerenciar servidores. Você paga apenas pelo tempo de computação consumido. Ideal para funções de curta duração, orientadas a eventos, como processamento de dados em tempo real, backends de API ou automação de tarefas. Suporta várias linguagens de programação.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Containers (Amazon ECS, Amazon EKS, AWS Fargate):&lt;/strong&gt; A AWS oferece várias opções para executar workloads em contêineres:&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon Elastic Container Service (ECS):&lt;/strong&gt; Um serviço de orquestração de contêineres totalmente gerenciado que facilita a execução, interrupção e gerenciamento de contêineres Docker em um cluster. É bem integrado com outros serviços AWS.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon Elastic Kubernetes Service (EKS):&lt;/strong&gt; Um serviço gerenciado de Kubernetes que facilita a execução de aplicações Kubernetes na AWS sem a necessidade de instalar, operar e manter seu próprio plano de controle Kubernetes. Ideal para quem já usa Kubernetes ou busca portabilidade.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Fargate:&lt;/strong&gt; Um mecanismo de computação &lt;em&gt;serverless&lt;/em&gt; para contêineres que funciona com ECS e EKS. Com Fargate, você não precisa provisionar, configurar ou escalar clusters de máquinas virtuais. Você paga apenas pelos recursos de computação que seus contêineres usam. Ideal para simplificar a operação de contêineres.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Outposts, Wavelength, Local Zones:&lt;/strong&gt; Estendem a infraestrutura e os serviços da AWS para locais on-premises (Outposts), para a borda da rede 5G (Wavelength) ou para áreas metropolitanas (Local Zones), permitindo que os clientes executem aplicações com baixa latência para usuários finais ou equipamentos locais.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Batch:&lt;/strong&gt; Permite executar workloads de computação em lote em escala. Ele provisiona dinamicamente a quantidade ideal de recursos de computação (EC2, Spot) com base nos requisitos da workload.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS ParallelCluster:&lt;/strong&gt; Uma ferramenta de código aberto que facilita a implantação e o gerenciamento de clusters de computação de alto desempenho (HPC) na AWS.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Serverless Application Model (AWS SAM) e AWS Amplify:&lt;/strong&gt; Ferramentas para simplificar o desenvolvimento e a implantação de aplicações &lt;em&gt;serverless&lt;/em&gt; e web/mobile, respectivamente.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="comparações-entre-serviços-e-quando-usar-cada-um-1"&gt;&lt;a href="#compara%c3%a7%c3%b5es-entre-servi%c3%a7os-e-quando-usar-cada-um-1" class="header-anchor"&gt;&lt;/a&gt;Comparações entre Serviços e Quando Usar Cada Um&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;EC2 vs. Lambda vs. Fargate:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Característica&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Amazon EC2&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;AWS Lambda&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;AWS Fargate&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Nível de Abstração&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Servidores Virtuais (IaaS)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Funções (Serverless, FaaS)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Contêineres (Serverless, CaaS)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Gerenciamento&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Alto (SO, patches, escalabilidade)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Baixo (apenas código)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Médio (apenas contêineres, sem infra)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Escalabilidade&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Auto Scaling Groups (minutos)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Automática (milissegundos)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Automática (segundos)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Custo&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Por hora/segundo (instância)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Por execução e tempo de computação&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Por vCPU e GB de memória por segundo&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Casos de Uso&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Aplicações legadas, DBs, controle total&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Funções orientadas a eventos, APIs sem estado&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Microsserviços, aplicações conteinerizadas&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Tempo de Execução&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Contínuo&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Curta duração (até 15 min)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Longa duração&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Use EC2 quando:&lt;/strong&gt; Você precisa de controle total sobre o sistema operacional, tem aplicações legadas que não podem ser facilmente conteinerizadas ou refatoradas, ou precisa de tipos de instância específicos (GPUs, HPC).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Use Lambda quando:&lt;/strong&gt; Você tem workloads orientadas a eventos, funções de curta duração, precisa de escalabilidade instantânea e não quer gerenciar servidores. Ideal para backends de API, processamento de arquivos, automação.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Use Fargate quando:&lt;/strong&gt; Você quer executar contêineres sem gerenciar a infraestrutura subjacente. Ideal para microsserviços, aplicações web conteinerizadas, onde a portabilidade do contêiner é importante, mas o gerenciamento de VMs não é desejado.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="configurações-limitações-boas-práticas-e-casos-de-uso-1"&gt;&lt;a href="#configura%c3%a7%c3%b5es-limita%c3%a7%c3%b5es-boas-pr%c3%a1ticas-e-casos-de-uso-1" class="header-anchor"&gt;&lt;/a&gt;Configurações, Limitações, Boas Práticas e Casos de Uso&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Amazon EC2:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Escolha o tipo de instância (família, tamanho), AMI (Amazon Machine Image), armazenamento (EBS), rede (VPC, sub-rede, Security Groups). Configure Auto Scaling Groups com políticas de escalabilidade.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Limites de serviço para o número de instâncias, vCPUs, volumes EBS por região. Custos podem escalar rapidamente se não forem otimizados.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Use instâncias Spot para workloads flexíveis. Use Auto Scaling para resiliência e otimização de custos. Use User Data para automação de inicialização. Monitore com CloudWatch.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Servidores web, servidores de aplicação, bancos de dados relacionais (com RDS ou self-managed), clusters de Big Data.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;AWS Lambda:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Defina a função (código), runtime, memória, tempo limite, variáveis de ambiente, gatilhos (eventos). Configure VPC para acesso a recursos privados.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Tempo limite de execução (15 minutos), tamanho do pacote de implantação, memória máxima. Cold starts podem impactar a latência.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Mantenha as funções pequenas e com uma única responsabilidade. Use Provisioned Concurrency para reduzir cold starts em workloads sensíveis à latência. Monitore com CloudWatch Logs e X-Ray.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Processamento de eventos (S3, DynamoDB Streams), backends de API (com API Gateway), chatbots, automação de infraestrutura.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;AWS Fargate (com ECS ou EKS):&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Defina a definição da tarefa (imagem do contêiner, vCPU, memória), políticas de escalabilidade. Integre com Load Balancers e Service Discovery.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Não há acesso ao sistema operacional subjacente. Custos podem ser mais altos que EC2 para workloads de longa duração e alta utilização.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Use imagens de contêiner otimizadas e pequenas. Implemente health checks para garantir a disponibilidade. Monitore com CloudWatch Container Insights.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Microsserviços, APIs conteinerizadas, aplicações web, processamento de dados em contêineres.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="modelos-de-arquitetura-recomendados-padrões-de-segurança-resiliência-e-governança-2"&gt;&lt;a href="#modelos-de-arquitetura-recomendados-padr%c3%b5es-de-seguran%c3%a7a-resili%c3%aancia-e-governan%c3%a7a-2" class="header-anchor"&gt;&lt;/a&gt;Modelos de Arquitetura Recomendados, Padrões de Segurança, Resiliência e Governança&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Arquitetura de Microsserviços:&lt;/strong&gt; Frequentemente implementada com contêineres (ECS/EKS/Fargate) e Lambda para componentes &lt;em&gt;serverless&lt;/em&gt;. Cada serviço é independente, escalável e resiliente.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Padrões de Segurança:&lt;/strong&gt; Use IAM Roles para conceder permissões mínimas aos serviços de computação. Isole recursos em sub-redes privadas. Use Security Groups para controlar o tráfego de rede. Criptografe dados em trânsito e em repouso.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Resiliência:&lt;/strong&gt; Distribua workloads por múltiplas AZs. Use Auto Scaling para lidar com picos de tráfego e falhas de instâncias. Implemente &lt;em&gt;health checks&lt;/em&gt; e &lt;em&gt;circuit breakers&lt;/em&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Governança:&lt;/strong&gt; Use AWS Config para monitorar a conformidade das configurações. Implemente políticas de tagging para rastreamento de custos e recursos.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="estratégias-de-migração-e-modernização-2"&gt;&lt;a href="#estrat%c3%a9gias-de-migra%c3%a7%c3%a3o-e-moderniza%c3%a7%c3%a3o-2" class="header-anchor"&gt;&lt;/a&gt;Estratégias de Migração e Modernização&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Rehost (Lift-and-Shift):&lt;/strong&gt; Migrar VMs on-premises para EC2. É a estratégia mais rápida, mas não aproveita totalmente os benefícios da nuvem.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Replatform:&lt;/strong&gt; Migrar aplicações para EC2 com algumas otimizações, como o uso de RDS para bancos de dados ou Auto Scaling. Pode envolver a conteinerização de aplicações para ECS/EKS.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Refactor/Re-architect:&lt;/strong&gt; Refatorar aplicações para usar serviços &lt;em&gt;serverless&lt;/em&gt; (Lambda, Fargate) e microsserviços. Esta é a estratégia que mais aproveita os benefícios da nuvem, mas também a mais complexa e demorada.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="exemplos-de-cenários-práticos-que-caem-na-prova-decisões-arquiteturais-e-armadilhas-comuns-2"&gt;&lt;a href="#exemplos-de-cen%c3%a1rios-pr%c3%a1ticos-que-caem-na-prova-decis%c3%b5es-arquiteturais-e-armadilhas-comuns-2" class="header-anchor"&gt;&lt;/a&gt;Exemplos de Cenários Práticos que Caem na Prova, Decisões Arquiteturais e Armadilhas Comuns&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Cenário:&lt;/strong&gt; Uma aplicação web tem picos de tráfego imprevisíveis e precisa de escalabilidade rápida e custos otimizados. A aplicação é composta por um frontend estático e um backend de API RESTful.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Decisão Arquitetural:&lt;/strong&gt; Hospedar o frontend estático no Amazon S3 e usar o Amazon CloudFront para entrega de conteúdo. Para o backend, usar AWS Lambda com Amazon API Gateway. Isso proporciona escalabilidade automática, alta disponibilidade e um modelo de custo &lt;em&gt;pay-per-use&lt;/em&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Armadilha Comum:&lt;/strong&gt; Usar EC2 para workloads que seriam mais adequadas para Lambda ou Fargate, resultando em custos mais altos e maior sobrecarga de gerenciamento. Por exemplo, executar um servidor web 24/7 em EC2 para uma aplicação que recebe tráfego apenas algumas horas por dia.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h4 id="22-arquitetar-soluções-de-armazenamento-1"&gt;&lt;a href="#22-arquitetar-solu%c3%a7%c3%b5es-de-armazenamento-1" class="header-anchor"&gt;&lt;/a&gt;2.2. Arquitetar soluções de armazenamento.&#10;&lt;/h4&gt;&lt;h4 id="conceitos-fundamentais-e-avançados-2"&gt;&lt;a href="#conceitos-fundamentais-e-avan%c3%a7ados-2" class="header-anchor"&gt;&lt;/a&gt;Conceitos Fundamentais e Avançados&#10;&lt;/h4&gt;&lt;p&gt;A AWS oferece uma ampla gama de serviços de armazenamento, cada um projetado para diferentes casos de uso, requisitos de performance, durabilidade e custo. A escolha do serviço de armazenamento adequado é crucial para a performance e a economia de uma solução.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon S3 (Simple Storage Service):&lt;/strong&gt; Armazenamento de objetos altamente durável, disponível e escalável. Ideal para armazenar qualquer tipo de dado (imagens, vídeos, backups, logs, arquivos estáticos de sites). Oferece diferentes classes de armazenamento para otimização de custos com base na frequência de acesso.&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Classes de Armazenamento:&lt;/strong&gt; S3 Standard, S3 Intelligent-Tiering, S3 Standard-IA (Infrequent Access), S3 One Zone-IA, S3 Glacier Instant Retrieval, S3 Glacier Flexible Retrieval, S3 Glacier Deep Archive. Cada classe tem um custo e um tempo de recuperação diferentes.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Pontos de Acesso (Access Points):&lt;/strong&gt; Simplificam o gerenciamento de acesso a dados em S3 em escala, permitindo criar centenas de pontos de acesso com políticas de acesso distintas para diferentes aplicações ou usuários.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon Elastic File System (EFS):&lt;/strong&gt; Um sistema de arquivos de rede (NFS) escalável e elástico para instâncias EC2 e on-premises (via Direct Connect ou VPN). Ideal para workloads que precisam de acesso compartilhado a arquivos, como aplicações web, sistemas de gerenciamento de conteúdo e ambientes de desenvolvimento.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon FSx:&lt;/strong&gt; Oferece sistemas de arquivos totalmente gerenciados para workloads específicas:&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;FSx for Lustre:&lt;/strong&gt; Para workloads de computação de alto desempenho (HPC) que exigem armazenamento de arquivos rápido.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;FSx for Windows File Server:&lt;/strong&gt; Para workloads que exigem compartilhamentos de arquivos baseados em Windows com suporte a SMB (Server Message Block).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;FSx for NetApp ONTAP:&lt;/strong&gt; Oferece recursos de gerenciamento de dados do ONTAP com a agilidade e escalabilidade da AWS.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon Elastic Block Store (EBS):&lt;/strong&gt; Fornece volumes de armazenamento em bloco persistentes para uso com instâncias EC2. É como um disco rígido virtual que você pode anexar a uma instância. Ideal para bancos de dados, sistemas de arquivos e qualquer aplicação que precise de armazenamento de baixa latência e alta performance.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Backup:&lt;/strong&gt; Um serviço de backup centralizado e gerenciado que facilita o backup de dados de vários serviços da AWS (EBS, RDS, DynamoDB, EFS, FSx, EC2, Storage Gateway) e on-premises.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon Glacier:&lt;/strong&gt; Uma classe de armazenamento de S3 para arquivamento de dados de longo prazo e baixo custo. Ideal para dados que são acessados raramente, mas que precisam ser retidos por anos ou décadas.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Storage Gateway:&lt;/strong&gt; Conecta ambientes on-premises com o armazenamento em nuvem da AWS, oferecendo gateways de arquivo, volume e fita para diferentes casos de uso de armazenamento híbrido.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Snow Family:&lt;/strong&gt; Dispositivos físicos (Snowcone, Snowball, Snowmobile) para transferir grandes volumes de dados para dentro e para fora da AWS, ou para executar computação na borda em ambientes desconectados ou remotos.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="comparações-entre-serviços-e-quando-usar-cada-um-2"&gt;&lt;a href="#compara%c3%a7%c3%b5es-entre-servi%c3%a7os-e-quando-usar-cada-um-2" class="header-anchor"&gt;&lt;/a&gt;Comparações entre Serviços e Quando Usar Cada Um&#10;&lt;/h4&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Característica&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Amazon S3&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Amazon EFS&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Amazon FSx&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Amazon EBS&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Tipo de Armazenamento&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Objeto&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Arquivo (NFS)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Arquivo (Lustre, SMB, ONTAP)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Bloco&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Casos de Uso&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Dados não estruturados, backups, arquivos estáticos&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Compartilhamento de arquivos, CMS, dev/test&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;HPC, Windows file shares, ONTAP features&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Bancos de dados, SO de EC2, logs de aplicação&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Acesso&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;HTTP/HTTPS, SDKs, APIs&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;NFSv4.1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Lustre, SMB, ONTAP&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Anexado a uma única instância EC2&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Escalabilidade&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Praticamente ilimitada&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Petabytes, elástico&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Petabytes, escalável&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Limitado ao tamanho do volume&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Variável (depende da classe)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Variável (depende do modo)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Alta (Lustre), Média (Windows)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Alta (depende do tipo de volume)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Durabilidade&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;11 noves (99.999999999%)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;11 noves (99.999999999%)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Alta (depende do tipo)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Alta (depende do tipo de volume)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Disponibilidade&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Alta (99.9% a 99.99%)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Multi-AZ&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Multi-AZ (Windows, ONTAP), Single-AZ (Lustre)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Single-AZ (replicado dentro da AZ)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;S3 vs. EFS vs. FSx:&lt;/strong&gt; A principal diferença está no modelo de acesso. S3 é para objetos (acesso via API), EFS e FSx são para arquivos (acesso via sistema de arquivos). A escolha entre EFS e FSx depende do tipo de sistema de arquivos e dos recursos específicos necessários (NFS genérico vs. Lustre/SMB/ONTAP).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;S3 vs. Glacier:&lt;/strong&gt; Glacier é uma classe de armazenamento de S3, otimizada para arquivamento de longo prazo com custos muito baixos, mas com tempos de recuperação mais longos. S3 Standard é para acesso frequente, enquanto as classes IA são para acesso infrequente.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="configurações-limitações-boas-práticas-e-casos-de-uso-2"&gt;&lt;a href="#configura%c3%a7%c3%b5es-limita%c3%a7%c3%b5es-boas-pr%c3%a1ticas-e-casos-de-uso-2" class="header-anchor"&gt;&lt;/a&gt;Configurações, Limitações, Boas Práticas e Casos de Uso&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Amazon S3:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Crie buckets, defina políticas de bucket, configure políticas de ciclo de vida para transição entre classes de armazenamento, configure versionamento, criptografia (SSE-S3, SSE-KMS, SSE-C).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Tamanho máximo de objeto (5 TB), limites de taxa de requisições por prefixo.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Use políticas de ciclo de vida para otimizar custos. Habilite o versionamento para proteção contra exclusão acidental. Use &lt;em&gt;Access Points&lt;/em&gt; para gerenciar o acesso em escala. Use criptografia por padrão.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Data lakes, backups, hospedagem de sites estáticos, armazenamento de logs, distribuição de conteúdo.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Amazon EFS:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Crie um sistema de arquivos EFS, defina modos de performance (General Purpose, Max I/O), modos de throughput (Bursting, Provisioned), crie &lt;em&gt;mount targets&lt;/em&gt; em suas VPCs.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Latência um pouco maior que EBS para acesso de bloco. Custo pode ser mais alto para workloads que não precisam de compartilhamento.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Use o modo General Purpose para a maioria das workloads. Use o modo Max I/O para workloads com alta concorrência. Monitore o throughput e o uso de burst credits.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Diretórios home de usuários, ambientes de desenvolvimento compartilhados, sistemas de gerenciamento de conteúdo (CMS), workloads de Big Data.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Amazon EBS:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Escolha o tipo de volume (gp2/gp3, io1/io2, st1, sc1), tamanho, IOPS/throughput. Crie snapshots para backup. Anexe a instâncias EC2.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Anexado a uma única instância EC2 por vez. Performance varia com o tipo de volume.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Use gp3 para a maioria das workloads. Use io2 Block Express para workloads de alta performance. Crie snapshots regularmente para recuperação de desastres. Criptografe volumes EBS por padrão.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Volumes de boot de instâncias EC2, bancos de dados, logs de aplicação, volumes de dados para aplicações que exigem armazenamento persistente e de baixa latência.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="modelos-de-arquitetura-recomendados-padrões-de-segurança-resiliência-e-governança-3"&gt;&lt;a href="#modelos-de-arquitetura-recomendados-padr%c3%b5es-de-seguran%c3%a7a-resili%c3%aancia-e-governan%c3%a7a-3" class="header-anchor"&gt;&lt;/a&gt;Modelos de Arquitetura Recomendados, Padrões de Segurança, Resiliência e Governança&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Data Lake no S3:&lt;/strong&gt; Armazene dados brutos e processados no S3, usando diferentes classes de armazenamento para otimização de custos. Integre com serviços como AWS Glue, Amazon Athena e Amazon Redshift Spectrum para análise.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Armazenamento Compartilhado para Aplicações Web:&lt;/strong&gt; Use EFS para compartilhar arquivos de conteúdo entre múltiplos servidores web EC2 em um Auto Scaling Group.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Padrões de Segurança:&lt;/strong&gt; Use políticas de bucket S3, ACLs e políticas de ponto de acesso para controlar o acesso. Use IAM Roles para acesso a serviços de armazenamento. Criptografe dados em repouso (SSE-S3, SSE-KMS) e em trânsito (SSL/TLS). Use o AWS PrivateLink para acesso privado a S3 de dentro da VPC.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Resiliência:&lt;/strong&gt; S3, EFS e FSx for Windows/ONTAP são projetados para alta durabilidade e disponibilidade multi-AZ. Para EBS, use snapshots para backup e replicação entre AZs para recuperação de desastres.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Governança:&lt;/strong&gt; Use AWS Config para monitorar a conformidade das configurações de armazenamento. Implemente políticas de ciclo de vida para gerenciar o ciclo de vida dos dados e otimizar custos.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="estratégias-de-migração-e-modernização-3"&gt;&lt;a href="#estrat%c3%a9gias-de-migra%c3%a7%c3%a3o-e-moderniza%c3%a7%c3%a3o-3" class="header-anchor"&gt;&lt;/a&gt;Estratégias de Migração e Modernização&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Migração de Dados:&lt;/strong&gt; Use AWS DataSync para transferir grandes volumes de dados de on-premises para S3, EFS ou FSx. Use o AWS Snow Family para migrações offline de petabytes de dados.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Modernização:&lt;/strong&gt; Substitua servidores de arquivos on-premises por EFS ou FSx. Migre bancos de dados para RDS ou DynamoDB, que usam EBS e S3 internamente. Refatore aplicações para usar S3 para armazenamento de objetos em vez de sistemas de arquivos locais.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="exemplos-de-cenários-práticos-que-caem-na-prova-decisões-arquiteturais-e-armadilhas-comuns-3"&gt;&lt;a href="#exemplos-de-cen%c3%a1rios-pr%c3%a1ticos-que-caem-na-prova-decis%c3%b5es-arquiteturais-e-armadilhas-comuns-3" class="header-anchor"&gt;&lt;/a&gt;Exemplos de Cenários Práticos que Caem na Prova, Decisões Arquiteturais e Armadilhas Comuns&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Cenário:&lt;/strong&gt; Uma aplicação de análise de Big Data gera grandes volumes de dados que precisam ser armazenados de forma econômica e acessados ocasionalmente para relatórios históricos.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Decisão Arquitetural:&lt;/strong&gt; Armazenar os dados no Amazon S3 com políticas de ciclo de vida para transicionar dados mais antigos para S3 Intelligent-Tiering e, eventualmente, para S3 Glacier Deep Archive. Isso otimiza os custos de armazenamento enquanto mantém os dados acessíveis quando necessário.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Armadilha Comum:&lt;/strong&gt; Usar S3 Standard para dados que são acessados raramente, resultando em custos de armazenamento desnecessariamente altos. Ou, inversamente, usar Glacier para dados que precisam de recuperação rápida, incorrendo em custos de recuperação elevados e atrasos.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h4 id="23-arquitetar-soluções-de-banco-de-dados-1"&gt;&lt;a href="#23-arquitetar-solu%c3%a7%c3%b5es-de-banco-de-dados-1" class="header-anchor"&gt;&lt;/a&gt;2.3. Arquitetar soluções de banco de dados.&#10;&lt;/h4&gt;&lt;h4 id="conceitos-fundamentais-e-avançados-3"&gt;&lt;a href="#conceitos-fundamentais-e-avan%c3%a7ados-3" class="header-anchor"&gt;&lt;/a&gt;Conceitos Fundamentais e Avançados&#10;&lt;/h4&gt;&lt;p&gt;A AWS oferece uma ampla variedade de serviços de banco de dados, cobrindo modelos relacionais, NoSQL, data warehousing, grafos, ledger, séries temporais e blockchain. A escolha do banco de dados certo é fundamental para a performance, escalabilidade, resiliência e custo de uma aplicação.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon Relational Database Service (RDS):&lt;/strong&gt; Um serviço de banco de dados relacional gerenciado que facilita a configuração, operação e escalabilidade de bancos de dados relacionais na nuvem. Suporta vários motores de banco de dados (MySQL, PostgreSQL, Oracle, SQL Server, MariaDB).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon Aurora:&lt;/strong&gt; Um banco de dados relacional compatível com MySQL e PostgreSQL, construído para a nuvem. Combina a velocidade e a disponibilidade de bancos de dados comerciais de ponta com a simplicidade e a economia de bancos de dados de código aberto. Oferece até 5x o throughput do MySQL padrão e 3x o do PostgreSQL padrão.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon DynamoDB:&lt;/strong&gt; Um serviço de banco de dados NoSQL de chave-valor e documento totalmente gerenciado que oferece performance de milissegundos de dígito único em qualquer escala. Ideal para aplicações que exigem baixa latência e alta taxa de transferência, como jogos, publicidade digital e IoT.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon DocumentDB (com compatibilidade MongoDB):&lt;/strong&gt; Um serviço de banco de dados de documentos totalmente gerenciado que suporta workloads MongoDB. Compatível com as APIs do MongoDB, permitindo que você use o código, drivers e ferramentas do MongoDB existentes.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon Neptune:&lt;/strong&gt; Um serviço de banco de dados de grafo rápido, confiável e totalmente gerenciado. Ideal para construir e executar aplicações que trabalham com conjuntos de dados altamente conectados, como redes sociais, motores de recomendação e detecção de fraudes.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon Redshift:&lt;/strong&gt; Um serviço de data warehouse rápido e totalmente gerenciado em escala de petabytes. Ideal para análise de grandes volumes de dados estruturados e semi-estruturados, permitindo consultas complexas e relatórios.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon ElastiCache:&lt;/strong&gt; Um serviço de cache na memória totalmente gerenciado que suporta Redis e Memcached. Usado para acelerar o desempenho de aplicações web e móveis, recuperando informações de caches na memória de alta velocidade em vez de depender de bancos de dados baseados em disco mais lentos.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon Quantum Ledger Database (QLDB):&lt;/strong&gt; Um banco de dados de ledger totalmente gerenciado que fornece um log de transações transparente, imutável e criptograficamente verificável. Ideal para sistemas que precisam de um registro completo e verificável de todas as alterações de dados, como registros financeiros ou de supply chain.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon Managed Blockchain:&lt;/strong&gt; Um serviço totalmente gerenciado para criar e gerenciar redes de blockchain escaláveis usando frameworks populares como Hyperledger Fabric e Ethereum.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon Keyspaces (para Apache Cassandra):&lt;/strong&gt; Um serviço de banco de dados de tabela ampla, &lt;em&gt;serverless&lt;/em&gt;, compatível com Apache Cassandra. Ideal para workloads Cassandra que precisam de escalabilidade e gerenciamento simplificados.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon Timestream:&lt;/strong&gt; Um serviço de banco de dados de séries temporais rápido, escalável e &lt;em&gt;serverless&lt;/em&gt;. Ideal para aplicações IoT e operacionais que coletam dados de séries temporais em alta velocidade.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Database Migration Service (DMS):&lt;/strong&gt; Ajuda a migrar bancos de dados para a AWS de forma rápida e segura. Suporta migrações homogêneas (por exemplo, Oracle para Oracle) e heterogêneas (por exemplo, Oracle para PostgreSQL).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Schema Conversion Tool (SCT):&lt;/strong&gt; Ajuda a converter o esquema do banco de dados e o código da aplicação de um banco de dados de origem para um banco de dados de destino diferente.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="comparações-entre-serviços-e-quando-usar-cada-um-3"&gt;&lt;a href="#compara%c3%a7%c3%b5es-entre-servi%c3%a7os-e-quando-usar-cada-um-3" class="header-anchor"&gt;&lt;/a&gt;Comparações entre Serviços e Quando Usar Cada Um&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Amazon RDS vs. Amazon Aurora vs. Amazon DynamoDB:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Característica&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Amazon RDS&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Amazon Aurora&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Amazon DynamoDB&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Tipo de Banco de Dados&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Relacional (SQL)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Relacional (SQL) - compatível com MySQL/PostgreSQL&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;NoSQL (Chave-Valor, Documento)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Escalabilidade&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Vertical (maior instância), Leitura (réplicas)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Leitura (até 15 réplicas), Armazenamento automático&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Horizontal (praticamente ilimitada)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Boa, depende do tipo de instância&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Alta (até 5x MySQL, 3x PostgreSQL)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Milissegundos de dígito único em qualquer escala&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Custo&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Por hora/segundo (instância, armazenamento)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Por hora/segundo (instância, armazenamento)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Por throughput provisionado/sob demanda, armazenamento&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Casos de Uso&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Aplicações web tradicionais, ERPs, CRMs&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Aplicações de alta performance, OLTP&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Aplicações de alta taxa de transferência, IoT, jogos, microsserviços&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Gerenciamento&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Gerenciado (SO, patches, backups)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Totalmente gerenciado, auto-reparável&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Totalmente gerenciado, &lt;em&gt;serverless&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Use RDS quando:&lt;/strong&gt; Você precisa de um banco de dados relacional tradicional e quer a conveniência de um serviço gerenciado sem se preocupar com a infraestrutura subjacente. Ideal para a maioria das aplicações web e empresariais que se beneficiam de um esquema fixo e transações ACID.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Use Aurora quando:&lt;/strong&gt; Você precisa de um banco de dados relacional com alta performance, escalabilidade e disponibilidade, superando o RDS padrão. É uma boa escolha para workloads OLTP (Online Transaction Processing) exigentes.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Use DynamoDB quando:&lt;/strong&gt; Você precisa de um banco de dados NoSQL com performance de milissegundos de dígito único em qualquer escala, sem se preocupar com o provisionamento de servidores. Ideal para aplicações com grandes volumes de dados e padrões de acesso flexíveis, como dados de sessão, perfis de usuário, IoT.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Outras Comparações:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;DocumentDB vs. DynamoDB:&lt;/strong&gt; Ambos são NoSQL. DocumentDB é para workloads de documentos compatíveis com MongoDB, enquanto DynamoDB é mais flexível para chave-valor e documentos, com performance garantida em escala.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Redshift vs. RDS/Aurora:&lt;/strong&gt; Redshift é um data warehouse para análise (OLAP), enquanto RDS/Aurora são bancos de dados transacionais (OLTP). Não são substitutos, mas complementares.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ElastiCache vs. Bancos de Dados:&lt;/strong&gt; ElastiCache é um cache na memória para acelerar o acesso a dados frequentemente acessados, reduzindo a carga no banco de dados principal.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="configurações-limitações-boas-práticas-e-casos-de-uso-3"&gt;&lt;a href="#configura%c3%a7%c3%b5es-limita%c3%a7%c3%b5es-boas-pr%c3%a1ticas-e-casos-de-uso-3" class="header-anchor"&gt;&lt;/a&gt;Configurações, Limitações, Boas Práticas e Casos de Uso&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Amazon RDS:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Escolha o motor, tipo de instância, armazenamento, Multi-AZ, réplicas de leitura, grupos de parâmetros e opções.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Escalabilidade vertical limitada pelo tipo de instância. Réplicas de leitura são assíncronas.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Use Multi-AZ para alta disponibilidade. Use réplicas de leitura para escalar workloads de leitura. Monitore métricas de performance e otimize consultas.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Aplicações web e móveis, sistemas de gerenciamento de conteúdo, CRMs, ERPs.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Amazon Aurora:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Escolha o motor (MySQL/PostgreSQL), tipo de instância, configure réplicas de leitura, Aurora Serverless para escalabilidade sob demanda.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Compatibilidade com MySQL/PostgreSQL, mas não 100% idêntico. Custos podem ser mais altos que RDS padrão para workloads de baixa utilização.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Use o endpoint de leitura para distribuir o tráfego de leitura entre as réplicas. Use Aurora Serverless para workloads intermitentes ou imprevisíveis. Monitore com CloudWatch.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Aplicações de alta performance, jogos, SaaS, e-commerce.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Amazon DynamoDB:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Defina tabelas, chaves primárias (partição e sort key), atributos, modos de capacidade (provisionado ou sob demanda), índices secundários globais/locais.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Não é um banco de dados relacional. Não suporta joins complexos ou transações multi-tabela nativamente (embora existam transações para múltiplos itens/tabelas no mesmo account/region).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Projete bem as chaves primárias para distribuir a carga de trabalho. Use o modo sob demanda para workloads imprevisíveis. Use o DynamoDB Accelerator (DAX) para cache na memória. Habilite o DynamoDB Streams para processamento de eventos.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Perfis de usuário, dados de sessão, carrinhos de compras, jogos, IoT, microsserviços sem estado.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="modelos-de-arquitetura-recomendados-padrões-de-segurança-resiliência-e-governança-4"&gt;&lt;a href="#modelos-de-arquitetura-recomendados-padr%c3%b5es-de-seguran%c3%a7a-resili%c3%aancia-e-governan%c3%a7a-4" class="header-anchor"&gt;&lt;/a&gt;Modelos de Arquitetura Recomendados, Padrões de Segurança, Resiliência e Governança&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Arquitetura Orientada a Dados:&lt;/strong&gt; Escolha o banco de dados certo para cada workload, combinando diferentes tipos (relacional para transações, NoSQL para dados flexíveis, data warehouse para análise).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Padrões de Segurança:&lt;/strong&gt; Use IAM Roles para acesso a bancos de dados. Criptografe dados em repouso (KMS) e em trânsito (SSL/TLS). Use Security Groups para controlar o acesso à rede. Implemente o princípio do menor privilégio.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Resiliência:&lt;/strong&gt; Use Multi-AZ para RDS e Aurora para alta disponibilidade. DynamoDB é inerentemente distribuído e resiliente. Use backups e snapshots regulares.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Governança:&lt;/strong&gt; Use AWS Config para monitorar a conformidade das configurações de banco de dados. Implemente políticas de tagging para rastreamento de custos e recursos.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="estratégias-de-migração-e-modernização-4"&gt;&lt;a href="#estrat%c3%a9gias-de-migra%c3%a7%c3%a3o-e-moderniza%c3%a7%c3%a3o-4" class="header-anchor"&gt;&lt;/a&gt;Estratégias de Migração e Modernização&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Migração de Banco de Dados:&lt;/strong&gt; Use AWS DMS para migrar bancos de dados existentes para a AWS, com suporte para migrações homogêneas e heterogêneas. Use AWS SCT para converter esquemas.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Modernização:&lt;/strong&gt; Refatore aplicações para usar bancos de dados &lt;em&gt;serverless&lt;/em&gt; como DynamoDB ou Aurora Serverless. Migre de bancos de dados auto-gerenciados para serviços gerenciados como RDS ou Aurora para reduzir a sobrecarga operacional.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="exemplos-de-cenários-práticos-que-caem-na-prova-decisões-arquiteturais-e-armadilhas-comuns-4"&gt;&lt;a href="#exemplos-de-cen%c3%a1rios-pr%c3%a1ticos-que-caem-na-prova-decis%c3%b5es-arquiteturais-e-armadilhas-comuns-4" class="header-anchor"&gt;&lt;/a&gt;Exemplos de Cenários Práticos que Caem na Prova, Decisões Arquiteturais e Armadilhas Comuns&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Cenário:&lt;/strong&gt; Uma aplicação de e-commerce precisa de um banco de dados para armazenar informações de produtos e pedidos. A aplicação espera um alto volume de transações e precisa de alta disponibilidade e escalabilidade.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Decisão Arquitetural:&lt;/strong&gt; Para informações de produtos e pedidos que exigem um esquema relacional e transações ACID, o Amazon Aurora (compatível com MySQL ou PostgreSQL) com Multi-AZ e réplicas de leitura seria uma excelente escolha devido à sua alta performance e escalabilidade. Para dados de sessão de usuário ou carrinhos de compras (que podem ser mais flexíveis e de alta taxa de transferência), o Amazon DynamoDB seria uma boa opção.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Armadilha Comum:&lt;/strong&gt; Tentar forçar um banco de dados relacional para um caso de uso NoSQL (ou vice-versa). Por exemplo, usar RDS para armazenar dados de IoT de alta taxa de ingestão, o que pode levar a problemas de performance e escalabilidade. Ou usar DynamoDB para dados que exigem joins complexos e transações multi-tabela, o que pode complicar o desenvolvimento e o gerenciamento.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h4 id="24-arquitetar-soluções-de-rede-1"&gt;&lt;a href="#24-arquitetar-solu%c3%a7%c3%b5es-de-rede-1" class="header-anchor"&gt;&lt;/a&gt;2.4. Arquitetar soluções de rede.&#10;&lt;/h4&gt;&lt;h4 id="conceitos-fundamentais-e-avançados-4"&gt;&lt;a href="#conceitos-fundamentais-e-avan%c3%a7ados-4" class="header-anchor"&gt;&lt;/a&gt;Conceitos Fundamentais e Avançados&#10;&lt;/h4&gt;&lt;p&gt;As soluções de rede na AWS são a base para a conectividade de todas as aplicações e serviços. O domínio 2 aprofunda os conceitos de rede, incluindo VPCs, conectividade global e serviços de entrega de conteúdo.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon VPC (Virtual Private Cloud):&lt;/strong&gt; O serviço fundamental para criar sua rede virtual isolada na AWS. Permite definir sub-redes (públicas e privadas), tabelas de rotas, gateways de internet, gateways NAT e endpoints de VPC. É o alicerce para a segurança e o isolamento da rede.&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Endpoints de VPC (Interface e Gateway):&lt;/strong&gt; Permitem que você se conecte a serviços da AWS (como S3 e DynamoDB) e serviços de endpoint de VPC alimentados por PrivateLink sem usar um gateway de internet, um dispositivo NAT ou uma conexão VPN. Isso mantém o tráfego dentro da rede da AWS, aumentando a segurança e reduzindo a latência.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Transit Gateway:&lt;/strong&gt; (Já abordado no Domínio 1) Atua como um hub central para conectar VPCs e redes on-premises, simplificando o roteamento e a conectividade em arquiteturas complexas e multi-contas.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS PrivateLink:&lt;/strong&gt; (Já abordado no Domínio 1) Permite que você exponha serviços em sua VPC para outras VPCs ou para redes on-premises de forma privada e segura, sem expor o tráfego à Internet pública.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;VPC Peering:&lt;/strong&gt; (Já abordado no Domínio 1) Conecta duas VPCs diretamente, permitindo que elas se comuniquem como se estivessem na mesma rede. Ideal para um número limitado de conexões ponto a ponto.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Direct Connect e AWS VPN:&lt;/strong&gt; (Já abordados no Domínio 1) Soluções para conectividade híbrida entre on-premises e AWS, oferecendo conexões privadas e seguras, respectivamente.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon Route 53:&lt;/strong&gt; Um serviço de DNS (Domain Name System) web escalável e altamente disponível. Além da resolução de nomes, oferece recursos avançados de roteamento:&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;DNS Multi-Região:&lt;/strong&gt; Permite rotear o tráfego para recursos em diferentes regiões com base em latência, geolocalização, ponderação ou saúde do recurso, crucial para alta disponibilidade e recuperação de desastres.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Políticas de Roteamento:&lt;/strong&gt; Incluem roteamento simples, ponderado, baseado em latência, failover, geolocalização, multi-valor de resposta e baseado em proximidade (com Global Accelerator).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon CloudFront:&lt;/strong&gt; Um serviço de rede de entrega de conteúdo (CDN) rápido que entrega dados, vídeos, aplicações e APIs com segurança globalmente, com baixa latência e altas velocidades de transferência. Ele armazena em cache o conteúdo em &lt;em&gt;edge locations&lt;/em&gt; (Pontos de Presença) próximos aos usuários.&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;URLs Assinadas e Cookies Assinados:&lt;/strong&gt; Permitem controlar o acesso ao conteúdo do CloudFront, concedendo acesso temporário a usuários específicos. Útil para conteúdo premium ou privado.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Geo-restrições:&lt;/strong&gt; Permitem controlar quais países podem acessar seu conteúdo do CloudFront.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Global Accelerator:&lt;/strong&gt; Um serviço de rede que melhora a disponibilidade e a performance de suas aplicações para usuários globais. Ele roteia o tráfego para o endpoint de aplicação mais saudável e mais próximo usando a rede global da AWS, otimizando a performance em comparação com a Internet pública.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS App Mesh:&lt;/strong&gt; Um &lt;em&gt;service mesh&lt;/em&gt; que fornece visibilidade e controle de rede para suas aplicações baseadas em microsserviços. Ele padroniza como os microsserviços se comunicam, fornecendo recursos como roteamento de tráfego, retries, circuit breaking e métricas.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Cloud Map:&lt;/strong&gt; Um serviço de descoberta de recursos que permite que suas aplicações descubram e se conectem a serviços de nuvem dinamicamente. Ele mantém um registro de todos os seus recursos de aplicação e seus locais, e os atualiza automaticamente.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;VPC Lattice:&lt;/strong&gt; Um novo serviço que simplifica a conectividade, segurança e observabilidade entre serviços em uma arquitetura de microsserviços. Ele permite que você defina políticas de acesso e roteamento em um nível de serviço, independentemente da infraestrutura de rede subjacente. Facilita a comunicação entre serviços em diferentes VPCs e contas.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="comparações-entre-serviços-e-quando-usar-cada-um-4"&gt;&lt;a href="#compara%c3%a7%c3%b5es-entre-servi%c3%a7os-e-quando-usar-cada-um-4" class="header-anchor"&gt;&lt;/a&gt;Comparações entre Serviços e Quando Usar Cada Um&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;AWS Transit Gateway vs. AWS PrivateLink vs. VPC Peering:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Característica&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;VPC Peering&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;AWS Transit Gateway&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;AWS PrivateLink&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Conectividade&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Ponto a ponto (VPC para VPC)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Hub-and-spoke (VPC para VPC, on-premises)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Endpoint privado para serviços&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Roteamento Transitivo&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Não suportado&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Suportado&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Não aplicável (acesso a serviço, não rede)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Escalabilidade&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Baixa (malha complexa)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Alta (hub central)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Alta (para acesso a serviços)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Complexidade&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Baixa para poucas VPCs&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Média para muitas VPCs&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Média (configuração de endpoints e serviços)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Custo&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Baixo para poucas VPCs&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Baseado em anexos e tráfego&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Baseado em endpoints e tráfego&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Casos de Uso&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Conectar 2-3 VPCs&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Redes corporativas, multi-contas, híbridas&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Acesso privado a SaaS, serviços internos&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;CloudFront vs. Global Accelerator:&lt;/strong&gt; Ambos melhoram a performance e a disponibilidade, mas em diferentes camadas. CloudFront é um CDN para conteúdo web (camada 7 - HTTP/HTTPS), otimizando a entrega de conteúdo estático e dinâmico. Global Accelerator opera na camada de rede (camada 4 - TCP/UDP), otimizando o roteamento do tráfego para aplicações, independentemente do protocolo. Use CloudFront para conteúdo web e Global Accelerator para aplicações que não são baseadas em HTTP/HTTPS ou que exigem endereços IP estáticos.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="configurações-limitações-boas-práticas-e-casos-de-uso-4"&gt;&lt;a href="#configura%c3%a7%c3%b5es-limita%c3%a7%c3%b5es-boas-pr%c3%a1ticas-e-casos-de-uso-4" class="header-anchor"&gt;&lt;/a&gt;Configurações, Limitações, Boas Práticas e Casos de Uso&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Amazon VPC:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Defina blocos CIDR, crie sub-redes (públicas/privadas), configure tabelas de rotas, gateways de internet, NAT Gateways, Endpoints de VPC. Use Security Groups e NACLs para controle de tráfego.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Limites de blocos CIDR, número de VPCs, sub-redes, Security Groups por região/conta.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Use um modelo de VPC com sub-redes públicas e privadas. Use NAT Gateways para acesso de saída de sub-redes privadas. Use Endpoints de VPC para acesso seguro a serviços AWS. Monitore Flow Logs para visibilidade do tráfego.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Isolamento de ambientes (dev, test, prod), hospedagem de aplicações multi-tier, redes híbridas.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Amazon Route 53:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Crie zonas hospedadas, registros DNS (A, CNAME, MX, TXT, etc.), configure políticas de roteamento (simples, ponderado, latência, failover, geolocalização).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Limites de zonas hospedadas e registros por zona.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Use políticas de roteamento de failover para alta disponibilidade. Use roteamento baseado em latência para otimizar a performance global. Use &lt;em&gt;health checks&lt;/em&gt; para monitorar a saúde dos endpoints.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Resolução de DNS para domínios, roteamento de tráfego global, failover de aplicações.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Amazon CloudFront:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Crie distribuições, defina origens (S3, EC2, Load Balancers), configure comportamentos de cache, SSL/TLS, URLs/Cookies assinados, geo-restrições.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Custos de transferência de dados podem ser significativos. Invalidações de cache podem levar tempo.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Use para entregar conteúdo estático e dinâmico. Otimize as configurações de cache para melhorar a performance e reduzir custos. Use URLs/Cookies assinados para conteúdo restrito.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Aceleração de sites e aplicações web, streaming de vídeo, distribuição de APIs, entrega de conteúdo de software.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;AWS Global Accelerator:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Crie um acelerador, adicione ouvintes (listeners) e grupos de endpoints (com instâncias EC2, Load Balancers, Elastic IPs). O Global Accelerator fornece dois endereços IP estáticos.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Não é um CDN. Não armazena conteúdo em cache.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Use para aplicações que exigem alta disponibilidade e performance global, especialmente para tráfego não-HTTP/HTTPS. Use com &lt;em&gt;health checks&lt;/em&gt; para rotear para endpoints saudáveis.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Jogos online, VoIP, aplicações financeiras, aplicações que exigem endereços IP estáticos globais.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="modelos-de-arquitetura-recomendados-padrões-de-segurança-resiliência-e-governança-5"&gt;&lt;a href="#modelos-de-arquitetura-recomendados-padr%c3%b5es-de-seguran%c3%a7a-resili%c3%aancia-e-governan%c3%a7a-5" class="header-anchor"&gt;&lt;/a&gt;Modelos de Arquitetura Recomendados, Padrões de Segurança, Resiliência e Governança&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Arquitetura de Rede em Estrela (Hub-and-Spoke):&lt;/strong&gt; Com o Transit Gateway como hub central, conectando VPCs de diferentes ambientes (produção, desenvolvimento, segurança) e redes on-premises.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Padrões de Segurança:&lt;/strong&gt; Implemente o princípio do menor privilégio para acesso à rede. Use Security Groups e NACLs. Use AWS WAF e Shield para proteção de aplicações web. Monitore o tráfego com VPC Flow Logs e CloudWatch.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Resiliência:&lt;/strong&gt; Projete redes multi-AZ e multi-região. Use Load Balancers para distribuir o tráfego. Implemente failover de DNS com Route 53.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Governança:&lt;/strong&gt; Use AWS Organizations para gerenciar contas de rede. Use AWS Config para monitorar a conformidade das configurações de rede. Use AWS Network Manager para gerenciar e monitorar sua rede global.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="estratégias-de-migração-e-modernização-5"&gt;&lt;a href="#estrat%c3%a9gias-de-migra%c3%a7%c3%a3o-e-moderniza%c3%a7%c3%a3o-5" class="header-anchor"&gt;&lt;/a&gt;Estratégias de Migração e Modernização&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Migração de Rede:&lt;/strong&gt; Migre redes on-premises para VPCs usando Direct Connect ou VPN. Consolide redes complexas com VPC Peering em uma arquitetura Transit Gateway.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Modernização:&lt;/strong&gt; Adote VPC Lattice para simplificar a conectividade e segurança de microsserviços. Use CloudFront e Global Accelerator para otimizar a entrega de aplicações globais. Refatore aplicações para usar Endpoints de VPC para acesso privado a serviços AWS.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="exemplos-de-cenários-práticos-que-caem-na-prova-decisões-arquiteturais-e-armadilhas-comuns-5"&gt;&lt;a href="#exemplos-de-cen%c3%a1rios-pr%c3%a1ticos-que-caem-na-prova-decis%c3%b5es-arquiteturais-e-armadilhas-comuns-5" class="header-anchor"&gt;&lt;/a&gt;Exemplos de Cenários Práticos que Caem na Prova, Decisões Arquiteturais e Armadilhas Comuns&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Cenário:&lt;/strong&gt; Uma empresa tem uma aplicação web global que precisa entregar conteúdo estático e dinâmico com baixa latência para usuários em todo o mundo, além de uma API backend que precisa de alta performance e disponibilidade.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Decisão Arquitetural:&lt;/strong&gt; Usar Amazon CloudFront para entregar o conteúdo estático (imagens, CSS, JS) e dinâmico (HTML). Para a API backend, usar AWS Global Accelerator para rotear o tráfego para o endpoint de API mais próximo e saudável, garantindo baixa latência e alta disponibilidade. O CloudFront pode ser configurado para usar o Global Accelerator como origem para a API.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Armadilha Comum:&lt;/strong&gt; Não otimizar o roteamento de DNS ou a entrega de conteúdo para usuários globais, resultando em alta latência e má experiência do usuário. Confundir o propósito de CloudFront e Global Accelerator e usar um onde o outro seria mais apropriado.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h4 id="25-arquitetar-soluções-de-mensageria-e-integração-1"&gt;&lt;a href="#25-arquitetar-solu%c3%a7%c3%b5es-de-mensageria-e-integra%c3%a7%c3%a3o-1" class="header-anchor"&gt;&lt;/a&gt;2.5. Arquitetar soluções de mensageria e integração.&#10;&lt;/h4&gt;&lt;h4 id="conceitos-fundamentais-e-avançados-5"&gt;&lt;a href="#conceitos-fundamentais-e-avan%c3%a7ados-5" class="header-anchor"&gt;&lt;/a&gt;Conceitos Fundamentais e Avançados&#10;&lt;/h4&gt;&lt;p&gt;Serviços de mensageria e integração são cruciais para construir aplicações distribuídas, desacopladas e escaláveis. Eles permitem que diferentes componentes de uma aplicação se comuniquem de forma assíncrona, aumentando a resiliência e a flexibilidade.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon Simple Notification Service (SNS):&lt;/strong&gt; Um serviço de mensagens &lt;em&gt;pub/sub&lt;/em&gt; (publicar/assinar) totalmente gerenciado. Permite enviar mensagens para um grande número de assinantes (aplicações, usuários, outros serviços AWS) de forma assíncrona. Ideal para notificações, fanout de eventos e comunicação entre microsserviços.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon Simple Queue Service (SQS):&lt;/strong&gt; Um serviço de fila de mensagens totalmente gerenciado que permite desacoplar e escalar microsserviços, sistemas distribuídos e aplicações &lt;em&gt;serverless&lt;/em&gt;. As mensagens são armazenadas em uma fila até que um consumidor as processe. Suporta filas padrão (alta taxa de transferência, melhor esforço de ordenação) e filas FIFO (First-In, First-Out - garante ordenação e processamento&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;exatamente uma vez).&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon EventBridge:&lt;/strong&gt; Um barramento de eventos &lt;em&gt;serverless&lt;/em&gt; que facilita a conexão de aplicações usando dados de seus próprios aplicativos, software como serviço (SaaS) e serviços da AWS. Ele permite rotear eventos de várias fontes para destinos como AWS Lambda, Amazon SQS, Amazon SNS e outros. Ideal para arquiteturas orientadas a eventos e integração entre sistemas.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Step Functions:&lt;/strong&gt; Um serviço de fluxo de trabalho &lt;em&gt;serverless&lt;/em&gt; que permite orquestrar funções Lambda e outros serviços AWS para construir aplicações complexas. Ele gerencia o estado, o tratamento de erros e as repetições, tornando a construção de fluxos de trabalho distribuídos mais fácil.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon Kinesis:&lt;/strong&gt; Uma plataforma para streaming de dados em tempo real. Inclui:&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Kinesis Data Streams:&lt;/strong&gt; Para coletar e processar grandes fluxos de dados em tempo real.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Kinesis Data Firehose:&lt;/strong&gt; Para entregar fluxos de dados para destinos como S3, Redshift, Splunk e outros.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Kinesis Data Analytics:&lt;/strong&gt; Para processar e analisar dados de streaming em tempo real usando SQL ou Apache Flink.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon Managed Streaming for Apache Kafka (MSK):&lt;/strong&gt; Um serviço totalmente gerenciado para Apache Kafka, facilitando a construção e execução de aplicações que usam Apache Kafka para processamento de dados em tempo real.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS AppSync:&lt;/strong&gt; Um serviço de GraphQL totalmente gerenciado que facilita o desenvolvimento de aplicações com dados em tempo real e offline. Ele lida com a conexão segura a fontes de dados, como DynamoDB, Lambda e bancos de dados relacionais.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon API Gateway:&lt;/strong&gt; Um serviço totalmente gerenciado que facilita a criação, publicação, manutenção, monitoramento e proteção de APIs em qualquer escala. Atua como um&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;front-door para aplicações, permitindo que os clientes acessem dados, lógica de negócios ou funcionalidades de seus serviços de backend.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS IoT Core:&lt;/strong&gt; Um serviço gerenciado que permite que dispositivos conectados interajam de forma segura e fácil com aplicações em nuvem e outros dispositivos. Ideal para soluções de Internet das Coisas.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="comparações-entre-serviços-e-quando-usar-cada-um-5"&gt;&lt;a href="#compara%c3%a7%c3%b5es-entre-servi%c3%a7os-e-quando-usar-cada-um-5" class="header-anchor"&gt;&lt;/a&gt;Comparações entre Serviços e Quando Usar Cada Um&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;SNS vs. SQS vs. EventBridge:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Característica&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Amazon SNS&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Amazon SQS&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Amazon EventBridge&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Modelo&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Publicar/Assinar (Pub/Sub)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Fila de Mensagens&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Barramento de Eventos&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Entrega&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Push (para múltiplos assinantes)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Pull (por um consumidor)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Roteamento de eventos&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Casos de Uso&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Notificações, fanout, microsserviços&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Desacoplamento, processamento assíncrono&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Arquiteturas orientadas a eventos, integração de SaaS&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Durabilidade&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Mensagens entregues para assinantes ativos&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Mensagens persistentes na fila&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Eventos roteados para destinos&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Ordenação&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Não garantida (padrão)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Não garantida (padrão), FIFO (garantida)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Não garantida&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Retries&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Políticas de repetição para endpoints HTTP/S&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Configurado no consumidor&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Configurado nas regras de destino&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Use SNS quando:&lt;/strong&gt; Você precisa enviar a mesma mensagem para múltiplos assinantes de forma assíncrona. Ideal para notificações (SMS, e-mail, push), fanout de eventos para múltiplos sistemas downstream, ou para acionar várias funções Lambda em paralelo.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Use SQS quando:&lt;/strong&gt; Você precisa desacoplar componentes de uma aplicação, processar mensagens de forma assíncrona e garantir que cada mensagem seja processada uma vez (com filas FIFO). Ideal para filas de trabalho, processamento em lote, ou para lidar com picos de tráfego.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Use EventBridge quando:&lt;/strong&gt; Você precisa construir arquiteturas orientadas a eventos, integrar aplicações com serviços AWS ou SaaS, ou rotear eventos de forma inteligente com base em regras. É mais poderoso que SNS para roteamento de eventos complexos e filtragem.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Kinesis Data Streams vs. SQS:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Kinesis Data Streams:&lt;/strong&gt; Ideal para processamento de dados em tempo real, onde a ordem dos registros é importante e você precisa de múltiplos consumidores para processar o mesmo fluxo de dados. Ex: clickstreams, dados de IoT.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;SQS:&lt;/strong&gt; Ideal para desacoplar componentes e processar mensagens de forma assíncrona, onde cada mensagem é processada por um único consumidor (ou um grupo de consumidores para filas padrão). Ex: filas de tarefas, processamento de pedidos.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="configurações-limitações-boas-práticas-e-casos-de-uso-5"&gt;&lt;a href="#configura%c3%a7%c3%b5es-limita%c3%a7%c3%b5es-boas-pr%c3%a1ticas-e-casos-de-uso-5" class="header-anchor"&gt;&lt;/a&gt;Configurações, Limitações, Boas Práticas e Casos de Uso&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Amazon SNS:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Crie tópicos, adicione assinantes (Lambda, SQS, HTTP/S, e-mail, SMS), defina políticas de acesso. Configure filas de &lt;em&gt;dead-letter&lt;/em&gt; (DLQ) para mensagens não entregues.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Tamanho máximo da mensagem (256 KB). Não garante a ordem de entrega para tópicos padrão.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Use para fanout de eventos. Integre com SQS para durabilidade e processamento assíncrono. Use DLQs para lidar com falhas de entrega.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Notificações de sistema, fanout de eventos de S3, acionamento de múltiplos microsserviços, alertas.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Amazon SQS:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Crie filas (padrão ou FIFO), configure visibilidade de mensagens, atraso, retenção, políticas de acesso. Configure DLQs.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Tamanho máximo da mensagem (256 KB). Filas FIFO têm menor throughput que filas padrão.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Use filas FIFO para workloads que exigem ordenação e processamento exatamente uma vez. Use filas padrão para alta taxa de transferência. Monitore o número de mensagens visíveis e invisíveis.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Filas de trabalho, processamento de pedidos, desacoplamento de microsserviços, processamento de dados em lote.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Amazon EventBridge:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Crie barramentos de eventos, defina regras com padrões de eventos e destinos. Use o Schema Registry para gerenciar esquemas de eventos.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Limites no número de regras e destinos por regra.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Use para construir arquiteturas orientadas a eventos. Use regras para filtrar e rotear eventos para destinos específicos. Use o Schema Registry para garantir a compatibilidade de eventos.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Integração entre serviços AWS, integração com SaaS, auditoria de eventos, automação de fluxos de trabalho.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="modelos-de-arquitetura-recomendados-padrões-de-segurança-resiliência-e-governança-6"&gt;&lt;a href="#modelos-de-arquitetura-recomendados-padr%c3%b5es-de-seguran%c3%a7a-resili%c3%aancia-e-governan%c3%a7a-6" class="header-anchor"&gt;&lt;/a&gt;Modelos de Arquitetura Recomendados, Padrões de Segurança, Resiliência e Governança&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Arquitetura Orientada a Eventos:&lt;/strong&gt; Use EventBridge como o hub central para eventos, com produtores publicando eventos e consumidores reagindo a eles. Isso promove o desacoplamento e a escalabilidade.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Padrões de Segurança:&lt;/strong&gt; Use IAM Roles para conceder permissões mínimas aos produtores e consumidores de mensagens. Criptografe mensagens em trânsito e em repouso. Use políticas de acesso para controlar quem pode publicar ou consumir mensagens.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Resiliência:&lt;/strong&gt; Use filas de mensagens (SQS) para absorver picos de tráfego e garantir a entrega de mensagens. Use DLQs para lidar com mensagens que não podem ser processadas. Implemente retries e backoff exponenciais.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Governança:&lt;/strong&gt; Use AWS CloudTrail para auditar as operações de API em serviços de mensageria. Use AWS Config para monitorar a conformidade das configurações.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="estratégias-de-migração-e-modernização-6"&gt;&lt;a href="#estrat%c3%a9gias-de-migra%c3%a7%c3%a3o-e-moderniza%c3%a7%c3%a3o-6" class="header-anchor"&gt;&lt;/a&gt;Estratégias de Migração e Modernização&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Migração:&lt;/strong&gt; Substitua sistemas de mensageria on-premises por SQS e SNS. Migre sistemas de integração legados para EventBridge para uma abordagem orientada a eventos.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Modernização:&lt;/strong&gt; Refatore aplicações monolíticas em microsserviços que se comunicam via eventos e filas. Adote Step Functions para orquestrar fluxos de trabalho complexos e de longa duração.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="exemplos-de-cenários-práticos-que-caem-na-prova-decisões-arquiteturais-e-armadilhas-comuns-6"&gt;&lt;a href="#exemplos-de-cen%c3%a1rios-pr%c3%a1ticos-que-caem-na-prova-decis%c3%b5es-arquiteturais-e-armadilhas-comuns-6" class="header-anchor"&gt;&lt;/a&gt;Exemplos de Cenários Práticos que Caem na Prova, Decisões Arquiteturais e Armadilhas Comuns&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Cenário:&lt;/strong&gt; Uma aplicação de e-commerce precisa processar pedidos de forma assíncrona. Após um pedido ser feito, várias ações precisam ser executadas: atualizar o estoque, enviar e-mail de confirmação, notificar o sistema de logística e atualizar o CRM.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Decisão Arquitetural:&lt;/strong&gt; O serviço de pedidos publica uma mensagem em uma fila SQS. Um consumidor (por exemplo, uma função Lambda) lê a mensagem da fila e orquestra as ações subsequentes usando AWS Step Functions. O Step Functions pode chamar funções Lambda para atualizar o estoque e o CRM, e publicar em um tópico SNS para enviar o e-mail de confirmação e notificar o sistema de logística. Isso garante que o processamento do pedido seja robusto, escalável e tolerante a falhas.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Armadilha Comum:&lt;/strong&gt; Usar SNS para desacoplar componentes quando SQS seria mais apropriado, resultando em mensagens perdidas se os assinantes não estiverem disponíveis. Ou, inversamente, usar SQS para fanout de eventos, o que exigiria que cada consumidor fizesse &lt;em&gt;polling&lt;/em&gt; da fila, em vez de receber a mensagem por &lt;em&gt;push&lt;/em&gt;.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="domínio-3-melhoria-contínua-para-soluções-existentes-1"&gt;&lt;a href="#dom%c3%adnio-3-melhoria-cont%c3%adnua-para-solu%c3%a7%c3%b5es-existentes-1" class="header-anchor"&gt;&lt;/a&gt;Domínio 3: Melhoria Contínua para Soluções Existentes&#10;&lt;/h2&gt;&lt;p&gt;Este domínio concentra-se na otimização e aprimoramento de arquiteturas existentes para melhorar a performance, resiliência, segurança e eficiência operacional. O foco é garantir que as soluções AWS continuem a atender aos requisitos de negócios em evolução e às melhores práticas da indústria.&lt;/p&gt;&#10;&lt;h3 id="tópicos-e-subtópicos-5"&gt;&lt;a href="#t%c3%b3picos-e-subt%c3%b3picos-5" class="header-anchor"&gt;&lt;/a&gt;Tópicos e Subtópicos:&#10;&lt;/h3&gt;&lt;h4 id="31-arquitetar-soluções-para-alta-disponibilidade-e-resiliência-1"&gt;&lt;a href="#31-arquitetar-solu%c3%a7%c3%b5es-para-alta-disponibilidade-e-resili%c3%aancia-1" class="header-anchor"&gt;&lt;/a&gt;3.1. Arquitetar soluções para alta disponibilidade e resiliência.&#10;&lt;/h4&gt;&lt;h4 id="conceitos-fundamentais-e-avançados-6"&gt;&lt;a href="#conceitos-fundamentais-e-avan%c3%a7ados-6" class="header-anchor"&gt;&lt;/a&gt;Conceitos Fundamentais e Avançados&#10;&lt;/h4&gt;&lt;p&gt;Alta disponibilidade e resiliência são pilares críticos de qualquer arquitetura de nuvem robusta. A AWS oferece uma série de serviços e padrões para garantir que as aplicações permaneçam operacionais mesmo diante de falhas.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Estratégias de Recuperação de Desastres (DR):&lt;/strong&gt; A recuperação de desastres envolve a preparação para a recuperação de um evento que interrompe as operações de negócios. As estratégias de DR são classificadas com base em dois objetivos principais:&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Recovery Time Objective (RTO):&lt;/strong&gt; O tempo máximo aceitável para restaurar o serviço após um desastre. Um RTO baixo significa que o serviço deve ser restaurado rapidamente.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Recovery Point Objective (RPO):&lt;/strong&gt; A quantidade máxima aceitável de perda de dados medida em tempo. Um RPO baixo significa que pouca ou nenhuma perda de dados é tolerada.&#10;As estratégias de DR na AWS incluem:&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Backup e Restauração:&lt;/strong&gt; O método mais simples e de menor custo. Os dados são copiados para outra região ou conta e restaurados em caso de desastre. RTO e RPO são mais altos.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Piloto Leve (Pilot Light):&lt;/strong&gt; Uma versão mínima da aplicação é mantida em execução em uma região de DR. Em caso de desastre, os recursos são escalados para restaurar a funcionalidade completa. RTO e RPO são menores que backup e restauração.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Warm Standby:&lt;/strong&gt; Uma versão em escala reduzida da aplicação está sempre em execução na região de DR, pronta para assumir a carga. RTO e RPO são ainda menores.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Multi-Site Ativo-Ativo (Multi-Region Active-Active):&lt;/strong&gt; A aplicação é executada simultaneamente em múltiplas regiões, com o tráfego roteado para ambas. Oferece o menor RTO e RPO (próximo de zero), mas é a estratégia mais cara e complexa.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Well-Architected Framework (Pilar de Confiabilidade):&lt;/strong&gt; Este pilar fornece diretrizes para projetar sistemas que podem se recuperar de falhas e continuar a funcionar conforme o esperado. Abrange tópicos como recuperação de desastres, design para falhas, gerenciamento de mudanças e monitoramento.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon Route 53:&lt;/strong&gt; Além de ser um serviço DNS, o Route 53 é fundamental para a resiliência, oferecendo:&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Roteamento de Failover:&lt;/strong&gt; Roteia o tráfego para um recurso alternativo se o recurso primário se tornar não saudável.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Roteamento Baseado em Latência:&lt;/strong&gt; Roteia o tráfego para a região da AWS que oferece a menor latência para o usuário.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Global Accelerator:&lt;/strong&gt; Melhora a disponibilidade e a performance de aplicações para usuários globais, roteando o tráfego para o endpoint mais saudável e mais próximo usando a rede global da AWS.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Elastic Load Balancing (ELB):&lt;/strong&gt; Distribui o tráfego de entrada entre múltiplas instâncias de destino em múltiplas Zonas de Disponibilidade, aumentando a disponibilidade e a tolerância a falhas.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon EC2 Auto Scaling:&lt;/strong&gt; Ajusta automaticamente o número de instâncias EC2 em seu grupo de Auto Scaling em resposta a condições definidas, garantindo que a aplicação tenha a capacidade necessária para lidar com a demanda e se recupere de falhas de instâncias.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon CloudFront:&lt;/strong&gt; Atua como um CDN, armazenando em cache o conteúdo em &lt;em&gt;edge locations&lt;/em&gt; próximos aos usuários, o que melhora a performance e a resiliência ao reduzir a carga sobre os servidores de origem.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Shield e AWS WAF:&lt;/strong&gt; Serviços de segurança que protegem contra ataques DDoS (Shield) e fornecem proteção em nível de aplicação contra exploits web comuns (WAF).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Padrões de Resiliência:&lt;/strong&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Circuit Breaker:&lt;/strong&gt; Impede que uma aplicação tente repetidamente uma operação que provavelmente falhará, protegendo o sistema de sobrecarga e permitindo que ele se recupere.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Sagas:&lt;/strong&gt; Um padrão para gerenciar transações distribuídas, garantindo a consistência dos dados em um sistema de microsserviços, mesmo quando as operações falham.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="comparações-entre-serviços-e-quando-usar-cada-um-6"&gt;&lt;a href="#compara%c3%a7%c3%b5es-entre-servi%c3%a7os-e-quando-usar-cada-um-6" class="header-anchor"&gt;&lt;/a&gt;Comparações entre Serviços e Quando Usar Cada Um&#10;&lt;/h4&gt;&lt;p&gt;As estratégias de DR (Backup e Restauração, Piloto Leve, Warm Standby, Multi-Site Ativo-Ativo) são escolhas que dependem diretamente dos requisitos de RTO e RPO. Quanto menores os RTO e RPO desejados, mais complexa e cara será a estratégia.&lt;/p&gt;&#10;&lt;h4 id="configurações-limitações-boas-práticas-e-casos-de-uso-6"&gt;&lt;a href="#configura%c3%a7%c3%b5es-limita%c3%a7%c3%b5es-boas-pr%c3%a1ticas-e-casos-de-uso-6" class="header-anchor"&gt;&lt;/a&gt;Configurações, Limitações, Boas Práticas e Casos de Uso&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Estratégias de DR:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Envolvem a replicação de dados (via S3 Cross-Region Replication, DynamoDB Global Tables, RDS Read Replicas ou DMS), o provisionamento de infraestrutura na região de DR e a configuração de roteamento de DNS (Route 53) para failover.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; O custo e a complexidade aumentam significativamente à medida que RTO e RPO diminuem.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Defina RTO e RPO claros para cada aplicação. Teste regularmente seu plano de DR. Automatize o processo de failover e recuperação sempre que possível.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Backup e Restauração:&lt;/strong&gt; Dados de arquivos, backups de bancos de dados não críticos.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Piloto Leve/Warm Standby:&lt;/strong&gt; Aplicações de negócios críticas que podem tolerar alguns minutos ou horas de inatividade.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Multi-Site Ativo-Ativo:&lt;/strong&gt; Aplicações de missão crítica que exigem alta disponibilidade contínua (ex: serviços financeiros, e-commerce de alto volume).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Amazon EC2 Auto Scaling:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Defina um grupo de Auto Scaling, especifique o tamanho mínimo, desejado e máximo, configure políticas de escalabilidade (simples, baseada em etapas, de rastreamento de destino), e &lt;em&gt;health checks&lt;/em&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; A escalabilidade leva tempo para que novas instâncias sejam provisionadas e inicializadas.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Use métricas de utilização de CPU ou requisições de Load Balancer para escalar. Use &lt;em&gt;warm pools&lt;/em&gt; para reduzir o tempo de inicialização de novas instâncias. Monitore o grupo de Auto Scaling com CloudWatch.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Aplicações web, microsserviços, qualquer workload que precise de escalabilidade elástica e resiliência a falhas de instâncias.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="modelos-de-arquitetura-recomendados-padrões-de-segurança-resiliência-e-governança-7"&gt;&lt;a href="#modelos-de-arquitetura-recomendados-padr%c3%b5es-de-seguran%c3%a7a-resili%c3%aancia-e-governan%c3%a7a-7" class="header-anchor"&gt;&lt;/a&gt;Modelos de Arquitetura Recomendados, Padrões de Segurança, Resiliência e Governança&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Arquitetura Multi-AZ:&lt;/strong&gt; Implante recursos em pelo menos duas Zonas de Disponibilidade dentro de uma região para proteger contra falhas de AZ. Use Load Balancers e Auto Scaling para distribuir o tráfego.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Arquitetura Multi-Região:&lt;/strong&gt; Para os requisitos mais rigorosos de RTO/RPO, implante a aplicação em múltiplas regiões. Use serviços como Route 53 e Global Accelerator para roteamento de tráfego e failover.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Padrões de Segurança:&lt;/strong&gt; Implemente o princípio do menor privilégio. Use Security Groups e NACLs. Criptografe dados em repouso e em trânsito. Use AWS Shield e WAF para proteção de borda.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Resiliência:&lt;/strong&gt; Projete para falhas. Implemente &lt;em&gt;timeouts&lt;/em&gt;, &lt;em&gt;retries&lt;/em&gt; e &lt;em&gt;circuit breakers&lt;/em&gt;. Use filas e mensageria para desacoplar componentes. Teste a resiliência regularmente com &lt;em&gt;Chaos Engineering&lt;/em&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Governança:&lt;/strong&gt; Use AWS Config para monitorar a conformidade das configurações de resiliência. Use AWS Resilience Hub para avaliar e gerenciar a resiliência de suas aplicações.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="estratégias-de-migração-e-modernização-7"&gt;&lt;a href="#estrat%c3%a9gias-de-migra%c3%a7%c3%a3o-e-moderniza%c3%a7%c3%a3o-7" class="header-anchor"&gt;&lt;/a&gt;Estratégias de Migração e Modernização&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Modernização para Resiliência:&lt;/strong&gt; Ao modernizar, refatore aplicações para serem &lt;em&gt;stateless&lt;/em&gt; e use serviços gerenciados que são inerentemente resilientes (ex: DynamoDB Global Tables, Aurora Multi-Master). Adote padrões de microsserviços para isolar falhas.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="exemplos-de-cenários-práticos-que-caem-na-prova-decisões-arquiteturais-e-armadilhas-comuns-7"&gt;&lt;a href="#exemplos-de-cen%c3%a1rios-pr%c3%a1ticos-que-caem-na-prova-decis%c3%b5es-arquiteturais-e-armadilhas-comuns-7" class="header-anchor"&gt;&lt;/a&gt;Exemplos de Cenários Práticos que Caem na Prova, Decisões Arquiteturais e Armadilhas Comuns&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Cenário:&lt;/strong&gt; Uma aplicação de streaming de vídeo de missão crítica precisa de um RTO de segundos e um RPO de zero para seus dados de sessão de usuário.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Decisão Arquitetural:&lt;/strong&gt; Implementar uma estratégia de DR Multi-Site Ativo-Ativo usando DynamoDB Global Tables para os dados de sessão (que oferece replicação multi-região ativa-ativa com RPO próximo de zero) e Amazon Route 53 com roteamento de failover para direcionar o tráfego para a região saudável.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Armadilha Comum:&lt;/strong&gt; Não testar o plano de recuperação de desastres regularmente. Um plano de DR não testado é um plano de DR que provavelmente falhará quando mais for necessário. Outra armadilha é superestimar a resiliência de um serviço sem entender suas limitações (ex: acreditar que Multi-AZ para RDS protege contra falhas de região inteira).&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h4 id="32-arquitetar-soluções-para-otimização-de-performance-1"&gt;&lt;a href="#32-arquitetar-solu%c3%a7%c3%b5es-para-otimiza%c3%a7%c3%a3o-de-performance-1" class="header-anchor"&gt;&lt;/a&gt;3.2. Arquitetar soluções para otimização de performance.&#10;&lt;/h4&gt;&lt;h4 id="conceitos-fundamentais-e-avançados-7"&gt;&lt;a href="#conceitos-fundamentais-e-avan%c3%a7ados-7" class="header-anchor"&gt;&lt;/a&gt;Conceitos Fundamentais e Avançados&#10;&lt;/h4&gt;&lt;p&gt;A otimização de performance na AWS envolve a seleção e configuração de recursos para garantir que as aplicações respondam rapidamente e processem dados de forma eficiente, ao mesmo tempo em que se equilibra com os custos. O Pilar de Eficiência de Performance do AWS Well-Architected Framework fornece diretrizes para isso.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Well-Architected Framework (Pilar de Eficiência de Performance):&lt;/strong&gt; Este pilar foca na capacidade de usar recursos de computação de forma eficiente para atender aos requisitos do sistema e manter essa eficiência à medida que a demanda muda. Abrange tópicos como seleção de recursos, monitoramento, otimização de rede e armazenamento.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Otimização de Computação:&lt;/strong&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Escolha de Instâncias:&lt;/strong&gt; Selecionar o tipo de instância EC2 correto (família, tamanho) para a workload. Instâncias otimizadas para computação, memória, armazenamento ou rede.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Otimização de Contêineres:&lt;/strong&gt; Otimizar imagens de contêiner para serem pequenas e eficientes. Usar Fargate para abstrair o gerenciamento de servidores.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Lambda Provisioned Concurrency:&lt;/strong&gt; Pre-inicializa instâncias de funções Lambda para reduzir &lt;em&gt;cold starts&lt;/em&gt;, melhorando a latência para aplicações sensíveis ao tempo.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Otimização de Armazenamento:&lt;/strong&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Escolha de Classes de S3:&lt;/strong&gt; Usar a classe de armazenamento S3 apropriada (Standard, IA, Glacier) com base na frequência de acesso para otimizar custos e performance de recuperação.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Otimização de EBS:&lt;/strong&gt; Selecionar o tipo de volume EBS correto (gp3, io2 Block Express) e provisionar IOPS/throughput adequados para a workload.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Otimização de EFS/FSx:&lt;/strong&gt; Escolher os modos de performance e throughput corretos para EFS, e o tipo de FSx adequado para o caso de uso (Lustre para HPC, Windows para SMB).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Otimização de Banco de Dados:&lt;/strong&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Escolha de Tipo de DB:&lt;/strong&gt; Selecionar o tipo de banco de dados (relacional, NoSQL, etc.) que melhor se adapta aos padrões de acesso e requisitos de escalabilidade da aplicação.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Otimização de Consultas:&lt;/strong&gt; Otimizar consultas SQL e NoSQL para reduzir o tempo de execução e o consumo de recursos.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Caching com ElastiCache:&lt;/strong&gt; Usar Amazon ElastiCache (Redis ou Memcached) para armazenar em cache dados frequentemente acessados, reduzindo a carga sobre o banco de dados e melhorando a latência.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Otimização de Rede:&lt;/strong&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Direct Connect:&lt;/strong&gt; Para conexões on-premises de alta largura de banda e baixa latência.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Global Accelerator:&lt;/strong&gt; Para roteamento de tráfego global otimizado para aplicações não-HTTP/HTTPS.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;CloudFront:&lt;/strong&gt; Para entrega de conteúdo com baixa latência e alta taxa de transferência via CDN.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Caching:&lt;/strong&gt; Implementar estratégias de cache em diferentes camadas da arquitetura (CDN com CloudFront, cache de aplicação com ElastiCache, cache de DNS com Route 53).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Content Delivery Networks (CDNs):&lt;/strong&gt; Redes de servidores distribuídos geograficamente que entregam conteúdo web e multimídia para usuários com base em sua localização, melhorando a velocidade de carregamento e reduzindo a carga sobre os servidores de origem.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="comparações-entre-serviços-e-quando-usar-cada-um-7"&gt;&lt;a href="#compara%c3%a7%c3%b5es-entre-servi%c3%a7os-e-quando-usar-cada-um-7" class="header-anchor"&gt;&lt;/a&gt;Comparações entre Serviços e Quando Usar Cada Um&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;ElastiCache (Redis vs. Memcached):&lt;/strong&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Redis:&lt;/strong&gt; Mais rico em recursos, suporta estruturas de dados complexas (listas, sets, hashes), persistência de dados, replicação e clustering. Ideal para caching, leaderboards, contadores, filas de mensagens.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Memcached:&lt;/strong&gt; Mais simples, focado em caching de objetos. Ideal para caching de dados simples e escalabilidade horizontal.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="configurações-limitações-boas-práticas-e-casos-de-uso-7"&gt;&lt;a href="#configura%c3%a7%c3%b5es-limita%c3%a7%c3%b5es-boas-pr%c3%a1ticas-e-casos-de-uso-7" class="header-anchor"&gt;&lt;/a&gt;Configurações, Limitações, Boas Práticas e Casos de Uso&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Otimização de Computação (EC2):&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Monitore a utilização de CPU, memória e rede. Use o AWS Compute Optimizer para recomendações de dimensionamento correto.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; A super-provisionamento leva a custos desnecessários; o sub-provisionamento leva a problemas de performance.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Use o tipo de instância mais adequado para a workload. Use Auto Scaling para ajustar a capacidade dinamicamente. Considere instâncias com processadores otimizados (Graviton2/3) para melhor performance/custo.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Aplicações web de alto tráfego, microsserviços, processamento de dados.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Amazon ElastiCache:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Escolha o motor (Redis/Memcached), tipo de nó, número de nós, Multi-AZ, grupos de segurança.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; O cache é volátil (dados podem ser perdidos). Requer lógica de aplicação para gerenciar o cache.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Armazene dados frequentemente acessados e que não mudam com frequência. Implemente estratégias de &lt;em&gt;cache-aside&lt;/em&gt; ou &lt;em&gt;write-through&lt;/em&gt;. Monitore as taxas de &lt;em&gt;cache hit&lt;/em&gt; e &lt;em&gt;miss&lt;/em&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Caching de resultados de consultas de banco de dados, dados de sessão de usuário, rankings de jogos, feeds de notícias.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="modelos-de-arquitetura-recomendados-padrões-de-segurança-resiliência-e-governança-8"&gt;&lt;a href="#modelos-de-arquitetura-recomendados-padr%c3%b5es-de-seguran%c3%a7a-resili%c3%aancia-e-governan%c3%a7a-8" class="header-anchor"&gt;&lt;/a&gt;Modelos de Arquitetura Recomendados, Padrões de Segurança, Resiliência e Governança&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Arquitetura de Caching em Camadas:&lt;/strong&gt; Combine CDN (CloudFront) para cache de borda, ElastiCache para cache de aplicação/banco de dados e cache de objetos em S3 para dados estáticos.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Padrões de Segurança:&lt;/strong&gt; Use IAM Roles para acesso a serviços de cache. Criptografe dados em trânsito e em repouso no cache (Redis suporta criptografia).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Resiliência:&lt;/strong&gt; Use ElastiCache com Multi-AZ para alta disponibilidade. Implemente lógica de &lt;em&gt;fallback&lt;/em&gt; na aplicação caso o cache não esteja disponível.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Governança:&lt;/strong&gt; Use AWS Config para monitorar a conformidade das configurações de performance. Use AWS Trusted Advisor para recomendações de otimização de performance.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="estratégias-de-migração-e-modernização-8"&gt;&lt;a href="#estrat%c3%a9gias-de-migra%c3%a7%c3%a3o-e-moderniza%c3%a7%c3%a3o-8" class="header-anchor"&gt;&lt;/a&gt;Estratégias de Migração e Modernização&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Modernização para Performance:&lt;/strong&gt; Refatore aplicações para serem &lt;em&gt;stateless&lt;/em&gt; e usem cache extensivamente. Migre para serviços &lt;em&gt;serverless&lt;/em&gt; e gerenciados que oferecem escalabilidade e performance otimizadas. Adote microsserviços para isolar e otimizar componentes individualmente.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="exemplos-de-cenários-práticos-que-caem-na-prova-decisões-arquiteturais-e-armadilhas-comuns-8"&gt;&lt;a href="#exemplos-de-cen%c3%a1rios-pr%c3%a1ticos-que-caem-na-prova-decis%c3%b5es-arquiteturais-e-armadilhas-comuns-8" class="header-anchor"&gt;&lt;/a&gt;Exemplos de Cenários Práticos que Caem na Prova, Decisões Arquiteturais e Armadilhas Comuns&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Cenário:&lt;/strong&gt; Uma aplicação de e-commerce sofre com alta latência nas consultas ao banco de dados durante picos de tráfego, impactando a experiência do usuário.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Decisão Arquitetural:&lt;/strong&gt; Implementar Amazon ElastiCache (Redis) para armazenar em cache os resultados de consultas frequentemente acessadas (ex: detalhes de produtos, categorias). A aplicação primeiro verifica o cache; se os dados não estiverem lá, consulta o banco de dados e armazena o resultado no cache para futuras requisições.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Armadilha Comum:&lt;/strong&gt; Caching de dados que mudam com frequência, levando a dados desatualizados. Não invalidar o cache corretamente quando os dados de origem mudam. Não monitorar o cache hit ratio, o que pode indicar que o cache não está sendo eficaz.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h4 id="33-arquitetar-soluções-para-monitoramento-e-observabilidade-1"&gt;&lt;a href="#33-arquitetar-solu%c3%a7%c3%b5es-para-monitoramento-e-observabilidade-1" class="header-anchor"&gt;&lt;/a&gt;3.3. Arquitetar soluções para monitoramento e observabilidade.&#10;&lt;/h4&gt;&lt;h4 id="conceitos-fundamentais-e-avançados-8"&gt;&lt;a href="#conceitos-fundamentais-e-avan%c3%a7ados-8" class="header-anchor"&gt;&lt;/a&gt;Conceitos Fundamentais e Avançados&#10;&lt;/h4&gt;&lt;p&gt;Monitoramento e observabilidade são essenciais para entender o comportamento das aplicações, identificar problemas, otimizar performance e garantir a segurança. A AWS oferece um conjunto robusto de ferramentas para coletar, analisar e visualizar dados de telemetria.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon CloudWatch:&lt;/strong&gt; Um serviço de monitoramento e gerenciamento que fornece dados e insights acionáveis para AWS, aplicações híbridas e on-premises. Ele coleta e rastreia métricas, coleta e monitora arquivos de log, e dispara alarmes com base em limites definidos.&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Métricas:&lt;/strong&gt; Pontos de dados que representam a performance de um recurso ao longo do tempo (ex: utilização de CPU, I/O de disco, requisições de Load Balancer).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Logs:&lt;/strong&gt; Registros de eventos de aplicações e serviços (ex: logs de EC2, Lambda, VPC Flow Logs).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Alarmes:&lt;/strong&gt; Acionam ações (ex: notificação SNS, Auto Scaling) quando uma métrica excede um limite.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Dashboards:&lt;/strong&gt; Visualizações personalizadas de métricas e logs.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS X-Ray:&lt;/strong&gt; Ajuda desenvolvedores a analisar e depurar aplicações distribuídas, como as construídas usando uma arquitetura de microsserviços. Ele fornece uma visão de ponta a ponta das requisições à medida que elas viajam através dos componentes da aplicação, mostrando o desempenho da aplicação, gargalos e erros.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS CloudTrail:&lt;/strong&gt; Registra as chamadas de API da AWS feitas em sua conta, incluindo as feitas por usuários, funções e serviços da AWS. Esses logs de eventos podem ser usados para auditoria de segurança, rastreamento de alterações de recursos e solução de problemas operacionais.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Config:&lt;/strong&gt; Permite avaliar, auditar e avaliar as configurações de seus recursos da AWS. Ele monitora continuamente as configurações dos recursos e as compara com as melhores práticas ou políticas definidas, alertando sobre não conformidades.&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Conformance Packs:&lt;/strong&gt; Coleções de regras e ações do AWS Config que podem ser implantadas como uma única entidade para ajudar a auditar e relatar a conformidade de um grupo de recursos.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon Kinesis (para ingestão de logs e métricas):&lt;/strong&gt; Pode ser usado para coletar grandes volumes de logs e métricas em tempo real de várias fontes para processamento e análise downstream.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Systems Manager (OpsCenter, Explorer):&lt;/strong&gt; Fornece uma visão centralizada de dados operacionais de seus recursos da AWS e permite automatizar a identificação e remediação de problemas.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Health Dashboard:&lt;/strong&gt; Fornece uma visão personalizada da saúde dos serviços da AWS e dos eventos que podem afetar seus recursos.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Trusted Advisor:&lt;/strong&gt; Um serviço que fornece recomendações para otimizar seus recursos da AWS em cinco categorias: otimização de custos, performance, segurança, tolerância a falhas e limites de serviço.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Feature flags com CloudWatch Evidently:&lt;/strong&gt; Permite que os desenvolvedores lancem novos recursos para um subconjunto de usuários, monitorem seu desempenho e impacto, e desativem ou ativem o recurso rapidamente com base em métricas em tempo real. Isso é parte de uma estratégia de &lt;em&gt;observability-driven development&lt;/em&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="comparações-entre-serviços-e-quando-usar-cada-um-8"&gt;&lt;a href="#compara%c3%a7%c3%b5es-entre-servi%c3%a7os-e-quando-usar-cada-um-8" class="header-anchor"&gt;&lt;/a&gt;Comparações entre Serviços e Quando Usar Cada Um&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;CloudWatch vs. X-Ray vs. CloudTrail:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Característica&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Amazon CloudWatch&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;AWS X-Ray&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;AWS CloudTrail&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Propósito&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Monitoramento de performance e logs&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Rastreamento de requisições distribuídas&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Auditoria de API calls e governança&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Dados Coletados&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Métricas, logs, eventos&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Traces de requisições, segmentos, subsegmentos&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Eventos de API (quem, o quê, quando, onde)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Casos de Uso&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Alarmes, dashboards, escalabilidade&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Depuração de microsserviços, análise de latência&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Auditoria de segurança, conformidade, solução de problemas operacionais&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Visão&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Saúde e performance de recursos&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Fluxo de requisições através de serviços&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Histórico de atividades na conta&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Use CloudWatch quando:&lt;/strong&gt; Você precisa monitorar a saúde e a performance de seus recursos e aplicações, coletar logs e configurar alarmes. É a ferramenta central para monitoramento na AWS.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Use X-Ray quando:&lt;/strong&gt; Você precisa entender o fluxo de requisições através de uma aplicação distribuída, identificar gargalos de performance e depurar erros em microsserviços. Complementa o CloudWatch para observabilidade de aplicações.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Use CloudTrail quando:&lt;/strong&gt; Você precisa auditar as atividades em sua conta AWS para segurança, conformidade e solução de problemas. Ele registra todas as ações realizadas na conta.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="configurações-limitações-boas-práticas-e-casos-de-uso-8"&gt;&lt;a href="#configura%c3%a7%c3%b5es-limita%c3%a7%c3%b5es-boas-pr%c3%a1ticas-e-casos-de-uso-8" class="header-anchor"&gt;&lt;/a&gt;Configurações, Limitações, Boas Práticas e Casos de Uso&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Amazon CloudWatch:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Crie alarmes com base em métricas, configure dashboards personalizados, envie logs de aplicações para CloudWatch Logs, use CloudWatch Events para automação.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Retenção de logs e métricas pode ter custos. Granularidade de métricas padrão (1 minuto).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Defina alarmes para métricas críticas. Use logs estruturados (JSON) para facilitar a análise. Crie dashboards para visibilidade rápida. Use CloudWatch Agent para coletar métricas e logs de instâncias EC2 e on-premises.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Monitoramento de utilização de recursos, detecção de erros de aplicação, alertas de segurança, escalabilidade automática.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;AWS X-Ray:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Habilite o X-Ray para seus serviços (Lambda, EC2, ECS), configure o SDK do X-Ray em sua aplicação, use o X-Ray Daemon para enviar dados de trace.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Overhead de performance mínimo na aplicação. Requer instrumentação do código.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Instrumente todos os componentes da aplicação. Use anotações e metadados para adicionar contexto aos traces. Monitore o mapa de serviço do X-Ray para identificar dependências e gargalos.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Depuração de aplicações distribuídas, análise de latência de ponta a ponta, otimização de performance de microsserviços.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;AWS Config:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Habilite o AWS Config para os tipos de recursos desejados, crie regras gerenciadas ou personalizadas, configure &lt;em&gt;conformance packs&lt;/em&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Custos baseados no número de configurações gravadas e regras avaliadas.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Use regras para impor padrões de segurança e conformidade. Use &lt;em&gt;conformance packs&lt;/em&gt; para auditorias de conformidade em larga escala. Integre com AWS Security Hub para agregação de descobertas de segurança.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Auditoria de conformidade, monitoramento de alterações de configuração, detecção de desvios de segurança.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="modelos-de-arquitetura-recomendados-padrões-de-segurança-resiliência-e-governança-9"&gt;&lt;a href="#modelos-de-arquitetura-recomendados-padr%c3%b5es-de-seguran%c3%a7a-resili%c3%aancia-e-governan%c3%a7a-9" class="header-anchor"&gt;&lt;/a&gt;Modelos de Arquitetura Recomendados, Padrões de Segurança, Resiliência e Governança&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Arquitetura de Observabilidade Centralizada:&lt;/strong&gt; Agregue logs e métricas de todas as contas e regiões em uma conta de log centralizada. Use CloudWatch, X-Ray e CloudTrail para uma visão unificada.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Padrões de Segurança:&lt;/strong&gt; Use CloudTrail para auditar todas as ações na conta. Use AWS Config para monitorar a conformidade de segurança. Integre com Security Hub para uma visão consolidada da postura de segurança.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Resiliência:&lt;/strong&gt; Use métricas e alarmes do CloudWatch para detectar problemas e acionar ações de recuperação automática (ex: Auto Scaling, Lambda).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Governança:&lt;/strong&gt; Use AWS Config para garantir que os recursos estejam configurados de acordo com as políticas da organização. Use CloudTrail para rastrear quem fez o quê e quando.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="estratégias-de-migração-e-modernização-9"&gt;&lt;a href="#estrat%c3%a9gias-de-migra%c3%a7%c3%a3o-e-moderniza%c3%a7%c3%a3o-9" class="header-anchor"&gt;&lt;/a&gt;Estratégias de Migração e Modernização&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Modernização para Observabilidade:&lt;/strong&gt; Ao modernizar, adote uma abordagem de &lt;em&gt;observability-driven development&lt;/em&gt;. Instrumente aplicações com X-Ray. Use logs estruturados. Implemente feature flags com CloudWatch Evidently para lançamentos controlados e monitoramento de impacto.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="exemplos-de-cenários-práticos-que-caem-na-prova-decisões-arquiteturais-e-armadilhas-comuns-9"&gt;&lt;a href="#exemplos-de-cen%c3%a1rios-pr%c3%a1ticos-que-caem-na-prova-decis%c3%b5es-arquiteturais-e-armadilhas-comuns-9" class="header-anchor"&gt;&lt;/a&gt;Exemplos de Cenários Práticos que Caem na Prova, Decisões Arquiteturais e Armadilhas Comuns&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Cenário:&lt;/strong&gt; Uma aplicação de microsserviços está apresentando alta latência e erros intermitentes, mas é difícil identificar a causa raiz devido à complexidade da arquitetura distribuída.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Decisão Arquitetural:&lt;/strong&gt; Implementar AWS X-Ray para rastrear as requisições através de todos os microsserviços. O X-Ray fornecerá um mapa de serviço visual, mostrando as dependências, latências em cada etapa e quaisquer erros, permitindo identificar rapidamente o serviço ou componente que está causando o problema.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Armadilha Comum:&lt;/strong&gt; Coletar muitos dados de monitoramento sem ter um plano para analisá-los ou agir sobre eles, resultando em&lt;/p&gt;&#10;&lt;p&gt;ruído e dificultando a identificação de problemas reais. Outra armadilha é não configurar alarmes adequados, o que significa que os problemas só são descobertos quando já estão impactando os usuários.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h4 id="34-arquitetar-soluções-para-segurança-contínua-1"&gt;&lt;a href="#34-arquitetar-solu%c3%a7%c3%b5es-para-seguran%c3%a7a-cont%c3%adnua-1" class="header-anchor"&gt;&lt;/a&gt;3.4. Arquitetar soluções para segurança contínua.&#10;&lt;/h4&gt;&lt;h4 id="conceitos-fundamentais-e-avançados-9"&gt;&lt;a href="#conceitos-fundamentais-e-avan%c3%a7ados-9" class="header-anchor"&gt;&lt;/a&gt;Conceitos Fundamentais e Avançados&#10;&lt;/h4&gt;&lt;p&gt;A segurança na AWS é uma responsabilidade compartilhada entre a AWS e o cliente. A AWS é responsável pela segurança &lt;em&gt;da&lt;/em&gt; nuvem, enquanto o cliente é responsável pela segurança &lt;em&gt;na&lt;/em&gt; nuvem. Este domínio foca em como arquitetar soluções para manter uma postura de segurança robusta e contínua, utilizando os serviços de segurança da AWS.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Security Hub:&lt;/strong&gt; Fornece uma visão abrangente de alto nível da sua postura de segurança na AWS. Ele agrega, organiza e prioriza seus alertas de segurança (ou descobertas) de vários serviços da AWS (como GuardDuty, Inspector, Macie) e de produtos de parceiros da AWS. Permite que você execute verificações de segurança automatizadas em relação aos padrões da indústria e às melhores práticas.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon GuardDuty:&lt;/strong&gt; Um serviço de detecção de ameaças que monitora continuamente atividades maliciosas e comportamentos não autorizados para proteger suas contas e workloads da AWS. Ele usa machine learning, detecção de anomalias e inteligência de ameaças para identificar ameaças como criptomineração, acesso não autorizado a dados e ataques de negação de serviço.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon Detective:&lt;/strong&gt; Um serviço que facilita a análise, investigação e identificação da causa raiz de descobertas de segurança ou atividades suspeitas. Ele coleta automaticamente dados de log de seus recursos da AWS e usa machine learning, análise estatística e teoria dos grafos para construir um modelo unificado de suas atividades, tornando mais fácil conduzir investigações de segurança.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Inspector:&lt;/strong&gt; Um serviço de avaliação de vulnerabilidades automatizado que ajuda a melhorar a segurança e a conformidade de aplicações implantadas na AWS. Ele descobre automaticamente e avalia continuamente instâncias EC2, imagens de contêiner no Amazon ECR e funções Lambda em busca de vulnerabilidades e desvios de melhores práticas.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS WAF (Web Application Firewall):&lt;/strong&gt; Ajuda a proteger suas aplicações web ou APIs contra exploits web comuns que podem afetar a disponibilidade, comprometer a segurança ou consumir recursos excessivos. Permite criar regras personalizadas para bloquear ou permitir tráfego com base em condições que você especifica.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Shield:&lt;/strong&gt; Um serviço de proteção contra ataques de negação de serviço distribuída (DDoS) gerenciado que protege aplicações em execução na AWS. Oferece dois níveis: Standard (proteção automática para todos os clientes AWS) e Advanced (proteção aprimorada para aplicações críticas, com detecção e mitigação mais sofisticadas).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Firewall Manager:&lt;/strong&gt; Um serviço de gerenciamento de segurança que permite configurar e gerenciar centralmente regras de firewall em suas contas e aplicações na AWS Organizations. Simplifica a implantação e a auditoria de regras de AWS WAF, AWS Shield Advanced, Security Groups, AWS Network Firewall e Route 53 Resolver DNS Firewall.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Certificate Manager (ACM):&lt;/strong&gt; Facilita o provisionamento, gerenciamento e implantação de certificados SSL/TLS para uso com serviços AWS (como ELB, CloudFront, API Gateway). Ajuda a proteger a comunicação de rede e estabelecer a identidade de sites e aplicações.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Secrets Manager:&lt;/strong&gt; Ajuda a proteger o acesso às suas aplicações, serviços e recursos de TI. Permite que você gire, gerencie e recupere credenciais de banco de dados, chaves de API e outros segredos durante seu ciclo de vida. Reduz a necessidade de codificar segredos em texto simples.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Systems Manager Parameter Store:&lt;/strong&gt; Fornece armazenamento seguro e hierárquico para dados de configuração e gerenciamento de segredos. Pode ser usado para armazenar senhas, strings de conexão de banco de dados, códigos de licença e outros valores que precisam ser acessados por suas aplicações.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Single Sign-On (AWS SSO) / AWS IAM Identity Center:&lt;/strong&gt; Um serviço de nuvem que facilita o gerenciamento centralizado do acesso a várias contas AWS e aplicações de negócios. Permite que os usuários façam login uma vez para acessar todos os seus recursos e aplicações atribuídos.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Princípio do Menor Privilégio:&lt;/strong&gt; Uma prática de segurança fundamental que afirma que cada usuário, programa ou processo deve ter apenas as permissões mínimas necessárias para executar sua função. Na AWS, isso é implementado através de políticas de IAM granulares.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Automação de Segurança:&lt;/strong&gt; Utilizar serviços como AWS Security Hub e AWS Config Rules para automatizar a detecção de não conformidades de segurança e, em alguns casos, a remediação.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="comparações-entre-serviços-e-quando-usar-cada-um-9"&gt;&lt;a href="#compara%c3%a7%c3%b5es-entre-servi%c3%a7os-e-quando-usar-cada-um-9" class="header-anchor"&gt;&lt;/a&gt;Comparações entre Serviços e Quando Usar Cada Um&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;AWS Security Hub vs. Amazon GuardDuty vs. Amazon Detective vs. AWS Inspector:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Serviço&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Propósito Principal&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Tipo de Análise&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Casos de Uso&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Security Hub&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Visão consolidada da postura de segurança, conformidade&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Agregação e priorização de descobertas, verificações de padrões&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Gerenciamento centralizado de segurança, auditoria de conformidade, relatórios&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;GuardDuty&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Detecção de ameaças e atividades maliciosas&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Machine learning, detecção de anomalias, inteligência de ameaças&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Identificação de comprometimento de contas, acesso não autorizado, criptomineração&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Detective&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Investigação e análise da causa raiz de incidentes&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Análise de grafos, machine learning, dados de log&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Investigação forense, identificação de atividades suspeitas, análise de comportamento&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Inspector&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Avaliação de vulnerabilidades em workloads&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Análise de vulnerabilidades em EC2, contêineres, Lambda&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Identificação de CVEs, desvios de melhores práticas de segurança em aplicações&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Esses serviços são complementares e devem ser usados em conjunto para uma postura de segurança abrangente. O Security Hub atua como um orquestrador e agregador, enquanto GuardDuty, Detective e Inspector fornecem insights específicos sobre ameaças, investigações e vulnerabilidades, respectivamente.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;AWS WAF vs. AWS Shield:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS WAF:&lt;/strong&gt; Protege aplicações web contra ataques em nível de aplicação (Camada 7), como injeção de SQL, cross-site scripting (XSS). Você define as regras para permitir ou bloquear o tráfego.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Shield:&lt;/strong&gt; Protege contra ataques DDoS (Distributed Denial of Service) em níveis de rede (Camada 3) e transporte (Camada 4), e também em nível de aplicação (Camada 7) com o Shield Advanced. É uma proteção mais ampla contra ataques de negação de serviço.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="configurações-limitações-boas-práticas-e-casos-de-uso-9"&gt;&lt;a href="#configura%c3%a7%c3%b5es-limita%c3%a7%c3%b5es-boas-pr%c3%a1ticas-e-casos-de-uso-9" class="header-anchor"&gt;&lt;/a&gt;Configurações, Limitações, Boas Práticas e Casos de Uso&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;AWS Security Hub:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Habilite o Security Hub, integre com outros serviços AWS (GuardDuty, Config, Macie), configure padrões de segurança (AWS Foundational Security Best Practices, CIS AWS Foundations Benchmark).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Requer a habilitação de outros serviços de segurança para coletar descobertas. Não é uma ferramenta de remediação direta.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Use o Security Hub como seu painel central de segurança. Automatize a resposta a descobertas usando EventBridge e Lambda. Revise regularmente as descobertas e priorize a remediação.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Gerenciamento centralizado de segurança, auditoria de conformidade, resposta a incidentes.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Amazon GuardDuty:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Habilite o GuardDuty em todas as regiões. Configure notificações para descobertas de alta severidade.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Não bloqueia o tráfego. Apenas detecta ameaças.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Habilite o GuardDuty em todas as contas e regiões. Integre as descobertas com o Security Hub e sistemas de SIEM. Use para identificar atividades suspeitas em tempo real.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Detecção de comprometimento de credenciais, acesso não autorizado a instâncias, uso de portas incomuns, criptomineração.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;AWS KMS (Key Management Service):&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Crie chaves KMS (chaves de cliente gerenciadas - CMKs), defina políticas de chave, configure rotação de chaves. Use chaves multi-região para replicação de chaves entre regiões.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Custos por chave e por requisição de API. Limites de taxa de requisições.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Use KMS para criptografar dados em repouso em serviços AWS (S3, EBS, RDS, Lambda). Use chaves separadas para diferentes aplicações ou ambientes. Implemente o princípio do menor privilégio para acesso a chaves.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Criptografia de dados em repouso, gerenciamento de chaves de criptografia, assinaturas digitais.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="modelos-de-arquitetura-recomendados-padrões-de-segurança-resiliência-e-governança-10"&gt;&lt;a href="#modelos-de-arquitetura-recomendados-padr%c3%b5es-de-seguran%c3%a7a-resili%c3%aancia-e-governan%c3%a7a-10" class="header-anchor"&gt;&lt;/a&gt;Modelos de Arquitetura Recomendados, Padrões de Segurança, Resiliência e Governança&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Arquitetura de Segurança em Camadas (Defense in Depth):&lt;/strong&gt; Implemente segurança em todas as camadas da arquitetura, desde a rede (VPC, Security Groups, NACLs, WAF, Shield) até a aplicação (IAM, Secrets Manager, KMS) e os dados (criptografia).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Padrões de Segurança:&lt;/strong&gt; Implemente o princípio do menor privilégio em todas as políticas de IAM. Use roles cross-account para acesso seguro entre contas. Automatize a detecção e resposta a incidentes de segurança.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Resiliência:&lt;/strong&gt; Use serviços de segurança gerenciados pela AWS que são inerentemente resilientes (ex: Shield, WAF). Projete para que as falhas de segurança não levem a uma interrupção completa do serviço.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Governança:&lt;/strong&gt; Use AWS Organizations e SCPs para impor políticas de segurança em toda a organização. Use AWS Config e Conformance Packs para monitorar a conformidade de segurança. Realize auditorias de segurança regulares.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="estratégias-de-migração-e-modernização-10"&gt;&lt;a href="#estrat%c3%a9gias-de-migra%c3%a7%c3%a3o-e-moderniza%c3%a7%c3%a3o-10" class="header-anchor"&gt;&lt;/a&gt;Estratégias de Migração e Modernização&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Modernização para Segurança:&lt;/strong&gt; Ao modernizar, adote uma abordagem de segurança &lt;em&gt;shift-left&lt;/em&gt;, integrando a segurança no ciclo de vida de desenvolvimento. Use ferramentas de segurança automatizadas. Migre de gerenciamento de segredos manual para AWS Secrets Manager. Adote ABAC para gerenciamento de permissões escalável.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="exemplos-de-cenários-práticos-que-caem-na-prova-decisões-arquiteturais-e-armadilhas-comuns-10"&gt;&lt;a href="#exemplos-de-cen%c3%a1rios-pr%c3%a1ticos-que-caem-na-prova-decis%c3%b5es-arquiteturais-e-armadilhas-comuns-10" class="header-anchor"&gt;&lt;/a&gt;Exemplos de Cenários Práticos que Caem na Prova, Decisões Arquiteturais e Armadilhas Comuns&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Cenário:&lt;/strong&gt; Uma empresa precisa garantir que nenhuma instância EC2 seja lançada sem criptografia de volume EBS em sua conta de produção, e que todas as atividades suspeitas sejam detectadas e investigadas.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Decisão Arquitetural:&lt;/strong&gt; Usar AWS Config para criar uma regra que detecta instâncias EC2 com volumes EBS não criptografados e, opcionalmente, uma função Lambda para remediar automaticamente. Habilitar Amazon GuardDuty para detecção de ameaças e Amazon Detective para investigação de incidentes. As descobertas de GuardDuty e Config seriam agregadas no AWS Security Hub para uma visão centralizada.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Armadilha Comum:&lt;/strong&gt; Conceder permissões excessivas (privilégio elevado) a usuários ou funções, violando o princípio do menor privilégio. Não revisar regularmente as políticas de IAM e as configurações de segurança. Confiar apenas em uma única camada de segurança, em vez de implementar uma defesa em profundidade.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="domínio-4-otimização-de-custos-e-performance"&gt;&lt;a href="#dom%c3%adnio-4-otimiza%c3%a7%c3%a3o-de-custos-e-performance" class="header-anchor"&gt;&lt;/a&gt;Domínio 4: Otimização de Custos e Performance&#10;&lt;/h2&gt;&lt;p&gt;Este domínio foca na capacidade de projetar soluções que sejam eficientes em termos de custo e performance. Isso envolve a seleção de serviços e recursos apropriados, a implementação de estratégias de otimização e o monitoramento contínuo para garantir que os gastos sejam controlados e que a performance atenda aos requisitos.&lt;/p&gt;&#10;&lt;h3 id="tópicos-e-subtópicos-6"&gt;&lt;a href="#t%c3%b3picos-e-subt%c3%b3picos-6" class="header-anchor"&gt;&lt;/a&gt;Tópicos e Subtópicos:&#10;&lt;/h3&gt;&lt;h4 id="41-arquitetar-soluções-para-otimização-de-custos"&gt;&lt;a href="#41-arquitetar-solu%c3%a7%c3%b5es-para-otimiza%c3%a7%c3%a3o-de-custos" class="header-anchor"&gt;&lt;/a&gt;4.1. Arquitetar soluções para otimização de custos.&#10;&lt;/h4&gt;&lt;h4 id="conceitos-fundamentais-e-avançados-10"&gt;&lt;a href="#conceitos-fundamentais-e-avan%c3%a7ados-10" class="header-anchor"&gt;&lt;/a&gt;Conceitos Fundamentais e Avançados&#10;&lt;/h4&gt;&lt;p&gt;A otimização de custos na AWS é um processo contínuo que visa maximizar o valor dos investimentos na nuvem. O Pilar de Otimização de Custos do AWS Well-Architected Framework fornece diretrizes para alcançar esse objetivo.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Well-Architected Framework (Pilar de Otimização de Custos):&lt;/strong&gt; Este pilar foca na capacidade de executar sistemas para entregar valor de negócio ao menor preço. Abrange tópicos como adoção de um modelo de consumo, medição da eficiência geral, interrupção de gastos com trabalho indiferenciado e análise e atribuição de gastos.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Modelos de Preços da AWS:&lt;/strong&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;On-Demand:&lt;/strong&gt; Pague por capacidade de computação por hora ou segundo, sem compromisso de longo prazo. Ideal para workloads imprevisíveis ou de curta duração.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Reserved Instances (RIs):&lt;/strong&gt; Compromisso de uso de instâncias EC2, RDS, Redshift, ElastiCache por 1 ou 3 anos em troca de um desconto significativo (até 75% em comparação com On-Demand). Podem ser Standard (menos flexíveis) ou Convertible (mais flexíveis).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Savings Plans:&lt;/strong&gt; Um modelo de precificação flexível que oferece preços mais baixos em troca de um compromisso de uso consistente (medido em USD/hora) por um período de 1 ou 3 anos. Abrangem EC2, Fargate e Lambda. Oferecem mais flexibilidade que RIs.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Spot Instances:&lt;/strong&gt; Permitem que você solicite capacidade EC2 não utilizada da AWS com grandes descontos (até 90% em comparação com On-Demand). Ideal para workloads tolerantes a interrupções, como processamento em lote, renderização ou testes.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Otimização de Recursos:&lt;/strong&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Dimensionamento Correto (Rightsizing):&lt;/strong&gt; Ajustar o tamanho dos recursos (instâncias EC2, volumes EBS, etc.) para corresponder à demanda da workload, evitando o super-provisionamento.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Elasticidade:&lt;/strong&gt; Usar Auto Scaling para escalar recursos para cima e para baixo automaticamente com base na demanda, garantindo que você pague apenas pela capacidade que realmente usa.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Desligamento de Recursos Ociosos:&lt;/strong&gt; Identificar e desligar recursos que não estão sendo utilizados (ex: instâncias de desenvolvimento fora do horário comercial).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Gerenciamento de Custos e Visibilidade:&lt;/strong&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Cost Explorer:&lt;/strong&gt; Uma ferramenta para visualizar, entender e gerenciar seus custos e uso da AWS ao longo do tempo. Permite analisar tendências, identificar áreas de alto custo e prever gastos futuros.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Budgets:&lt;/strong&gt; Permite definir orçamentos personalizados que o alertam quando seus custos ou uso excedem (ou estão previstos para exceder) seus limites orçamentários.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Cost and Usage Report (CUR):&lt;/strong&gt; Fornece um conjunto abrangente de dados sobre seus custos e uso da AWS, permitindo análises detalhadas e integração com ferramentas de BI.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Compute Optimizer:&lt;/strong&gt; Um serviço que usa machine learning para analisar a configuração e as métricas de utilização de seus recursos de computação da AWS (EC2, Auto Scaling Groups, Lambda, EBS, Fargate) e recomenda os recursos ideais para reduzir custos e melhorar a performance.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Trusted Advisor:&lt;/strong&gt; Oferece recomendações para otimização de custos, performance, segurança, tolerância a falhas e limites de serviço.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Estratégias Multi-Conta para Otimização de Custos:&lt;/strong&gt; Usar AWS Organizations para consolidação de faturamento e aplicação de políticas de custos em toda a organização.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="comparações-entre-serviços-e-quando-usar-cada-um-10"&gt;&lt;a href="#compara%c3%a7%c3%b5es-entre-servi%c3%a7os-e-quando-usar-cada-um-10" class="header-anchor"&gt;&lt;/a&gt;Comparações entre Serviços e Quando Usar Cada Um&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Reserved Instances (RIs) vs. Savings Plans:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Característica&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Reserved Instances (RIs)&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Savings Plans&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Compromisso&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Uso de uma configuração de instância específica (tipo, região, SO)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Gasto consistente (USD/hora) por um período&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Flexibilidade&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Menor (específico para instância/região)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Maior (aplica-se a EC2, Fargate, Lambda)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Tipos&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Standard (menos flexível, maior desconto), Convertible (mais flexível, menor desconto)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Compute Savings Plans, EC2 Instance Savings Plans&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Aplicabilidade&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;EC2, RDS, Redshift, ElastiCache, DynamoDB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;EC2, Fargate, Lambda&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Recomendação AWS&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Savings Plans são geralmente preferidos devido à flexibilidade&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Use Savings Plans quando:&lt;/strong&gt; Você tem um uso consistente de computação (EC2, Fargate, Lambda) e quer o maior desconto com flexibilidade para mudar tipos de instância ou regiões.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Use Reserved Instances quando:&lt;/strong&gt; Você tem um uso muito estável e previsível de um tipo de instância específico (especialmente para RDS, Redshift, ElastiCache, onde Savings Plans não se aplicam).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="configurações-limitações-boas-práticas-e-casos-de-uso-10"&gt;&lt;a href="#configura%c3%a7%c3%b5es-limita%c3%a7%c3%b5es-boas-pr%c3%a1ticas-e-casos-de-uso-10" class="header-anchor"&gt;&lt;/a&gt;Configurações, Limitações, Boas Práticas e Casos de Uso&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Otimização de Custos:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Habilite o AWS Cost Explorer e o AWS Budgets. Configure o AWS Compute Optimizer. Use políticas de ciclo de vida para S3. Configure Auto Scaling para escalar para baixo.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; A otimização de custos é um processo contínuo e requer monitoramento e ajustes regulares. Nem todas as workloads são adequadas para Spot Instances.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Comece com o dimensionamento correto. Use o modelo de consumo (pague pelo que usa). Aproveite os descontos por volume. Use instâncias Spot para workloads tolerantes a falhas. Use Savings Plans ou RIs para workloads de base. Monitore e analise os custos regularmente.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Redução de custos em ambientes de desenvolvimento/teste, otimização de workloads de produção, planejamento orçamentário.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="modelos-de-arquitetura-recomendados-padrões-de-segurança-resiliência-e-governança-11"&gt;&lt;a href="#modelos-de-arquitetura-recomendados-padr%c3%b5es-de-seguran%c3%a7a-resili%c3%aancia-e-governan%c3%a7a-11" class="header-anchor"&gt;&lt;/a&gt;Modelos de Arquitetura Recomendados, Padrões de Segurança, Resiliência e Governança&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Arquitetura Serverless:&lt;/strong&gt; Frequentemente a mais eficiente em termos de custo, pois você paga apenas pelo uso real, sem provisionamento de servidores.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Padrões de Segurança:&lt;/strong&gt; Implemente o princípio do menor privilégio para evitar o provisionamento excessivo de recursos. Monitore o uso de recursos para identificar anomalias que possam indicar atividades maliciosas.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Resiliência:&lt;/strong&gt; A elasticidade (Auto Scaling) que otimiza custos também contribui para a resiliência, garantindo que a capacidade seja ajustada à demanda.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Governança:&lt;/strong&gt; Use tagging para atribuição de custos. Implemente políticas de orçamento. Use AWS Organizations para gerenciar custos em várias contas.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="estratégias-de-migração-e-modernização-11"&gt;&lt;a href="#estrat%c3%a9gias-de-migra%c3%a7%c3%a3o-e-moderniza%c3%a7%c3%a3o-11" class="header-anchor"&gt;&lt;/a&gt;Estratégias de Migração e Modernização&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Migração para Otimização de Custos:&lt;/strong&gt; Ao migrar, considere refatorar aplicações para usar serviços gerenciados e &lt;em&gt;serverless&lt;/em&gt; que oferecem um modelo de custo mais granular e otimizado. Use o AWS Migration Hub para rastrear e otimizar o processo de migração.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Modernização para Otimização de Custos:&lt;/strong&gt; Adote microsserviços e conteinerização para otimizar o uso de recursos. Use serviços &lt;em&gt;serverless&lt;/em&gt; sempre que possível. Implemente práticas de FinOps para gerenciar e otimizar continuamente os custos da nuvem.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="exemplos-de-cenários-práticos-que-caem-na-prova-decisões-arquiteturais-e-armadilhas-comuns-11"&gt;&lt;a href="#exemplos-de-cen%c3%a1rios-pr%c3%a1ticos-que-caem-na-prova-decis%c3%b5es-arquiteturais-e-armadilhas-comuns-11" class="header-anchor"&gt;&lt;/a&gt;Exemplos de Cenários Práticos que Caem na Prova, Decisões Arquiteturais e Armadilhas Comuns&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Cenário:&lt;/strong&gt; Uma empresa tem uma grande frota de instâncias EC2 para processamento de dados em lote que pode ser interrompido e reiniciado. Eles querem reduzir os custos de computação.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Decisão Arquitetural:&lt;/strong&gt; Utilizar &lt;strong&gt;Spot Instances&lt;/strong&gt; para a frota de processamento em lote. Isso pode reduzir os custos de computação em até 90% em comparação com as instâncias On-Demand. Para gerenciar a frota, pode-se usar o &lt;strong&gt;EC2 Fleet&lt;/strong&gt; ou &lt;strong&gt;Auto Scaling Groups&lt;/strong&gt; com uma estratégia de &lt;em&gt;mixed instances&lt;/em&gt; que priorize Spot.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Armadilha Comum:&lt;/strong&gt; Não considerar o custo total de propriedade (TCO) ao migrar para a nuvem, focando apenas nos custos de infraestrutura e ignorando os custos operacionais, de licenciamento ou de migração. Outra armadilha é comprar RIs ou Savings Plans sem uma análise cuidadosa do uso futuro, resultando em capacidade não utilizada e desperdício de dinheiro.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h4 id="42-arquitetar-soluções-para-otimização-de-performance"&gt;&lt;a href="#42-arquitetar-solu%c3%a7%c3%b5es-para-otimiza%c3%a7%c3%a3o-de-performance" class="header-anchor"&gt;&lt;/a&gt;4.2. Arquitetar soluções para otimização de performance.&#10;&lt;/h4&gt;&lt;h4 id="conceitos-fundamentais-e-avançados-11"&gt;&lt;a href="#conceitos-fundamentais-e-avan%c3%a7ados-11" class="header-anchor"&gt;&lt;/a&gt;Conceitos Fundamentais e Avançados&#10;&lt;/h4&gt;&lt;p&gt;A otimização de performance já foi abordada em detalhes no Domínio 3 (Seção 3.2). No contexto do Domínio 4, o foco é a intersecção entre performance e custo, buscando o equilíbrio ideal para entregar valor de negócio.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Well-Architected Framework (Pilar de Eficiência de Performance):&lt;/strong&gt; Relembrando, este pilar foca na capacidade de usar recursos de computação de forma eficiente para atender aos requisitos do sistema e manter essa eficiência à medida que a demanda muda. A otimização de performance muitas vezes leva à otimização de custos, pois recursos mais eficientes podem significar menos recursos necessários.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Serviços e Estratégias Chave (revisão e aprofundamento com foco em custo):&lt;/strong&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Dimensionamento Correto (Rightsizing):&lt;/strong&gt; Usar o AWS Compute Optimizer para identificar e redimensionar recursos (EC2, EBS, Lambda, Fargate) para o tamanho ideal, o que otimiza tanto a performance quanto o custo.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Caching:&lt;/strong&gt; Implementar estratégias de cache (CloudFront, ElastiCache) para reduzir a latência e a carga sobre os serviços de backend, o que pode levar a uma necessidade menor de recursos computacionais e, consequentemente, a custos mais baixos.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Elasticidade e Escalabilidade:&lt;/strong&gt; Usar Auto Scaling e serviços &lt;em&gt;serverless&lt;/em&gt; (Lambda, Fargate, DynamoDB) que escalam automaticamente com a demanda. Isso garante que você tenha a performance necessária nos picos, mas não pague por capacidade ociosa nos períodos de baixa demanda.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Otimização de Banco de Dados:&lt;/strong&gt; Escolher o tipo de banco de dados correto para a workload (relacional, NoSQL, etc.) e otimizar consultas. O uso de DynamoDB com seu modelo de capacidade sob demanda, por exemplo, pode ser mais eficiente em custo para workloads com picos de tráfego do que um banco de dados relacional provisionado para o pico.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Otimização de Rede:&lt;/strong&gt; Utilizar serviços como CloudFront e Global Accelerator para melhorar a performance de entrega de conteúdo e roteamento de tráfego, o que pode reduzir a necessidade de recursos de backend e, portanto, custos.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Armazenamento Inteligente:&lt;/strong&gt; Usar classes de armazenamento S3 como Intelligent-Tiering, que movem automaticamente os dados para as classes de acesso infrequente ou arquivamento com base nos padrões de acesso, otimizando custos sem comprometer a performance de acesso quando necessário.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="comparações-entre-serviços-e-quando-usar-cada-um-11"&gt;&lt;a href="#compara%c3%a7%c3%b5es-entre-servi%c3%a7os-e-quando-usar-cada-um-11" class="header-anchor"&gt;&lt;/a&gt;Comparações entre Serviços e Quando Usar Cada Um&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Compute Optimizer vs. Análise Manual:&lt;/strong&gt; O Compute Optimizer automatiza a análise de performance e custo, fornecendo recomendações baseadas em machine learning, o que é mais eficiente e preciso do que a análise manual, especialmente em ambientes grandes e dinâmicos.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="configurações-limitações-boas-práticas-e-casos-de-uso-11"&gt;&lt;a href="#configura%c3%a7%c3%b5es-limita%c3%a7%c3%b5es-boas-pr%c3%a1ticas-e-casos-de-uso-11" class="header-anchor"&gt;&lt;/a&gt;Configurações, Limitações, Boas Práticas e Casos de Uso&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Otimização de Performance e Custo:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Configurações:&lt;/strong&gt; Habilite o AWS Compute Optimizer. Monitore métricas de performance e custo no CloudWatch e Cost Explorer. Configure políticas de ciclo de vida para S3 Intelligent-Tiering.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; A otimização é um trade-off. Otimizar demais o custo pode impactar a performance, e vice-versa. É crucial encontrar o equilíbrio certo para os requisitos de negócio.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Boas Práticas:&lt;/strong&gt; Adote uma cultura de FinOps. Revise regularmente as recomendações do Compute Optimizer. Teste as otimizações em ambientes de não produção antes de aplicar em produção. Automatize o desligamento de recursos não utilizados.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Casos de Uso:&lt;/strong&gt; Redução de custos de infraestrutura, melhoria da experiência do usuário, garantia de que as aplicações atendam aos SLAs de performance.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="modelos-de-arquitetura-recomendados-padrões-de-segurança-resiliência-e-governança-12"&gt;&lt;a href="#modelos-de-arquitetura-recomendados-padr%c3%b5es-de-seguran%c3%a7a-resili%c3%aancia-e-governan%c3%a7a-12" class="header-anchor"&gt;&lt;/a&gt;Modelos de Arquitetura Recomendados, Padrões de Segurança, Resiliência e Governança&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Arquitetura Elástica e Serverless:&lt;/strong&gt; Permite que a capacidade se ajuste à demanda, otimizando tanto a performance (capacidade suficiente nos picos) quanto o custo (não paga por capacidade ociosa).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Padrões de Segurança:&lt;/strong&gt; A otimização de recursos (rightsizng) também contribui para a segurança, pois menos recursos expostos significam uma superfície de ataque menor.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Resiliência:&lt;/strong&gt; A elasticidade é um componente chave da resiliência. A capacidade de escalar rapidamente para cima e para baixo ajuda a manter a performance e a disponibilidade sob carga variável.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Governança:&lt;/strong&gt; Use tags para rastrear o uso e o custo dos recursos. Implemente políticas de gerenciamento de recursos para garantir que os recursos sejam otimizados continuamente.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="estratégias-de-migração-e-modernização-12"&gt;&lt;a href="#estrat%c3%a9gias-de-migra%c3%a7%c3%a3o-e-moderniza%c3%a7%c3%a3o-12" class="header-anchor"&gt;&lt;/a&gt;Estratégias de Migração e Modernização&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Modernização para Performance e Custo:&lt;/strong&gt; Refatorar aplicações para usar serviços &lt;em&gt;serverless&lt;/em&gt; e gerenciados que oferecem escalabilidade automática e um modelo de custo baseado no consumo. Isso geralmente resulta em melhor performance e custos mais baixos em comparação com a execução de workloads em VMs auto-gerenciadas.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="exemplos-de-cenários-práticos-que-caem-na-prova-decisões-arquiteturais-e-armadilhas-comuns-12"&gt;&lt;a href="#exemplos-de-cen%c3%a1rios-pr%c3%a1ticos-que-caem-na-prova-decis%c3%b5es-arquiteturais-e-armadilhas-comuns-12" class="header-anchor"&gt;&lt;/a&gt;Exemplos de Cenários Práticos que Caem na Prova, Decisões Arquiteturais e Armadilhas Comuns&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Cenário:&lt;/strong&gt; Uma aplicação web de e-commerce tem um tráfego variável ao longo do dia, com picos significativos durante promoções. A empresa quer garantir a performance durante os picos e otimizar os custos nos períodos de baixa demanda.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Decisão Arquitetural:&lt;/strong&gt; Utilizar &lt;strong&gt;Amazon EC2 Auto Scaling&lt;/strong&gt; para o backend da aplicação, configurado com políticas de escalabilidade baseadas na utilização da CPU ou no número de requisições do Load Balancer. Para o banco de dados, considerar &lt;strong&gt;Amazon Aurora Serverless&lt;/strong&gt; ou &lt;strong&gt;DynamoDB On-Demand&lt;/strong&gt;, que escalam automaticamente a capacidade e cobram apenas pelo uso real, eliminando a necessidade de provisionar para o pico.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Armadilha Comum:&lt;/strong&gt; Não implementar Auto Scaling ou usar um modelo de provisionamento fixo para workloads com demanda variável, resultando em super-provisionamento (custo alto) ou sub-provisionamento (baixa performance). Ignorar as recomendações do Compute Optimizer ou não agir sobre elas.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="tabelas-comparativas-e-resumos"&gt;&lt;a href="#tabelas-comparativas-e-resumos" class="header-anchor"&gt;&lt;/a&gt;Tabelas Comparativas e Resumos&#10;&lt;/h2&gt;&lt;p&gt;Esta seção consolida informações importantes em tabelas para facilitar a consulta rápida e a tomada de decisões arquiteturais.&lt;/p&gt;&#10;&lt;h3 id="estratégias-de-recuperação-de-desastres-dr"&gt;&lt;a href="#estrat%c3%a9gias-de-recupera%c3%a7%c3%a3o-de-desastres-dr" class="header-anchor"&gt;&lt;/a&gt;Estratégias de Recuperação de Desastres (DR)&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Estratégia&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;RTO (Tempo de Recuperação)&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;RPO (Perda de Dados)&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Custo&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Complexidade&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Caso de Uso&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Backup e Restauração&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Horas a dias&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Horas&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Baixo&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Baixa&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Dados de arquivo, backups não críticos&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Piloto Leve (Pilot Light)&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Dezenas de minutos a horas&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Minutos&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Baixo-Médio&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Média&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Aplicações de negócios críticas com alguma tolerância&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Warm Standby&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Minutos a dezenas de minutos&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Segundos a minutos&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Médio&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Média-Alta&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Aplicações de negócios importantes com baixa tolerância&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Multi-Site Ativo-Ativo&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Segundos (ou zero)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Zero (ou quase zero)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Alto&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Alta&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Aplicações de missão crítica com tolerância zero&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="reserved-instances-ris-vs-savings-plans"&gt;&lt;a href="#reserved-instances-ris-vs-savings-plans" class="header-anchor"&gt;&lt;/a&gt;Reserved Instances (RIs) vs. Savings Plans&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Característica&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Reserved Instances (RIs)&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Savings Plans&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Compromisso&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Uso de uma configuração de instância específica (tipo, região, SO)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Gasto consistente (USD/hora) por um período&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Flexibilidade&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Menor (específico para instância/região)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Maior (aplica-se a EC2, Fargate, Lambda em diferentes regiões/tipos)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Tipos&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Standard (menos flexível, maior desconto), Convertible (mais flexível)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Compute Savings Plans, EC2 Instance Savings Plans, SageMaker Savings Plans&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Aplicabilidade&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;EC2, RDS, Redshift, ElastiCache, DynamoDB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;EC2, Fargate, Lambda, SageMaker&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Recomendação AWS&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Savings Plans são geralmente preferidos devido à maior flexibilidade para computação. RIs ainda são relevantes para RDS, Redshift, etc.&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="gatilhos-comuns-de-auto-scaling"&gt;&lt;a href="#gatilhos-comuns-de-auto-scaling" class="header-anchor"&gt;&lt;/a&gt;Gatilhos Comuns de Auto Scaling&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Métrica/Gatilho&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Descrição&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Caso de Uso Comum&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Utilização de CPU&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Escala com base na utilização média da CPU do grupo de Auto Scaling.&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Aplicações web, processamento de CPU intensivo&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Contagem de Requisições por Alvo&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Escala com base no número de requisições por instância no Load Balancer.&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Aplicações web, APIs&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Tráfego de Rede (Entrada/Saída)&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Escala com base na quantidade de tráfego de rede por instância.&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Aplicações de streaming, transferência de dados&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Tamanho da Fila SQS&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Escala com base no número de mensagens em uma fila SQS.&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Processamento de trabalho assíncrono, workloads em lote&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Métricas Personalizadas&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Escala com base em qualquer métrica personalizada do CloudWatch.&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Workloads com métricas de negócio específicas (ex: usuários ativos)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Escalonamento Agendado&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Escala em horários específicos do dia ou da semana.&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Aplicações com padrões de tráfego previsíveis (ex: horário comercial)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="comparação-de-serviços-de-mensageria-sns-vs-sqs-vs-eventbridge"&gt;&lt;a href="#compara%c3%a7%c3%a3o-de-servi%c3%a7os-de-mensageria-sns-vs-sqs-vs-eventbridge" class="header-anchor"&gt;&lt;/a&gt;Comparação de Serviços de Mensageria: SNS vs. SQS vs. EventBridge&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Característica&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Amazon SNS&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Amazon SQS&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Amazon EventBridge&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Modelo&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Publicar/Assinar (Pub/Sub)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Fila de Mensagens&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Barramento de Eventos&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Entrega&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Push (para múltiplos assinantes)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Pull (por um consumidor)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Roteamento de eventos para múltiplos destinos&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Casos de Uso&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Notificações, fanout, microsserviços&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Desacoplamento, processamento assíncrono&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Arquiteturas orientadas a eventos, integração de SaaS&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Durabilidade&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Mensagens entregues para assinantes ativos&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Mensagens persistentes na fila&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Eventos roteados para destinos&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Filtragem&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Simples (baseada em atributos)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Não (consumidor processa todas as mensagens)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Avançada (baseada no conteúdo do evento)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="detalhamento-de-tópicos-obrigatórios"&gt;&lt;a href="#detalhamento-de-t%c3%b3picos-obrigat%c3%b3rios" class="header-anchor"&gt;&lt;/a&gt;Detalhamento de Tópicos Obrigatórios&#10;&lt;/h2&gt;&lt;p&gt;Esta seção aprofunda os tópicos mais críticos e frequentemente cobrados no exame, consolidando o conhecimento dos domínios anteriores.&lt;/p&gt;&#10;&lt;h3 id="1-estratégias-multi-account-e-aws-organizations"&gt;&lt;a href="#1-estrat%c3%a9gias-multi-account-e-aws-organizations" class="header-anchor"&gt;&lt;/a&gt;1. Estratégias Multi-Account e AWS Organizations&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Organizations:&lt;/strong&gt; Permite gerenciar centralmente várias contas AWS. Facilita a aplicação de políticas, o faturamento consolidado e o gerenciamento de segurança.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Landing Zone (via AWS Control Tower):&lt;/strong&gt; Uma arquitetura de referência para configurar um ambiente multi-conta seguro e escalável. O Control Tower automatiza a criação da Landing Zone, estabelecendo uma linha de base com contas para log, auditoria e segurança, e aplicando &lt;em&gt;guardrails&lt;/em&gt; (baseados em SCPs) para governança.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Unidades Organizacionais (OUs):&lt;/strong&gt; Permitem agrupar contas para aplicar políticas de forma hierárquica. Uma estrutura comum é ter OUs para Infraestrutura, Segurança, Workloads (separados por Prod, Dev, Test), etc.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Service Control Policies (SCPs):&lt;/strong&gt; Políticas de controle de serviço que definem as permissões máximas para as contas em uma OU. Elas não concedem permissões, mas atuam como um filtro, restringindo o que os administradores de contas podem delegar aos usuários e roles. Por exemplo, um SCP pode negar o acesso a regiões específicas ou impedir a desativação de serviços de segurança como CloudTrail e GuardDuty.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="2-networking-avançado"&gt;&lt;a href="#2-networking-avan%c3%a7ado" class="header-anchor"&gt;&lt;/a&gt;2. Networking Avançado&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Transit Gateway:&lt;/strong&gt; Atua como um hub de rede central para conectar VPCs e redes on-premises. Simplifica a arquitetura de rede, elimina a necessidade de VPC Peering complexo e permite o roteamento centralizado.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;PrivateLink:&lt;/strong&gt; Fornece conectividade privada entre VPCs, serviços AWS e suas redes on-premises sem expor o tráfego à internet pública. Cria um endpoint de interface em sua VPC que se conecta a um serviço de endpoint.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Direct Connect:&lt;/strong&gt; Uma conexão de rede dedicada e privada entre seu data center e a AWS. Oferece largura de banda consistente e baixa latência. O Direct Connect Gateway permite conectar a múltiplas VPCs em diferentes regiões com uma única conexão.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;DNS Multi-Região com Route 53:&lt;/strong&gt; Essencial para alta disponibilidade e recuperação de desastres. Use políticas de roteamento como &lt;strong&gt;Failover&lt;/strong&gt; (para DR ativo-passivo), &lt;strong&gt;Latency-based&lt;/strong&gt; (para performance global) e &lt;strong&gt;Geolocation&lt;/strong&gt; (para conformidade de dados) para direcionar o tráfego para a região mais apropriada.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="3-iam-avançado"&gt;&lt;a href="#3-iam-avan%c3%a7ado" class="header-anchor"&gt;&lt;/a&gt;3. IAM Avançado&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Permission Boundaries:&lt;/strong&gt; Uma política de IAM gerenciada que define as permissões máximas que uma política de identidade pode conceder a uma entidade (usuário ou role). Útil para delegar a criação de roles a desenvolvedores, garantindo que eles não possam criar roles com mais permissões do que o limite definido.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Attribute-Based Access Control (ABAC):&lt;/strong&gt; Uma estratégia de autorização que define permissões com base em atributos (tags) anexados a usuários e recursos. É mais escalável que o RBAC (Role-Based Access Control) em ambientes com muitos recursos e políticas, pois você pode criar uma única política que se aplica a todos os recursos com uma determinada tag.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Roles Cross-Account:&lt;/strong&gt; Permitem que usuários ou serviços em uma conta (a conta confiável) assumam uma role em outra conta (a conta que confia) para acessar recursos. É a maneira padrão e segura de conceder acesso entre contas.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;IAM Roles Anywhere:&lt;/strong&gt; Permite que workloads que rodam fora da AWS (como em seus data centers on-premises) usem certificados X.509 para obter credenciais de segurança temporárias e acessar recursos da AWS. Estende a segurança do IAM para fora da nuvem.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="4-observabilidade-e-segurança-contínua"&gt;&lt;a href="#4-observabilidade-e-seguran%c3%a7a-cont%c3%adnua" class="header-anchor"&gt;&lt;/a&gt;4. Observabilidade e Segurança Contínua&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;CloudWatch:&lt;/strong&gt; O serviço central para monitoramento de métricas e logs. Use &lt;strong&gt;CloudWatch Logs Insights&lt;/strong&gt; para análises de log poderosas e &lt;strong&gt;CloudWatch Alarms&lt;/strong&gt; para automação e alertas.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;CloudTrail:&lt;/strong&gt; Audita todas as chamadas de API. Essencial para segurança e conformidade. Envie os logs para o S3 para retenção a longo prazo e para o CloudWatch Logs para análise em tempo real.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Config:&lt;/strong&gt; Monitora a conformidade das configurações dos recursos. Use &lt;strong&gt;Conformance Packs&lt;/strong&gt; para implantar um conjunto de regras de conformidade em sua organização.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Security Hub:&lt;/strong&gt; Agrega descobertas de segurança de GuardDuty, Inspector, Macie e outros serviços, fornecendo uma visão unificada da sua postura de segurança.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;GuardDuty:&lt;/strong&gt; Detecção de ameaças baseada em machine learning. Monitora logs de CloudTrail, VPC Flow Logs e DNS para identificar atividades maliciosas.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;KMS Multi-Region Keys:&lt;/strong&gt; Chaves KMS que podem ser replicadas para múltiplas regiões. Simplificam o gerenciamento de criptografia para dados que são replicados entre regiões, garantindo que você possa descriptografar os dados na região de DR.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="5-migração-e-modernização-7rs"&gt;&lt;a href="#5-migra%c3%a7%c3%a3o-e-moderniza%c3%a7%c3%a3o-7rs" class="header-anchor"&gt;&lt;/a&gt;5. Migração e Modernização (7Rs)&#10;&lt;/h3&gt;&lt;p&gt;As 7 estratégias comuns de migração e modernização:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Retire (Aposentar):&lt;/strong&gt; Descomissionar aplicações que não são mais necessárias.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Retain (Reter):&lt;/strong&gt; Manter aplicações on-premises que não estão prontas para migrar.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Rehost (Lift-and-Shift):&lt;/strong&gt; Migrar aplicações para a nuvem sem modificações. Rápido, mas com menos benefícios da nuvem. (Ex: usar &lt;strong&gt;Application Migration Service - MGN&lt;/strong&gt;).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Replatform (Lift-and-Tinker):&lt;/strong&gt; Migrar com algumas otimizações, como mover um banco de dados para RDS.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Repurchase (Comprar Novamente):&lt;/strong&gt; Mover para um produto diferente, geralmente uma solução SaaS.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Refactor/Re-architect (Refatorar/Rearquitetar):&lt;/strong&gt; Modificar a aplicação para aproveitar os recursos nativos da nuvem (ex: microsserviços, serverless). Maior benefício, mas maior esforço.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Relocate (Realocar):&lt;/strong&gt; Mover infraestrutura de um ambiente de nuvem para outro (ex: VMware Cloud on AWS).&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;AWS Migration Acceleration Program (MAP):&lt;/strong&gt; Um programa que fornece consultoria, ferramentas e créditos de serviço para acelerar a migração para a AWS.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="6-novidades-relevantes"&gt;&lt;a href="#6-novidades-relevantes" class="header-anchor"&gt;&lt;/a&gt;6. Novidades Relevantes&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;VPC Lattice:&lt;/strong&gt; Simplifica a conectividade, segurança e observabilidade entre serviços em diferentes VPCs e contas, sem a complexidade de gerenciar Transit Gateways ou VPC Peering para cada serviço.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;CloudFront Signed URLs/Cookies:&lt;/strong&gt; Mecanismos para controlar o acesso a conteúdo privado no CloudFront. URLs assinadas são para acesso a arquivos individuais, enquanto cookies assinados podem conceder acesso a múltiplos arquivos.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;CloudWatch Evidently:&lt;/strong&gt; Permite realizar experimentos e lançamentos de features (feature flags) para testar novas funcionalidades com um subconjunto de usuários e medir o impacto na performance e no negócio.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="cenários-práticos-e-questões-de-exemplo"&gt;&lt;a href="#cen%c3%a1rios-pr%c3%a1ticos-e-quest%c3%b5es-de-exemplo" class="header-anchor"&gt;&lt;/a&gt;Cenários Práticos e Questões de Exemplo&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Cenário 1: Otimização de Custos para Workload de Análise&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Situação:&lt;/strong&gt; Uma empresa executa um cluster de análise de dados no Amazon EMR todas as noites. O trabalho leva cerca de 4 horas para ser concluído e pode ser reiniciado em caso de falha. O custo do cluster é alto.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Decisão Arquitetural:&lt;/strong&gt; Usar &lt;strong&gt;Spot Instances&lt;/strong&gt; para os nós de tarefa (task nodes) do cluster EMR. Como os nós de tarefa não armazenam dados, a interrupção de uma instância Spot pode ser tolerada. Isso pode reduzir significativamente os custos de computação. Para os nós principais (master e core nodes), usar instâncias On-Demand ou Reserved Instances para garantir a estabilidade do cluster.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Cenário 2: Segurança de Acesso a Dados em Múltiplas Contas&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Situação:&lt;/strong&gt; Uma aplicação em uma VPC na Conta A precisa acessar um bucket S3 na Conta B de forma segura, sem expor o tráfego à internet.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Decisão Arquitetural:&lt;/strong&gt; Criar um &lt;strong&gt;VPC Gateway Endpoint&lt;/strong&gt; para o S3 na VPC da Conta A. Na Conta B, criar uma política de bucket S3 que permita o acesso a partir do VPC Endpoint da Conta A. Isso garante que o tráfego entre a VPC e o S3 permaneça na rede da AWS.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Cenário 3: Alta Disponibilidade para Aplicação Web Global&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Situação:&lt;/strong&gt; Uma aplicação web com usuários em todo o mundo precisa de baixa latência e alta disponibilidade. A aplicação tem um backend de API e conteúdo estático.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Decisão Arquitetural:&lt;/strong&gt; Usar &lt;strong&gt;Amazon CloudFront&lt;/strong&gt; para entregar o conteúdo estático e dinâmico. Configurar o CloudFront com múltiplas origens em diferentes regiões. Usar &lt;strong&gt;Amazon Route 53&lt;/strong&gt; com uma política de roteamento baseada em latência para direcionar os usuários para a região mais próxima. Implementar &lt;em&gt;health checks&lt;/em&gt; do Route 53 para failover automático em caso de falha de uma região.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Cenário 4: Governança de Segurança em Larga Escala&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Situação:&lt;/strong&gt; Uma empresa com dezenas de contas AWS quer garantir que ninguém possa desativar o AWS CloudTrail ou criar chaves de acesso IAM para o usuário root.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Decisão Arquitetural:&lt;/strong&gt; Usar &lt;strong&gt;AWS Organizations&lt;/strong&gt; para gerenciar todas as contas. Criar uma &lt;strong&gt;Service Control Policy (SCP)&lt;/strong&gt; e anexá-la à raiz da organização ou a uma OU específica. A SCP deve conter uma declaração de &lt;code&gt;Deny&lt;/code&gt; explícita para as ações &lt;code&gt;cloudtrail:StopLogging&lt;/code&gt;, &lt;code&gt;cloudtrail:DeleteTrail&lt;/code&gt; e &lt;code&gt;iam:CreateAccessKey&lt;/code&gt; quando o principal for o usuário root. Isso impõe a política em todas as contas afetadas, mesmo para os administradores dessas contas.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>Estudando C Sharp a partir do Python</title><link>https://fabiolopes.page/pt-br/p/estudando-c-sharp-a-partir-do-python/</link><pubDate>Sat, 08 Mar 2025 00:00:00 +0000</pubDate><guid>https://fabiolopes.page/pt-br/p/estudando-c-sharp-a-partir-do-python/</guid><description>&lt;img src="https://fabiolopes.page/p/studying-c-sharp-from-python/banner_hu_7436efdeae6a71c1.jpg" alt="Featured image of post Estudando C Sharp a partir do Python" /&gt;&lt;p&gt;Nesta postagem, vou analisar a implementação da sequência de Fibonacci em Python e C#, destacando as principais diferenças de sintaxe e conceitos de programação. Também vou explorar alguns princípios essenciais do C# para facilitar a transição para desenvolvedores Python. Tenho uma amiga que é apaixonada pelo .NET. Sempre que mostro a ela um trecho de código em Python, ela torce o nariz e diz: “Por que usar Python? O .NET é muito melhor!” Então, em homenagem a ela, resolvi converter esse código Python para C# e estudar as diferenças. Utilizei IA para gerar o código em C# e comentar o código, para me ajudar a entender. Achei esta abordagem fantástica para aprendizado, e pretendo me aprofundar em C# paralelamente utilizando esta forma de estudo.&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="dotineti" class="gallery-image" data-flex-basis="165px" data-flex-grow="68" height="473" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://fabiolopes.page/p/studying-c-sharp-from-python/dotineti_hu_c6564660f57226b7.gif" width="326"&gt;&lt;/p&gt;&#10;&lt;h3 id="código-em-python"&gt;&lt;a href="#c%c3%b3digo-em-python" class="header-anchor"&gt;&lt;/a&gt;Código em Python:&#10;&lt;/h3&gt;&lt;div class="code-example"&gt;&#10; &lt;div class="code-toolbar"&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;span class="code-language"&gt;python&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;span class="lnt"&gt;20&#10;&lt;/span&gt;&lt;span class="lnt"&gt;21&#10;&lt;/span&gt;&lt;span class="lnt"&gt;22&#10;&lt;/span&gt;&lt;span class="lnt"&gt;23&#10;&lt;/span&gt;&lt;span class="lnt"&gt;24&#10;&lt;/span&gt;&lt;span class="lnt"&gt;25&#10;&lt;/span&gt;&lt;span class="lnt"&gt;26&#10;&lt;/span&gt;&lt;span class="lnt"&gt;27&#10;&lt;/span&gt;&lt;span class="lnt"&gt;28&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;calls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cache_hits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;calls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cache_hits&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cache_hits&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;calls&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;start_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;perf_counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;end_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;perf_counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;elapsed_time_ms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;end_time&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start_time&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;calls&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; chamadas de função e &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cache_hits&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt; acertos de cache.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Tempo decorrido: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;elapsed_time_ms&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; ms&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="tradução-para-c"&gt;&lt;a href="#tradu%c3%a7%c3%a3o-para-c" class="header-anchor"&gt;&lt;/a&gt;Tradução para C#:&#10;&lt;/h3&gt;&lt;p&gt;Abaixo o equivalente em C#:&lt;/p&gt;&#10;&lt;div class="code-example"&gt;&#10; &lt;div class="code-toolbar"&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;span class="code-language"&gt;csharp&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;span class="lnt"&gt;20&#10;&lt;/span&gt;&lt;span class="lnt"&gt;21&#10;&lt;/span&gt;&lt;span class="lnt"&gt;22&#10;&lt;/span&gt;&lt;span class="lnt"&gt;23&#10;&lt;/span&gt;&lt;span class="lnt"&gt;24&#10;&lt;/span&gt;&lt;span class="lnt"&gt;25&#10;&lt;/span&gt;&lt;span class="lnt"&gt;26&#10;&lt;/span&gt;&lt;span class="lnt"&gt;27&#10;&lt;/span&gt;&lt;span class="lnt"&gt;28&#10;&lt;/span&gt;&lt;span class="lnt"&gt;29&#10;&lt;/span&gt;&lt;span class="lnt"&gt;30&#10;&lt;/span&gt;&lt;span class="lnt"&gt;31&#10;&lt;/span&gt;&lt;span class="lnt"&gt;32&#10;&lt;/span&gt;&lt;span class="lnt"&gt;33&#10;&lt;/span&gt;&lt;span class="lnt"&gt;34&#10;&lt;/span&gt;&lt;span class="lnt"&gt;35&#10;&lt;/span&gt;&lt;span class="lnt"&gt;36&#10;&lt;/span&gt;&lt;span class="lnt"&gt;37&#10;&lt;/span&gt;&lt;span class="lnt"&gt;38&#10;&lt;/span&gt;&lt;span class="lnt"&gt;39&#10;&lt;/span&gt;&lt;span class="lnt"&gt;40&#10;&lt;/span&gt;&lt;span class="lnt"&gt;41&#10;&lt;/span&gt;&lt;span class="lnt"&gt;42&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections.Generic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Diagnostics&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Fibonacci&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;calls&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;cacheHits&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;Fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContainsKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cacheHits&lt;/span&gt;&lt;span class="p"&gt;++;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;calls&lt;/span&gt;&lt;span class="p"&gt;++;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;Fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Stopwatch&lt;/span&gt; &lt;span class="n"&gt;stopwatch&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Stopwatch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stopwatch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stopwatch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;elapsedTimeMs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stopwatch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Elapsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TotalMilliseconds&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$&amp;#34;{calls} chamadas de função e {cacheHits} acertos de cache.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$&amp;#34;Tempo decorrido: {elapsedTimeMs:F4} ms&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="conceitos-chave-para-desenvolvedores-python-transicionando-para-c"&gt;&lt;a href="#conceitos-chave-para-desenvolvedores-python-transicionando-para-c" class="header-anchor"&gt;&lt;/a&gt;Conceitos Chave para Desenvolvedores Python Transicionando para C#&#10;&lt;/h3&gt;&lt;p&gt;Esta seção destaca os conceitos principais encontrados ao migrar do Python para o C#, com foco nas áreas onde as diferenças são mais pronunciadas.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Tipagem Estática:&lt;/strong&gt; Ao contrário da tipagem dinâmica do Python, o C# exige declarações de tipo explícitas (por exemplo, &lt;code&gt;int idade = 30;&lt;/code&gt;). Isso impõe a segurança de tipo em tempo de compilação, detectando possíveis erros antecipadamente. É necessário familiarizar-se com os tipos de dados comuns do C#, como &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;double&lt;/code&gt;, &lt;code&gt;string&lt;/code&gt;, &lt;code&gt;bool&lt;/code&gt;, &lt;code&gt;char&lt;/code&gt; e &lt;code&gt;long&lt;/code&gt; (usado para valores inteiros maiores).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Paradigma de Programação Orientada a Objetos (POO):&lt;/strong&gt; O C# é fundamentalmente orientado a objetos. O código é organizado em torno de classes, que servem como modelos para criar objetos. Os principais conceitos de POO a serem dominados incluem:&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Classes e Objetos:&lt;/strong&gt; Definir classes com propriedades (dados) e métodos (comportamento).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Encapsulamento:&lt;/strong&gt; Proteger os dados dentro de uma classe e controlar o acesso usando modificadores de acesso (&lt;code&gt;public&lt;/code&gt;, &lt;code&gt;private&lt;/code&gt;, &lt;code&gt;protected&lt;/code&gt;).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Herança:&lt;/strong&gt; Criar novas classes com base em classes existentes, herdando suas características.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Polimorfismo:&lt;/strong&gt; Permitir que objetos de diferentes classes respondam à mesma chamada de método de sua própria maneira.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Namespaces: Organização do Código:&lt;/strong&gt; Namespaces são como módulos Python, mas turbinados. Eles fornecem uma maneira hierárquica de organizar o código, evitando conflitos de nomenclatura e agrupando classes relacionadas. Usa-se a palavra-chave &lt;code&gt;using&lt;/code&gt; para importar namespaces e acessar seu conteúdo (por exemplo, &lt;code&gt;using System;&lt;/code&gt;).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Métodos: Funções Vinculadas à Classe:&lt;/strong&gt; Métodos são funções que pertencem a uma classe. Eles definem as ações que um objeto pode executar. Prestar atenção às assinaturas dos métodos, incluindo tipos de retorno, parâmetros e modificadores de acesso. A palavra-chave &lt;code&gt;static&lt;/code&gt; permite definir métodos que pertencem à própria classe, em vez de a uma instância.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Fluxo de Controle com Chaves:&lt;/strong&gt; O C# usa chaves &lt;code&gt;{}&lt;/code&gt; para definir blocos de código para instruções de fluxo de controle como &lt;code&gt;if&lt;/code&gt;, &lt;code&gt;else&lt;/code&gt;, &lt;code&gt;for&lt;/code&gt;, &lt;code&gt;while&lt;/code&gt; e &lt;code&gt;switch&lt;/code&gt;. Esta é uma diferença sintática fundamental da abordagem baseada em indentação do Python.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Coleções: Estruturas de Dados:&lt;/strong&gt; O C# oferece um rico conjunto de classes de coleção para armazenar e gerenciar dados, incluindo arrays, listas (&lt;code&gt;List&amp;lt;T&amp;gt;&lt;/code&gt;) e dicionários (&lt;code&gt;Dictionary&amp;lt;TKey, TValue&amp;gt;&lt;/code&gt;).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;O Ecossistema .NET:&lt;/strong&gt; O código C# é executado no runtime .NET. Compreender o básico do framework .NET, incluindo o Common Language Runtime (CLR) e a Base Class Library (BCL), fornece uma compreensão mais profunda de como o código C# é executado.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="lições-aprendidas-principais-conclusões-para-pythonistas"&gt;&lt;a href="#li%c3%a7%c3%b5es-aprendidas-principais-conclus%c3%b5es-para-pythonistas" class="header-anchor"&gt;&lt;/a&gt;Lições Aprendidas: Principais Conclusões para Pythonistas&#10;&lt;/h3&gt;&lt;p&gt;Após converter a sequência de Fibonacci e explorar esses conceitos básicos, aqui estão as lições mais significativas aprendidas:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Abrace a Tipagem Estática:&lt;/strong&gt; Embora possa parecer verboso no início, a tipagem estática leva a um código mais robusto e fácil de manter.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;POO é Fundamental:&lt;/strong&gt; O C# é uma linguagem orientada a objetos de ponta a ponta.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Aproveite o Framework .NET:&lt;/strong&gt; O framework .NET fornece uma riqueza de classes e métodos pré-construídos que podem acelerar significativamente o desenvolvimento.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;A Sintaxe Importa:&lt;/strong&gt; Prestar atenção à sintaxe, especialmente ao uso de chaves para blocos de código. Pequenos erros sintáticos podem impedir que o código seja compilado.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;IA como Acelerador de Aprendizagem:&lt;/strong&gt; Usar ferramentas de IA para gerar código e explicar conceitos é maneira poderosa de aprender C#. Concentrar-se em entender o &lt;em&gt;porquê&lt;/em&gt; por trás do código, em vez de apenas o &lt;em&gt;como&lt;/em&gt;, é a diferença entre aprender de fato e deixar a IA fazer por você apenas.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="considerações-finais"&gt;&lt;a href="#considera%c3%a7%c3%b5es-finais" class="header-anchor"&gt;&lt;/a&gt;Considerações Finais&#10;&lt;/h3&gt;&lt;p&gt;Converter código Python para C# pode parecer intimidador no início, mas ao entender os conceitos principais e as diferenças de sintaxe, a transição se torna muito mais suave. Este exercício com a sequência de Fibonacci destaca a importância da tipagem estática, da programação orientada a objetos e da estrutura que os namespaces fornecem em C#. O que tornou essa experiência de aprendizado verdadeiramente poderosa foi o uso de IA para gerar o código C# inicial e fornecer explicações. Essa abordagem me permitiu focar em entender o porquê por trás do código, em vez de me perder em erros de sintaxe. Enquanto o Python oferece flexibilidade e prototipagem rápida, o C# traz robustez e desempenho, especialmente benéficos para aplicações maiores. É uma questão de saber qual linguagem utilizar em cada situação. Na minha opinião, o Python resolve a maioria dos problemas que não exijam desempenho e para tarefas rápidas. E, crucialmente, ao usar a IA como uma companheira de aprendizado, podemos acelerar o processo de dominar novas linguagens e paradigmas, tornando tarefas complexas como tradução entre linguagens e compreensão de conceitos significativamente mais acessíveis.&lt;/p&gt;&#10;</description></item><item><title>Busca em Largura (BFS) e Busca em Profundidade (DFS): Um Estudo Detalhado</title><link>https://fabiolopes.page/pt-br/p/busca-em-largura-bfs-e-busca-em-profundidade-dfs-um-estudo-detalhado/</link><pubDate>Wed, 05 Mar 2025 00:00:00 +0000</pubDate><guid>https://fabiolopes.page/pt-br/p/busca-em-largura-bfs-e-busca-em-profundidade-dfs-um-estudo-detalhado/</guid><description>&lt;img src="https://fabiolopes.page/p/breadth-first-search-bfs-and-depth-first-search-dfs-a-deep-dive/banner_hu_6d3783d5432a348f.png" alt="Featured image of post Busca em Largura (BFS) e Busca em Profundidade (DFS): Um Estudo Detalhado" /&gt;&lt;h2 id="busca-em-largura-bfs"&gt;&lt;a href="#busca-em-largura-bfs" class="header-anchor"&gt;&lt;/a&gt;Busca em Largura (BFS)&#10;&lt;/h2&gt;&lt;p&gt;A Busca em Largura (BFS, do inglês Breadth-First Search) é um algoritmo fundamental de busca e travessia de grafos. Ele explora sistematicamente um grafo nível por nível, começando de um &lt;em&gt;nó inicial&lt;/em&gt; designado. Imagine explorar um labirinto: o BFS exploraria todos os caminhos a um passo da entrada, depois todos os caminhos a dois passos, e assim por diante, garantindo que o caminho mais curto seja encontrado primeiro.&lt;/p&gt;&#10;&lt;h3 id="como-o-bfs-funciona"&gt;&lt;a href="#como-o-bfs-funciona" class="header-anchor"&gt;&lt;/a&gt;Como o BFS Funciona&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Inicialização:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Comece com uma estrutura de dados &lt;em&gt;fila&lt;/em&gt; (queue), tipicamente implementada usando &lt;code&gt;collections.deque&lt;/code&gt; em Python para operações FIFO (First-In, First-Out, Primeiro a Entrar, Primeiro a Sair) eficientes. A fila inicialmente contém apenas o &lt;em&gt;nó inicial&lt;/em&gt;.&lt;/li&gt;&#10;&lt;li&gt;Mantenha um conjunto (set) ou lista &lt;code&gt;visitados&lt;/code&gt; para controlar os nós que já foram explorados, evitando ciclos.&lt;/li&gt;&#10;&lt;li&gt;Opcionalmente, um dicionário &lt;code&gt;pai&lt;/code&gt; (parent) é usado para armazenar o predecessor de cada nó visitado, permitindo a reconstrução do caminho mais tarde.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Iteração:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Enquanto a fila não estiver vazia:&#10;&lt;ul&gt;&#10;&lt;li&gt;Remova um nó da frente da fila (dequeue). Este é o nó sendo explorado atualmente.&lt;/li&gt;&#10;&lt;li&gt;Para cada &lt;em&gt;vizinho&lt;/em&gt; do nó atual:&#10;&lt;ul&gt;&#10;&lt;li&gt;Se o vizinho não foi visitado:&#10;&lt;ul&gt;&#10;&lt;li&gt;Marque o vizinho como visitado.&lt;/li&gt;&#10;&lt;li&gt;Adicione o vizinho ao final da fila (enqueue).&lt;/li&gt;&#10;&lt;li&gt;Registre o nó atual como o &lt;em&gt;pai&lt;/em&gt; do vizinho (se a reconstrução do caminho for necessária).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Terminação:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;O algoritmo termina quando a fila está vazia, indicando que todos os nós alcançáveis a partir do nó inicial foram explorados.&lt;/li&gt;&#10;&lt;li&gt;Se um &lt;em&gt;nó alvo&lt;/em&gt; for especificado, a busca pode terminar assim que o nó alvo for removido da fila. O dicionário &lt;code&gt;pai&lt;/code&gt; pode então ser usado para reconstruir o caminho mais curto do nó inicial ao nó alvo.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="prós-do-bfs"&gt;&lt;a href="#pr%c3%b3s-do-bfs" class="header-anchor"&gt;&lt;/a&gt;Prós do BFS&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Completude:&lt;/strong&gt; O BFS é &lt;em&gt;completo&lt;/em&gt;, o que significa que se um caminho existe entre o nó inicial e o nó alvo, o BFS &lt;em&gt;irá&lt;/em&gt; encontrá-lo.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Optimalidade:&lt;/strong&gt; O BFS garante encontrar o &lt;em&gt;caminho mais curto&lt;/em&gt; (em termos do número de arestas) entre o nó inicial e o nó alvo em um grafo não ponderado.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Simplicidade:&lt;/strong&gt; O algoritmo é relativamente simples de entender e implementar.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="contras-do-bfs"&gt;&lt;a href="#contras-do-bfs" class="header-anchor"&gt;&lt;/a&gt;Contras do BFS&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Consumo de Memória:&lt;/strong&gt; O BFS pode consumir uma quantidade significativa de memória, especialmente para grafos grandes. Isso ocorre porque ele armazena todos os nós no nível atual na fila. No pior cenário, onde todo o grafo precisa ser percorrido, a fila pode crescer e conter uma grande fração do número total de nós.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Não Adequado para Grafos Ponderados:&lt;/strong&gt; O BFS é projetado para grafos não ponderados. Ele encontra o caminho mais curto com base no número de arestas, não no peso total das arestas. Para grafos ponderados, algoritmos como o algoritmo de Dijkstra são mais apropriados.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="onde-o-bfs-se-destaca"&gt;&lt;a href="#onde-o-bfs-se-destaca" class="header-anchor"&gt;&lt;/a&gt;Onde o BFS se Destaca&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Encontrar Caminhos Mais Curtos (Grafos Não Ponderados):&lt;/strong&gt; Sua principal força é encontrar o caminho mais curto em grafos onde todas as arestas têm o mesmo peso (ou nenhum peso).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Teste de Conectividade:&lt;/strong&gt; Determinar se dois nós estão conectados em um grafo.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Web Crawlers (Robôs de Busca):&lt;/strong&gt; O BFS pode ser usado para rastrear páginas da web, explorando links nível por nível.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Análise de Redes Sociais:&lt;/strong&gt; Encontrar a cadeia mais curta de conexões entre duas pessoas em uma rede social.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Navegação GPS:&lt;/strong&gt; Em cenários onde minimizar o número de &amp;ldquo;saltos&amp;rdquo; (hops) é mais importante do que a distância total (por exemplo, minimizar o número de transferências no transporte público).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="onde-o-bfs-falha"&gt;&lt;a href="#onde-o-bfs-falha" class="header-anchor"&gt;&lt;/a&gt;Onde o BFS Falha&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Grafos Ponderados:&lt;/strong&gt; Conforme mencionado anteriormente, o BFS não é adequado para encontrar o caminho mais curto em grafos onde as arestas têm pesos diferentes.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Grafos Muito Grandes:&lt;/strong&gt; Os requisitos de memória do BFS podem se tornar proibitivos para grafos muito grandes.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Grafos com Altos Fatores de Ramificação (Branching Factors):&lt;/strong&gt; Grafos onde cada nó tem muitos vizinhos podem levar a uma fila grande e alto consumo de memória.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="casos-de-uso-comuns"&gt;&lt;a href="#casos-de-uso-comuns" class="header-anchor"&gt;&lt;/a&gt;Casos de Uso Comuns&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Pathfinding em Jogos (Busca de Caminho):&lt;/strong&gt; Encontrar o caminho mais curto para um personagem se mover em um ambiente de jogo (onde todos os movimentos têm o mesmo custo).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Roteamento de Rede:&lt;/strong&gt; Descobrir a topologia da rede e encontrar os caminhos mais curtos entre dispositivos.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Coleta de Lixo (Garbage Collection):&lt;/strong&gt; Rastrear objetos alcançáveis na memória para identificar aqueles que podem ser desalocados com segurança.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Redes Peer-to-Peer:&lt;/strong&gt; Encontrar os pares mais próximos em uma rede peer-to-peer.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="busca-em-profundidade-dfs"&gt;&lt;a href="#busca-em-profundidade-dfs" class="header-anchor"&gt;&lt;/a&gt;Busca em Profundidade (DFS)&#10;&lt;/h2&gt;&lt;p&gt;A Busca em Profundidade (DFS, do inglês Depth-First Search) é outro algoritmo fundamental de busca e travessia de grafos. Em vez de explorar um grafo nível por nível como o BFS, o DFS explora o mais profundamente possível ao longo de cada ramo antes de retroceder (backtracking). O DFS escolherá um caminho e o seguirá até o final, então retrocederá ao último ponto de ramificação e tentará um caminho diferente.&lt;/p&gt;&#10;&lt;h3 id="como-o-dfs-funciona"&gt;&lt;a href="#como-o-dfs-funciona" class="header-anchor"&gt;&lt;/a&gt;Como o DFS Funciona&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Inicialização:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Comece com uma estrutura de dados &lt;em&gt;pilha&lt;/em&gt; (stack), tipicamente implementada usando uma lista em Python. A pilha inicialmente contém apenas o &lt;em&gt;nó inicial&lt;/em&gt;.&lt;/li&gt;&#10;&lt;li&gt;Mantenha um conjunto (set) ou lista &lt;code&gt;visitados&lt;/code&gt; para controlar os nós que já foram explorados, evitando ciclos.&lt;/li&gt;&#10;&lt;li&gt;Opcionalmente, um dicionário &lt;code&gt;pai&lt;/code&gt; (parent) é usado para armazenar o predecessor de cada nó visitado, permitindo a reconstrução do caminho mais tarde.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Iteração:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Enquanto a pilha não estiver vazia:&#10;&lt;ul&gt;&#10;&lt;li&gt;Remova um nó do &lt;em&gt;topo&lt;/em&gt; da pilha (pop). Este é o nó sendo explorado atualmente.&lt;/li&gt;&#10;&lt;li&gt;Se o nó não foi visitado:&#10;&lt;ul&gt;&#10;&lt;li&gt;Marque o nó como visitado.&lt;/li&gt;&#10;&lt;li&gt;Para cada &lt;em&gt;vizinho&lt;/em&gt; do nó atual:&#10;&lt;ul&gt;&#10;&lt;li&gt;Se o vizinho não foi visitado:&#10;&lt;ul&gt;&#10;&lt;li&gt;Adicione o vizinho ao &lt;em&gt;topo&lt;/em&gt; da pilha (push).&lt;/li&gt;&#10;&lt;li&gt;Registre o nó atual como o &lt;em&gt;pai&lt;/em&gt; do vizinho (se a reconstrução do caminho for necessária).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Terminação:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;O algoritmo termina quando a pilha está vazia, indicando que todos os nós alcançáveis a partir do nó inicial foram explorados.&lt;/li&gt;&#10;&lt;li&gt;Se um &lt;em&gt;nó alvo&lt;/em&gt; for especificado, a busca pode terminar assim que o nó alvo for removido da pilha e for encontrado. O dicionário &lt;code&gt;pai&lt;/code&gt; pode então ser usado para reconstruir um caminho (não necessariamente o mais curto) do nó inicial ao nó alvo.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="prós-do-dfs"&gt;&lt;a href="#pr%c3%b3s-do-dfs" class="header-anchor"&gt;&lt;/a&gt;Prós do DFS&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Eficiência de Memória:&lt;/strong&gt; O DFS geralmente requer menos memória do que o BFS, especialmente para grafos profundos. Ele só precisa armazenar os nós no caminho atual sendo explorado, em vez de todos os nós no nível atual (como o BFS faz).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Implementação Simples:&lt;/strong&gt; O DFS pode ser implementado recursivamente, tornando o código muito conciso (embora a versão iterativa, usando uma pilha, também seja direta).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Bom para Encontrar &lt;em&gt;Qualquer&lt;/em&gt; Caminho:&lt;/strong&gt; Se você só precisa encontrar &lt;em&gt;um&lt;/em&gt; caminho entre dois nós (não necessariamente o mais curto), o DFS pode ser mais rápido do que o BFS.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="contras-do-dfs"&gt;&lt;a href="#contras-do-dfs" class="header-anchor"&gt;&lt;/a&gt;Contras do DFS&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Não Garante Encontrar o Caminho Mais Curto:&lt;/strong&gt; O DFS &lt;em&gt;não&lt;/em&gt; garante encontrar o caminho mais curto. Ele encontra um caminho, mas esse caminho pode ser muito mais longo do que o caminho mais curto.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Pode Ficar Preso em Loops Infinitos:&lt;/strong&gt; Se o grafo contém ciclos e o conjunto &lt;code&gt;visitados&lt;/code&gt; não for usado corretamente, o DFS pode ficar preso em um loop infinito, explorando os mesmos nós repetidamente.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Pode Explorar Caminhos Irrelevantes:&lt;/strong&gt; O DFS pode explorar caminhos que estão longe do nó alvo antes de encontrar o alvo.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="onde-o-dfs-se-destaca"&gt;&lt;a href="#onde-o-dfs-se-destaca" class="header-anchor"&gt;&lt;/a&gt;Onde o DFS se Destaca&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Detecção de Ciclos:&lt;/strong&gt; O DFS é adequado para detectar ciclos em um grafo. Se, durante a travessia, você encontrar um nó que já foi visitado (e ainda está na pilha), isso indica a presença de um ciclo.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Ordenação Topológica:&lt;/strong&gt; O DFS é usado em algoritmos para ordenação topológica de grafos acíclicos dirigidos (DAGs).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Verificação da Existência de Caminho:&lt;/strong&gt; Determinar se um caminho existe entre dois nós, mesmo que o caminho mais curto não seja necessário.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Resolvendo Quebra-Cabeças:&lt;/strong&gt; O DFS pode ser usado para explorar possíveis soluções em quebra-cabeças e jogos (por exemplo, resolver um labirinto, encontrar uma solução para um quebra-cabeça Sudoku).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="onde-o-dfs-falha"&gt;&lt;a href="#onde-o-dfs-falha" class="header-anchor"&gt;&lt;/a&gt;Onde o DFS Falha&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Encontrar Caminhos Mais Curtos:&lt;/strong&gt; Quando o caminho mais curto é necessário, o BFS ou outros algoritmos como o algoritmo de Dijkstra são melhores opções.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Grafos com Caminhos Longos:&lt;/strong&gt; Em grafos com caminhos muito longos, o DFS pode levar muito tempo para encontrar o nó alvo ou explorar todo o grafo.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Grafos Infinitos:&lt;/strong&gt; O DFS pode se perder em grafos infinitos se não houver uma condição de terminação clara.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="casos-de-uso-comuns-1"&gt;&lt;a href="#casos-de-uso-comuns-1" class="header-anchor"&gt;&lt;/a&gt;Casos de Uso Comuns&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Detecção de Ciclos:&lt;/strong&gt; Conforme mencionado anteriormente, o DFS é comumente usado para detectar ciclos em grafos.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Ordenação Topológica:&lt;/strong&gt; Ordenar tarefas em um projeto com base em dependências.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Resolvendo Labirintos:&lt;/strong&gt; Encontrar um caminho da entrada para a saída.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Algoritmos de Backtracking:&lt;/strong&gt; Resolver problemas onde você precisa explorar diferentes possibilidades e retroceder quando um beco sem saída é atingido (por exemplo, resolver problemas de satisfação de restrições).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;IA de Jogos:&lt;/strong&gt; Implementar IA para jogos onde a IA precisa explorar possíveis movimentos e avaliar suas consequências.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Adicionei abaixo dois exemplos, um para BFS e outro para DFS. O grafo usado foi o da imagem abaixo:&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="graph" class="gallery-image" data-flex-basis="304px" data-flex-grow="127" height="1290" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://fabiolopes.page/p/breadth-first-search-bfs-and-depth-first-search-dfs-a-deep-dive/graph_hu_a1d2011dd928b702.png" srcset="https://fabiolopes.page/p/breadth-first-search-bfs-and-depth-first-search-dfs-a-deep-dive/graph_hu_3c645fdf0fdb17c.png 800w, https://fabiolopes.page/p/breadth-first-search-bfs-and-depth-first-search-dfs-a-deep-dive/graph_hu_6cd21ce34a271bb8.png 1600w, https://fabiolopes.page/p/breadth-first-search-bfs-and-depth-first-search-dfs-a-deep-dive/graph_hu_a1d2011dd928b702.png 1639w" width="1639"&gt;&lt;/p&gt;&#10;&lt;p&gt;Este é o resultado de ambos, onde podemos notar a diferença:&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;bfs.py:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="code-example"&gt;&#10; &lt;div class="code-toolbar"&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;span class="code-language"&gt;bash&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Sequência de nós visitados: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;G&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;C&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;D&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;E&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;H&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;J&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;I&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Visitados um total de &lt;span class="m"&gt;10&lt;/span&gt; nós.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Caminho encontrado de A para F: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;E&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&lt;strong&gt;Ordem de Visitação:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Nível 0: [&amp;lsquo;A&amp;rsquo;]&lt;/li&gt;&#10;&lt;li&gt;Nível 1: [&amp;lsquo;B&amp;rsquo;, &amp;lsquo;G&amp;rsquo;]&lt;/li&gt;&#10;&lt;li&gt;Nível 2: [&amp;lsquo;C&amp;rsquo;, &amp;lsquo;D&amp;rsquo;, &amp;lsquo;E&amp;rsquo;, &amp;lsquo;H&amp;rsquo;, &amp;lsquo;J&amp;rsquo;]&lt;/li&gt;&#10;&lt;li&gt;Nível 3: [&amp;lsquo;F&amp;rsquo;, &amp;lsquo;I&amp;rsquo;]&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Ele visita todos os nós no nível atual antes de ir para o próximo nível.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;dfs.py:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="code-example"&gt;&#10; &lt;div class="code-toolbar"&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;span class="code-language"&gt;bash&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Sequência de nós visitados: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;G&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;J&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;H&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;I&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;E&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Visitados um total de &lt;span class="m"&gt;8&lt;/span&gt; nós.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Caminho encontrado de A para F: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;E&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&lt;strong&gt;Ordem de Visitação:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&amp;lsquo;A&amp;rsquo;: Nó inicial, removido primeiro.&lt;/li&gt;&#10;&lt;li&gt;&amp;lsquo;G&amp;rsquo;: De &amp;lsquo;A&amp;rsquo;, vizinhos são [&amp;lsquo;B&amp;rsquo;, &amp;lsquo;G&amp;rsquo;]. Adicionado à pilha como [&amp;lsquo;B&amp;rsquo;, &amp;lsquo;G&amp;rsquo;], então &amp;lsquo;G&amp;rsquo; é removido em seguida (LIFO).&lt;/li&gt;&#10;&lt;li&gt;&amp;lsquo;J&amp;rsquo;: De &amp;lsquo;G&amp;rsquo;, vizinhos são [&amp;lsquo;H&amp;rsquo;, &amp;lsquo;J&amp;rsquo;]. Adicionado como [&amp;lsquo;B&amp;rsquo;, &amp;lsquo;H&amp;rsquo;, &amp;lsquo;J&amp;rsquo;], &amp;lsquo;J&amp;rsquo; removido.&lt;/li&gt;&#10;&lt;li&gt;&amp;lsquo;H&amp;rsquo;: De &amp;lsquo;J&amp;rsquo;, nenhum novo vizinho. Pilha agora [&amp;lsquo;B&amp;rsquo;, &amp;lsquo;H&amp;rsquo;], &amp;lsquo;H&amp;rsquo; removido.&lt;/li&gt;&#10;&lt;li&gt;&amp;lsquo;I&amp;rsquo;: De &amp;lsquo;H&amp;rsquo;, vizinho &amp;lsquo;I&amp;rsquo; adicionado, removido em seguida.&lt;/li&gt;&#10;&lt;li&gt;&amp;lsquo;B&amp;rsquo;: Pilha agora [&amp;lsquo;B&amp;rsquo;], removido após a subárvore de &amp;lsquo;G&amp;rsquo; ser esgotada.&lt;/li&gt;&#10;&lt;li&gt;&amp;lsquo;E&amp;rsquo;: De &amp;lsquo;B&amp;rsquo;, vizinhos [&amp;lsquo;C&amp;rsquo;, &amp;lsquo;D&amp;rsquo;, &amp;lsquo;E&amp;rsquo;]. Adicionado como [&amp;lsquo;C&amp;rsquo;, &amp;lsquo;D&amp;rsquo;, &amp;lsquo;E&amp;rsquo;], &amp;lsquo;E&amp;rsquo; removido.&lt;/li&gt;&#10;&lt;li&gt;&amp;lsquo;F&amp;rsquo;: De &amp;lsquo;E&amp;rsquo;, vizinhos [&amp;lsquo;F&amp;rsquo;, &amp;lsquo;I&amp;rsquo;]. &amp;lsquo;I&amp;rsquo; já visitado, então &amp;lsquo;F&amp;rsquo; adicionado e removido. Alvo encontrado, para.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Ele vai fundo no ramo de &amp;lsquo;G&amp;rsquo; (&amp;lsquo;G&amp;rsquo; → &amp;lsquo;J&amp;rsquo; → &amp;lsquo;H&amp;rsquo; → &amp;lsquo;I&amp;rsquo;) antes de retroceder para &amp;lsquo;B&amp;rsquo; e então &amp;lsquo;E&amp;rsquo; → &amp;lsquo;F&amp;rsquo;.&lt;/p&gt;&#10;&lt;details&gt;&#10;&lt;summary&gt;&lt;b&gt;Exemplo de BFS&lt;/b&gt; (Clique para Mostrar/Esconder)&lt;/summary&gt;&#10;&lt;div class="code-example"&gt;&#10; &lt;div class="code-toolbar"&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;span class="code-language"&gt;python&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;span class="lnt"&gt;20&#10;&lt;/span&gt;&lt;span class="lnt"&gt;21&#10;&lt;/span&gt;&lt;span class="lnt"&gt;22&#10;&lt;/span&gt;&lt;span class="lnt"&gt;23&#10;&lt;/span&gt;&lt;span class="lnt"&gt;24&#10;&lt;/span&gt;&lt;span class="lnt"&gt;25&#10;&lt;/span&gt;&lt;span class="lnt"&gt;26&#10;&lt;/span&gt;&lt;span class="lnt"&gt;27&#10;&lt;/span&gt;&lt;span class="lnt"&gt;28&#10;&lt;/span&gt;&lt;span class="lnt"&gt;29&#10;&lt;/span&gt;&lt;span class="lnt"&gt;30&#10;&lt;/span&gt;&lt;span class="lnt"&gt;31&#10;&lt;/span&gt;&lt;span class="lnt"&gt;32&#10;&lt;/span&gt;&lt;span class="lnt"&gt;33&#10;&lt;/span&gt;&lt;span class="lnt"&gt;34&#10;&lt;/span&gt;&lt;span class="lnt"&gt;35&#10;&lt;/span&gt;&lt;span class="lnt"&gt;36&#10;&lt;/span&gt;&lt;span class="lnt"&gt;37&#10;&lt;/span&gt;&lt;span class="lnt"&gt;38&#10;&lt;/span&gt;&lt;span class="lnt"&gt;39&#10;&lt;/span&gt;&lt;span class="lnt"&gt;40&#10;&lt;/span&gt;&lt;span class="lnt"&gt;41&#10;&lt;/span&gt;&lt;span class="lnt"&gt;42&#10;&lt;/span&gt;&lt;span class="lnt"&gt;43&#10;&lt;/span&gt;&lt;span class="lnt"&gt;44&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;collections&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;deque&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;breadth_first_search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start_node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_node&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;visited_set&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;visited_order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;start_node&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;start_node&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;deque&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;start_node&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;popleft&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;target_node&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;start_node&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;visited_order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;[::&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;neighbor&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;neighbor&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;visited_set&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;visited_set&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;neighbor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;visited_order&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;neighbor&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;neighbor&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;neighbor&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;visited_order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;graph&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;G&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;C&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;D&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;E&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;C&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;D&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;E&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;I&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;G&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;H&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;J&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;H&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;I&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;I&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;J&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;start_node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;target_node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;breadth_first_search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start_node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Sequência de nós visitados: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Visitados um total de &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; nós.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Caminho encontrado de &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;start_node&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; para &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;target_node&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;target_node&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Alvo não foi especificado.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Nenhum caminho encontrado de &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;start_node&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; para &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;target_node&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&lt;details&gt;&#10;&lt;summary&gt;&lt;b&gt;Exemplo de DFS&lt;/b&gt; (Clique para Mostrar/Esconder)&lt;/summary&gt;&#10;&lt;div class="code-example"&gt;&#10; &lt;div class="code-toolbar"&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;span class="code-language"&gt;python&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;span class="lnt"&gt;20&#10;&lt;/span&gt;&lt;span class="lnt"&gt;21&#10;&lt;/span&gt;&lt;span class="lnt"&gt;22&#10;&lt;/span&gt;&lt;span class="lnt"&gt;23&#10;&lt;/span&gt;&lt;span class="lnt"&gt;24&#10;&lt;/span&gt;&lt;span class="lnt"&gt;25&#10;&lt;/span&gt;&lt;span class="lnt"&gt;26&#10;&lt;/span&gt;&lt;span class="lnt"&gt;27&#10;&lt;/span&gt;&lt;span class="lnt"&gt;28&#10;&lt;/span&gt;&lt;span class="lnt"&gt;29&#10;&lt;/span&gt;&lt;span class="lnt"&gt;30&#10;&lt;/span&gt;&lt;span class="lnt"&gt;31&#10;&lt;/span&gt;&lt;span class="lnt"&gt;32&#10;&lt;/span&gt;&lt;span class="lnt"&gt;33&#10;&lt;/span&gt;&lt;span class="lnt"&gt;34&#10;&lt;/span&gt;&lt;span class="lnt"&gt;35&#10;&lt;/span&gt;&lt;span class="lnt"&gt;36&#10;&lt;/span&gt;&lt;span class="lnt"&gt;37&#10;&lt;/span&gt;&lt;span class="lnt"&gt;38&#10;&lt;/span&gt;&lt;span class="lnt"&gt;39&#10;&lt;/span&gt;&lt;span class="lnt"&gt;40&#10;&lt;/span&gt;&lt;span class="lnt"&gt;41&#10;&lt;/span&gt;&lt;span class="lnt"&gt;42&#10;&lt;/span&gt;&lt;span class="lnt"&gt;43&#10;&lt;/span&gt;&lt;span class="lnt"&gt;44&#10;&lt;/span&gt;&lt;span class="lnt"&gt;45&#10;&lt;/span&gt;&lt;span class="lnt"&gt;46&#10;&lt;/span&gt;&lt;span class="lnt"&gt;47&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;depth_first_search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start_node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_node&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;start_node&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;start_node&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;visited&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;target_node&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;start_node&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;start_node&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;[::&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;neighbor&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;neighbor&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;neighbor&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;neighbor&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;graph&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;G&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;C&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;D&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;E&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;C&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;D&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;E&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;I&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;G&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;H&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;J&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;H&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;I&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;I&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;J&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;start_node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;target_node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;depth_first_search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start_node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Sequência de nós visitados: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Visitados um total de &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; nós.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Caminho encontrado de &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;start_node&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; para &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;target_node&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;target_node&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Alvo não foi especificado.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Nenhum caminho encontrado de &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;start_node&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; para &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;target_node&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/details&gt;</description></item><item><title>Construindo um Cluster Kubernetes com Kubespray: Uma Jornada Pessoal</title><link>https://fabiolopes.page/pt-br/p/construindo-um-cluster-kubernetes-com-kubespray-uma-jornada-pessoal/</link><pubDate>Sat, 09 Nov 2024 00:00:00 +0000</pubDate><guid>https://fabiolopes.page/pt-br/p/construindo-um-cluster-kubernetes-com-kubespray-uma-jornada-pessoal/</guid><description>&lt;img src="https://fabiolopes.page/p/building-a-kubernetes-cluster-with-kubespray-a-personal-journey/kubespray.svg" alt="Featured image of post Construindo um Cluster Kubernetes com Kubespray: Uma Jornada Pessoal" /&gt;&lt;h2 id="construindo-um-cluster-kubernetes-com-kubespray-e-stack-de-monitoramento-uma-jornada-pessoal"&gt;&lt;a href="#construindo-um-cluster-kubernetes-com-kubespray-e-stack-de-monitoramento-uma-jornada-pessoal" class="header-anchor"&gt;&lt;/a&gt;Construindo um Cluster Kubernetes com Kubespray e Stack de Monitoramento: Uma Jornada Pessoal&#10;&lt;/h2&gt;&lt;p&gt;Este post detalha minha experiência configurando um cluster Kubernetes em 7 nós bare-metal usando Kubespray, seguido pela implantação de um stack de monitoramento abrangente composto por Rook, Mimir, Grafana e Loki, que serão descritos em posts separados. Esta configuração fornece recursos robustos de armazenamento, métricas e logs para nosso uso interno.&lt;/p&gt;&#10;&lt;h3 id="kubespray-o-orquestrador"&gt;&lt;a href="#kubespray-o-orquestrador" class="header-anchor"&gt;&lt;/a&gt;Kubespray: O Orquestrador&#10;&lt;/h3&gt;&lt;p&gt;Kubespray é uma ferramenta poderosa baseada em Ansible para implantar e gerenciar clusters Kubernetes. Ele automatiza o processo complexo de configurar um plano de controle Kubernetes e nós de trabalho, lidando com tarefas como instalar componentes Kubernetes, configurar rede e gerenciar etcd. Ele permite personalização flexível por meio de arquivos de inventário e variáveis de grupo. Escolhi a versão 2.26.0 para esta implantação na época.&lt;/p&gt;&#10;&lt;h3 id="pré-requisitos"&gt;&lt;a href="#pr%c3%a9-requisitos" class="header-anchor"&gt;&lt;/a&gt;Pré-requisitos&#10;&lt;/h3&gt;&lt;p&gt;Como usei servidores bare metal que ficaram disponíveis de outro projeto, instalei previamente o sistema operacional e configurei tudo, desde pacotes até rede e autenticação.&lt;/p&gt;&#10;&lt;h3 id="configuração-passo-a-passo"&gt;&lt;a href="#configura%c3%a7%c3%a3o-passo-a-passo" class="header-anchor"&gt;&lt;/a&gt;Configuração Passo a Passo&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;1. Clonagem do Git e Imagem Docker:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Primeiro, clonamos o repositório Kubespray e puxamos a imagem Docker necessária:&lt;/p&gt;&#10;&lt;div class="code-example"&gt;&#10; &lt;div class="code-toolbar"&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;span class="code-language"&gt;bash&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Clona o repositório Kubespray&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/kubernetes-sigs/kubespray.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git checkout v2.26.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Puxa a imagem Docker do Kubespray&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker pull quay.io/kubespray/kubespray:v2.26.0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Isso garante que tenhamos a versão mais recente (ou a versão específica que precisamos) do Kubespray. A imagem Docker contém todos os componentes Ansible necessários e evita possíveis conflitos com instalações locais. &lt;strong&gt;Nunca&lt;/strong&gt; use a versão mais recente commitada no repositório, sempre use uma versão estável.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;2. Configuração do Inventário:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;O coração da configuração do Kubespray reside em seus arquivos de inventário. Eles definem os nós em seu cluster, suas funções e informações de rede relevantes. Meu arquivo de inventário (&lt;code&gt;inventory/k8s-logs/hosts.yml&lt;/code&gt;) se parece com isto:&lt;/p&gt;&#10;&lt;div class="code-example"&gt;&#10; &lt;div class="code-toolbar"&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;span class="code-language"&gt;yaml&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;span class="lnt"&gt;20&#10;&lt;/span&gt;&lt;span class="lnt"&gt;21&#10;&lt;/span&gt;&lt;span class="lnt"&gt;22&#10;&lt;/span&gt;&lt;span class="lnt"&gt;23&#10;&lt;/span&gt;&lt;span class="lnt"&gt;24&#10;&lt;/span&gt;&lt;span class="lnt"&gt;25&#10;&lt;/span&gt;&lt;span class="lnt"&gt;26&#10;&lt;/span&gt;&lt;span class="lnt"&gt;27&#10;&lt;/span&gt;&lt;span class="lnt"&gt;28&#10;&lt;/span&gt;&lt;span class="lnt"&gt;29&#10;&lt;/span&gt;&lt;span class="lnt"&gt;30&#10;&lt;/span&gt;&lt;span class="lnt"&gt;31&#10;&lt;/span&gt;&lt;span class="lnt"&gt;32&#10;&lt;/span&gt;&lt;span class="lnt"&gt;33&#10;&lt;/span&gt;&lt;span class="lnt"&gt;34&#10;&lt;/span&gt;&lt;span class="lnt"&gt;35&#10;&lt;/span&gt;&lt;span class="lnt"&gt;36&#10;&lt;/span&gt;&lt;span class="lnt"&gt;37&#10;&lt;/span&gt;&lt;span class="lnt"&gt;38&#10;&lt;/span&gt;&lt;span class="lnt"&gt;39&#10;&lt;/span&gt;&lt;span class="lnt"&gt;40&#10;&lt;/span&gt;&lt;span class="lnt"&gt;41&#10;&lt;/span&gt;&lt;span class="lnt"&gt;42&#10;&lt;/span&gt;&lt;span class="lnt"&gt;43&#10;&lt;/span&gt;&lt;span class="lnt"&gt;44&#10;&lt;/span&gt;&lt;span class="lnt"&gt;45&#10;&lt;/span&gt;&lt;span class="lnt"&gt;46&#10;&lt;/span&gt;&lt;span class="lnt"&gt;47&#10;&lt;/span&gt;&lt;span class="lnt"&gt;48&#10;&lt;/span&gt;&lt;span class="lnt"&gt;49&#10;&lt;/span&gt;&lt;span class="lnt"&gt;50&#10;&lt;/span&gt;&lt;span class="lnt"&gt;51&#10;&lt;/span&gt;&lt;span class="lnt"&gt;52&#10;&lt;/span&gt;&lt;span class="lnt"&gt;53&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;all&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Nós de Trabalho&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;logsrv1234&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ansible_host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10.0.0.245&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# IP de conexão Ansible&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10.1.0.45&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Endereço IP interno&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;access_ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10.1.0.45&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# IP para acesso externo (se necessário)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;node_labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;node-role.kubernetes.io/node&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Rótulo indicando que é um nó de trabalho&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ... (entradas semelhantes para outros nós de trabalho logsrv1233 - logsrv1228) ...&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Nó de Ingress&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ingress-1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ansible_host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10.0.0.241&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10.1.0.41&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;access_ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10.1.0.41&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;node_labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;node-role.kubernetes.io/node&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Nó de Ingress também precisa de função de nó&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Nós Master&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;master-1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ansible_host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10.0.0.242&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10.1.0.42&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;access_ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10.1.0.42&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;node_labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;node-role.kubernetes.io/master&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Rótulo designando um nó master&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ... (entradas semelhantes para master-2 e master-3) ...&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Agrupando hosts com base em suas funções para gerenciamento simplificado&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;kube_control_plane&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;master-1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;master-2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;master-3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;kube_node&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;logsrv1234&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;logsrv1233&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ... outros nós de trabalho e ingress ...&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;etcd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;master-1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;master-2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;master-3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;k8s_cluster&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;kube_control_plane&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;kube_node&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;calico_rr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{}&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Configuração do Calico (vazia por enquanto)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Isso define meticulosamente cada nó, seus endereços IP (ansible_host para conexão Ansible, ip para comunicação interna do cluster e access_ip para acesso externo) e sua função dentro do cluster Kubernetes usando rótulos de nó. A seção &lt;code&gt;children&lt;/code&gt; agrupa os hosts para facilitar o gerenciamento nos playbooks do Ansible.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;3. Variáveis de Grupo:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;O diretório &lt;code&gt;group_vars&lt;/code&gt; contém arquivos YAML que definem variáveis globais e específicas do grupo para a implantação do Kubespray. O arquivo &lt;code&gt;all.yml&lt;/code&gt; define configurações gerais:&lt;/p&gt;&#10;&lt;div class="code-example"&gt;&#10; &lt;div class="code-toolbar"&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;span class="code-language"&gt;yaml&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;span class="lnt"&gt;20&#10;&lt;/span&gt;&lt;span class="lnt"&gt;21&#10;&lt;/span&gt;&lt;span class="lnt"&gt;22&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;bin_dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/usr/local/bin&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;loadbalancer_apiserver_port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6443&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;loadbalancer_apiserver_healthcheck_port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8081&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;upstream_dns_servers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;10.0.0.15&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;10.0.0.16&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;http_proxy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://proxy.internal:3128&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ambiente sem acesso direto à internet&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;https_proxy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://proxy.internal:3128&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ambiente sem acesso direto à internet&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;no_proxy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;10.0.0.0/8,localhost,127.0.0.0/8,172.16.0.0/16,*.internal&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ambiente sem acesso direto à internet&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;no_proxy_exclude_workers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_webhook_token_auth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_webhook_token_auth_url_skip_tls_verify&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;ntp_enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;ntp_manage_config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;ntp_servers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;0.pool.ntp.org iburst&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;1.pool.ntp.org iburst&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;2.pool.ntp.org iburst&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;3.pool.ntp.org iburst&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;unsafe_show_logs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;allow_unsupported_distribution_setup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;E &lt;code&gt;k8s-cluster.yml&lt;/code&gt; configura as configurações específicas do Kubernetes:&lt;/p&gt;&#10;&lt;div class="code-example"&gt;&#10; &lt;div class="code-toolbar"&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;span class="code-language"&gt;yaml&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;span class="lnt"&gt;20&#10;&lt;/span&gt;&lt;span class="lnt"&gt;21&#10;&lt;/span&gt;&lt;span class="lnt"&gt;22&#10;&lt;/span&gt;&lt;span class="lnt"&gt;23&#10;&lt;/span&gt;&lt;span class="lnt"&gt;24&#10;&lt;/span&gt;&lt;span class="lnt"&gt;25&#10;&lt;/span&gt;&lt;span class="lnt"&gt;26&#10;&lt;/span&gt;&lt;span class="lnt"&gt;27&#10;&lt;/span&gt;&lt;span class="lnt"&gt;28&#10;&lt;/span&gt;&lt;span class="lnt"&gt;29&#10;&lt;/span&gt;&lt;span class="lnt"&gt;30&#10;&lt;/span&gt;&lt;span class="lnt"&gt;31&#10;&lt;/span&gt;&lt;span class="lnt"&gt;32&#10;&lt;/span&gt;&lt;span class="lnt"&gt;33&#10;&lt;/span&gt;&lt;span class="lnt"&gt;34&#10;&lt;/span&gt;&lt;span class="lnt"&gt;35&#10;&lt;/span&gt;&lt;span class="lnt"&gt;36&#10;&lt;/span&gt;&lt;span class="lnt"&gt;37&#10;&lt;/span&gt;&lt;span class="lnt"&gt;38&#10;&lt;/span&gt;&lt;span class="lnt"&gt;39&#10;&lt;/span&gt;&lt;span class="lnt"&gt;40&#10;&lt;/span&gt;&lt;span class="lnt"&gt;41&#10;&lt;/span&gt;&lt;span class="lnt"&gt;42&#10;&lt;/span&gt;&lt;span class="lnt"&gt;43&#10;&lt;/span&gt;&lt;span class="lnt"&gt;44&#10;&lt;/span&gt;&lt;span class="lnt"&gt;45&#10;&lt;/span&gt;&lt;span class="lnt"&gt;46&#10;&lt;/span&gt;&lt;span class="lnt"&gt;47&#10;&lt;/span&gt;&lt;span class="lnt"&gt;48&#10;&lt;/span&gt;&lt;span class="lnt"&gt;49&#10;&lt;/span&gt;&lt;span class="lnt"&gt;50&#10;&lt;/span&gt;&lt;span class="lnt"&gt;51&#10;&lt;/span&gt;&lt;span class="lnt"&gt;52&#10;&lt;/span&gt;&lt;span class="lnt"&gt;53&#10;&lt;/span&gt;&lt;span class="lnt"&gt;54&#10;&lt;/span&gt;&lt;span class="lnt"&gt;55&#10;&lt;/span&gt;&lt;span class="lnt"&gt;56&#10;&lt;/span&gt;&lt;span class="lnt"&gt;57&#10;&lt;/span&gt;&lt;span class="lnt"&gt;58&#10;&lt;/span&gt;&lt;span class="lnt"&gt;59&#10;&lt;/span&gt;&lt;span class="lnt"&gt;60&#10;&lt;/span&gt;&lt;span class="lnt"&gt;61&#10;&lt;/span&gt;&lt;span class="lnt"&gt;62&#10;&lt;/span&gt;&lt;span class="lnt"&gt;63&#10;&lt;/span&gt;&lt;span class="lnt"&gt;64&#10;&lt;/span&gt;&lt;span class="lnt"&gt;65&#10;&lt;/span&gt;&lt;span class="lnt"&gt;66&#10;&lt;/span&gt;&lt;span class="lnt"&gt;67&#10;&lt;/span&gt;&lt;span class="lnt"&gt;68&#10;&lt;/span&gt;&lt;span class="lnt"&gt;69&#10;&lt;/span&gt;&lt;span class="lnt"&gt;70&#10;&lt;/span&gt;&lt;span class="lnt"&gt;71&#10;&lt;/span&gt;&lt;span class="lnt"&gt;72&#10;&lt;/span&gt;&lt;span class="lnt"&gt;73&#10;&lt;/span&gt;&lt;span class="lnt"&gt;74&#10;&lt;/span&gt;&lt;span class="lnt"&gt;75&#10;&lt;/span&gt;&lt;span class="lnt"&gt;76&#10;&lt;/span&gt;&lt;span class="lnt"&gt;77&#10;&lt;/span&gt;&lt;span class="lnt"&gt;78&#10;&lt;/span&gt;&lt;span class="lnt"&gt;79&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1.30.4 &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Versão do Kubernetes&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_network_plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;calico&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Plugin CNI a ser usado&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_config_dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/etc/kubernetes&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_script_dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{{ bin_dir }}/kubernetes-scripts&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_manifest_dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{{ kube_config_dir }}/manifests&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_cert_dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{{ kube_config_dir }}/ssl&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_token_dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{{ kube_config_dir }}/tokens&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_api_anonymous_auth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;local_release_dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/tmp/releases&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;retry_stagger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_owner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kube&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_cert_group&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kube-cert&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_log_level&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;credentials_dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{{ inventory_dir }}/credentials&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_network_plugin_multus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_service_addresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10.36.192.0&lt;/span&gt;&lt;span class="l"&gt;/18&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_pods_subnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;172.16.0.0&lt;/span&gt;&lt;span class="l"&gt;/16&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_network_node_prefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;24&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;enable_dual_stack_networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_service_addresses_ipv6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;fd85:ee78:d8a6:8607::1000/116&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_pods_subnet_ipv6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;fd85:ee78:d8a6:8607::1:0000/112&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_network_node_prefix_ipv6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;120&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_apiserver_ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{{ kube_service_addresses | ipaddr(&amp;#39;net&amp;#39;) | ipaddr(1) | ipaddr(&amp;#39;address&amp;#39;) }}&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_apiserver_port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6443&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_proxy_mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ipvs&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_proxy_strict_arp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_proxy_nodeport_addresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;gt;-&lt;/span&gt;&lt;span class="sd"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; {%- if kube_proxy_nodeport_addresses_cidr is defined -%}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; [{{ kube_proxy_nodeport_addresses_cidr }}]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; {%- else -%}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; []&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; {%- endif -%} &lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_encrypt_secret_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;cluster_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;k8s-logs&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;ndots&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;dns_mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;coredns&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;enable_nodelocaldns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;enable_nodelocaldns_secondary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;nodelocaldns_ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;169.254.25.10&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;nodelocaldns_health_port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;9254&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;nodelocaldns_second_health_port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;9256&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;nodelocaldns_bind_metrics_host_ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;nodelocaldns_secondary_skew_seconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;enable_coredns_k8s_external&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;coredns_k8s_external_zone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;k8s_external.local&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;enable_coredns_k8s_endpoint_pod_names&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;resolvconf_mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;host_resolvconf&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;deploy_netchecker&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;skydns_server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{{ kube_service_addresses | ipaddr(&amp;#39;net&amp;#39;) | ipaddr(3) | ipaddr(&amp;#39;address&amp;#39;) }}&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;skydns_server_secondary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{{ kube_service_addresses | ipaddr(&amp;#39;net&amp;#39;) | ipaddr(4) | ipaddr(&amp;#39;address&amp;#39;) }}&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;dns_domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{{ cluster_name }}&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;container_manager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;containerd&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kata_containers_enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kubeadm_certificate_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{{ lookup(&amp;#39;password&amp;#39;, credentials_dir + &amp;#39;/kubeadm_certificate_key.creds length=64 chars=hexdigits&amp;#39;) | lower }}&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;k8s_image_pull_policy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;IfNotPresent&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kubernetes_audit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;default_kubelet_config_dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{{ kube_config_dir }}/dynamic_kubelet_dir&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;podsecuritypolicy_enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;volume_cross_zone_attachment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;persistent_volumes_enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;event_ttl_duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1h0m0s&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;auto_renew_certificates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kubeadm_patches&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;source_dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{{ inventory_dir }}/patches&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dest_dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{{ kube_config_dir }}/patches&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;containerd_limit_open_file_num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1048576&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_proxy_metrics_bind_address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0.0.0.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;10249&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_vip_enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_vip_controlplane_enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_vip_address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10.46.0.40&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiserver_loadbalancer_domain_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;master-k8s-logs.local&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;loadbalancer_apiserver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10.0.0.40&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6443&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_vip_interface&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ens224&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_vip_services_enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kube_vip_arp_enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Essas variáveis definem parâmetros cruciais como a versão do Kubernetes, configuração de rede, configurações de proxy e muito mais. Os comentários dentro dos arquivos YAML oferecem mais detalhes sobre o propósito dessas variáveis.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;4. Geração de Chave SSH:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Em seguida, um par de chaves SSH é gerado para autenticação sem senha nos nós bare metal:&lt;/p&gt;&#10;&lt;div class="code-example"&gt;&#10; &lt;div class="code-toolbar"&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;span class="code-language"&gt;bash&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-keygen -t rsa -f id_rsa_kubespray&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Esta chave será usada pelo Ansible para se conectar e gerenciar os nós do cluster sem exigir a entrada manual de senha. Lembre-se de copiar a chave pública para o arquivo &lt;code&gt;authorized_keys&lt;/code&gt; de todos os nós.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;5. Executando o Kubespray dentro de um Contêiner Docker:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Para executar o Kubespray, usamos um contêiner Docker para isolar o ambiente:&lt;/p&gt;&#10;&lt;div class="code-example"&gt;&#10; &lt;div class="code-toolbar"&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;span class="code-language"&gt;bash&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --rm -it &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --mount &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;bind,source&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;/inventory/k8s-logs,dst&lt;span class="o"&gt;=&lt;/span&gt;/inventory &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --mount &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;bind,source&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;/cluster-logs/kubespray/id_rsa_kubespray,dst&lt;span class="o"&gt;=&lt;/span&gt;/root/.ssh/id_rsa &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; quay.io/kubespray/kubespray:v2.26.0 bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Este comando executa a imagem Kubespray, montando o diretório de inventário e a chave privada SSH no contêiner. A flag &lt;code&gt;--rm&lt;/code&gt; remove o contêiner após a execução. O comando &lt;code&gt;bash&lt;/code&gt; inicia um shell bash dentro do contêiner.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;6. Executando o Playbook:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Uma vez dentro do contêiner, o playbook principal do Kubespray é executado:&lt;/p&gt;&#10;&lt;div class="code-example"&gt;&#10; &lt;div class="code-toolbar"&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;span class="code-language"&gt;bash&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ansible-playbook -i inventory/hosts.yml cluster.yml -b&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&lt;code&gt;-i inventory/hosts.yml&lt;/code&gt; especifica o arquivo de inventário, &lt;code&gt;cluster.yml&lt;/code&gt; é o playbook principal e &lt;code&gt;-b&lt;/code&gt; habilita a execução become (sudo). Este comando inicia a implantação automatizada de todo o cluster Kubernetes.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;7. Obtendo o kubeconfig:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Após a execução bem-sucedida do playbook, o arquivo Kubernetes &lt;code&gt;admin.conf&lt;/code&gt; está localizado em &lt;code&gt;/etc/kubernetes/admin.conf&lt;/code&gt; em qualquer nó master. Este arquivo é copiado e usado para autenticar com o cluster usando &lt;code&gt;kubectl&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;8. Ajustes do kubectl:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Para acesso de fora da rede local (por exemplo, via VPN), o arquivo &lt;code&gt;kubeconfig&lt;/code&gt; pode precisar de ajustes para usar endereços IP em vez de FQDNs para uma conexão adequada.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;9. Implantação de Rook, Mimir, Grafana e Loki (Não detalhado aqui):&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Após a configuração do cluster Kubernetes, instalei o Rook para armazenamento persistente, o Mimir para armazenamento de métricas de longo prazo, o Grafana para visualizar as métricas e o Loki para agregação de logs. Essas etapas estão além do escopo deste post, mas foram cruciais para criar nosso stack de monitoramento. Descreverei cada instalação em posts dedicados.&lt;/p&gt;&#10;&lt;p&gt;Todo este processo fornece uma base sólida para um cluster Kubernetes robusto e escalável. O uso do Kubespray simplificou significativamente a implantação, e o stack de monitoramento garante que possamos gerenciar e solucionar problemas de nossa infraestrutura de forma eficaz. As configurações detalhadas de inventário e variáveis de grupo fornecem um modelo sólido para futuras implantações de cluster.&lt;/p&gt;&#10;</description></item><item><title>Primeiros Passos com Pipelines Declarativos no Jenkins</title><link>https://fabiolopes.page/pt-br/p/primeiros-passos-com-pipelines-declarativos-no-jenkins/</link><pubDate>Mon, 18 Oct 2021 00:00:00 +0000</pubDate><guid>https://fabiolopes.page/pt-br/p/primeiros-passos-com-pipelines-declarativos-no-jenkins/</guid><description>&lt;img src="https://fabiolopes.page/p/getting-started-with-jenkins-declarative-pipelines/Jenkins-logo-001.svg" alt="Featured image of post Primeiros Passos com Pipelines Declarativos no Jenkins" /&gt;&lt;p&gt;Depois de horas e horas de treinamento, vídeos, documentação e tutoriais, era hora de colocar em prática os conceitos que aprendi sobre Jenkins, uma das ferramentas de automação mais usadas para CI/CD.&lt;/p&gt;&#10;&lt;!--more---&gt;&#10;&lt;p&gt;É sabido que existem muitas outras soluções mais modernas hoje em dia, como GitHub Actions ou Gitlab CI, por exemplo, que é uma abordagem comum, já que você pode aproveitar o SCM (Source Code Management, ou Gerenciamento de Código Fonte) diretamente para automatizar suas tarefas, em vez de depender de uma ferramenta externa. No entanto, o Jenkins ainda é amplamente adotado e você pode executar muitas tarefas de automação sem muito esforço usando-o. Tudo vai depender da situação, do projeto atual e da equipe.&#10;Tradicionalmente, os jobs do Jenkins eram criados usando a interface do usuário do Jenkins e eram chamados de jobs FreeStyle. No Jenkins 2.0, uma nova forma foi introduzida usando uma técnica chamada pipeline como código, onde os jobs são criados usando um arquivo de script contendo os passos a serem executados. Esse arquivo de script é chamado de Jenkinsfile. Isso é apenas uma pincelada sobre os pipelines do Jenkins, há muito mais profundidade nisso e você sempre pode se aprofundar usando a documentação oficial em &lt;a class="link" href="https://www.jenkins.io/doc/book/pipeline/" target="_blank" rel="noopener"&#10; &gt;https://www.jenkins.io/doc/book/pipeline/&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Antes de começarmos a entrar nas coisas sérias, deixe-me apenas mencionar uma referência que inevitavelmente me veio à mente quando li pela primeira vez o nome &amp;ldquo;Jenkins&amp;rdquo;, que tenho certeza de que a maioria dos gamers do início dos anos 2000 vão se lembrar:&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="leeroy_jenkins" class="gallery-image" data-flex-basis="360px" data-flex-grow="150" height="466" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://fabiolopes.page/p/getting-started-with-jenkins-declarative-pipelines/leeroy-jenkins-civil-war-pn_hu_8e6e65d80bea0bd6.jpg" width="700"&gt;&lt;/p&gt;&#10;&lt;h3 id="1-o-que-é-um-pipeline-de-cicd"&gt;&lt;a href="#1-o-que-%c3%a9-um-pipeline-de-cicd" class="header-anchor"&gt;&lt;/a&gt;1. O que é um Pipeline de CI/CD?&#10;&lt;/h3&gt;&lt;p&gt;Um pipeline de CI/CD é geralmente descrito como os processos e estágios de automação na entrega de software. Geralmente, existe uma ferramenta específica usada para realizar isso, que se orquestra com o SCM e as outras ferramentas. Ele pode ser usado para construir código, executar testes unitários, testes de fumaça (smoke tests), chamar ferramentas externas como SonarQube, Anchore, Trivy, construir imagens Docker e implantar em ambientes como Kubernetes ou onde quer que a aplicação seja entregue. Ao realizar operações e testes padronizados, um pipeline de CI/CD pode ajudar a reduzir erros manuais, fornecer feedback aos desenvolvedores e permitir iterações rápidas.&lt;/p&gt;&#10;&lt;h3 id="2-o-que-é-um-jenkinsfile"&gt;&lt;a href="#2-o-que-%c3%a9-um-jenkinsfile" class="header-anchor"&gt;&lt;/a&gt;2. O que é um Jenkinsfile?&#10;&lt;/h3&gt;&lt;p&gt;Um &lt;code&gt;Jenkinsfile&lt;/code&gt; é apenas um arquivo de texto, geralmente commitado juntamente com o código fonte do projeto em um SCM. Idealmente, cada aplicação terá seu Jenkinsfile.&#10;Um Jenkinsfile pode ser escrito de duas maneiras - &amp;ldquo;sintaxe de pipeline com script&amp;rdquo; ou &amp;ldquo;sintaxe de pipeline declarativa&amp;rdquo;.&lt;/p&gt;&#10;&lt;h3 id="3-o-que-é-um-pipeline-scripted-do-jenkins"&gt;&lt;a href="#3-o-que-%c3%a9-um-pipeline-scripted-do-jenkins" class="header-anchor"&gt;&lt;/a&gt;3. O que é um Pipeline Scripted do Jenkins?&#10;&lt;/h3&gt;&lt;p&gt;Pipelines com script são executados no Jenkins master com a ajuda de um executor leve. Ele usa muito poucos recursos para traduzir o pipeline em comandos atômicos. Tanto a sintaxe declarativa quanto a sintaxe com script são diferentes uma da outra e são definidas de forma diferente. Pipelines com script são escritos em Groovy.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Requer conhecimento da linguagem Groovy;&lt;/li&gt;&#10;&lt;li&gt;O Jenkinsfile começa com a palavra &amp;rsquo;node';&lt;/li&gt;&#10;&lt;li&gt;Capacidades avançadas;&lt;/li&gt;&#10;&lt;li&gt;Motor Groovy;&lt;/li&gt;&#10;&lt;li&gt;Pode conter construções de programação padrão, como bloco if-else, bloco try-catch, etc.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Um exemplo de um Pipeline Scripted:&lt;/p&gt;&#10;&lt;div class="code-example"&gt;&#10; &lt;div class="code-toolbar"&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;span class="code-language"&gt;groovy&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Build&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;BRANCH_NAME&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;master&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Estou na branch master, construindo a aplicação&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;bat&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;msbuild ${C:\\Jenkins\\my_project\\workspace\\test\\my_project.sln}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Em direção ao centro do Computador Nuvem.&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Selenium&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Executando Testes de Fumaça do Selenium&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bachelol&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;//muda o caminho para “bachelol”&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;bat&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mvn clean test -Dsuite=SMOKE_TEST -Denvironment=QA&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="4-o-que-é-um-pipeline-declarativo-do-jenkins"&gt;&lt;a href="#4-o-que-%c3%a9-um-pipeline-declarativo-do-jenkins" class="header-anchor"&gt;&lt;/a&gt;4. O que é um Pipeline Declarativo do Jenkins?&#10;&lt;/h3&gt;&lt;p&gt;O Pipeline Declarativo é relativamente novo e fornece uma sintaxe simplificada e opinativa sobre os subsistemas do Pipeline. Sua sintaxe oferece uma maneira fácil de criar pipelines. Ele contém uma hierarquia predefinida e oferece a capacidade de controlar todos os aspectos da execução de um pipeline de maneira simples e direta.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;A adição mais recente na técnica de criação de job pipeline do Jenkins;&lt;/li&gt;&#10;&lt;li&gt;Precisa usar as construções predefinidas para criar pipelines; Portanto, não é tão flexível quanto um pipeline com script;&lt;/li&gt;&#10;&lt;li&gt;O Jenkinsfile começa com a palavra &amp;lsquo;pipeline&amp;rsquo; e existe uma estrutura predefinida;&lt;/li&gt;&#10;&lt;li&gt;Normalmente, a maneira preferida de começar, pois oferecem um rico conjunto de recursos, vêm com uma curva de aprendizado menor e não exigem o aprendizado prévio de uma linguagem de programação como Groovy apenas para escrever código de pipeline;&lt;/li&gt;&#10;&lt;li&gt;Também podemos validar a sintaxe do código do pipeline declarativo antes de executar o job. Ajuda a evitar muitos problemas de tempo de execução com o script de build.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="5-por-que-executar-o-jenkins-no-docker"&gt;&lt;a href="#5-por-que-executar-o-jenkins-no-docker" class="header-anchor"&gt;&lt;/a&gt;5. Por que executar o Jenkins no Docker?&#10;&lt;/h3&gt;&lt;p&gt;Apesar das vantagens inerentes (e ressalvas) de executar qualquer coisa no Docker, os principais motivos que pude pensar são:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Capacidade de manter a configuração do servidor sob controle de versão;&lt;/li&gt;&#10;&lt;li&gt;Executar várias cópias do servidor em qualquer lugar;&lt;/li&gt;&#10;&lt;li&gt;Integrar com Kubernetes e outras plataformas de orquestração;&lt;/li&gt;&#10;&lt;li&gt;A imagem oficial do Docker do Jenkins é amplamente adotada e mantida;&lt;/li&gt;&#10;&lt;li&gt;Implementação simples = administração simples.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;O principal (Desvantagem|Ressalva|Problema|Questão|Falha) é quando você também deseja usar agentes com o docker. Para fazer isso, você precisará de alguma implementação do Docker in Docker. Existem algumas maneiras de fazer isso, mas as duas maneiras mais fáceis são conectar o contêiner Jenkins diretamente ao socket Docker do host usando &lt;code&gt;-v /var/run/docker.sock:/var/run/docker.sock&lt;/code&gt; e alterar as permissões, ou habilitar o TCP no lado do servidor Docker.&#10;Se você puder executar seu servidor Jenkins no Kubernetes, poderá habilitá-lo para iniciar novos pods de agente dentro do cluster, o que oferece ainda mais flexibilidade. Vou tentar isso no futuro, já que estou sem créditos na AWS e meu cluster de desenvolvimento está atrás de um proxy, o que é uma dor de cabeça para lidar.&lt;/p&gt;&#10;&lt;h3 id="6-construindo-uma-imagem-do-jenkins"&gt;&lt;a href="#6-construindo-uma-imagem-do-jenkins" class="header-anchor"&gt;&lt;/a&gt;6. Construindo uma Imagem do Jenkins&#10;&lt;/h3&gt;&lt;p&gt;O &lt;code&gt;Dockerfile&lt;/code&gt; abaixo cria uma imagem baseada no Jenkins LTS mais recente do Dockerhub e pré-instala os plugins necessários:&lt;/p&gt;&#10;&lt;div class="code-example"&gt;&#10; &lt;div class="code-toolbar"&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;span class="code-language"&gt;dockerfile&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;span class="lnt"&gt;20&#10;&lt;/span&gt;&lt;span class="lnt"&gt;21&#10;&lt;/span&gt;&lt;span class="lnt"&gt;22&#10;&lt;/span&gt;&lt;span class="lnt"&gt;23&#10;&lt;/span&gt;&lt;span class="lnt"&gt;24&#10;&lt;/span&gt;&lt;span class="lnt"&gt;25&#10;&lt;/span&gt;&lt;span class="lnt"&gt;26&#10;&lt;/span&gt;&lt;span class="lnt"&gt;27&#10;&lt;/span&gt;&lt;span class="lnt"&gt;28&#10;&lt;/span&gt;&lt;span class="lnt"&gt;29&#10;&lt;/span&gt;&lt;span class="lnt"&gt;30&#10;&lt;/span&gt;&lt;span class="lnt"&gt;31&#10;&lt;/span&gt;&lt;span class="lnt"&gt;32&#10;&lt;/span&gt;&lt;span class="lnt"&gt;33&#10;&lt;/span&gt;&lt;span class="lnt"&gt;34&#10;&lt;/span&gt;&lt;span class="lnt"&gt;35&#10;&lt;/span&gt;&lt;span class="lnt"&gt;36&#10;&lt;/span&gt;&lt;span class="lnt"&gt;37&#10;&lt;/span&gt;&lt;span class="lnt"&gt;38&#10;&lt;/span&gt;&lt;span class="lnt"&gt;39&#10;&lt;/span&gt;&lt;span class="lnt"&gt;40&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;jenkins/jenkins:lts&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Ignorar o assistente de configuração&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENV&lt;/span&gt; &lt;span class="nv"&gt;JAVA_OPTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-Djenkins.install.runSetupWizard=false&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Definir o grupo docker&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ARG&lt;/span&gt; &lt;span class="nv"&gt;DOCKER_GID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;998&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Obter plugins&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; /usr/local/bin/install-plugins.sh &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; workflow-multibranch:latest &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; pipeline-model-definition:latest &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; pipeline-stage-view:latest &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; git:latest &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; credentials:latest &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; slack:latest&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Instalar Docker &amp;amp; docker-compose&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;root&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; apt-get -y install apt-transport-https &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ca-certificates &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; curl &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gnupg2 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; software-properties-common &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; curl -fsSL https://download.docker.com/linux/&lt;span class="k"&gt;$(&lt;/span&gt;. /etc/os-release&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$ID&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;/gpg &amp;gt; /tmp/dkey&lt;span class="p"&gt;;&lt;/span&gt; apt-key add /tmp/dkey &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; add-apt-repository &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;deb [arch=amd64] https://download.docker.com/linux/&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;. /etc/os-release&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$ID&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; \&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; \&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; stable&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; groupadd -g &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DOCKER_GID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; docker &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; apt-get -y install docker-ce docker-ce-cli containerd.io&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; curl -L &lt;span class="s2"&gt;&amp;#34;https://github.com/docker/compose/releases/download/1.29.2/docker-compose-&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;uname -s&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;uname -m&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -o /usr/local/bin/docker-compose &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; chmod +x /usr/local/bin/docker-compose&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; usermod -aG docker jenkins&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;jenkins&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Eu me referi à documentação oficial:&#10;&lt;a class="link" href="https://docs.docker.com/compose/install/" target="_blank" rel="noopener"&#10; &gt;https://docs.docker.com/compose/install/&lt;/a&gt;&#10;&lt;a class="link" href="https://docs.docker.com/engine/install/ubuntu/" target="_blank" rel="noopener"&#10; &gt;https://docs.docker.com/engine/install/ubuntu/&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Para subir uma instância do Jenkins na minha máquina local, usei um arquivo &lt;code&gt;docker-compose.yml&lt;/code&gt; e coloquei tudo na mesma pasta. O serviço jenkins aponta para um dockerfile no mesmo caminho e o contêiner estará acessível em &lt;code&gt;localhost:9080&lt;/code&gt;. Mapeei o &lt;code&gt;docker.sock&lt;/code&gt; para o contêiner e combinei o docker GID com o host, e também criei e mapeei uma pasta &lt;code&gt;jenkins_home&lt;/code&gt; localmente para persistir os dados:&lt;/p&gt;&#10;&lt;div class="code-example"&gt;&#10; &lt;div class="code-toolbar"&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;span class="code-language"&gt;yaml&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;3.8&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;jenkins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dockerfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Dockerfile&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;127.0.0.1:9080:8080&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./jenkins_home:/var/jenkins_home&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;unless-stopped&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Agora que temos uma instância do Jenkins em execução com os plugins instalados e com acesso ao dockerd do host, vamos começar a usá-lo para automatizar um build.&lt;/p&gt;&#10;&lt;h3 id="7-a-aplicação-de-exemplo-spring-petclinic"&gt;&lt;a href="#7-a-aplica%c3%a7%c3%a3o-de-exemplo-spring-petclinic" class="header-anchor"&gt;&lt;/a&gt;7. A Aplicação de Exemplo Spring PetClinic&#10;&lt;/h3&gt;&lt;p&gt;Para testar tudo, baixei a &amp;ldquo;Spring PetClinic Sample Application&amp;rdquo; (pode ser encontrada aqui: &lt;a class="link" href="https://github.com/spring-projects/spring-petclinic" target="_blank" rel="noopener"&#10; &gt;https://github.com/spring-projects/spring-petclinic&lt;/a&gt;), que é escrita em Java usando Spring Boot e construída com Maven. Se você clonar o repositório oficial, você terá um Maven Wrapper incluído que pode ser usado para construir a aplicação. Então, antes de tentar automatizar qualquer coisa com Jenkins, vamos primeiro construir, testar e executar a aplicação manualmente:&lt;/p&gt;&#10;&lt;div class="code-example"&gt;&#10; &lt;div class="code-toolbar"&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;span class="code-language"&gt;bash&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Clonar o repo&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/spring-projects/spring-petclinic.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Entrar no diretório&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; spring-petclinic&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Construir a aplicação&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./mvnw package&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Executar a aplicação&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;java -jar target/*.jar&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Na primeira vez que executei o comando &lt;code&gt;mvnw package&lt;/code&gt;, demorou um pouco para terminar, pois baixou todas as dependências. Depois disso, as execuções subsequentes levaram cerca de um minuto para terminar. Isso é praticamente tudo que temos que fazer para testar se ele constrói e executa corretamente, eu apenas segui as instruções do repositório sem mudar nada. Se ele executar, sabemos que o código deve funcionar dentro do pipeline também. As mudanças virão quando usarmos o Maven do Jenkins e tentarmos executar os testes JUnit.&lt;/p&gt;&#10;&lt;p&gt;Saída do build:&lt;/p&gt;&#10;&lt;div class="code-example"&gt;&#10; &lt;div class="code-toolbar"&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;span class="code-language"&gt;Texto simples&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[INFO] Construindo jar: ./github/spring-petclinic/target/spring-petclinic-2.5.0-SNAPSHOT.jar&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[INFO]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[INFO] --- spring-boot-maven-plugin:2.5.4:repackage (repackage) @ spring-petclinic ---&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[INFO] Substituindo o artefato principal pelo arquivo repaginado&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[INFO] ------------------------------------------------------------------------&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[INFO] BUILD SUCCESS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[INFO] ------------------------------------------------------------------------&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[INFO] Tempo total: 01:15 min&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[INFO] Finalizado em: 2021-10-19T11:35:43-03:00&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[INFO] ------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Saída de &lt;code&gt;java -jar target/*.jar&lt;/code&gt;:&lt;/p&gt;&#10;&lt;div class="code-example"&gt;&#10; &lt;div class="code-toolbar"&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;span class="code-language"&gt;Texto simples&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;span class="lnt"&gt;20&#10;&lt;/span&gt;&lt;span class="lnt"&gt;21&#10;&lt;/span&gt;&lt;span class="lnt"&gt;22&#10;&lt;/span&gt;&lt;span class="lnt"&gt;23&#10;&lt;/span&gt;&lt;span class="lnt"&gt;24&#10;&lt;/span&gt;&lt;span class="lnt"&gt;25&#10;&lt;/span&gt;&lt;span class="lnt"&gt;26&#10;&lt;/span&gt;&lt;span class="lnt"&gt;27&#10;&lt;/span&gt;&lt;span class="lnt"&gt;28&#10;&lt;/span&gt;&lt;span class="lnt"&gt;29&#10;&lt;/span&gt;&lt;span class="lnt"&gt;30&#10;&lt;/span&gt;&lt;span class="lnt"&gt;31&#10;&lt;/span&gt;&lt;span class="lnt"&gt;32&#10;&lt;/span&gt;&lt;span class="lnt"&gt;33&#10;&lt;/span&gt;&lt;span class="lnt"&gt;34&#10;&lt;/span&gt;&lt;span class="lnt"&gt;35&#10;&lt;/span&gt;&lt;span class="lnt"&gt;36&#10;&lt;/span&gt;&lt;span class="lnt"&gt;37&#10;&lt;/span&gt;&lt;span class="lnt"&gt;38&#10;&lt;/span&gt;&lt;span class="lnt"&gt;39&#10;&lt;/span&gt;&lt;span class="lnt"&gt;40&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;java -jar target/*.jar&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |\ _,,,--,,_&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /,`.-&amp;#39;`&amp;#39; ._ \-;;,_&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; _______ __|,4- ) )_ .;.(__`&amp;#39;-&amp;#39;__ ___ __ _ ___ _______&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | | &amp;#39;---&amp;#39;&amp;#39;(_/._)-&amp;#39;(_\_) | | | | | | | | |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | _ | ___|_ _| | | | | |_| | | | __ _ _&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | |_| | |___ | | | | | | | | | | \ \ \ \&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | ___| ___| | | | _| |___| | _ | | _| \ \ \ \&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | | | |___ | | | |_| | | | | | | |_ ) ) ) )&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |___| |_______| |___| |_______|_______|___|_| |__|___|_______| / / / /&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ==================================================================/_/_/_/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:: Built with Spring Boot :: 2.5.4&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:31.201 INFO 39806 --- [ main] o.s.s.petclinic.PetClinicApplication : Starting PetClinicApplication v2.5.0-SNAPSHOT using Java 11.0.11 on my-machine with PID 39806 (./github/spring-petclinic/target/spring-petclinic-2.5.0-SNAPSHOT.jar started by biofa in ./github/spring-petclinic)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:31.204 INFO 39806 --- [ main] o.s.s.petclinic.PetClinicApplication : No active profile set, falling back to default profiles: default&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:32.230 INFO 39806 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:32.288 INFO 39806 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 50 ms. Found 4 JPA repository interfaces.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:33.020 INFO 39806 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:33.036 INFO 39806 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:33.037 INFO 39806 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.52]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:33.128 INFO 39806 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:33.128 INFO 39806 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1865 ms&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:33.377 INFO 39806 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:33.590 INFO 39806 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:33.919 INFO 39806 --- [ main] org.ehcache.core.EhcacheManager : Cache &amp;#39;vets&amp;#39; created in EhcacheManager.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:33.934 INFO 39806 --- [ main] org.ehcache.jsr107.Eh107CacheManager : Registering Ehcache MBean javax.cache:type=CacheStatistics,CacheManager=urn.X-ehcache.jsr107-default-config,Cache=vets&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:33.941 INFO 39806 --- [ main] org.ehcache.jsr107.Eh107CacheManager : Registering Ehcache MBean javax.cache:type=CacheStatistics,CacheManager=urn.X-ehcache.jsr107-default-config,Cache=vets&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:34.021 INFO 39806 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:34.081 INFO 39806 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.32.Final&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:34.204 INFO 39806 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:34.332 INFO 39806 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:34.955 INFO 39806 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:34.962 INFO 39806 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit &amp;#39;default&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:36.371 INFO 39806 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 13 endpoint(s) beneath base path &amp;#39;/actuator&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:36.441 INFO 39806 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path &amp;#39;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2021-10-19 11:38:36.453 INFO 39806 --- [ main] o.s.s.petclinic.PetClinicApplication : Started PetClinicApplication in 5.753 seconds (JVM running for 6.136)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="8-usando-maven-no-jenkins"&gt;&lt;a href="#8-usando-maven-no-jenkins" class="header-anchor"&gt;&lt;/a&gt;8. Usando Maven no Jenkins&#10;&lt;/h3&gt;&lt;p&gt;Existem algumas maneiras diferentes de usar o Maven com o Jenkins. Existe um plugin Maven para Jenkins, e podemos instalar o Maven no servidor Jenkins e configurá-lo em &amp;ldquo;Global Tool Configuration&amp;rdquo;. Como queremos usar contêineres docker como executores ou agentes, essa não seria uma opção. Também poderíamos usar o wrapper que vem com o projeto, mas uma rota melhor e simples seria usar a imagem oficial do Maven docker, e dessa forma podemos ter um agente sempre atualizado e completamente separado do Maven do nosso servidor Jenkins. Essa abordagem facilita o gerenciamento do ambiente e também permite que um único servidor Jenkins trabalhe com diferentes tipos de builds com uma única instalação, sem ter que incorporar todas as ferramentas usadas no servidor.&lt;/p&gt;&#10;&lt;p&gt;Eu construí um pipeline com seis estágios: &lt;strong&gt;Init&lt;/strong&gt;, &lt;strong&gt;Build&lt;/strong&gt;, &lt;strong&gt;Test&lt;/strong&gt; e &lt;strong&gt;Build Image&lt;/strong&gt;, &lt;strong&gt;Publish Image&lt;/strong&gt; e &lt;strong&gt;Prod&lt;/strong&gt;. Alguns dos principais aspectos são:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Ele monta o diretório m2, que é usado pelo maven, localmente para ter cache entre os builds, e também o settings.xml para permitir a configuração de parâmetros personalizados para o Maven;&lt;/li&gt;&#10;&lt;li&gt;A Imagem Docker Maven 3.8.3 com AdoptOpenJDK 11 é usada como um agente apenas para os estágios que a requerem;&lt;/li&gt;&#10;&lt;li&gt;As credenciais do Dockerhub foram adicionadas anteriormente no Jenkins.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="code-example"&gt;&#10; &lt;div class="code-toolbar"&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;span class="code-language"&gt;groovy&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;span class="lnt"&gt;20&#10;&lt;/span&gt;&lt;span class="lnt"&gt;21&#10;&lt;/span&gt;&lt;span class="lnt"&gt;22&#10;&lt;/span&gt;&lt;span class="lnt"&gt;23&#10;&lt;/span&gt;&lt;span class="lnt"&gt;24&#10;&lt;/span&gt;&lt;span class="lnt"&gt;25&#10;&lt;/span&gt;&lt;span class="lnt"&gt;26&#10;&lt;/span&gt;&lt;span class="lnt"&gt;27&#10;&lt;/span&gt;&lt;span class="lnt"&gt;28&#10;&lt;/span&gt;&lt;span class="lnt"&gt;29&#10;&lt;/span&gt;&lt;span class="lnt"&gt;30&#10;&lt;/span&gt;&lt;span class="lnt"&gt;31&#10;&lt;/span&gt;&lt;span class="lnt"&gt;32&#10;&lt;/span&gt;&lt;span class="lnt"&gt;33&#10;&lt;/span&gt;&lt;span class="lnt"&gt;34&#10;&lt;/span&gt;&lt;span class="lnt"&gt;35&#10;&lt;/span&gt;&lt;span class="lnt"&gt;36&#10;&lt;/span&gt;&lt;span class="lnt"&gt;37&#10;&lt;/span&gt;&lt;span class="lnt"&gt;38&#10;&lt;/span&gt;&lt;span class="lnt"&gt;39&#10;&lt;/span&gt;&lt;span class="lnt"&gt;40&#10;&lt;/span&gt;&lt;span class="lnt"&gt;41&#10;&lt;/span&gt;&lt;span class="lnt"&gt;42&#10;&lt;/span&gt;&lt;span class="lnt"&gt;43&#10;&lt;/span&gt;&lt;span class="lnt"&gt;44&#10;&lt;/span&gt;&lt;span class="lnt"&gt;45&#10;&lt;/span&gt;&lt;span class="lnt"&gt;46&#10;&lt;/span&gt;&lt;span class="lnt"&gt;47&#10;&lt;/span&gt;&lt;span class="lnt"&gt;48&#10;&lt;/span&gt;&lt;span class="lnt"&gt;49&#10;&lt;/span&gt;&lt;span class="lnt"&gt;50&#10;&lt;/span&gt;&lt;span class="lnt"&gt;51&#10;&lt;/span&gt;&lt;span class="lnt"&gt;52&#10;&lt;/span&gt;&lt;span class="lnt"&gt;53&#10;&lt;/span&gt;&lt;span class="lnt"&gt;54&#10;&lt;/span&gt;&lt;span class="lnt"&gt;55&#10;&lt;/span&gt;&lt;span class="lnt"&gt;56&#10;&lt;/span&gt;&lt;span class="lnt"&gt;57&#10;&lt;/span&gt;&lt;span class="lnt"&gt;58&#10;&lt;/span&gt;&lt;span class="lnt"&gt;59&#10;&lt;/span&gt;&lt;span class="lnt"&gt;60&#10;&lt;/span&gt;&lt;span class="lnt"&gt;61&#10;&lt;/span&gt;&lt;span class="lnt"&gt;62&#10;&lt;/span&gt;&lt;span class="lnt"&gt;63&#10;&lt;/span&gt;&lt;span class="lnt"&gt;64&#10;&lt;/span&gt;&lt;span class="lnt"&gt;65&#10;&lt;/span&gt;&lt;span class="lnt"&gt;66&#10;&lt;/span&gt;&lt;span class="lnt"&gt;67&#10;&lt;/span&gt;&lt;span class="lnt"&gt;68&#10;&lt;/span&gt;&lt;span class="lnt"&gt;69&#10;&lt;/span&gt;&lt;span class="lnt"&gt;70&#10;&lt;/span&gt;&lt;span class="lnt"&gt;71&#10;&lt;/span&gt;&lt;span class="lnt"&gt;72&#10;&lt;/span&gt;&lt;span class="lnt"&gt;73&#10;&lt;/span&gt;&lt;span class="lnt"&gt;74&#10;&lt;/span&gt;&lt;span class="lnt"&gt;75&#10;&lt;/span&gt;&lt;span class="lnt"&gt;76&#10;&lt;/span&gt;&lt;span class="lnt"&gt;77&#10;&lt;/span&gt;&lt;span class="lnt"&gt;78&#10;&lt;/span&gt;&lt;span class="lnt"&gt;79&#10;&lt;/span&gt;&lt;span class="lnt"&gt;80&#10;&lt;/span&gt;&lt;span class="lnt"&gt;81&#10;&lt;/span&gt;&lt;span class="lnt"&gt;82&#10;&lt;/span&gt;&lt;span class="lnt"&gt;83&#10;&lt;/span&gt;&lt;span class="lnt"&gt;84&#10;&lt;/span&gt;&lt;span class="lnt"&gt;85&#10;&lt;/span&gt;&lt;span class="lnt"&gt;86&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;none&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;DEPLOY_TO&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;staging&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;imageName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;fabioctba/spring-petclinic&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;registryCredential&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;dockerhub&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dockerImage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stages&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Init&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;slackSend&lt;/span&gt; &lt;span class="nl"&gt;channel:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#jenkins&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;message:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${env.BUILD_ID} on ${env.JENKINS_URL} - Starting&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;git --version&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Implantando para ${DEPLOY_TO}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Build&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;docker&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;maven:3.8.3-adoptopenjdk-11&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-v m2:/root/.m2 -v settings.xml:/root/.m2/settings.xml&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;slackSend&lt;/span&gt; &lt;span class="nl"&gt;channel:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#jenkins&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;message:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${env.BUILD_ID} on ${env.JENKINS_URL} - Building&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mvn -B -DskipTests clean package&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Test&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;docker&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;maven:3.8.3-adoptopenjdk-11&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-v m2:/root/.m2 -v settings.xml:/root/.m2/settings.xml&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;slackSend&lt;/span&gt; &lt;span class="nl"&gt;channel:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#jenkins&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;message:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${env.BUILD_ID} on ${env.JENKINS_URL} - Running Tests&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mvn test&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;always&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;archiveArtifacts&lt;/span&gt; &lt;span class="nl"&gt;artifacts:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;target/*.jar&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;junit&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;target/surefire-reports/*.xml&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Build Image&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;slackSend&lt;/span&gt; &lt;span class="nl"&gt;channel:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#jenkins&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;message:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${env.BUILD_ID} on ${env.JENKINS_URL} - Building Image&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dockerImage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt; &lt;span class="n"&gt;imageName&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Publish Image&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;slackSend&lt;/span&gt; &lt;span class="nl"&gt;channel:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#jenkins&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;message:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${env.BUILD_ID} on ${env.JENKINS_URL} - Building Image&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withRegistry&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;registryCredential&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dockerImage&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;$BUILD_NUMBER&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dockerImage&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;latest&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Prod&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;when&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;allOf&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;branch&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;master&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;DEPLOY_TO&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;value:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;production&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;slackSend&lt;/span&gt; &lt;span class="nl"&gt;channel:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#jenkins&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;message:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${env.BUILD_ID} on ${env.JENKINS_URL} - Running Production stage&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Algum passo extra quando no release de produção&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Eu usei o Plugin Slack para integrar com o Jenkins, seguindo &lt;a class="link" href="https://github.com/jenkinsci/slack-plugin" target="_blank" rel="noopener"&#10; &gt;esta&lt;/a&gt; documentação. Usei apenas duas variáveis apenas para ilustrar o que pode ser enviado como mensagem, mas uma lista completa de variáveis de ambiente pode ser encontrada diretamente no Jenkins acessando &lt;code&gt;http://localhost:9080/env-vars.html&lt;/code&gt;. Claro, você tem que mudar &lt;code&gt;localhost:9080&lt;/code&gt; para o endereço do seu servidor.&lt;/p&gt;&#10;&lt;p&gt;O estágio &lt;strong&gt;Init&lt;/strong&gt; imprime as versões das principais ferramentas utilizadas, úteis para depurar problemas;&lt;/p&gt;&#10;&lt;p&gt;O estágio &lt;strong&gt;Build&lt;/strong&gt; executa &lt;code&gt;mvn package&lt;/code&gt;, que cria os arquivos jar;&lt;/p&gt;&#10;&lt;p&gt;O estágio &lt;strong&gt;Test&lt;/strong&gt; executa os testes unitários. O Spring Pet Clinic tem um total de 40 testes configurados, e isso dependeria de como a equipe de desenvolvimento criou seus testes;&lt;/p&gt;&#10;&lt;p&gt;O estágio &lt;strong&gt;Build Image&lt;/strong&gt; cria uma imagem Docker;&lt;/p&gt;&#10;&lt;p&gt;O estágio &lt;strong&gt;Publish Image&lt;/strong&gt; publica a imagem no Dockerhub;&lt;/p&gt;&#10;&lt;p&gt;O estágio &lt;strong&gt;Prod&lt;/strong&gt; não faz nada, é apenas um exemplo de um passo condicional que pode ser executado dependendo de uma variável.&lt;/p&gt;&#10;&lt;p&gt;Observe que não há um estágio para clonar o repositório no início; esse estágio é &lt;strong&gt;implícito&lt;/strong&gt; quando você configura o Jenkins para puxar o pipeline do SCM, que é o plano aqui.&lt;/p&gt;&#10;&lt;p&gt;Aqui está o Dockerfile que eu usei para publicar a aplicação:&lt;/p&gt;&#10;&lt;div class="code-example"&gt;&#10; &lt;div class="code-toolbar"&gt;&lt;span&gt;Código-fonte&lt;/span&gt;&lt;span class="code-language"&gt;dockerfile&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;openjdk:11-jre-slim&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; groupadd --gid &lt;span class="m"&gt;1000&lt;/span&gt; java &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; useradd --uid &lt;span class="m"&gt;1000&lt;/span&gt; --gid java --shell /bin/bash --create-home java&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;java&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;VOLUME&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/tmp&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; --chown&lt;span class="o"&gt;=&lt;/span&gt;java:java ./target/*.jar /app/&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CMD&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;java&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-Djava.security.egd=file:/dev/./urandom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-jar&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/app/*.jar&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Esse é um pipeline funcional, e eu queria incluir a maioria dos conceitos que vi nos cursos. Existem outros recursos que gostaria de experimentar no futuro, como bibliotecas compartilhadas e pipelines multi-branch, mas isso pode entrar em outro post.&lt;/p&gt;&#10;&lt;h3 id="9-cursos-que-eu-fiz-ou-recomendo"&gt;&lt;a href="#9-cursos-que-eu-fiz-ou-recomendo" class="header-anchor"&gt;&lt;/a&gt;9. Cursos que eu fiz ou recomendo:&#10;&lt;/h3&gt;&lt;h5 id="a-jenkins-do-zero-ao-herói-torne-se-um-mestre-devops-jenkins"&gt;&lt;a href="#a-jenkins-do-zero-ao-her%c3%b3i-torne-se-um-mestre-devops-jenkins" class="header-anchor"&gt;&lt;/a&gt;a. Jenkins, Do Zero ao Herói: Torne-se um Mestre DevOps Jenkins&#10;&lt;/h5&gt;&lt;p&gt;Udemy, por Ricardo Andre Gonzalez Gomez, 2018&#10;&lt;a class="link" href="https://www.udemy.com/course/jenkins-from-zero-to-hero/" target="_blank" rel="noopener"&#10; &gt;https://www.udemy.com/course/jenkins-from-zero-to-hero/&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Eu achei este curso um pouco desatualizado e parece que o autor parou de mantê-lo em 2020. No entanto, se você nunca usou o Jenkins antes e quer um curso barato para começar, eu recomendo fortemente este. Também é bem recomendado em muitas outras fontes e tem uma alta taxa na Udemy. Ricardo se concentra muito em Docker, então pode ser mais adequado para alguém sem nenhuma experiência em Docker também.&lt;/p&gt;&#10;&lt;h5 id="b-integração-contínua-com-jenkins"&gt;&lt;a href="#b-integra%c3%a7%c3%a3o-cont%c3%adnua-com-jenkins" class="header-anchor"&gt;&lt;/a&gt;b. Integração Contínua com Jenkins&#10;&lt;/h5&gt;&lt;p&gt;Pluralsight, por diferentes autores, atualizado constantemente&#10;&lt;a class="link" href="https://app.pluralsight.com/paths/skill/continuous-integration-with-jenkins" target="_blank" rel="noopener"&#10; &gt;https://app.pluralsight.com/paths/skill/continuous-integration-with-jenkins&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;A Pluralsight tem um total de 8 cursos, cada um com cerca de 2 horas de duração, o que torna o Skill Path do Jenkins. Fiz quatro deles durante a última Pluralsight Free Week e, como outros cursos que fiz na Pluralsight, a qualidade foi muito superior. Infelizmente, a Pluralsight custa uma grande quantia de dinheiro, então geralmente fico de olho em suas semanas gratuitas e fins de semana gratuitos periodicamente. O bom é que você pode baixar o material do curso e a maioria dos autores tem repositórios no GitHub onde você pode verificar o código mais tarde.&lt;/p&gt;&#10;&lt;h3 id="10-referências"&gt;&lt;a href="#10-refer%c3%aancias" class="header-anchor"&gt;&lt;/a&gt;10. Referências&#10;&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://stackoverflow.com/questions/44440164/what-are-the-advantages-of-running-jenkins-in-a-docker-container" target="_blank" rel="noopener"&#10; &gt;https://stackoverflow.com/questions/44440164/what-are-the-advantages-of-running-jenkins-in-a-docker-container&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://www.cinqict.nl/blog/building-a-jenkins-development-docker-image" target="_blank" rel="noopener"&#10; &gt;https://www.cinqict.nl/blog/building-a-jenkins-development-docker-image&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://tomgregory.com/building-a-spring-boot-application-in-jenkins/" target="_blank" rel="noopener"&#10; &gt;https://tomgregory.com/building-a-spring-boot-application-in-jenkins/&lt;/a&gt;&lt;/p&gt;&#10;&lt;br&gt;&#10;&lt;p&gt;&lt;b&gt;&lt;center&gt;Se você leu até o final, gostaria de ouvir seus comentários, e espero que isso o tenha ajudado de alguma forma.&lt;/b&gt;&lt;/center&gt;&lt;/p&gt;&#10;&lt;p&gt;. &lt;br&gt;&#10;. &lt;br&gt;&#10;. &lt;br&gt;&#10;.&lt;/p&gt;&#10;&lt;br&gt;&#10;E desculpe pelo post longo... aqui está uma batata.&#10;&lt;p&gt;&lt;img alt="potato" class="gallery-image" data-flex-basis="240px" data-flex-grow="100" height="880" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://fabiolopes.page/p/getting-started-with-jenkins-declarative-pipelines/222-5c163369f2bfd__880_hu_4a7f09a65cf6214e.jpg" srcset="https://fabiolopes.page/p/getting-started-with-jenkins-declarative-pipelines/222-5c163369f2bfd__880_hu_b8abc9da8f17c5d2.jpg 800w, https://fabiolopes.page/p/getting-started-with-jenkins-declarative-pipelines/222-5c163369f2bfd__880_hu_4a7f09a65cf6214e.jpg 880w" width="880"&gt;&#10;Fonte: &lt;a class="link" href="https://www.instagram.com/truth.potato/?hl=en" target="_blank" rel="noopener"&#10; &gt;@truth.potato&lt;/a&gt;&lt;/p&gt;&#10;</description></item></channel></rss>