<?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>Forem: Paulo Alves</title>
    <description>The latest articles on Forem by Paulo Alves (@pcb737).</description>
    <link>https://forem.com/pcb737</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F910384%2Fc06da62b-0753-41b1-a217-c3d03c23520c.png</url>
      <title>Forem: Paulo Alves</title>
      <link>https://forem.com/pcb737</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/pcb737"/>
    <language>en</language>
    <item>
      <title>Versionamento de Banco de Dados com Liquibase</title>
      <dc:creator>Paulo Alves</dc:creator>
      <pubDate>Fri, 15 Mar 2024 20:47:51 +0000</pubDate>
      <link>https://forem.com/pcb737/versionamento-de-banco-de-dados-com-liquibase-4nd3</link>
      <guid>https://forem.com/pcb737/versionamento-de-banco-de-dados-com-liquibase-4nd3</guid>
      <description>&lt;p&gt;O Liquibase é uma ferramenta open-source que permite rastrear e controlar as alterações no esquema do seu banco de dados. Ele funciona como um sistema de controle de versão para seu banco de dados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefícios do Versionamento de Banco de Dados
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Rastreabilidade:&lt;/em&gt;&lt;/strong&gt; Permite acompanhar todas as alterações feitas no banco de dados, facilitando a identificação de problemas e a reversibilidade de mudanças.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Facilidade de migração:&lt;/em&gt;&lt;/strong&gt; Simplifica a migração de alterações para diferentes ambientes, como desenvolvimento, teste e produção.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Colaboração entre times:&lt;/em&gt;&lt;/strong&gt; Permite que diferentes desenvolvedores trabalhem no mesmo banco de dados sem conflitos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Segurança e confiabilidade:&lt;/strong&gt; Reduz o risco de erros e garante a consistência do banco de dados.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Para começar a usar o Liquibase, você precisa:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instalar o Liquibase:&lt;/strong&gt; Acesse o site oficial &lt;a href="https://www.liquibase.com/community"&gt;https://www.liquibase.com/community&lt;/a&gt; e baixe a versão mais recente para o seu sistema operacional.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Criar um changelog:&lt;/strong&gt; O changelog é um arquivo que armazena o histórico de todas as alterações feitas no banco de dados. Você pode criar o changelog manualmente ou usar a ferramenta de linha de comando do Liquibase.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Executar as mudanças:&lt;/strong&gt; O Liquibase pode aplicar as mudanças no banco de dados de diversas maneiras, como através da linha de comando, scripts SQL ou ferramentas de integração contínua.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Bora praticar
&lt;/h2&gt;

&lt;p&gt;Vamos criar uma tabela simples de usuários usando o Liquibase:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crie um arquivo XML chamado "changelog.xml" na pasta do seu projeto e adicione o seguinte código ao arquivo:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;databaseChangeLog
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.3.xsd"&amp;gt;

  &amp;lt;changeSet author="TESTE01" id="1"&amp;gt;
    &amp;lt;createTable tableName="usuarios"&amp;gt;
      &amp;lt;column name="id" type="integer" autoIncrement="true" primaryKey="true"/&amp;gt;
      &amp;lt;column name="nome" type="varchar(255)"/&amp;gt;
      &amp;lt;column name="email" type="varchar(255)"/&amp;gt;
    &amp;lt;/createTable&amp;gt;
  &amp;lt;/changeSet&amp;gt;

&amp;lt;/databaseChangeLog&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Executar a mudança:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;liquibase update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O Liquibase irá criar a tabela "usuarios" no banco de dados.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Alterar a tabela:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Vamos adicionar uma nova coluna à tabela "usuarios":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;changeSet author="TESTE01" id="2"&amp;gt;
  &amp;lt;addColumn tableName="usuarios"&amp;gt;
    &amp;lt;column name="data_nascimento" type="date"/&amp;gt;
  &amp;lt;/addColumn&amp;gt;
&amp;lt;/changeSet&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Executar a mudança:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;liquibase update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O Liquibase irá adicionar a coluna "data_nascimento" à tabela "usuarios".&lt;/p&gt;

&lt;p&gt;O Liquibase é uma ferramenta muito interessante quando se trata de versionamento de banco de dados. A ideia deste guia prático é oferecer uma visão inicial de seu funcionamento e possibilitando a manutenção consistente dos bancos de dados em diversos ambientes. Essa abordagem garante a uniformidade estrutural dos bancos de dados, tanto no ambiente de Desenvolvimento quanto no de Homologação, alinhando-os ao ambiente de Produção. Todo este processo, aliado à pipeline, torna a interação entre times ainda mais rápida.&lt;/p&gt;

