<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>The Ops Community ⚙️: Rafael Conceição</title>
    <description>The latest articles on The Ops Community ⚙️ by Rafael Conceição (@rafaelonline).</description>
    <link>https://community.ops.io/rafaelonline</link>
    <image>
      <url>https://community.ops.io/images/yFtGwhN_yxrTirsejQFLaEQUR8Vv61L0i9k-BxIKzYM/rs:fill:90:90/g:sm/mb:500000/ar:1/aHR0cHM6Ly9jb21t/dW5pdHkub3BzLmlv/L3JlbW90ZWltYWdl/cy91cGxvYWRzL3Vz/ZXIvcHJvZmlsZV9p/bWFnZS8xNTUvOTc5/NDUzMTItMjk3Yy00/MDNmLTg4YjEtZmRj/NTMxMmE1ODEzLmpw/Zw</url>
      <title>The Ops Community ⚙️: Rafael Conceição</title>
      <link>https://community.ops.io/rafaelonline</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://community.ops.io/feed/rafaelonline"/>
    <language>en</language>
    <item>
      <title>Explorando o Limit Range no Kubernetes para gerenciar recursos</title>
      <dc:creator>Rafael Conceição</dc:creator>
      <pubDate>Sun, 21 May 2023 11:34:33 +0000</pubDate>
      <link>https://community.ops.io/rafaelonline/explorando-o-limit-range-no-kubernetes-para-gerenciar-recursos-21kp</link>
      <guid>https://community.ops.io/rafaelonline/explorando-o-limit-range-no-kubernetes-para-gerenciar-recursos-21kp</guid>
      <description>&lt;h2&gt;
  
  
  Introdução:
&lt;/h2&gt;

&lt;p&gt;Uma das principais preocupações no ambiente Kubernetes é o gerenciamento eficiente dos recursos computacionais disponíveis. Nesse sentido, o Kubernetes oferece o conceito de Limit Range, que permite aos administradores definir limites e solicitações de recursos para os contêineres em um cluster. Abaixo, exploraremos o uso do Limit Range e forneceremos um exemplo prático para ilustrar seu funcionamento.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o Limit Range:
&lt;/h2&gt;

&lt;p&gt;O Limit Range é um objeto do Kubernetes que permite aos administradores definir políticas de limites e solicitações de recursos para pods em um namespace específico. Ele fornece uma maneira de garantir que os contêineres tenham acesso aos recursos necessários e impõe restrições para evitar o uso excessivo de recursos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo de utilização do Limit Range:
&lt;/h2&gt;

&lt;p&gt;Suponha que temos um namespace chamado "my-app" e desejamos definir limites de CPU e memória, e também adicionamos os valores mínimos e máximos para CPU e memória para os contêineres executados nesse namespace. Podemos criar um arquivo YAML contendo a definição do Limit Range da seguinte maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;LimitRange&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;resource-limits&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;500m&lt;/span&gt;
      &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;512Mi&lt;/span&gt;
    &lt;span class="na"&gt;defaultRequest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;200m&lt;/span&gt;
      &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;256Mi&lt;/span&gt;
    &lt;span class="na"&gt;min&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;100m&lt;/span&gt;
      &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;128Mi&lt;/span&gt;
    &lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
      &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1Gi&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Container&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima, definimos os limites e as solicitações de recursos para os contêineres do namespace "my-app". &lt;/p&gt;

&lt;p&gt;O limite padrão máximo de CPU é de 500 milicores, enquanto "512Mi" define o limite padrão máximo de memória. As solicitações de recursos padrão são definidas pelos valores "200m" para CPU e "256Mi" para memória. Esses valores serão usados como padrão caso nenhum limite ou solicitação específica seja definido para um contêiner individual.&lt;/p&gt;

&lt;p&gt;Além de definir os limites padrão e as solicitações de recursos, também adicionamos os valores mínimos e máximos para CPU e memória.&lt;/p&gt;

&lt;p&gt;O limite mínimo de CPU é de 100 milicores, enquanto "128Mi" define o limite mínimo de memória. Por outro lado, os valores "1" para CPU e "1Gi" para memória estabelecem o limite máximo permitido para esses recursos.&lt;/p&gt;