&lt;p&gt;Recursos Adicionais&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Documentação do Liquibase: &lt;a href="https://docs.liquibase.com/"&gt;https://docs.liquibase.com/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tutoriais do Liquibase: &lt;a href="https://www.youtube.com/watch?v=dTmg8NNcWM4"&gt;https://www.youtube.com/watch?v=dTmg8NNcWM4&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exemplos de Changelogs: &lt;a href="https://docs.liquibase.com/start/design-liquibase-project.html"&gt;https://docs.liquibase.com/start/design-liquibase-project.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Simplificando a Entrega de Serviços em Nuvem com Cookiecutter e Terraform</title>
      <dc:creator>Paulo Alves</dc:creator>
      <pubDate>Tue, 27 Feb 2024 22:13:40 +0000</pubDate>
      <link>https://forem.com/pcb737/simplificando-a-entrega-de-servicos-em-nuvem-com-cookiecutter-e-terraform-10c2</link>
      <guid>https://forem.com/pcb737/simplificando-a-entrega-de-servicos-em-nuvem-com-cookiecutter-e-terraform-10c2</guid>
      <description>&lt;p&gt;Olá pessoal, Paulo Alves aqui compartilhando conhecimento e apresentando duas ferramentas poderosas que podem facilitar bastante o nosso dia a dia: Cookiecutter e Terraform.&lt;/p&gt;

&lt;p&gt;E quando falo em facilitar nossa vida, é para não ficamos inventando a roda, começando tudo do zero. E neste caso vamos criar um template e podemos reutilizar ele quantas vezes forem necessário para garantir a entrega do ambiente para os time de desenvolvimentos ou até mesmo serviços que os time de DevOps, Cloud, Security, etc irão utilizar também.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agilizando a Criação com Templates Personalizados utilizando Cookiecutter
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;O &lt;strong&gt;&lt;em&gt;Cookiecutter&lt;/em&gt;&lt;/strong&gt; é uma ferramenta incrível para a criação de templates personalizados. A prévia definição de um template traz benefícios notáveis, oferecendo estruturas base para documentos, designs e outros tipos de conteúdo. Suas funcionalidades principais incluem:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Criação de Templates:&lt;/strong&gt; Possibilita a criação de modelos personalizados conforme as necessidades específicas de projetos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Edição Simples:&lt;/strong&gt; Facilita a modificação intuitiva de templates, tornando o processo acessível mesmo para usuários sem conhecimento avançado, já que tudo gira em torno de um simples json no processo básico.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Organização:&lt;/strong&gt; Oferece recursos para organizar e categorizar templates, facilitando a busca e seleção do modelo desejado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compatibilidade:&lt;/strong&gt; Pode ser integrado a diferentes plataformas ou softwares, garantindo compatibilidade e utilização eficiente dos templates.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Colaboração:&lt;/strong&gt; Possibilita a colaboração entre usuários na criação e edição de templates, promovendo um fluxo de trabalho colaborativo, até mesmo pelo fato de ter que manter esses templates atualizados.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Versatilidade:&lt;/strong&gt; Adapta-se a diversos tipos de templates, desde documentos de texto até designs gráficos, proporcionando versatilidade de uso.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Automatizando a Infraestrutura como Código utilizando Terraform
&lt;/h2&gt;

&lt;p&gt;A segunda ferramenta é o Terraform, uma criação da HashiCorp, que automatiza a infraestrutura como código (IaC), proporcionando uma gestão eficiente da infraestrutura mantendo sempre o padrão inicial do projeto. Suas características e conceitos principais incluem:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Código Declarativo:&lt;/strong&gt; Utiliza uma linguagem declarativa para descrever a infraestrutura desejada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Provisionamento Multi-Cloud:&lt;/strong&gt; Suporta provisionamento em várias nuvens, além de outros serviços como datadog, cloudflare, elastic, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Controle de Estado:&lt;/strong&gt; Mantém um arquivo de estado que registra o estado atual da infraestrutura.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Módulos Reutilizáveis:&lt;/strong&gt; Organiza o código em módulos, possibilitando a reutilização de configurações em diferentes partes do projeto, promovendo modularidade e consistência.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Planejamento Prévio:&lt;/strong&gt; Antes de efetuar qualquer alteração na infraestrutura, o Terraform fornece um plano detalhado das mudanças propostas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Versionamento:&lt;/strong&gt; Permite o versionamento do código de infraestrutura, facilitando o rastreamento de mudanças ao longo do tempo e a colaboração em equipe.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Criando uma VPC na AWS usando Terraform e Cookiecutter
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/3NmyKHfg4q4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>devops</category>
      <category>aws</category>
      <category>cloud</category>
      <category>github</category>
    </item>
    <item>
      <title>Criando instâncias EC2 da Amazon com discos EBS Multi-Attach usando Terraform</title>
      <dc:creator>Paulo Alves</dc:creator>
      <pubDate>Thu, 09 Mar 2023 18:13:19 +0000</pubDate>
      <link>https://forem.com/pcb737/criando-instancias-ec2-da-amazon-com-discos-ebs-multi-attach-usando-terraform-12p</link>
      <guid>https://forem.com/pcb737/criando-instancias-ec2-da-amazon-com-discos-ebs-multi-attach-usando-terraform-12p</guid>
      <description>&lt;p&gt;Neste artigo, mostraremos como usar o Terraform para criar duas instâncias EC2 da Amazon com um discos compartilhado.&lt;/p&gt;

&lt;p&gt;Neste artigo, mostraremos como usar o Terraform para criar duas instâncias EC2 da Amazon com um disco compartilhado.&lt;/p&gt;

&lt;p&gt;Por padrão, o / terá apenas 8GB. Depois, será criado outro disco com 30GB para compartilhamento.&lt;/p&gt;

&lt;p&gt;Algumas observações ao utilizar o EBS Multi-Attach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Atualmente, a opção Multi-Attach está disponível apenas para volumes do tipo &lt;strong&gt;io1&lt;/strong&gt; e &lt;strong&gt;io2&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Outro ponto a ser testado é a diminuição do número de IOPS para que não haja um custo elevado na sua conta. No Terraform, defini o valor de 100.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Inicialmente, tentei criar as instâncias com a família &lt;strong&gt;t2.micro&lt;/strong&gt;, mas não é possível trabalhar com o EBS Multi-Attach nessa configuração. Acabei alterando para a família &lt;strong&gt;t3.micro&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Depois que as instâncias subirem, os discos estarão disponíveis, mas não acessíveis. Para torná-los acessíveis, execute os comandos abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo mkfs -t ext4 /dev/nvme1n1
$ sudo mkdir /area51
$ sudo mount /dev/nvme1n1 /area51
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E caso queira deixar em definitivo o disco montado basta executar o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo echo "/dev/nvme1n1       /area51   ext4    defaults,nofail        0       0" &amp;gt;&amp;gt; /etc/fstab
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para que possa testar, de forma rápida e fácil segue o &lt;a href="https://gitlab.com/pcmalves/tf-ebs-multi-attach"&gt;link&lt;/a&gt; do Terraform&lt;/p&gt;

&lt;p&gt;E ai vamos nos conectar? Entre em contato comigo:&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/pcmalves/"&gt;https://www.linkedin.com/in/pcmalves/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>terraform</category>
      <category>cloud</category>
      <category>devops</category>
    </item>
    <item>
      <title>Monitoramento completo com EC2 + Grafana + Prometheus e Loki</title>
      <dc:creator>Paulo Alves</dc:creator>
      <pubDate>Thu, 02 Mar 2023 21:52:38 +0000</pubDate>
      <link>https://forem.com/pcb737/monitoramento-completo-com-ec2-grafana-prometheus-e-loki-385</link>
      <guid>https://forem.com/pcb737/monitoramento-completo-com-ec2-grafana-prometheus-e-loki-385</guid>
      <description>&lt;p&gt;Em um post &lt;a href="https://dev.to/pcb737/ec2-com-logs-centralizados-utilizando-loki-fluentbit-grafana-8jp"&gt;passado&lt;/a&gt; fiz a criação do servidor do Grafana e instalação do plugin do Loki. Também montei um servidor com nginx padrão para se utilizado no envio dos logs.&lt;/p&gt;

&lt;p&gt;Neste post quero trazer o monitoramento full de uma instância EC2, monitoramento de disco, cpu, rede, swap, processos que estão rodando na máquina e logs.&lt;/p&gt;

&lt;p&gt;Não vou contemplar a criação do servidor do Grafana e nem o servidor que será monitorado. Já vou direto para o ponto onde vou subir o contêiner com o Prometheus, na máquina do server do Grafana e a configuração do dashboard para análise da saúde do ambiente.&lt;/p&gt;