&lt;p&gt;Esses valores mínimos e máximos ajudam a controlar e garantir que os contêineres estejam dentro de intervalos aceitáveis de uso de recursos. Com essa definição, os administradores podem evitar que um contêiner utilize muito poucos recursos, o que pode prejudicar o desempenho do aplicativo, ou que um contêiner monopolize uma quantidade excessiva de recursos, prejudicando outros componentes do cluster.&lt;/p&gt;

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

&lt;p&gt;O uso do Limit Range é uma prática recomendada para garantir o uso eficiente dos recursos em um cluster. Ele permite aos administradores definir limites e solicitações de recursos de maneira granular, controlando o consumo e evitando problemas de alocação inadequada. Ao aplicar políticas adequadas de Limit Range, é possível otimizar o desempenho dos aplicativos e evitar gargalos de recursos em ambientes de produção.&lt;/p&gt;

&lt;h2&gt;
  
  
  Saiba mais:
&lt;/h2&gt;

&lt;p&gt;Link para a documentação oficial do Kubernetes sobre Limit Ranges:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Documentação oficial do Kubernetes sobre Limit Ranges:

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/concepts/policy/limit-range/"&gt;Limit Ranges&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>kubernetes</category>
      <category>tutorials</category>
      <category>devops</category>
    </item>
    <item>
      <title>Razões para monitorar um sistema</title>
      <dc:creator>Rafael Conceição</dc:creator>
      <pubDate>Mon, 17 Apr 2023 19:34:55 +0000</pubDate>
      <link>https://community.ops.io/rafaelonline/razoes-para-monitorar-um-sistema-36le</link>
      <guid>https://community.ops.io/rafaelonline/razoes-para-monitorar-um-sistema-36le</guid>
      <description>&lt;h2&gt;
  
  
  Por que Monitorar?
&lt;/h2&gt;

&lt;p&gt;Algumas razões porquê você deve monitorar um sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  Analisar tendências de longo prazo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Qual o tamanho do meu storage e em quanto tempo estará cheio? Qual a taxa de crescimento de acessos ao meu site?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Comparações ao longo do tempo ou grupos de experimentos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Minhas consultas são mais rápidas usando o banco XPTO ou o Banco XYZ? Minha aplicação está mais lenta do que na semana passada?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Gerar Alertas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Algo parou de funcionar e precisa ser consertado. Ou algo está preste a parar de funcionar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Criar dashboards
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Os dashboards devem responder a perguntas básica sobre o estado do serviço. Normalmente abordam os quatro sinais de ouro (golden signals)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Realizar um debugging
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A latência de um serviço aumentou muito. O que mais estava ocorrendo no momento do evento?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O monitoramento também é útil para fornecer informações brutas sobre análises de negócios. Junto com os alertas permite que um sistema nos diga quando algo está quebrado, ou nos diga o que está prestes a quebrar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Os Quatro Sinais Dourados
&lt;/h2&gt;

&lt;p&gt;Os quatro sinais dourados do monitoramento são latência, tráfego, erros e saturação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Latência
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;O tempo que se leva para atender a uma solicitação. Importante separar a latência das solicitações bem sucedidas, das solicitações com falha.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tráfego
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Medida de quanta demanda está sendo colocada em seu sistema (quantidade de transações, requisições, execuções...)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Erros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Taxa de solicitações que apresentaram falha (erros 4xx/5xx, timeout...)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Saturação
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Uma medida da fração do sistema, enfatizando os recursos que são mais restritos. Exemplo, em um sistema com restrição de memória, mostrar a medição da memória.&lt;/li&gt;
&lt;li&gt;Quanto tráfego/processamento seu sistema pode lidar, antes de começar a apresentar degradação?&lt;/li&gt;
&lt;li&gt;As previsões de saturação iminente (espaço em disco, por exemplo) também são preocupações desse ponto.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Medir os quatros sinais dourados e gerar alertas quando um sinal apresentar problemas (ou quase problema), faz com que seu serviço esteja minimamente coberto pelo monitoramento.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Esse texto foi adaptado do capitulo 6 - &lt;a href="https://sre.google/sre-book/monitoring-distributed-systems/"&gt;Monitoring Distributed Systems - do livro&lt;/a&gt; - do livro Site Reliability Engineering&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Conheça também as metodologias RED e USE: Monitoring Methodologies: RED and USE&lt;/p&gt;