&lt;p&gt;Neste ponto já temos o docker instalado na instância do Grafana, com o contêiner do Grafana e Loki rondando. Agora vou subir o contêiner do Prometheus, mas antes vou baixar o arquivo de configuração e fazer a criação de um diretório onde ficará o arquivo de configuração para ser mapeado no contêiner do Prometheus. Segue abaixo os comandos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo mkdir /docker &amp;amp;&amp;amp; \
cd /docker &amp;amp;&amp;amp; \
git clone https://gitlab.com/snippets/2484803.git &amp;amp;&amp;amp; \
sudo mv 2484803 prometheus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste ponto já temos os arquivos de configuração, agora podemos subir o contêiner do Prometheus com esse arquivo de configuração.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -d --name=prometheus \
--network monitoring \
-p 9090:9090 \
-v /docker/prometheus/prometheus.yml:/opt/bitnami/prometheus/conf/prometheus.yml bitnami/prometheus:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se tudo estiver ok, deverá estar desta forma:&lt;/p&gt;

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

&lt;p&gt;Com o contêiner do Prometheus up, vou iniciar a configuração do Datasource. Para isso vá em &lt;strong&gt;configurações &amp;gt; Plugins&lt;/strong&gt; na busca digite Prometheus. Deve estar assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqn4p331era5kavmnxzeb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqn4p331era5kavmnxzeb.png" alt="DataSourceGrafana"&gt;&lt;/a&gt;&lt;br&gt;
Selecionando o plugin do Prometheus irá para tela onde irei configurar o Datasource.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdrvropsv8czgquul2tln.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdrvropsv8czgquul2tln.png" alt="Datasource"&gt;&lt;/a&gt;&lt;br&gt;
Selecione &lt;strong&gt;Create a Prometheus data source&lt;/strong&gt; e faça o preenchimento das seguintes informações:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffjudoyz7cdmdn15uksqz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffjudoyz7cdmdn15uksqz.png" alt="formulario"&gt;&lt;/a&gt;&lt;br&gt;
Feito isso clique em &lt;strong&gt;Salve &amp;amp; test&lt;/strong&gt;&lt;br&gt;
Neste ponto já temos o Datasource do Prometheus configurado com o Grafana.&lt;br&gt;
Agora vou fazer as configurações na instância que será monitorada. Na instância que será monitorada eu irei configurar o &lt;strong&gt;node exporter&lt;/strong&gt;, que é responsável por enviar as métricas para o Prometheus.&lt;/p&gt;
&lt;h2&gt;
  
  
  Instalando Node Exporter
&lt;/h2&gt;

&lt;p&gt;Acesse via ssh a instância a ser monitorada. Esse servidor que será monitorado, eu estou utilizando Amazon Linux2. Com isso vou baixar o executável do &lt;strong&gt;node_exporter&lt;/strong&gt; no diretório home do usuário &lt;strong&gt;ec2-user&lt;/strong&gt; utilizando o comando abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wget https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você pode verificar &lt;a href="https://prometheus.io/download/" rel="noopener noreferrer"&gt;aqui&lt;/a&gt; versões mais atualizadas do node_exporter.&lt;br&gt;
Agora vou descompactar e renomear o diretório do pacote baixado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tar xf node_exporter-1.5.0.linux-amd64.tar.gz &amp;amp;&amp;amp; \
mv node_exporter-1.5.0.linux-amd64 node_exporter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito isso, vou acessar o diretório node_exporter e inciar o executável. Vou executar com &lt;strong&gt;nohup&lt;/strong&gt;, para que minha sessão não fica presa ao executável. O comando fica assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nohup ./node_exporter &amp;amp;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pressionando 2x o enter para liberar a console, deverá ficar desta forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Favmz3i4703326yfaropm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Favmz3i4703326yfaropm.png" alt="nohup"&gt;&lt;/a&gt;&lt;br&gt;
Para certificar que está tudo ok, podemos acessar via browser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://ip_do_server_node_exporter:9100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você deve ver uma tela igual a essa:&lt;/p&gt;

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