</description>
      <category>sre</category>
      <category>o11y</category>
      <category>devops</category>
    </item>
    <item>
      <title>Gerenciando APIs obsoletas do Kubernetes com Pluto</title>
      <dc:creator>Rafael Conceição</dc:creator>
      <pubDate>Sun, 12 Mar 2023 20:06:02 +0000</pubDate>
      <link>https://community.ops.io/rafaelonline/gerenciando-apis-obsoletas-do-kubernetes-com-pluto-1dnh</link>
      <guid>https://community.ops.io/rafaelonline/gerenciando-apis-obsoletas-do-kubernetes-com-pluto-1dnh</guid>
      <description>&lt;h2&gt;
  
  
  O que é o Pluto
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/FairwindsOps/pluto"&gt;&lt;strong&gt;Pluto&lt;/strong&gt;&lt;/a&gt; é uma ferramenta desenvolvida pela &lt;a href="https://www.fairwinds.com/"&gt;FairwindsOps&lt;/a&gt; que ajuda na detecção de &lt;a href="https://kubernetes.io/docs/reference/using-api/deprecation-guide/"&gt;APIs obsoletas do Kubernetes &lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mas antes de falarmos da ferramenta, vamos entender um pouco sobre as &lt;a href="https://kubernetes.io/docs/reference/using-api/api-concepts/"&gt;APIs do Kubernetes&lt;/a&gt; e porque devemos nos preocupar com elas.&lt;/p&gt;

&lt;h2&gt;
  
  
  As APIs do Kubernetes
&lt;/h2&gt;

&lt;p&gt;As APIs são a forma que podemos interagir com o cluster. Podemos então manipular e consultar os objetos (Pod, deployment...) através delas. Normalmente utilizamos o &lt;a href="https://kubernetes.io/docs/reference/kubectl/"&gt;kubectl&lt;/a&gt; para acessar as APIs, mas também é possível através de chamadas REST.&lt;/p&gt;

&lt;h3&gt;
  
  
  Substituições ou remoções das APIs do Kubernetes
&lt;/h3&gt;

&lt;p&gt;O Kubernetes está em constante evolução, sendo assim, alguns recursos novos são adicionados e outros precisam ser removidos, o mesmo acontece para as APIs.&lt;/p&gt;

&lt;p&gt;Como resultado, as APIs antigas são depreciadas e eventualmente removidas, a depreciação, nesse contexto, significa marcar uma API para eventual remoção.&lt;/p&gt;

&lt;p&gt;Para saber mais como o Kubernetes deprecia suas APIs veja na documentação da &lt;a href="https://kubernetes.io/docs/reference/using-api/deprecation-policy/"&gt;política de reprovação do Kubernetes&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Porque me preocupar com APIs obsoletas
&lt;/h3&gt;

&lt;p&gt;Ao definir uma configuração de Deployment, você especifica a versão da API (&lt;code&gt;apiVersion&lt;/code&gt;) do objeto Kubernetes a ser usado.&lt;/p&gt;

&lt;p&gt;Se você atualizar seu cluster, há chances de encontrar APIs do Kubernetes depreciadas se a versão para a qual você atualizou não oferecer suporte a elas.&lt;/p&gt;

&lt;p&gt;Nesse caso, provavelmente, seu Deployment pode não funcionar se a API depreciada tiver sido removida na nova versão do cluster.&lt;/p&gt;

&lt;p&gt;Para saber todas as APIs depreciadas e/ou removidas veja no &lt;a href="https://kubernetes.io/docs/reference/using-api/deprecation-guide/"&gt;guia de depreciação&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Também é possível verificar todos os grupos de API suportados na sua versão através do comando &lt;code&gt;kubectl api-versions&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O desafio é como verificar quais APIs estão depreciadas e quais, de todos os recursos em execução no cluster, estão sendo utilizadas. &lt;strong&gt;Nesse ponto que o Pluto entra para nos ajudar.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Características do Pluto
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ele lista todas as APIs que foram depreciadas ou removidas, não apenas do Kubernetes, mas também para outras ferramentas como Istio e CertManager.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Detecta APIs depreciadas a partir de arquivos de configuração, helm instalados e/ou em todos os resources do cluster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Também é possível utilizar num Workflow do Github Actions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Como instalar
&lt;/h3&gt;

&lt;p&gt;Você pode instalar em sua estação &lt;a href="https://github.com/FairwindsOps/pluto/releases"&gt;baixando a versão apropriada&lt;/a&gt; para seu sistema.&lt;/p&gt;

&lt;p&gt;O Pluto possui versão para Windows, Linux e MacOs.&lt;/p&gt;

&lt;p&gt;Exemplo de instalação no MacOs:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;wget https://github.com/FairwindsOps/pluto/releases/download/v5.15.1/pluto_5.15.1_darwin_amd64.tar.gz -O /tmp/pluto_5.15.1_darwin_amd64.tar.gz&lt;br&gt;
tar -zxvf /tmp/pluto_5.15.1_darwin_amd64.tar.gz&lt;br&gt;
chmod +x /tmp/pluto&lt;br&gt;
cp /tmp/pluto /usr/local/bin&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo de uso
&lt;/h3&gt;

&lt;p&gt;Usando o comando &lt;code&gt;pluto detect-all-in-cluster&lt;/code&gt; em um cluster que roda na versão 1.21 do Kubernetes, podemos ver que temos o recurso &lt;code&gt;HPA Operator&lt;/code&gt; em uma versão que será removida na próxima versão do Kubernetes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/46bxOz1q6-UNX30JDc7zrangVZU-5MOCgI840V5pcDg/w:880/mb:500000/ar:1/aHR0cHM6Ly9kZXYt/dG8tdXBsb2Fkcy5z/My5hbWF6b25hd3Mu/Y29tL3VwbG9hZHMv/YXJ0aWNsZXMvdnhp/N3M0djVzOXVleGN3/aGJvMjIucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/46bxOz1q6-UNX30JDc7zrangVZU-5MOCgI840V5pcDg/w:880/mb:500000/ar:1/aHR0cHM6Ly9kZXYt/dG8tdXBsb2Fkcy5z/My5hbWF6b25hd3Mu/Y29tL3VwbG9hZHMv/YXJ0aWNsZXMvdnhp/N3M0djVzOXVleGN3/aGJvMjIucG5n" alt="saida do comando detect all" width="880" height="95"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como a instalação dele foi através de um Helm, vemos o mesmo através do comando &lt;code&gt;pluto detect-helm&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/kmh-cwCXQ-n4yfw7gJwfD5SbtKzu0pz0vltwQHSg5iM/w:880/mb:500000/ar:1/aHR0cHM6Ly9kZXYt/dG8tdXBsb2Fkcy5z/My5hbWF6b25hd3Mu/Y29tL3VwbG9hZHMv/YXJ0aWNsZXMvOHpj/dGZ1ZnpqMXF5cGow/Z3JxYTEucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/kmh-cwCXQ-n4yfw7gJwfD5SbtKzu0pz0vltwQHSg5iM/w:880/mb:500000/ar:1/aHR0cHM6Ly9kZXYt/dG8tdXBsb2Fkcy5z/My5hbWF6b25hd3Mu/Y29tL3VwbG9hZHMv/YXJ0aWNsZXMvOHpj/dGZ1ZnpqMXF5cGow/Z3JxYTEucG5n" alt="saida do comando detect helm" width="880" height="75"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O comando &lt;code&gt;pluto -h&lt;/code&gt; lista todos os comando disponíveis.&lt;/p&gt;

</description>
      <category>sre</category>
      <category>kubernetes</category>
      <category>tutorials</category>
    </item>
    <item>
      <title>Eventos orientados com Amazon EventBridge</title>
      <dc:creator>Rafael Conceição</dc:creator>
      <pubDate>Sun, 26 Feb 2023 23:36:58 +0000</pubDate>
      <link>https://community.ops.io/rafaelonline/eventos-orientados-com-amazon-eventbridge-25af</link>
      <guid>https://community.ops.io/rafaelonline/eventos-orientados-com-amazon-eventbridge-25af</guid>
      <description>&lt;p&gt;As arquiteturas orientadas a eventos (Event-Driven) são caracterizadas por serviços que se comunicam de forma assíncrona e desacoplado através de eventos.&lt;/p&gt;