&lt;p&gt;Agora vou voltar ao servidor onde está instalado o Prometheus para que posso adicionar o ip interno da instância a ser monitorada, para que possa fechar a comunicação entre eles.&lt;br&gt;
No servidor do Prometheus vá no diretório &lt;strong&gt;docker/prometheus&lt;/strong&gt; e edite o arquivo &lt;strong&gt;prometheus.yml&lt;/strong&gt;. Se você estiver com o arquivo que eu disponibilizei, deverá editar somente a &lt;strong&gt;linha 28&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;Basta salvar o arquivo, o servidor já irá começar a se comunicar com o agente. Você pode validar, acessando o Prometheus via browser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://ip_do_servidor_grafana:9090
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4r9hzgagvartsmty6kx3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4r9hzgagvartsmty6kx3.png" alt="console_prometheus"&gt;&lt;/a&gt;&lt;br&gt;
Acessando no menu superior &lt;strong&gt;status &amp;gt; Service Discovery&lt;/strong&gt;. Você será direcionado para essa tela:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn43vk36o8uij8w278utu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn43vk36o8uij8w278utu.png" alt="service_discovery"&gt;&lt;/a&gt;&lt;br&gt;
Agora clicando em &lt;strong&gt;show more&lt;/strong&gt;, terá no próprio servidor do Prometheus e o servidor que vou monitorar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj2mfh09d2ykegmwhu0nq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj2mfh09d2ykegmwhu0nq.png" alt="server_monitoring"&gt;&lt;/a&gt;&lt;br&gt;
Configurações ok, vou para criação do dashboard de monitoramento de recursos e recebimento dos logs. A parte de config de recebimento de logs contemplei neste &lt;a href="https://dev.tourl"&gt;post&lt;/a&gt;&lt;br&gt;
Para facilitar vou pegar um dashboard pronto e apenas importa-lo para o ambiente de teste. Selecione a opção &lt;strong&gt;Dashboard &amp;gt; + Import&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsabbubnowc0x1kpxv7uu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsabbubnowc0x1kpxv7uu.png" alt="import_dashboard"&gt;&lt;/a&gt;&lt;br&gt;
Nessa tela você vai adicionar o &lt;strong&gt;ID 1860 &amp;gt; load&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5cgt00n3y9p9krn999sn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5cgt00n3y9p9krn999sn.png" alt="load"&gt;&lt;/a&gt;&lt;br&gt;
A tela seguinte deverá estar desta forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8xm14themn0p5h2xkb9g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8xm14themn0p5h2xkb9g.png" alt="import_dash"&gt;&lt;/a&gt;&lt;br&gt;
Agora é clicar em &lt;strong&gt;import&lt;/strong&gt;&lt;br&gt;
Se estiver tudo ok, você deve visualizar algo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnayzmy5pox09vpk1v9gk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnayzmy5pox09vpk1v9gk.png" alt="dash"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Não esqueça de salvar o dash para não peder as configs..&lt;/strong&gt;&lt;br&gt;
Agora vou inserir a visualização dos logs, as configs para deixar o Loki funcional estão &lt;a href="https://dev.tourl"&gt;aqui&lt;/a&gt;.&lt;br&gt;
Selecione add painel &amp;gt; add new panel&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp74xwbqwp828m6ta8doj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp74xwbqwp828m6ta8doj.png" alt="add_new_panel"&gt;&lt;/a&gt;&lt;br&gt;
Add new panel, vamos selecionar o Datasource Loki&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6vjf39q8bihu8k8i2sqc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6vjf39q8bihu8k8i2sqc.png" alt="datasource_loki"&gt;&lt;/a&gt;&lt;br&gt;
Agora vamos filtrar por labels:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2de67a7l640qe92071if.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2de67a7l640qe92071if.png" alt="filter_labels"&gt;&lt;/a&gt;&lt;br&gt;
Pode dar um &lt;strong&gt;Run queries&lt;/strong&gt; para validar que está trazendo os logs do ambiente correto. Se o retorno estiver desta forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdxwu5jts5df7dnjzlfpw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdxwu5jts5df7dnjzlfpw.png" alt="logs"&gt;&lt;/a&gt;&lt;br&gt;
Basta dar um apply.&lt;br&gt;
Para que você veja os logs sendo exibidos é necessário acessar o Nginx no servidor que está enviando os logs via browser, e ficar dando f5 na página para gerar conteúdo dentro do access.log.&lt;/p&gt;

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

&lt;p&gt;Ambiente finalizado! Espero ter ajudo e nos vemos no próximo post&lt;/p&gt;

&lt;p&gt;E ai vamos se conectar? Entre em contato comigo:&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/pcmalves/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/pcmalves/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>kubernetes ingress-controller '400 Bad request - plain HTTP request sent to HTTPS port'</title>
      <dc:creator>Paulo Alves</dc:creator>
      <pubDate>Wed, 08 Feb 2023 01:32:26 +0000</pubDate>
      <link>https://forem.com/pcb737/kubernetes-ingress-controller-400-bad-request-plain-http-request-sent-to-https-port-542h</link>
      <guid>https://forem.com/pcb737/kubernetes-ingress-controller-400-bad-request-plain-http-request-sent-to-https-port-542h</guid>
      <description>&lt;p&gt;Resolvi criar um material de consulta rápida e que pudesse compartilhar, sobre um problema que me consumiu uma quantidade de tempo considerável. E como consegui resolver, resolvi compartilhar...😎&lt;/p&gt;

&lt;p&gt;Criei um cluster EKS do zero para testar algumas variações com Terraform.&lt;/p&gt;