&lt;p&gt;Os serviços transmitirão eventos (Produtores) que serão consumidos e reagidos por outros serviços (Consumidores).&lt;/p&gt;

&lt;p&gt;Uma característica que marca uma Arquitetura Event-Drive é que: Produtores e consumidores estão completamente dissociados, um produtor não deve saber ou se importar com quem está consumindo seus eventos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/-A_wHONF17vYXCJoo_yLTMnd7HnMgyP16TCsafBd1gk/w:880/mb:500000/ar:1/aHR0cHM6Ly9kZXYt/dG8tdXBsb2Fkcy5z/My5hbWF6b25hd3Mu/Y29tL3VwbG9hZHMv/YXJ0aWNsZXMvczh6/YmxidWN4cnIxZHRt/dGR5a28ucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/-A_wHONF17vYXCJoo_yLTMnd7HnMgyP16TCsafBd1gk/w:880/mb:500000/ar:1/aHR0cHM6Ly9kZXYt/dG8tdXBsb2Fkcy5z/My5hbWF6b25hd3Mu/Y29tL3VwbG9hZHMv/YXJ0aWNsZXMvczh6/YmxidWN4cnIxZHRt/dGR5a28ucG5n" alt="Event-Driven Architectures Draw" width="880" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que seria o Amazon EventBridge?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;O &lt;a href="https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html"&gt;Amazon EventBridge&lt;/a&gt; é um serviço que oferece acesso em tempo real a alterações de dados em serviços da AWS, em suas aplicações e em aplicações de software como serviço (SaaS) sem precisar escrever código. Para começar, você pode escolher uma origem de eventos no console do EventBridge. Em seguida, pode selecionar um destino entre os serviços da AWS, incluindo o AWS Lambda, o Amazon Simple Notification Service (SNS) e o Amazon Kinesis Data Firehose. O EventBridge entregará automaticamente os eventos quase em tempo real.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Em resumo você pode receber, filtrar, transformar, rotear (dos Produtores) e entregar esses eventos a Consumidores.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trabalhando com o Amazon EventBridge
&lt;/h2&gt;

&lt;p&gt;Para exemplificar o uso do Amazon EventBridge vamos criar o seguinte cenário:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Toda vez que uma instancia RDS for criada queremos que uma Lambda seja executada. Para nosso exemplo a Lambda irá adicionar uma tag.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Utilizaremos então a seguinte arquitetura:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/UCdzLatwCsYUTcTrQfc6ioE4aULcSCb4IQuArIEWx3A/w:880/mb:500000/ar:1/aHR0cHM6Ly9kZXYt/dG8tdXBsb2Fkcy5z/My5hbWF6b25hd3Mu/Y29tL3VwbG9hZHMv/YXJ0aWNsZXMvem5p/NTZncDdqNXp0YTR5/bXJwcHEucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/UCdzLatwCsYUTcTrQfc6ioE4aULcSCb4IQuArIEWx3A/w:880/mb:500000/ar:1/aHR0cHM6Ly9kZXYt/dG8tdXBsb2Fkcy5z/My5hbWF6b25hd3Mu/Y29tL3VwbG9hZHMv/YXJ0aWNsZXMvem5p/NTZncDdqNXp0YTR5/bXJwcHEucG5n" alt="Event-Driven Architectures exemple" width="513" height="173"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Como &lt;strong&gt;Produtor&lt;/strong&gt; de eventos utilizaremos o &lt;em&gt;CloudTrail&lt;/em&gt;. &lt;/li&gt;
&lt;li&gt;Como &lt;strong&gt;Broker&lt;/strong&gt;, que irá tratar os eventos, utilizaremos o &lt;em&gt;EventBridge&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Como &lt;strong&gt;Consumer&lt;/strong&gt; desses eventos utilizaremos a &lt;em&gt;AWS Lambda&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O repositório do Github &lt;a href="https://github.com/rafaelonline/eventbridge-lambda"&gt;rafaelonline/eventbridge-lambda&lt;/a&gt; possui um exemplo de configuração infraestrutura usando Terraform e o script Python utilizado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 1
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Pre-Requisito: É preciso que a conta possua um Trail configurado no CloudTrail, saiba como configurar em &lt;a href="https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-a-trail-using-the-console-first-time.html"&gt;Creating a trail&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;O &lt;a href="https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html"&gt;CloudTrail&lt;/a&gt; gera eventos no formato JSON e possui integração nativa com o EventBridge. Ele será nosso Produtor de eventos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O CloudTrail proporciona visibilidade sobre as atividades de usuários por meio do registro das ações executadas na sua conta. O CloudTrail registra informações importantes sobre cada ação, como quem fez a solicitação, quais serviços foram usados, quais ações foram executadas, quais os parâmetros da ação e quais elementos da resposta foram retornados pelo serviço da AWS&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Passo 2
&lt;/h3&gt;

&lt;p&gt;Agora devemos configurar uma regra no &lt;a href="https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-get-started.html"&gt;EventBridge Rules&lt;/a&gt; para monitorar os eventos desejados. &lt;/p&gt;

&lt;p&gt;No nosso caso o &lt;a href="https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html"&gt;event pattern&lt;/a&gt; será a própria AWS tendo como origem o Cloudtrail e eventos do rds.amazonaws.com de nome       CreateDBInstance.&lt;/p&gt;

&lt;p&gt;Exemplo no console da AWS:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/LwlLUrJ1G6DwzNTyHc2Ibrb4M9V8gu1x_pyrW1sqyOA/w:880/mb:500000/ar:1/aHR0cHM6Ly9kZXYt/dG8tdXBsb2Fkcy5z/My5hbWF6b25hd3Mu/Y29tL3VwbG9hZHMv/YXJ0aWNsZXMvbGFx/NDJjbXcxcnd1dXBw/cjU4Y3YucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/LwlLUrJ1G6DwzNTyHc2Ibrb4M9V8gu1x_pyrW1sqyOA/w:880/mb:500000/ar:1/aHR0cHM6Ly9kZXYt/dG8tdXBsb2Fkcy5z/My5hbWF6b25hd3Mu/Y29tL3VwbG9hZHMv/YXJ0aWNsZXMvbGFx/NDJjbXcxcnd1dXBw/cjU4Y3YucG5n" alt="Exemplo no console da AWS" width="814" height="822"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Exemplo de código Terraform para criação da Rule:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;###### EVENTBRIDGE RULE - CREATED RDS INSTANCE ######
resource "aws_cloudwatch_event_rule" "rds_event_rule" {
  name          = "rule-rds-created"
  description   = "Triggers Lambda when new RDS instance are created"
  is_enabled    = true
  event_pattern = &amp;lt;&amp;lt;EOF
    {
    "source": ["aws.rds"],
    "detail-type": ["AWS API Call via CloudTrail"],
    "detail": {
        "eventSource" : ["rds.amazonaws.com"],
        "eventName": ["CreateDBInstance"]
    }
    }
  EOF
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Passo 3
&lt;/h3&gt;

&lt;p&gt;Agora precisamos encaminhar nosso evento para o Consumidor (Target), que será uma Lambda.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Um &lt;a href="https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-targets.html"&gt;Target&lt;/a&gt; é um recurso ou endpoint que EventBridge envia um evento para quando o evento corresponde ao padrão de evento definido para uma regra. A regra processa os dados do evento e envia as informações pertinentes ao Target&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Podemos encaminhar esse mesmo evento para até cinco (5) Targets, por exemplo enviar um SNS informando que um RDS foi criado, além de executar a Lambda.&lt;/p&gt;

&lt;p&gt;Inclusive podemos enviar o evento originalmente como foi gerado, enviar somente uma parte do evento, fazer alguma edição no evento antes de enviar, enviar um json de evento fixo.&lt;/p&gt;

&lt;p&gt;Exemplo no console da AWS:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ops.io/images/B1S5QVx4Y7f_ctuNdG5u0Z7P9-Ig7NlZLgr5qgrNFqo/w:880/mb:500000/ar:1/aHR0cHM6Ly9kZXYt/dG8tdXBsb2Fkcy5z/My5hbWF6b25hd3Mu/Y29tL3VwbG9hZHMv/YXJ0aWNsZXMvNTBp/cG5vZmlya2lxd2lr/NGZ6MzUucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ops.io/images/B1S5QVx4Y7f_ctuNdG5u0Z7P9-Ig7NlZLgr5qgrNFqo/w:880/mb:500000/ar:1/aHR0cHM6Ly9kZXYt/dG8tdXBsb2Fkcy5z/My5hbWF6b25hd3Mu/Y29tL3VwbG9hZHMv/YXJ0aWNsZXMvNTBp/cG5vZmlya2lxd2lr/NGZ6MzUucG5n" alt="Exemplo no console da AWS" width="812" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Exemplo de código Terraform para criação do Target:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;###### EVENTBRIDGE TARGET - CREATED RDS INSTANCE ######
resource "aws_cloudwatch_event_target" "lambda_rule_rds" {
  depends_on = [aws_lambda_function.autotag]
  rule       = aws_cloudwatch_event_rule.rds_event_rule.name
  target_id  = "SendToLambda"
  arn        = aws_lambda_function.autotag.arn
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Passo 4
&lt;/h3&gt;

&lt;p&gt;Chegamos ao passo final que é termos o nosso Consumidor, para  nosso cenário usaremos uma Lambda que irá adicionar uma Tag a instancia RDS criada.&lt;/p&gt;

&lt;p&gt;Script Python que cria a Tag&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"""Add tags on RDS and Aurora."""
import logging
import os
import boto3
from botocore.exceptions import ClientError

# Config Logging.
log = logging.getLogger()
log.setLevel(logging.INFO)

def lambda_handler(event, context):
    """Add tags on RDS and Aurora"""

    # Define the tags to add to the RDS instance
    tag_key = os.environ.get('TAG_KEY')
    tag_value = os.environ.get('TAG_VALUE')
    tags = [
        {
            'Key': tag_key,
            'Value': tag_value
        }
    ]

    # Connect to RDS service
    rds = boto3.client('rds')
    event_name = event.get("detail").get("eventName")

    if event_name == "CreateDBCluster":
        aurora_arn = event.get("detail").get("responseElements").get("dBClusterArn")
    # Add tags to the Regional Cluster
        try:
            rds.add_tags_to_resource(
                ResourceName=aurora_arn,
                Tags=tags
            )
            log.info('Tag adicionda com sucesso ao Cluster Aurora: %s', aurora_arn)
        except ClientError as error:
            log.exception(error)

    else:
    # Add tags to the RDS instance
        rds_arn = event.get("detail").get("responseElements").get("dBInstanceArn")
        try:
            rds.add_tags_to_resource(
                ResourceName=rds_arn,
                Tags=tags
            )
            log.info('Tag adicionda com sucesso ao RDS: %s', rds_arn)
        except ClientError as error:
            log.exception(error)        
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo de código Terraform para criação Lambda:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;###### GENERATE PACKAGE LAMBDA ###### 
data "archive_file" "lambda_autotag" {
  type        = "zip"
  source_dir  = "${path.module}/code/src"
  output_path = "${path.module}/code/lambda_package.zip"
}

###### LAMBDA FUNCTION ######
resource "aws_lambda_function" "autotag" {
  function_name    = var.autotag_function_name
  role             = aws_iam_role.lambda_exec_role.arn
  filename         = data.archive_file.lambda_autotag.output_path
  source_code_hash = data.archive_file.lambda_autotag.output_base64sha256
  description      = var.autotag_description
  publish          = true

  runtime       = "python3.8"
  handler       = "main.lambda_handler"
  timeout       = 300
  memory_size   = 128
  architectures = ["arm64"]

  environment {
    variables = {
      TAG_KEY   = var.lambda_tag_key
      TAG_VALUE = var.lambda_tag_value
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Saiba Mais
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.alexdebrie.com/posts/event-driven-vs-event-based/"&gt;Event-Driven Architectures vs. Event-Based Compute in Serverless Applications&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>terraform</category>
      <category>python</category>
      <category>eventdriven</category>
    </item>
  </channel>
</rss>