&lt;p&gt;Legal tudo ok, só que estava chamando a aplicação somente via HTTP e estava funcionando. Como teria um api gateway na frente, achei prudente que a chamada fizesse um redirect de HTTP para HTTPS.&lt;/p&gt;

&lt;p&gt;Quando fiz este redirect foi onde comecei a receber a seguinte erro:&lt;/p&gt;

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

&lt;p&gt;O único lugar que havia configurado redirecionamento era no ingress-controller. Decide ir debugando por partes, primeiro validei se a requisição chegava até o POD, isso não ocorria.&lt;/p&gt;

&lt;p&gt;Então no &lt;strong&gt;service&lt;/strong&gt; que crie para aplicação, alterei o parâmetro abaixo:&lt;br&gt;
Antes&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fespas78fhlqhlvxjul6b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fespas78fhlqhlvxjul6b.png" alt="depois" width="794" height="101"&gt;&lt;/a&gt;&lt;br&gt;
Com as alterações de redirects na parte do annotations, as requisições chegavam na aplicação.&lt;/p&gt;

&lt;p&gt;Voltei o ambiente como estava antes, e fui pegar os logs do ingress-controller, as requisições chegavam mas dava 400. Com isso resolvi olhar para o service do ingress-controller.&lt;/p&gt;

&lt;p&gt;Existe uma parte no service que estava assim:&lt;/p&gt;

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

&lt;p&gt;E ficou assim:&lt;/p&gt;

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

&lt;p&gt;Isso porque no meu caso em específico, o ingress que configurei para aplicação, estava apontando para porta 80.&lt;/p&gt;

&lt;p&gt;Espero ter ajudar e até a próxima!!!&lt;/p&gt;

&lt;p&gt;E ai vamos se conectar? Entre em contato comigo:&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/pcmalves/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/pcmalves/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>EC2 com logs centralizados utilizando Loki + FluentBit + Grafana</title>
      <dc:creator>Paulo Alves</dc:creator>
      <pubDate>Wed, 25 Jan 2023 13:07:55 +0000</pubDate>
      <link>https://forem.com/pcb737/ec2-com-logs-centralizados-utilizando-loki-fluentbit-grafana-8jp</link>
      <guid>https://forem.com/pcb737/ec2-com-logs-centralizados-utilizando-loki-fluentbit-grafana-8jp</guid>
      <description>&lt;p&gt;acessei via SSM e por ai vai. Se eu tivesse um lugar com os logs centralizados das instâncias EC2, eu poderia consultar os logs das instância com problemas e trabalhar na resolução.&lt;/p&gt;

&lt;p&gt;Com isso surgiu a ideia de montar este artigo para documentar e ajudar outras pessoas. Neste artigo não reinventei a roda, fiz um compilado do que já existe nas documentações oficiais. Entre outras documentações que fui encontrando para facilitar na configurações.&lt;/p&gt;

&lt;p&gt;Vou colocar aqui as adaptações que fiz para o meu cenário de atuação, mas também deixar de forma clara para que qualquer um possa utilizar.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;OBS: Neste artigo estou seguindo com uma estrutura de VPC já criada na AWS para as 2 instâncias utilizadas no LAB&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vou fazer um apresentação rápida e básica dos serviços que serão utilizados neste artigo:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EC2&lt;/strong&gt; - é um serviço com recurso computacional, redimensionável e que pode ser utilizado para qualquer workload. Uma definição bem básica sobre este serviço disponibilizado pela AWS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FluentBit&lt;/strong&gt; - É o agente responsável por ler o arquivo de log e enviar para o Loki.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grafana Loki&lt;/strong&gt; - É uma stack de monitoramentos de logs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grafana Dashbord&lt;/strong&gt; - É a ferramenta onde irei criar o dash de visualização de logs da instância que será utilizada como LAB.&lt;/p&gt;

&lt;p&gt;Feito um breve resumo das ferramentas que serão utilizadas, vou iniciar a criação do servidor do Grafana.&lt;/p&gt;

&lt;p&gt;Para criação do servidor que irá hospedar Grafana, Loki vou utilizar os comandos do awscli. Mas para criação deste ambiente poderia ter sido utilizado outras ferramentas de provisionamento e configurações, segue abaixo alguns exemplos de ferramentas&lt;/p&gt;

&lt;p&gt;Um exemplo dessas ferramentas são: &lt;a href="https://www.terraform.io/" rel="noopener noreferrer"&gt;Terraform&lt;/a&gt;, &lt;a href="https://aws.amazon.com/pt/cloudformation/" rel="noopener noreferrer"&gt;Cloudformation&lt;/a&gt;, &lt;a href="https://www.ansible.com/" rel="noopener noreferrer"&gt;Ansible&lt;/a&gt;, &lt;a href="https://www.chef.io/" rel="noopener noreferrer"&gt;Chef&lt;/a&gt;, &lt;a href="https://www.puppet.com/" rel="noopener noreferrer"&gt;Puppet&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando uma instância do EC2
&lt;/h3&gt;

&lt;p&gt;Para iniciar a criação da instância, ao invés de criar uma chave &lt;em&gt;&lt;strong&gt;.pem&lt;/strong&gt;&lt;/em&gt; vou importar a minha chave pública para acessar a instância:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ec2 import-key-pair --key-name "grafana-server" --public-key-material fileb://~/.ssh/id_rsa.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na sequência vou criar um security group:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ec2 create-security-group --group-name grafana-server  --description "Grafana EC2 Server" --vpc-id vpc-668d120f
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vou criar 2 regras de ingress no security group criado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ec2 authorize-security-group-ingress --group-id sg-02c489bbdeffdca1d --protocol tcp --port 22 --cidr 192.168.15/32

aws ec2 authorize-security-group-ingress --group-id sg-02c489bbdeffdca1d --protocol tcp --port 3000 --cidr 192.168.15/32

aws ec2 authorize-security-group-ingress --group-id sg-02c489bbdeffdca1d --protocol tcp --port 3100 --cidr 192.168.15/32
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;Na última regra liberando a porta 3100 ela é necessária para que o fluent-bit possa se comunicar com o Loki e fazer o envio dos logs.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Deixei as regras do security group somente para acesso da minha rede local&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Criando a instância:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ec2 run-instances --image-id ami-0b5eea76982371e91 --instance-type t3.medium --key-name grafana-server --security-group-ids sg-0aa58857d399d42d0 --subnet-id subnet-0f322466aad742642 --associate-public-ip-address
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Instalando e configurando Docker, Grafana e o Loki
&lt;/h2&gt;

&lt;p&gt;Com o ambiente criado, vou seguir com a instalação do Grafana e Loki. Neste ponto vou subir 2 containers, que irão se comunicar pela rede interna do docker. Vou acessar a console para pegar o endereço público da instância. Para criação da instância utilizei a AMI com Amazon Linux 2, então o acesso será feito desta forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh ec2-user@ec2-174-129-133-73.compute-1.amazonaws.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Logado na instância vou fazer a instalação do serviço do docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo yum update -y
sudo yum install docker -y
sudo service docker start
sudo usermod -a -G docker ec2-user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após ter feito a instalação se receber a seguinte mensagem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;É necessário dar um logout e fazer o login novamente&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agora vou criar a rede no docker e subir o container do Grafana e do Loki&lt;/p&gt;

&lt;p&gt;Criando a rede:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker network create networklogs --driver bridge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rede criada vou subir os 2 containers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -d --name=grafana --network monitoring -p 3000:3000 grafana/grafana-os

docker run -d --name=loki --network monitoring -p 3100:3100 grafana/loki
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se os 2 container subiram sem problemas, podemos acessar via browser a console do Grafana.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://ec2-174-129-133-73.compute-1.amazonaws.com:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se estiver tudo ok, essa tela deverá se exibida&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwsukzm0olukcy13sv47.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwsukzm0olukcy13sv47.png" alt="tela de login grafana"&gt;&lt;/a&gt;&lt;br&gt;
Nessa tela o usuário e senha padrão é admin admin. Após logar você será solicitado a alterar a senha.&lt;/p&gt;

&lt;p&gt;Logado na interface vamos fazer a config do Loki, para isso a engrenagem no painel lateral esquerdo &amp;gt; Plugins&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8e2la8x4cuq7i2c3r4zz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8e2la8x4cuq7i2c3r4zz.png" alt="configuração do plugin do Loki"&gt;&lt;/a&gt;&lt;br&gt;
Nos plugins vai na busca para procurar pelo plugin do Loki&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fruapqh7huk1f8plp5lgl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fruapqh7huk1f8plp5lgl.png" alt="plugin loki"&gt;&lt;/a&gt;&lt;br&gt;
Agora clique no botão azul  Create a Loki data source&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsao82a9a380o8007gfj5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsao82a9a380o8007gfj5.png" alt="create loki Datasource"&gt;&lt;/a&gt;&lt;br&gt;
Agora vou preencher as informações solicitadas. Em url perceba que coloquei&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://loki:3100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Porque este endereço?&lt;/p&gt;

&lt;p&gt;Lembra que incialmente eu cria uma rede interna docker, certo? Com isso ao invés de chamar&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Eu estou chamando na url pelo nome do container.&lt;/p&gt;

&lt;p&gt;Feito as configs, pode clicar em Save &amp;amp; test. Caso aparece essa mensagem:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmoq2oybhs19euwg33pi3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmoq2oybhs19euwg33pi3.png" alt="log ainda não está sendo enviado"&gt;&lt;/a&gt;&lt;br&gt;
É porque ainda não estamos enviando os logs com os labels utilizado nas querys. &lt;/p&gt;

&lt;p&gt;Ambiente do Grafana e Loki configurados, vamos configurar o ambiente que fará o envio dos logs. Aqui vou utilizar os mesmo comandos iniciais, já vou partir para o acesso via SSH e instalação do Nginx, que enviará os logs do access.log para o servidor do Loki.&lt;/p&gt;

&lt;p&gt;Instalando Nginx no Amazon Linux 2&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo yum install nginx -y

sudo service nginx start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Necessário somente instalar e dar start no serviço&lt;/p&gt;

&lt;p&gt;Na instância onde o Nginx está instalado, é necessário que tenha o docker instalado também. Pois será necessário para subir o container do fluent-bit  para que seja feito o envio dos logs.&lt;/p&gt;

&lt;p&gt;Iniciando o container do fluent-bit para o envio dos logs, aqui vou utilizar a configuração padrão sem mexer em labels ou qualquer outra config. O valor da variável LOKI_URL vou colocar o ip interno da instância do servidor do Grafana, para que isso não passe pela internet para não termos gastos desnecessários.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -d -v /var/log/nginx:/var/log/nginx -e LOG_PATH="/var/log/nginx/access.log" -e LOKI_URL="http://10.42.12.1:3100/loki/api/v1/push" grafana/fluent-bit-plugin-loki:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim que o container estiver up, de alguns acesse o Nginx pelo public DNS e de alguns F5 para gerar logs no access.log&lt;/p&gt;

&lt;p&gt;Um detalhe, se for novamente na parte dos plugins, verá que aquela mensagem do Datasource que printei anteriormente na config do Loki não está mais aparecendo uma vez que estamos enviando os logs.&lt;/p&gt;

&lt;p&gt;Vou validar se os logs estão chegando no Loki, para isso vou fazer um query. Na interface do Grafana, vá em Explore&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1mzl3dxx2bn7z7yiqqc9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1mzl3dxx2bn7z7yiqqc9.png" alt="query"&gt;&lt;/a&gt;&lt;br&gt;
Em label filters selecione o seguintes valores:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjm58odwzqw862hhtktma.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjm58odwzqw862hhtktma.png" alt="label filters"&gt;&lt;/a&gt;&lt;br&gt;
A query deverá fica desta forma. Agora vamos rodar a query e ver se temos os logs da instância do nginx.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpxwhahvdtpfdsovr0ypf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpxwhahvdtpfdsovr0ypf.png" alt="logs nginx"&gt;&lt;/a&gt;&lt;br&gt;
Se na parte inferior, retornar desta forma&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgkr2c6lzwhzevnun44au.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgkr2c6lzwhzevnun44au.png" alt="resultado"&gt;&lt;/a&gt;&lt;br&gt;
Funcionou com sucesso as configs.&lt;/p&gt;

&lt;p&gt;Tentei demonstrar basicamente a criação de um servidor Grafana com plugin do Loki para coleta dos logs de um Nginx, instalado em uma instância EC2. Os logs aqui foram enviados utilizando o fluent-bit, com as configurações default. Aqui eu utilizei o fluent-bit para fazer a coleta e envio dos logs, mas poderia ser utilizado qualquer outro ship para o envio de logs, por exemplo o Promtail.&lt;/p&gt;

&lt;p&gt;E ai vamos se conectar? Entre em contato comigo:&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/pcmalves/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/pcmalves/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Referências:&lt;br&gt;
&lt;a href="https://hub.docker.com/r/grafana/fluent-bit-plugin-loki" rel="noopener noreferrer"&gt;https://hub.docker.com/r/grafana/fluent-bit-plugin-loki&lt;/a&gt;&lt;br&gt;
&lt;a href="https://grafana.com/docs/loki/latest/clients/fluentbit/" rel="noopener noreferrer"&gt;https://grafana.com/docs/loki/latest/clients/fluentbit/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://grafana.com/blog/2020/07/13/loki-tutorial-how-to-set-up-promtail-on-aws-ec2-to-find-and-analyze-your-logs/" rel="noopener noreferrer"&gt;https://grafana.com/blog/2020/07/13/loki-tutorial-how-to-set-up-promtail-on-aws-ec2-to-find-and-analyze-your-logs/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>monitoring</category>
      <category>cloud</category>
      <category>linux</category>
    </item>
  </channel>
</rss>
