<?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: Isaque Alcantara</title>
    <description>The latest articles on Forem by Isaque Alcantara (@isaque21).</description>
    <link>https://forem.com/isaque21</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%2F964581%2F3acda19c-3062-4c79-9862-6c46bb813c01.jpeg</url>
      <title>Forem: Isaque Alcantara</title>
      <link>https://forem.com/isaque21</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/isaque21"/>
    <language>en</language>
    <item>
      <title>Arara Watch: a serverless global disaster monitor, developed with technology from Google Gemini, AWS, OpenWeather and NASA.</title>
      <dc:creator>Isaque Alcantara</dc:creator>
      <pubDate>Mon, 20 Apr 2026 04:24:53 +0000</pubDate>
      <link>https://forem.com/isaque21/arara-watch-a-serverless-global-disaster-monitor-developed-with-technology-from-google-gemini-15m9</link>
      <guid>https://forem.com/isaque21/arara-watch-a-serverless-global-disaster-monitor-developed-with-technology-from-google-gemini-15m9</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-04-16"&gt;Weekend Challenge: Earth Day Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;For this Earth Day Challenge, I wanted to build something that bridges the gap between raw climate data and actionable human insight. When extreme weather events occur, raw numbers (like humidity percentages or temperature drops) aren't enough. People need context.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Arara Watch&lt;/strong&gt;, a Global Disaster Monitor. It takes real-time climate and satellite data and transforms it into an actionable &lt;strong&gt;Threat Matrix&lt;/strong&gt; for natural disasters (wildfires, floods, extreme heat/cold, landslides).&lt;/p&gt;

&lt;p&gt;To celebrate Earth Day, the system doesn't just look at the dangers; it also generates an AI-powered &lt;strong&gt;Ecological Overview&lt;/strong&gt; of any selected region on Earth, highlighting its vegetation type, natural attractions, and overall ecosystem conservation status.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live Application:&lt;/strong&gt; &lt;a href="https://d27z4plmo8syhc.cloudfront.net/" rel="noopener noreferrer"&gt;Arara Watch&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;💻 &lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/isaque21/dev_earth_day_challenge" rel="noopener noreferrer"&gt;isaque21/dev_earth_day_challenge&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;To ensure the application could handle sudden spikes in traffic (like during an actual natural disaster) without costing a fortune, I designed a &lt;strong&gt;100% Serverless architecture&lt;/strong&gt; deployed via Terraform.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Serverless Foundation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Vanilla HTML/CSS/JS hosted on an Amazon S3 Bucket and distributed globally via CloudFront. I used a Glassmorphism UI design over a high-resolution nature background to fit the Earth Day theme.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; An Amazon API Gateway routing requests to an AWS Lambda function (Python 3.12).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Ingestion:&lt;/strong&gt; The Lambda function fetches real-time weather from the OpenWeather API and active fire hotspots from NASA's FIRMS satellite data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Core Challenge: Rate Limiting &amp;amp; Latency
&lt;/h3&gt;

&lt;p&gt;Integrating Large Language Models in real-time mapping applications usually leads to API rate limits (like the &lt;code&gt;429 Too Many Requests&lt;/code&gt; error).&lt;/p&gt;

&lt;p&gt;To solve this, I implemented a &lt;strong&gt;Proximity Caching Strategy&lt;/strong&gt; using Amazon DynamoDB. When a user clicks on the map, the Lambda function rounds the coordinates to two decimal places (creating a "coverage radius" of roughly 1.1km) and uses it as a Global Secondary Index (GSI) key. &lt;/p&gt;

&lt;p&gt;If another user checked that same neighborhood in the last 30 minutes, the API bypasses the external requests and returns the cached analysis instantly. This dropped my API calls by over 80% and reduced response times from 8 seconds to just &lt;strong&gt;200 milliseconds&lt;/strong&gt; for cached locations! 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;I am submitting this project for the &lt;strong&gt;Best Use of Google Gemini&lt;/strong&gt; category.&lt;/p&gt;

&lt;p&gt;Instead of using the AI just for chatbot-style text generation, I utilized &lt;strong&gt;Google Gemini 2.5 Flash&lt;/strong&gt; as a structured backend microservice. &lt;/p&gt;

&lt;p&gt;By using strict prompt engineering, I instructed Gemini to act as both a Civil Defense Analyst and an Ecological Expert. The prompt feeds the raw NASA and OpenWeather data into the model and forces it to return a strictly formatted JSON response. This allows the Vanilla JS frontend to seamlessly map the AI's cognitive output directly into the DOM to render the colored Threat Matrix and the Ecological Overview cards without any parsing errors.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>gemini</category>
      <category>aws</category>
    </item>
    <item>
      <title>Amazon S3 Files: Tudo o que Você Precisa Saber Sobre o Novo Armazenamento de Arquivos</title>
      <dc:creator>Isaque Alcantara</dc:creator>
      <pubDate>Fri, 17 Apr 2026 14:32:42 +0000</pubDate>
      <link>https://forem.com/isaque21/amazon-s3-files-tudo-o-que-voce-precisa-saber-sobre-o-novo-armazenamento-de-arquivos-25l7</link>
      <guid>https://forem.com/isaque21/amazon-s3-files-tudo-o-que-voce-precisa-saber-sobre-o-novo-armazenamento-de-arquivos-25l7</guid>
      <description>&lt;h2&gt;
  
  
  Sumário
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Introdução: O Fim da Escolha Binária entre Objeto e Arquivo&lt;/li&gt;
&lt;li&gt;O Paradigma Histórico: Por que isso era um problema?&lt;/li&gt;
&lt;li&gt;O que é o Amazon S3 Files? Uma visão geral do novo serviço&lt;/li&gt;
&lt;li&gt;
Mergulho na Arquitetura: Como o S3 Files Funciona por Baixo dos Panos

&lt;ul&gt;
&lt;li&gt;1. Camada de Metadados com Latência Submilissegundo&lt;/li&gt;
&lt;li&gt;2. Tiering Inteligente e Cache&lt;/li&gt;
&lt;li&gt;3. Modelo “Stage and Commit” com Sincronização Bidirecional&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Casos de Uso: Onde o S3 Files se Destaca

&lt;ul&gt;
&lt;li&gt;Preparação de Dados para Machine Learning e IA&lt;/li&gt;
&lt;li&gt;Agentes de IA e Pipelines Colaborativos (Agentic AI)&lt;/li&gt;
&lt;li&gt;Modernização de Aplicações (Lift-and-Shift)&lt;/li&gt;
&lt;li&gt;Computação de Alto Desempenho (HPC) e Genômica&lt;/li&gt;
&lt;li&gt;AWS Lambda e Processamento Serverless de Arquivos Grandes&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Comparação Detalhada: S3 Files vs. Outros Serviços de Armazenamento da AWS

&lt;ul&gt;
&lt;li&gt;S3 Files vs. Amazon S3 Standard (API HTTP)&lt;/li&gt;
&lt;li&gt;S3 Files vs. Amazon EFS (Elastic File System)&lt;/li&gt;
&lt;li&gt;S3 Files vs. Amazon EBS (Elastic Block Store)&lt;/li&gt;
&lt;li&gt;S3 Files vs. Amazon FSx (Lustre, Windows, NetApp, OpenZFS)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Governança, Segurança e Conformidade&lt;/li&gt;

&lt;li&gt;Como Iniciar e Integrar com Seus Workloads&lt;/li&gt;

&lt;li&gt;Conclusão: O Futuro do Armazenamento de Dados na Nuvem&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  Introdução: O Fim da Escolha Binária entre Objeto e Arquivo
&lt;/h2&gt;

&lt;p&gt;O mundo da computação em nuvem acaba de presenciar um dos seus marcos mais importantes dos últimos anos. Em 7 de abril de 2026, a Amazon Web Services anunciou o lançamento do Amazon S3 Files, um produto inovador que promete revolucionar a forma como arquitetos de software, engenheiros de dados, equipes de Inteligência Artificial e desenvolvedores interagem com seus sistemas de armazenamento na nuvem.&lt;/p&gt;

&lt;p&gt;Por quase duas décadas, o ecossistema de TI foi obrigado a fazer uma escolha binária que, muitas vezes, acabava sendo limitante. De um lado da equação estava o armazenamento de objetos, como o Amazon S3, que oferecia uma durabilidade incomparável de 11 noves (99,999999999%), custo extremamente baixo, escalabilidade praticamente infinita e ampla integração com o mundo web por meio de APIs REST.&lt;/p&gt;

&lt;p&gt;Do outro lado, tínhamos o armazenamento baseado em sistemas de arquivos (como NFS): suporte nativo ao padrão POSIX, operações interativas com baixa latência, controle de bloqueio de arquivos e compatibilidade com aplicações legadas e ferramentas de linha de comando.&lt;/p&gt;

&lt;p&gt;Até agora, se fosse necessário aproveitar os benefícios de ambos, era preciso construir arquiteturas complexas. Com a chegada do Amazon S3 Files, essa dicotomia histórica chega ao fim. A AWS criou uma ponte que permite tratar buckets do S3 como sistemas de arquivos completos.&lt;/p&gt;




&lt;h2&gt;
  
  
  O Paradigma Histórico: Por que isso era um problema?
&lt;/h2&gt;

&lt;p&gt;Para entender a importância desse lançamento, é preciso olhar para as dores que as equipes de engenharia enfrentam no dia a dia. Aplicações modernas e ferramentas de Machine Learning frequentemente dependem da semântica de sistemas de arquivos. Uma simples linha como &lt;code&gt;open('/data/dataset.csv', 'r')&lt;/code&gt; em Python pressupõe que será possível interagir de forma transparente com bibliotecas de processamento de dados. Conseguir listar diretórios com comandos como &lt;code&gt;ls&lt;/code&gt; ou inspecionar metadados com &lt;code&gt;stat&lt;/code&gt; também é um comportamento esperado.&lt;/p&gt;

&lt;p&gt;Como o Amazon S3 é um serviço de armazenamento de objetos baseado em operações HTTP (&lt;code&gt;PUT&lt;/code&gt;, &lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt;), ele não oferecia esse tipo de funcionalidade de forma nativa. Com o tempo, desenvolvedores passaram a depender de três abordagens principais como solução alternativa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Processo de Download/Upload:&lt;/strong&gt;
Os dados permaneciam no S3, mas sempre que era necessário processá-los, os arquivos precisavam ser baixados para um armazenamento local (ou para serviços como o Amazon EFS), processados com ferramentas baseadas em arquivos e, depois, enviados novamente ao S3. Isso gerava duplicação de armazenamento, custos adicionais de transferência e atrasos significativos devido à movimentação de dados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FUSE (Filesystem in Userspace):&lt;/strong&gt;
Ferramentas como &lt;code&gt;s3fs&lt;/code&gt; ou AWS Mountpoint for S3 tentavam fazer o S3 se comportar como um disco. Embora o Mountpoint tenha melhorado o desempenho, essas soluções apresentavam limitações importantes, como otimização principalmente para leitura ou suporte apenas a gravações sequenciais, sem oferecer suporte completo a operações atômicas ou ao bloqueio de arquivos no estilo POSIX.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pagamento Premium por Sistemas de Arquivos:&lt;/strong&gt;
Em alguns casos, organizações evitavam o S3 completamente para dados acessados com frequência e mantinham tudo em sistemas baseados em arquivos, como o Amazon EFS ou o Amazon FSx. Isso garantia compatibilidade, mas com um custo por gigabyte significativamente mais alto.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O S3 Files resolve esses três desafios de uma só vez — eliminando a necessidade de movimentação de dados, dispensando conectores complexos de terceiros e melhorando a eficiência de custos em larga escala.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é o Amazon S3 Files? Uma visão geral do novo serviço
&lt;/h2&gt;

&lt;p&gt;Em termos simples, o Amazon S3 Files transforma seus buckets do Amazon S3 em sistemas de arquivos compartilhados ao conectar diretamente qualquer recurso de computação da AWS aos dados armazenados nesses buckets. Ele expõe uma interface de Network File System (NFS versão 4.1) diretamente sobre os dados que já estão no bucket.&lt;/p&gt;

&lt;p&gt;Sem que os dados precisem sair do S3, o serviço traduz de forma inteligente as operações padrão de sistemas de arquivos em requisições eficientes da API do S3 nos bastidores. Na prática, o S3 passa a funcionar como um “disco compartilhado”. Quando uma aplicação altera algum dado por meio do mount NFS, essa alteração é automaticamente refletida no objeto subjacente no S3.&lt;/p&gt;

&lt;p&gt;As equipes não precisam fazer nenhuma modificação no código de aplicações baseadas em sistemas de arquivos. Utilitários padrão de linha de comando do Linux, frameworks legados de Machine Learning, agentes de IA e sistemas analíticos podem ler e gravar dados como fariam em um disco local, enquanto o S3 atua como a fonte principal dos dados (System of Record).&lt;/p&gt;




&lt;h2&gt;
  
  
  Mergulho na Arquitetura: Como o S3 Files Funciona por Baixo dos Panos
&lt;/h2&gt;

&lt;p&gt;A AWS não construiu o Amazon S3 Files do zero. Internamente, o serviço se apoia na tecnologia já consolidada do Amazon Elastic File System para lidar com conexões e camadas de desempenho. Seu design segue uma abordagem de dupla camada, pensada para resolver um dos maiores desafios técnicos: a latência de metadados em armazenamento de objetos.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Camada de Metadados com Latência Submilissegundo
&lt;/h3&gt;

&lt;p&gt;Quando se executa um comando &lt;code&gt;ls&lt;/code&gt; em um diretório com milhares de arquivos, um sistema de arquivos tradicional responde quase instantaneamente. Em contraste, buckets de armazenamento de objetos podem levar mais tempo devido à paginação nas listagens. O S3 Files resolve isso mantendo uma camada dedicada e extremamente rápida de metadados. Essa camada mantém uma visão em tempo real dos objetos no bucket, permitindo que operações como &lt;code&gt;stat&lt;/code&gt;, navegação em diretórios e verificação de permissões ocorram com latência mínima — sem a necessidade de consultar constantemente a API do Amazon S3.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Tiering Inteligente e Cache
&lt;/h3&gt;

&lt;p&gt;Para entregar alto desempenho em diferentes tipos de workload, o S3 Files utiliza uma estratégia de armazenamento em camadas (tiering) inteligente. Arquivos menores e dados “quentes”, que se beneficiam de acesso rápido e aleatório, são mantidos em uma camada de cache de alta performance. Já para leituras sequenciais de grande volume — como carregar um dataset de 100 GB para treinamento de IA — o sistema ignora o cache e faz streaming direto do S3, atingindo um throughput agregado extremamente alto, que pode chegar a múltiplos terabytes por segundo.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Modelo “Stage and Commit” com Sincronização Bidirecional
&lt;/h3&gt;

&lt;p&gt;O S3 Files conecta a semântica de sistemas de arquivos com a de armazenamento de objetos por meio de um modelo de “stage and commit”. Alterações feitas pela interface NFS são primeiro processadas na camada de alta performance e, em seguida, sincronizadas de forma assíncrona com o S3 como atualizações completas de objetos. Esse processo funciona nos dois sentidos: se uma função serverless grava um novo objeto diretamente pela API do S3 (por exemplo, usando um SDK em Python), esse arquivo se torna visível quase imediatamente no sistema de arquivos montado para qualquer instância EC2 que esteja acessando o bucket.&lt;/p&gt;




&lt;h2&gt;
  
  
  Casos de Uso: Onde o S3 Files se Destaca
&lt;/h2&gt;

&lt;p&gt;A introdução do Amazon S3 Files abre uma ampla gama de possibilidades, especialmente em cenários que antes sofriam com a lacuna entre armazenamento de objetos e sistemas de arquivos tradicionais.&lt;/p&gt;

&lt;h3&gt;
  
  
  Preparação de Dados para Machine Learning e IA
&lt;/h3&gt;

&lt;p&gt;Cientistas de dados frequentemente gastam muito tempo limpando e preparando datasets brutos. No passado, isso exigia a construção de pipelines complexos e caros para mover dados do Amazon S3 para o Amazon Elastic File System, executar o pré-processamento com ferramentas como Pandas ou NumPy e, depois, enviar os resultados de volta ao S3. Com o S3 Files, o bucket pode simplesmente ser montado em uma instância de treinamento (ou no Amazon SageMaker), permitindo que scripts de preparação trabalhem diretamente com os dados no S3.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agentes de IA e Pipelines Colaborativos (Agentic AI)
&lt;/h3&gt;

&lt;p&gt;Agentes de IA modernos precisam de espaços de trabalho persistentes e estado de sessão. Agentes que geram código, compilam projetos ou analisam documentos podem agora usar o S3 Files como um diretório raiz compartilhado. Um agente pode escrever saídas intermediárias, e outro — rodando em um contêiner diferente — pode acessá-las imediatamente usando semântica POSIX. Isso possibilita colaboração em larga escala entre agentes de IA sem depender de bancos de dados intermediários complexos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Modernização de Aplicações (Lift-and-Shift)
&lt;/h3&gt;

&lt;p&gt;Muitas organizações ainda operam sistemas legados on-premises, como ERPs, servidores de mídia ou processadores de documentos, que esperam caminhos de arquivo como &lt;code&gt;//storage/data/&lt;/code&gt;. Migrar esses sistemas para a nuvem sempre foi um desafio, pois o S3 não oferecia compatibilidade nativa com sistemas de arquivos, enquanto o EFS pode ser caro para armazenamento de longo prazo. O S3 Files permite uma abordagem de lift-and-shift mais simples: as aplicações continuam funcionando normalmente, enquanto os dados são armazenados no S3 com alta escalabilidade.&lt;/p&gt;

&lt;h3&gt;
  
  
  Computação de Alto Desempenho (HPC) e Genômica
&lt;/h3&gt;

&lt;p&gt;Áreas como pesquisa biomédica, meteorologia e física frequentemente dependem de ferramentas científicas antigas baseadas no padrão POSIX. Com o S3 Files, clusters de computação podem acessar diretamente grandes volumes de dados — como bibliotecas genômicas — armazenados de forma econômica no S3, enquanto ainda se beneficiam de suporte completo ao NFS v4.1 e leituras paralelas de alto throughput.&lt;/p&gt;

&lt;h3&gt;
  
  
  AWS Lambda e Processamento Serverless de Arquivos Grandes
&lt;/h3&gt;

&lt;p&gt;Funções do AWS Lambda possuem limites rígidos de armazenamento local (até 10 GB em &lt;code&gt;/tmp&lt;/code&gt;). Processar arquivos muito grandes — como um vídeo de 50 GB — sempre foi um desafio em arquiteturas serverless. Com o S3 Files, funções Lambda podem montar grandes volumes de dados como se fossem um sistema de arquivos local, permitindo o processamento contínuo e nativo de arquivos em larga escala.&lt;/p&gt;




&lt;h2&gt;
  
  
  Comparação Detalhada: S3 Files vs. Outros Serviços de Armazenamento da AWS
&lt;/h2&gt;

&lt;p&gt;Para tomar decisões arquitetônicas mais acertadas, é essencial entender como o Amazon S3 Files se posiciona em relação às soluções já existentes no ecossistema AWS.&lt;/p&gt;

&lt;h3&gt;
  
  
  S3 Files vs. Amazon S3 Standard (API HTTP)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Acesso:&lt;/strong&gt; O S3 Standard exige o uso de APIs ou SDKs (como &lt;code&gt;PUT&lt;/code&gt; e &lt;code&gt;GET&lt;/code&gt;) e trabalha com objetos imutáveis. Já o S3 Files apresenta esses mesmos dados como arquivos e diretórios acessíveis via NFS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mutações:&lt;/strong&gt; No S3 tradicional, não é possível alterar apenas uma parte de um objeto — qualquer modificação exige a reescrita completa. O S3 Files resolve isso ao permitir alterações parciais no nível de blocos, abstraindo toda a complexidade internamente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uso ideal:&lt;/strong&gt; APIs do S3 continuam sendo a melhor escolha para aplicações cloud-native. Já o S3 Files é mais adequado quando há necessidade de semântica de sistema de arquivos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  S3 Files vs. Amazon EFS (Elastic File System)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Foco:&lt;/strong&gt; O EFS é um sistema de arquivos elástico voltado para uso geral. O S3 Files, embora utilize tecnologia do EFS internamente, tem o S3 como camada principal de persistência.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escala e custo:&lt;/strong&gt; Armazenar grandes volumes no EFS pode ser caro. O S3 Files mantém os dados no S3 (muito mais econômico) e usa uma camada adicional para performance interativa. Enquanto o EFS é ideal para arquivos sensíveis à latência (como diretórios de sistema), o S3 Files se destaca em dados massivos, analytics e datalakes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  S3 Files vs. Amazon EBS (Elastic Block Store)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Compartilhamento:&lt;/strong&gt; Volumes EBS geralmente são anexados a uma única instância por vez (com exceções limitadas). O S3 Files, por outro lado, é nativamente compartilhado — múltiplas instâncias, containers ou funções Lambda podem acessar os mesmos dados simultaneamente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistência:&lt;/strong&gt; O EBS é vinculado a zonas de disponibilidade específicas. Já o S3 (e o S3 Files) é multi-AZ por natureza, oferecendo maior resiliência regional.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  S3 Files vs. Amazon FSx (Lustre, Windows, NetApp, OpenZFS)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Especialização:&lt;/strong&gt; O FSx é voltado para cenários altamente específicos. Por exemplo, o FSx for Lustre é otimizado para HPC e pode integrar com S3, mas exige provisionamento dedicado, maior custo e mais gestão.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Posicionamento:&lt;/strong&gt; O S3 Files é totalmente gerenciado, pronto para uso geral via NFS 4.1, e atende a uma ampla gama de casos empresariais. Na prática, ele se posiciona como a opção padrão para integrar armazenamento de objetos com experiência de sistema de arquivos.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Governança, Segurança e Conformidade
&lt;/h2&gt;

&lt;p&gt;Ao introduzir uma ponte tão poderosa para um repositório principal de dados, a segurança naturalmente se torna uma das maiores preocupações para qualquer CISO. A Amazon Web Services projetou o Amazon S3 Files para manter a segurança centralizada e consistente.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Identity and Access Management (IAM):&lt;/strong&gt; Todo o controle de acesso é gerenciado por meio do AWS Identity and Access Management. Políticas baseadas em recursos e em identidade podem ser usadas para definir quem pode montar e acessar o sistema de arquivos, respeitando também as permissões granulares já configuradas no Amazon S3.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permissões POSIX:&lt;/strong&gt; Além do IAM, o S3 Files oferece suporte às permissões padrão do Linux (User ID e Group ID). Esses valores de UID/GID são armazenados como metadados nos objetos do S3, garantindo que operações como &lt;code&gt;chmod&lt;/code&gt;, realizadas em um sistema montado, sejam aplicadas corretamente na camada de armazenamento.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Criptografia:&lt;/strong&gt; Os dados em trânsito entre recursos computacionais e o S3 Files são criptografados utilizando TLS 1.3. Já os dados em repouso são protegidos por chaves gerenciadas automaticamente pelo S3 (SSE-S3) ou por chaves gerenciadas pelo cliente através do AWS Key Management Service.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auditoria (Audit Logging):&lt;/strong&gt; Todos os eventos de gerenciamento são registrados por meio do AWS CloudTrail, permitindo rastreabilidade completa e ajudando organizações a atender requisitos de conformidade ao monitorar quem acessou ou tentou modificar o sistema de arquivos.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Como Iniciar e Integrar com Seus Workloads
&lt;/h2&gt;

&lt;p&gt;A implementação do Amazon S3 Files foi pensada para gerar o mínimo de atrito para qualquer engenheiro já familiarizado com a AWS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Configuração:&lt;/strong&gt; Por meio do console da AWS, ou utilizando ferramentas como AWS CLI ou Terraform, é possível criar um recurso de interface do S3 Files e apontá-lo para o bucket (ou prefixo/diretório dentro dele) que se deseja expor no Amazon S3.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instalação do Driver:&lt;/strong&gt; Nos recursos de computação (como instâncias EC2 ou containers no EKS), é necessário garantir que o pacote &lt;code&gt;amazon-efs-utils&lt;/code&gt; esteja instalado. Como o serviço utiliza a infraestrutura do Amazon Elastic File System por baixo dos panos, esse é o único requisito do lado do cliente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Montagem Simples:&lt;/strong&gt; Com um comando Linux simples, como:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mount &lt;span class="nt"&gt;-t&lt;/span&gt; s3files file-system-id /mnt/meu-datalake
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A partir desse ponto, o diretório &lt;code&gt;/mnt/meu-datalake&lt;/code&gt; passa a funcionar como um sistema de arquivos de alta capacidade, com todo o conteúdo do S3 disponível para acesso imediato.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusão: O Futuro do Armazenamento de Dados na Nuvem
&lt;/h2&gt;

&lt;p&gt;Com o lançamento do Amazon S3 Files, a Amazon Web Services não está apenas adicionando mais uma ferramenta ao seu vasto portfólio — está resolvendo um desafio arquitetônico antigo. A proposta dos Data Lakes sempre foi centralizar a fonte de verdade das organizações. No entanto, isso frequentemente era comprometido quando equipes de IA e operações precisavam duplicar e isolar dados para torná-los compatíveis com ferramentas baseadas em sistemas de arquivos.&lt;/p&gt;

&lt;p&gt;Ao eliminar essa necessidade de movimentação e duplicação, o S3 Files reduz significativamente a complexidade das arquiteturas modernas, corta custos associados à redundância de dados, aumenta a produtividade de cientistas e engenheiros e posiciona o armazenamento de objetos como o núcleo central de todas as cargas de trabalho.&lt;/p&gt;

&lt;p&gt;Seja viabilizando o lift-and-shift de aplicações legadas ou permitindo o treinamento de novas gerações de IA com petabytes de dados acessados nativamente, o Amazon S3 deixa de ser apenas a base da “internet dos dados” e passa a atuar também como um verdadeiro disco rígido infinito e compartilhado.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/aws/launching-s3-files-making-s3-buckets-accessible-as-file-systems/" rel="noopener noreferrer"&gt;AWS News Blog: Launching S3 Files, making S3 buckets accessible as file systems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-files.html" rel="noopener noreferrer"&gt;AWS Documentation: Working with Amazon S3 Files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.allthingsdistributed.com/2026/04/s3-files-and-the-changing-face-of-s3.html" rel="noopener noreferrer"&gt;All Things Distributed: S3 Files and the changing face of S3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/aws-builders/amazon-s3-files-the-game-changer-weve-been-waiting-for-2515"&gt;DEV Community: Amazon S3 Files: The Game Changer We've Been Waiting For&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.geekwire.com/2026/amazon-revamps-s3-cloud-storage-for-the-ai-era-removing-a-key-barrier-for-apps-and-agents/" rel="noopener noreferrer"&gt;GeekWire: Amazon revamps S3 cloud storage for the AI era&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.infoq.com/news/2026/04/aws-s3-files/" rel="noopener noreferrer"&gt;InfoQ: AWS Introduces S3 Files, Bringing File System Access to S3 Buckets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@Hassan01SE/amazon-s3-files-mount-your-s3-bucket-like-a-local-drive-fded34d811ff" rel="noopener noreferrer"&gt;Medium: Amazon S3 Files: Mount Your S3 Bucket Like a Local Drive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=zb8TdNJhZCk" rel="noopener noreferrer"&gt;YouTube (AWS Developers): Intro to S3 Files&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>cloudcomputing</category>
      <category>architecture</category>
      <category>s3</category>
    </item>
    <item>
      <title>Obter tempo de disponibilidade de instâncias EC2 na AWS</title>
      <dc:creator>Isaque Alcantara</dc:creator>
      <pubDate>Thu, 13 Jul 2023 11:44:15 +0000</pubDate>
      <link>https://forem.com/isaque21/obter-tempo-de-disponibilidade-de-instancias-ec2-na-aws-1ooh</link>
      <guid>https://forem.com/isaque21/obter-tempo-de-disponibilidade-de-instancias-ec2-na-aws-1ooh</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Este artigo descreve a primeira parte do desenvolvimento de um sistema web para obter e visualizar o tempo de disponibilidade e indisponibilidade de instâncias EC2 na AWS.&lt;/p&gt;

&lt;p&gt;O sistema consiste em duas partes: um backend onde utilizaremos um script em python para obter e tratar os dados necessários para gerar os relatórios e um frontend composto por uma página simples que utilizará HTML, Javascript e CSS, para fornecer um dashboard com gráficos e insights sobre as instâncias EC2 de todas as regiões da conta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Arquitetura proposta
&lt;/h2&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%2F9ual0d1fe7eruuydsws8.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%2F9ual0d1fe7eruuydsws8.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com esta arquitetura, teremos uma Função Lambda que fará a coleta de métricas de &lt;strong&gt;StatusCheckFailed&lt;/strong&gt; vindas do CloudWatch para todas as instâncias da conta. Após coletá-las, o Lambda irá tratá-las e armazenar os resultados em um Bucket S3. O Bucket armazenará esses resultados em arquivos .csv juntamente com os arquivos HTML, Javascript e CSS que irão compor o sistema. Utilizaremos o CloudFront para distribuir o conteúdo e também proteger os acessos para somente usuários autorizados. &lt;/p&gt;

&lt;p&gt;Com isso teremos um Dashboard com o total, em horas, de tempo disponível e indisponível de todas as instâncias EC2. Também será possível baixar esse relatório em formato CSV para melhor administração.&lt;/p&gt;

&lt;h2&gt;
  
  
  Métricas de Status Check
&lt;/h2&gt;

&lt;p&gt;As métricas de status check na AWS são uma forma de monitorar a saúde e o desempenho das instâncias do Amazon EC2 (Elastic Compute Cloud) em uma região específica. Essas métricas fornecem informações sobre a integridade dos componentes da instância, como a camada de virtualização, a conectividade de rede e o sistema operacional.&lt;/p&gt;

&lt;p&gt;Vamos passar rapidamente sobre o papel de cada uma:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;StatusCheckFailed&lt;/strong&gt;: Essa métrica relata se a instância passou tanto na verificação de status da instância quanto na verificação de status do sistema no último minuto. Ela tem um valor binário, onde 0 significa que passou e 1 significa que falhou. Por padrão, essa métrica está disponível gratuitamente a cada um minuto. As unidades dessa métrica são contagem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;StatusCheckFailed_Instance&lt;/strong&gt;: Essa métrica informa se a instância passou na verificação de status da instância no último minuto. Similar à métrica anterior, ela possui um valor binário de 0 (passou) ou 1 (falhou). Também está disponível gratuitamente a cada um minuto e suas unidades são contagem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;StatusCheckFailed_System&lt;/strong&gt;: Essa métrica indica se a instância passou na verificação de status do sistema no último minuto. Mais uma vez, ela possui um valor binário de 0 (passou) ou 1 (falhou). A disponibilidade gratuita e a frequência de um minuto também se aplicam a essa métrica, e suas unidades são contagem.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ao acompanhar essas métricas, é possível identificar problemas e tomar medidas corretivas quando ocorrerem falhas nos status checks.&lt;/p&gt;

&lt;p&gt;Com base nas métricas de status check registradas no CloudWatch, podemos calcular o tempo de disponibilidade das instâncias. Ao monitorar as falhas nos status checks e calcular o tempo em que as instâncias estão passando nesses checks, é possível ter uma estimativa do tempo em que as instâncias estiveram disponíveis.&lt;/p&gt;

&lt;p&gt;No entanto, é importante destacar que essa abordagem é uma estimativa e depende de vários fatores, como a frequência de verificação das métricas, por exemplo. Além disso, existem outros fatores que podem afetar a disponibilidade das instâncias, como atualizações de sistema operacional, manutenção programada, eventos de força maior, entre outros.&lt;/p&gt;

&lt;h2&gt;
  
  
  Calculando o tempo de Downtime e Uptime
&lt;/h2&gt;

&lt;p&gt;Para calcular o tempo de disponibilidade das instâncias, utilizaremos um código em Python para rodar em uma função Lambda, que tem como propósito principal gerar um relatório de disponibilidade das instâncias do Amazon EC2 em várias regiões da AWS. Ele utiliza a biblioteca boto3 para interagir com os serviços da AWS, como o CloudWatch e o S3.&lt;/p&gt;

&lt;p&gt;O código itera sobre cada região configurada e, em seguida, obtém informações sobre as instâncias EC2 presentes em cada região. Para cada instância, são coletadas métricas de falha de status usando o CloudWatch. Com base nessas métricas, o código calcula o tempo de disponibilidade e indisponibilidade de cada instância.&lt;/p&gt;

&lt;p&gt;Após processar todas as regiões e instâncias, os dados são armazenados em uma lista e, em seguida, enviados como um arquivo CSV para um bucket S3 especificado. O relatório contém informações como ID da instância, nome, tipo, plataforma, tempo de disponibilidade, tempo de indisponibilidade e porcentagem de disponibilidade.&lt;/p&gt;

&lt;p&gt;Baixe o código &lt;a href="https://github.com/isaque21/lambda/tree/main/ec2-availability-time/backend" rel="noopener noreferrer"&gt;neste&lt;/a&gt; repositório.&lt;/p&gt;

&lt;p&gt;Hora de colocar a mão na massa. Vamos lá!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1 - Criar bucket S3&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Acesse o console do Amazon S3 e clique em &lt;strong&gt;Create bucket&lt;/strong&gt;. Dê um nome para seu bucket e escolha a região de sua preferência.&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%2F90iyw1xn8brgs3d3zxig.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%2F90iyw1xn8brgs3d3zxig.png" width="800" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Deixe o restante das opções como padrão e clique em &lt;strong&gt;Create bucket&lt;/strong&gt;.&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%2F38kia6jp90juw8qhqskq.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%2F38kia6jp90juw8qhqskq.png" width="800" height="205"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2 - Criar uma função do IAM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No console do IAM, clique em &lt;strong&gt;Policies&lt;/strong&gt; no menu lateral esquerdo e depois em &lt;strong&gt;Create policy&lt;/strong&gt;. Clique na guia JSON e substitua o código JSON por este:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::your-bucket-name-123456/*"
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Desta forma, a função Lambda que usará essa IAM role terá acesso restrito somente ao bucket em questão.&lt;/p&gt;

&lt;p&gt;Substitua o nome do bucket na linha &lt;code&gt;"Resource": "arn:aws:s3:::your-bucket-name-123456/*"&lt;/code&gt; pelo nome do bucket que você criou anteriormente. Avance para a parte de &lt;strong&gt;Review&lt;/strong&gt; para dar um nome à sua Policy e depois clique em &lt;strong&gt;Create Policy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Vamos então criar uma Role e atachar a Policy criada junto com outras necessárias para o funcionamento do script. Clique em &lt;strong&gt;Roles&lt;/strong&gt; no menu lateral esquerdo e depois em &lt;strong&gt;Create Role&lt;/strong&gt;. &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%2Fm92mtdhm05y8jqawg6kr.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%2Fm92mtdhm05y8jqawg6kr.png" width="800" height="227"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em &lt;strong&gt;Trusted entity type&lt;/strong&gt; escolha &lt;strong&gt;AWS service&lt;/strong&gt;, marque o serviço &lt;strong&gt;Lambda&lt;/strong&gt; e avance para atachar as policies necessárias.&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%2Fz8qdnvs5d8twrxucsse8.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%2Fz8qdnvs5d8twrxucsse8.png" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em &lt;strong&gt;Add permissions&lt;/strong&gt; pesquise pela policy que você criou anteriormente e marque a caixa ao lado do nome para selecioná-la. Faça o mesmo processo para as seguintes policies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CloudWatchLogsReadOnlyAccess&lt;/li&gt;
&lt;li&gt;AmazonEC2ReadOnlyAccess&lt;/li&gt;
&lt;/ul&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%2Fkt79tgea9br8dgcvmlcw.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%2Fkt79tgea9br8dgcvmlcw.png" width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Avance para escolher um nome para sua Role e revise as Policies atachadas. Feito isso, clique em &lt;strong&gt;Create role&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3 - Criar função Lambda&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Acesse o console do Lambda e clique em &lt;strong&gt;Create function&lt;/strong&gt;. Escolha a opção &lt;strong&gt;Author from scratch&lt;/strong&gt; para iniciar com um exemplo de código. Dê um nome para sua Função Lambda e escolha o Runtime &lt;strong&gt;Python 3.10&lt;/strong&gt;.&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%2Fur40tf9hkoozyy1se96c.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%2Fur40tf9hkoozyy1se96c.png" width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em &lt;strong&gt;Change default execution role&lt;/strong&gt; escolha &lt;strong&gt;Use an existing role&lt;/strong&gt; e selecione a Role que você criou no passo anterior. Feito isso clique em &lt;strong&gt;Create function&lt;/strong&gt;.&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%2F3bo8jylxu28khwuby95c.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%2F3bo8jylxu28khwuby95c.png" width="800" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora que você criou a Função, substitua o código de exemplo pelo código que está &lt;a href="https://github.com/isaque21/lambda/tree/main/ec2-availability-time/backend" rel="noopener noreferrer"&gt;neste&lt;/a&gt; repositório. Após inserir o código, clique em &lt;strong&gt;Deploy&lt;/strong&gt; para Salvar as alterações.&lt;/p&gt;

&lt;p&gt;Feito isso, vá para a aba &lt;strong&gt;Configuration&lt;/strong&gt; e mude o &lt;strong&gt;Timeout&lt;/strong&gt; para 2 minutos (configure um tempo maior ou menor de acordo com a quantidade de instâncias do ambiente).&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%2Fi1v2fsyqq47b6nc1ohrr.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%2Fi1v2fsyqq47b6nc1ohrr.png" width="800" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lembre-se de alterar as &lt;strong&gt;regiões&lt;/strong&gt;, o &lt;strong&gt;nome do bucket&lt;/strong&gt; e o &lt;strong&gt;nome do arquivo&lt;/strong&gt; no script.&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%2F3asdmaowquty2o1iq447.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%2F3asdmaowquty2o1iq447.png" width="626" height="177"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vá para a aba &lt;strong&gt;Test&lt;/strong&gt; para configurar um novo teste. Dê um nome ao evento e clique em &lt;strong&gt;Save&lt;/strong&gt;.&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%2Fyxujtxngs5zthcenkkgl.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%2Fyxujtxngs5zthcenkkgl.png" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após salvar, execute um teste. Se tudo correr bem você verá uma saída como a imagem abaixo.&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%2F5tbbeappio9sgq6jwgno.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%2F5tbbeappio9sgq6jwgno.png" width="800" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3 - Configurar EventBridge&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Na parte superior da página da função, em &lt;strong&gt;Function Overview&lt;/strong&gt;, clique em &lt;strong&gt;Add trigger&lt;/strong&gt;.&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%2Fjyj8lsznkpaaix8k1mtr.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%2Fjyj8lsznkpaaix8k1mtr.png" width="800" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em &lt;strong&gt;Trigger configuration&lt;/strong&gt; selecione &lt;strong&gt;EventBridge (CloudWatch Events)&lt;/strong&gt;. Crie uma nova regra, dê um nome para a regra e em seguida selecione &lt;strong&gt;Schedule expression&lt;/strong&gt; para inserir uma Cron.&lt;br&gt;
Aqui você pode configurar uma expressão que melhor atende a sua necessidade. Neste exemplo usei uma expressão que chamará a função Lambda de 30 em 30 minutos.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cron(0/30 * * * ? *)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Após inserir o valor clique em &lt;strong&gt;Add&lt;/strong&gt;.&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%2Fd1m8rl1p5ja5hmwxam6e.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%2Fd1m8rl1p5ja5hmwxam6e.png" width="800" height="644"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4 - Baixe o relatório gerado&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Volte ao bucket criado, navegue até a pasta “data/” e faça download do arquivo .csv gerado pelo script. &lt;/p&gt;

&lt;p&gt;As primeiras colunas do arquivo dizem respeito às especificações das instâncias como ID, nome, tamanho e sistema operacional.&lt;/p&gt;

&lt;p&gt;As informações sobre disponibilidade estão nas colunas uptime_hours, downtime_hours e hours_used.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;uptime_hours&lt;/strong&gt;: tempo em que a instância ficou disponível e operante.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;downtime_hours&lt;/strong&gt;: tempo em que a instância ficou indisponível e não operante (devido a alguma falha detectada pelas métricas de status check).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;hours_used&lt;/strong&gt;: tempo total em que a instância permaneceu ligada, independente de estar operante ou não operante.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por fim, temos as colunas start_date e end_date que representam o período em que o relatório se baseia. Por configuração do script, o relatório sempre começará no primeiro dia do mês às 00:00 horas e terminará no último horário de execução da função lambda, segmentando cada relatório por mês atual.&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%2Fi8t9iztwf9c6tve3cqcl.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%2Fi8t9iztwf9c6tve3cqcl.png" width="800" height="130"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Concluímos a primeira parte de nosso sistema. Com isso, temos um backend que nos traz um relatório de tempo de disponibilidade e indisponibilidade das instâncias EC2 da conta.&lt;/p&gt;

&lt;p&gt;Na parte 2 deste artigo, vamos criar um frontend utilizando HTML, Javascript e CSS para poder exibir esse relatório de forma mais apreciativa, e claro, vamos utilizar dos serviços da AWS que são próprios para isso, visando o mínimo custo possível. Até lá!&lt;/p&gt;

</description>
      <category>aws</category>
      <category>python</category>
      <category>lambda</category>
      <category>ec2</category>
    </item>
    <item>
      <title>Verificar rotinas de Snapshots via Lambda</title>
      <dc:creator>Isaque Alcantara</dc:creator>
      <pubDate>Sat, 11 Feb 2023 16:05:52 +0000</pubDate>
      <link>https://forem.com/isaque21/verificar-rotinas-de-snapshots-via-lambda-17jl</link>
      <guid>https://forem.com/isaque21/verificar-rotinas-de-snapshots-via-lambda-17jl</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;O backup é peça chave nas operações de qualquer ambiente e deixar de realizar alguma rotina pode resultar em surpresas desagradáveis em algum procedimento de recuperação.&lt;/p&gt;

&lt;p&gt;Existem diversas formas de realizar backups dos seus recursos e serviços na AWS. Quando se trata de Instâncias EC2 e RDS, a AWS oferece ferramentas como o &lt;a href="https://aws.amazon.com/pt/backup/" rel="noopener noreferrer"&gt;AWS Backup&lt;/a&gt; ou serviço de backup integrado no próprio recurso, como é o caso do RDS por exemplo.&lt;/p&gt;

&lt;p&gt;Apesar da facilidade em manter seus backups em dia, sabemos que sempre tem aquela exceção(zinha) que foge à regra e com o tempo pode acabar no limbo. Pensando nisso, elaborei este script em Python para poder verificar se os volumes de suas contas estão com o snapshot em dia. 🙂&lt;/p&gt;

&lt;h2&gt;
  
  
  Vamos aos passos
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1 - Criar uma função do IAM para o Lambda&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Acesse o console do &lt;strong&gt;IAM&lt;/strong&gt;, no menu lateral esquerdo clique em &lt;strong&gt;Roles&lt;/strong&gt; e depois clique no botão &lt;strong&gt;Create role&lt;/strong&gt;. &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%2F8hf2vmimd5zc1rfh4eag.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%2F8hf2vmimd5zc1rfh4eag.png" width="800" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em &lt;strong&gt;Select trusted entity&lt;/strong&gt; selecione &lt;strong&gt;AWS service&lt;/strong&gt;, &lt;strong&gt;Lambda&lt;/strong&gt; e clique em &lt;strong&gt;Next&lt;/strong&gt;. &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%2Fdthxh38gsqt4n09hgerg.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%2Fdthxh38gsqt4n09hgerg.png" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clique no botão &lt;strong&gt;Create policy&lt;/strong&gt;. Uma nova guia será aberta para criação da policy. Vá na guia &lt;strong&gt;JSON&lt;/strong&gt; do editor, cole o seguinte código abaixo e depois clique em &lt;strong&gt;Next&lt;/strong&gt; para avançar para a parte de &lt;strong&gt;Review policy&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "cloudwatch:PutMetricData",
                "ec2:DescribeInstances",
                "ec2:DescribeVolumeStatus",
                "ec2:DescribeSnapshotAttribute",
                "ec2:DescribeRegions",
                "ec2:DescribeVolumes",
                "ec2:DescribeVolumesModifications",
                "ec2:DescribeSnapshots",
                "ec2:DescribeVolumeAttribute"
            ],
            "Resource": [
                "*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:*:*:*"
            ],
            "Effect": "Allow"
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F4hu2j8owpicefj8bjzhv.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%2F4hu2j8owpicefj8bjzhv.png" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dê um nome para sua Policy e clique em &lt;strong&gt;Create policy&lt;/strong&gt;.&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%2Feeuhxhkgrd8vphue42pw.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%2Feeuhxhkgrd8vphue42pw.png" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Volte para a guia da criação da Role em seu navegador e atualize a lista de policies. Pesquise pela policy criada anteriormente, selecione-a e clique em &lt;strong&gt;Next&lt;/strong&gt;.&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%2Fg43we8l6wjl8hm1p144s.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%2Fg43we8l6wjl8hm1p144s.png" width="800" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dê um nome para sua Role e clique em &lt;strong&gt;Create role&lt;/strong&gt;. Pronto, sua Role está criada.&lt;/p&gt;

&lt;h2&gt;
  
  
  2 - Criar função Lambda
&lt;/h2&gt;

&lt;p&gt;Abra o console do &lt;strong&gt;Lambda&lt;/strong&gt;, no menu lateral esquerdo clique em &lt;strong&gt;Functions&lt;/strong&gt; e depois no botão &lt;strong&gt;Create function&lt;/strong&gt;.&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%2Fsaj3btosax159u0dv2dj.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%2Fsaj3btosax159u0dv2dj.png" width="800" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Selecione &lt;strong&gt;Author from scratch&lt;/strong&gt;, dê um nome para sua função e escolha o &lt;strong&gt;Runtime Python 3.9&lt;/strong&gt;.&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%2F853d4hd9czfqbfe65jiz.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%2F853d4hd9czfqbfe65jiz.png" width="800" height="311"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em &lt;strong&gt;Permissions&lt;/strong&gt;, selecione o item &lt;strong&gt;Use an existing role&lt;/strong&gt; e no campo de seleção escolha a Role criada anteriormente. Feito isso clique em &lt;strong&gt;Create function&lt;/strong&gt;.&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%2Fqu0t5kkc2u16mxxgojv0.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%2Fqu0t5kkc2u16mxxgojv0.png" width="800" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com isso sua função está criada. Agora vamos substituir o código de exemplo da função pelo código &lt;a href="https://github.com/isaque21/lambda/blob/main/ebs-check-snapshots/lambda_function.py" rel="noopener noreferrer"&gt;deste repositório&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Este código seleciona todos os volumes da conta e verifica se cada um deles possui ou não algum snapshot realizado. &lt;/p&gt;

&lt;p&gt;Caso NÃO possua algum snapshot realizado, será impresso a seguinte mensagem nos logs de execução: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;[ALERT] The Volume-ID: vol-a1b2c3d4e5f6g7 does not have a Snapshot.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Se o volume possuir algum snapshot mas esse for mais antigo do que a quantidade de dias inserida na constante de verificação &lt;code&gt;DAYS = x&lt;/code&gt; será impresso a mensagem: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;[ALERT] The last Snapshot of Volume-ID: vol-a1b2c3d4e5f6g7 was in 2022-09-23 01:33:04.596000+00:00.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Se por algum motivo você quiser excluir algum volume da verificação, basta adicionar a tag &lt;code&gt;snapshot:false&lt;/code&gt; no volume desejado. Então verá na saída de logs a mensagem: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;[WARNING] Volume-ID: vol-a1b2c3d4e5f6g7 excluded from snapshot routine.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Por padrão, o código verifica se os snapshots mais recentes possuem mais de 3 dias, mas você pode alterar esse valor na constante &lt;code&gt;DAYS = x&lt;/code&gt; no início do código.&lt;/p&gt;

&lt;p&gt;Caso a saída do código &lt;strong&gt;não retorne nada&lt;/strong&gt; significa que seus volumes estão com o snapshot &lt;strong&gt;em dia&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Após substituir o código, clique em &lt;strong&gt;Deploy&lt;/strong&gt; para salvar.&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%2F5u6oz4ps9jiwyayg79wq.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%2F5u6oz4ps9jiwyayg79wq.png" width="800" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após salvar o código, vá até a guia &lt;strong&gt;Configuration&lt;/strong&gt; e clique em &lt;strong&gt;Edit&lt;/strong&gt;.&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%2Fkv9260nwwce3owrnk9rm.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%2Fkv9260nwwce3owrnk9rm.png" width="800" height="185"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Altere o &lt;strong&gt;Timeout&lt;/strong&gt; para 1 minuto e 30 segundos (pode ser necessário um tempo maior dependendo da quantidade de volumes na conta) e depois clique em &lt;strong&gt;Save&lt;/strong&gt;.&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%2F9lpuxlz6h69n6bmu2ylz.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%2F9lpuxlz6h69n6bmu2ylz.png" width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Volte na guia &lt;strong&gt;Code&lt;/strong&gt;, clique em &lt;strong&gt;Test&lt;/strong&gt; para configurar um novo evento de teste.&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%2Fap5k171ht58rs86i0k6c.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%2Fap5k171ht58rs86i0k6c.png" width="778" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dê um nome ao evento, mantenha o restante das configurações padrão e clique em &lt;strong&gt;Save&lt;/strong&gt;.&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%2Fdqw1udl3dflbv6z5jlg0.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%2Fdqw1udl3dflbv6z5jlg0.png" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após salvar o Evento, clique no botão &lt;strong&gt;Test&lt;/strong&gt; novamente para executar sua função Lambda.&lt;/p&gt;

&lt;h2&gt;
  
  
  3 - Analisando os Logs
&lt;/h2&gt;

&lt;p&gt;Após executar a função, você verá uma saída parecida com esta abaixo:&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%2Fdhtj4yc9v8yz3hofc8u6.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%2Fdhtj4yc9v8yz3hofc8u6.png" width="800" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para uma visualização mais completa, vamos analisar essa saída no &lt;strong&gt;Log Groups&lt;/strong&gt; do &lt;strong&gt;CloudWatch&lt;/strong&gt;. Para isso clique na guia &lt;strong&gt;Monitor&lt;/strong&gt; e depois em &lt;strong&gt;View CloudWatch logs&lt;/strong&gt;.&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%2Fnvmthd5hlk4tqwprcvp9.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%2Fnvmthd5hlk4tqwprcvp9.png" width="800" height="137"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com isso você será redirecionado para o Grupo de logs da função Lambda que você criou. Clique no &lt;strong&gt;Log stream&lt;/strong&gt; mais recente para visualizar a saída completa da Função.&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%2Fl1lrsrsgs9ca48d6nm2m.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%2Fl1lrsrsgs9ca48d6nm2m.png" width="800" height="158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dessa forma você pode ter uma visão completa, o que dependendo do seu ambiente pode ser bem extensa.&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%2Fezacj0nc6tr7zf9tx00e.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%2Fezacj0nc6tr7zf9tx00e.png" width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;A partir dos logs no &lt;strong&gt;CloudWatch&lt;/strong&gt; podemos criar alarmes com base em filtros de métricas e assim termos uma monitoria de backup de todos os volumes da conta, mas isso é um assunto para um próximo post. &lt;/p&gt;

&lt;p&gt;Vou ficando por aqui e qualquer feedback só deixar nos comentários. &lt;/p&gt;

</description>
      <category>career</category>
      <category>education</category>
      <category>finance</category>
    </item>
    <item>
      <title>Gerando relatório de Rightsizing de Instâncias via Lambda</title>
      <dc:creator>Isaque Alcantara</dc:creator>
      <pubDate>Sun, 29 Jan 2023 12:40:44 +0000</pubDate>
      <link>https://forem.com/isaque21/gerando-relatorio-de-rightsizing-de-instancias-via-lambda-2nlb</link>
      <guid>https://forem.com/isaque21/gerando-relatorio-de-rightsizing-de-instancias-via-lambda-2nlb</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Ainda na pegada de otimização de custos na AWS, este post complementa o &lt;a href="https://dev.to/isaque21/gerando-relatorio-de-precos-de-reservas-de-instancias-via-lambda-4mjn"&gt;post anterior&lt;/a&gt; onde geramos um relatório de preços de reservas das instâncias do seu ambiente através de um script em Python executado via Lambda. &lt;/p&gt;

&lt;p&gt;Neste post utilizaremos a mesma abordagem, porém com o script um pouco mais “turbinado”, onde adicionamos alguns recursos do AWS Compute Optimizer na jogada. &lt;/p&gt;

&lt;p&gt;Com isso, será gerado um outro relatório com recomendações de rightsizing para suas instâncias EC2 juntamente com os preços sob demanda e de reservas como no relatório anterior. O relatório traz também uma comparação de utilização de CPU e memória da família atual com uma estimativa de uso da família recomendada pelo Compute Optimizer.&lt;/p&gt;

&lt;h2&gt;
  
  
  O AWS Compute Optimizer
&lt;/h2&gt;

&lt;p&gt;O AWS Compute Optimizer ajuda você a evitar o provisionamento excessivo ou insuficiente de alguns recursos da AWS. Acesse a documentação &lt;a href="https://aws.amazon.com/pt/compute-optimizer/" rel="noopener noreferrer"&gt;neste link&lt;/a&gt; para saber mais.&lt;/p&gt;

&lt;p&gt;Alguns casos de uso do AWS Compute Optimizer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avalie as oportunidades estimadas de economia e melhoria de performance no nível da conta para recursos do Amazon EC2, Amazon EBS e AWS Lambda.&lt;/li&gt;
&lt;li&gt;Obtenha recomendações aprimoradas para otimizar instâncias do EC2 e grupos do Auto Scaling usando três meses de dados históricos.&lt;/li&gt;
&lt;li&gt;Encontre as workloads do EC2 que fornecerão o maior retorno pelo menor esforço de migração em uma mudança para CPUs AWS Graviton.&lt;/li&gt;
&lt;li&gt;Aumente a economia e o reconhecimento da performance configurando métricas de terceiros a partir de suas ferramentas de Monitoramento de performance de aplicações (APM).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É importante ressaltar que a opção padrão do Compute Optimizer analisa as métricas do Amazon CloudWatch durante os últimos 14 dias para fornecer recomendações. Caso você queira estender esse período por até 3 meses, é necessário ativar as métricas de infraestrutura avançadas do Compute Optimizer, que é um recurso pago. Entenda a definição de preços &lt;a href="https://aws.amazon.com/pt/compute-optimizer/pricing/" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bora pro trampo!
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1 - Criar bucket&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O primeiro ponto será a criação do nosso bucket onde ficarão os arquivos que serão gerados pelo script.&lt;/p&gt;

&lt;p&gt;Acesse o console do Amazon S3 e clique em Create bucket. Dê um nome para seu bucket e escolha a região de sua preferência. Deixe o restante das opções como padrão e clique em Create bucket.&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%2Fp9jpevuktav13risxd3g.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%2Fp9jpevuktav13risxd3g.png" width="768" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O nome do bucket é globalmente exclusivo, portanto use um nome diferente do meu e anote. Vamos usar esse nome na política que criaremos na próxima etapa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2 - Criar uma função do IAM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No console do IAM, clique em Policies no menu lateral esquerdo e depois em Create policy. Clique na guia JSON e substitua o código JSON por este:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::ec2-recommendations-reports/*"
        }
    ]
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Substitua o nome do bucket na linha &lt;code&gt;"Resource": "arn:aws:s3:::ec2-recommendations-reports/*"&lt;/code&gt; pelo nome do bucket que você criou anteriormente. Avance para a parte de Review para dar um nome à sua Policy e depois clique em Create Policy.&lt;/p&gt;

&lt;p&gt;Vamos então criar uma Role e atachar a Policy criada junto com outras necessárias para o funcionamento do script. Clique em Roles no menu lateral esquerdo e depois em Create Role.  Em Trusted entity type escolha AWS service, marque o serviço Lambda e avance para atachar as policies necessárias. &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%2F4tos0mfzpn5zsu4t4csc.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%2F4tos0mfzpn5zsu4t4csc.png" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em Add permissions pesquise pela policy que você criou anteriormente e marque a caixa ao lado do nome para selecioná-la. Faça o mesmo processo para as seguintes policies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWSPriceListServiceFullAccess&lt;/li&gt;
&lt;li&gt;ComputeOptimizerReadOnlyAccess&lt;/li&gt;
&lt;li&gt;AmazonEC2ReadOnlyAccess&lt;/li&gt;
&lt;li&gt;AmazonSSMReadOnlyAccess&lt;/li&gt;
&lt;li&gt;AWSLambdaBasicExecutionRole&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avance para escolher um nome para sua Role e revise as Policies atachadas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3 - Criar função Lambda&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Acesse o console do Lambda e clique em Create function. Escolha a opção Author from scratch para iniciar com um exemplo de código. Dê um nome para sua Função Lambda e escolha o Runtime Python 3.9 ou superior.&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%2Frwnuq09zso5210hcx0cf.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%2Frwnuq09zso5210hcx0cf.png" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em Change default execution role escolha Use an existing role e selecione a Role que você criou no passo anterior. Feito isso clique em Create function.&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%2Fjiacy5rhiu5x4iyid36o.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%2Fjiacy5rhiu5x4iyid36o.png" width="800" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora que você criou a Função, substitua o código de exemplo pelo código que está &lt;a href="https://github.com/isaque21/lambda/blob/main/get-recommendations/lambda_function.py" rel="noopener noreferrer"&gt;neste repositório&lt;/a&gt;. Após inserir o código, clique em Deploy para Salvar as alterações.&lt;/p&gt;

&lt;p&gt;Feito isso, vá para a aba Configuration e mude o Timeout para 2 minutos (configure um tempo maior ou menor de acordo com a quantidade de instâncias do ambiente).&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%2Fnhxq2kl0ycz80ausvymj.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%2Fnhxq2kl0ycz80ausvymj.png" width="800" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vá para a aba Test para configurar um novo teste. Dê um nome ao evento e clique em Save.&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%2F5gje5dbmjhfviahzw7l3.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%2F5gje5dbmjhfviahzw7l3.png" width="800" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4 - Configuração do script&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Volte para a aba Code. Vamos analisar algumas linhas do código que precisam ser alteradas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Região dos recursos na AWS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Escolha as regiões onde suas instâncias estão. O script verifica todas instâncias EC2 nas regiões setadas na variável &lt;code&gt;AWS_REGIONS&lt;/code&gt; e adiciona todas no mesmo arquivo csv.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Define AWS Region
AWS_REGIONS = ['us-east-1', 'sa-east-1']
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Região do endpoint da API de preços&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Conforme dito anteriormente, a API de preços da AWS fornece dois endpoints com duas regiões diferentes. Aqui usaremos a região da Virgínia, mas você pode trabalhar com outra se preferir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Define AWS Pricing Rregion (us-east-1 or ap-south-1)
AWS_PRICING_REGION = 'us-east-1'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Tipo de reserva que será utilizada no relatório&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Você pode trabalhar com o tipo de reservas padrão ou conversível. Para entender a diferença entre os dois, consulte &lt;a href="https://aws.amazon.com/pt/ec2/pricing/reserved-instances/" rel="noopener noreferrer"&gt;este link&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Define reservation type (standard or convertible)
OFFERING_CLASS = 'standard'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Nome do bucket onde serão armazenados os arquivos csv do relatório&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Altere esta opção e insira o nome do bucket que você criou. Como o bucket é globalmente exclusivo, você terá que mudar de qualquer jeito.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Enter your BUCKET name, e.g 'mybucket'
BUCKET = 'mybucket'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Nome do arquivo CSV que será criado pelo script&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Defina um nome para o arquivo de relatório que será gerado pelo script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# KEY path, e.g.'myec2report'
KEY = 'myec2report'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obs.: esse nome será concatenado com o tipo de reserva e uma hash de identificação única para não haver sobreposição do arquivo ao executar a função novamente.&lt;/p&gt;

&lt;p&gt;Ex: &lt;strong&gt;myec2report&lt;/strong&gt;_standard_1684081195342122923.csv&lt;/p&gt;

&lt;p&gt;Após executar a função Lambda, seu bucket S3 deverá estar parecido com esse:&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%2Fg29suxr3ge0z4avw6314.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%2Fg29suxr3ge0z4avw6314.png" alt="Image description" width="800" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos ver o arquivo que foi gerado pelo script (com uma sequência numérica no final).&lt;/p&gt;

&lt;p&gt;O arquivo de relatório gerado nos traz os mesmos tipos de preços sob demanda e de reservas para todas as instâncias da região inserida no código, porém desta vez os preços são para a família de instâncias recomendadas pelo Compute Optimizer. Também é possível ver uma comparação de utilização de CPU e memória da família atual com uma estimativa de uso da família recomendada pelo Compute Optimizer.&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%2F8oe6ayjtrsbhi8b62bav.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%2F8oe6ayjtrsbhi8b62bav.png" width="800" height="106"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A coluna Fiding fornece um status dos seus recursos durante o período analisado, podendo ser &lt;em&gt;Under-provisioned&lt;/em&gt;, &lt;em&gt;Over-provisioned&lt;/em&gt; ou &lt;em&gt;Optimized&lt;/em&gt;. Entenda cada um desses status &lt;a href="https://docs.aws.amazon.com/compute-optimizer/latest/ug/viewing-dashboard.html#dashboard-findings-classifications" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Considerações
&lt;/h2&gt;

&lt;p&gt;O script lista as recomendações de instâncias baseado na arquitetura atual da instância (Intel, AMD e Arm). Para alterar esta configuração, adicione o parâmetro &lt;code&gt;"cpuVendorArchitectures": [ "string" ]&lt;/code&gt; na chamada da API em &lt;code&gt;COMPUTE_OPTIMIZER.get_ec2_instance_recommendations()&lt;/code&gt;. Veja a documentação &lt;a href="https://docs.aws.amazon.com/compute-optimizer/latest/APIReference/API_GetEC2InstanceRecommendations.html" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Em alguns casos, o Compute Optimizer recomenda a troca de família mesmo a instância estando como &lt;em&gt;Optimized&lt;/em&gt;, pois a geração recomendada é mais nova que a atual e isso gera uma redução de uso da capacidade computacional e até mesmo de custo.&lt;/p&gt;

&lt;p&gt;Outro ponto importante é que para a obtenção de métricas de memória, é necessário ter o &lt;em&gt;CloudWatch Agent&lt;/em&gt; instalado nas instâncias. Caso contrário, tanto a coluna de métricas de memória atual quanto a estimada serão preenchidas com "&lt;em&gt;Not available&lt;/em&gt;".&lt;/p&gt;

&lt;p&gt;Em algumas ocasiões o Compute Optimizer necessita que as instâncias permaneçam ligadas por um período mínimo de tempo. Em meus testes de laboratório, foi  preciso mantê-las ligadas por no mínimo 24 horas sem interrupções.&lt;/p&gt;

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

&lt;p&gt;Novamente, é IMPORTANTE sempre validar os preços gerados pelo script com os valores da &lt;a href="https://calculator.aws/#/" rel="noopener noreferrer"&gt;calculadora de preços da AWS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Isso é tudo por hoje!&lt;br&gt;
Se tiver dúvidas ou quer mandar um feedback fique a vontade para comentar.&lt;br&gt;
Abraços!&lt;/p&gt;

</description>
      <category>tooling</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Gerando relatório de preços de reservas de Instâncias via Lambda</title>
      <dc:creator>Isaque Alcantara</dc:creator>
      <pubDate>Sat, 21 Jan 2023 16:13:13 +0000</pubDate>
      <link>https://forem.com/isaque21/gerando-relatorio-de-precos-de-reservas-de-instancias-via-lambda-4mjn</link>
      <guid>https://forem.com/isaque21/gerando-relatorio-de-precos-de-reservas-de-instancias-via-lambda-4mjn</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Talvez você já tenha se deparado com a necessidade de avaliar preços para possíveis reservas de instâncias para o seu ambiente e dependendo da quantidade de instâncias, esta pode não ser uma tarefa muito agradável.&lt;/p&gt;

&lt;p&gt;Em um ambiente que contém dezenas ou talvez centenas de instâncias em uso, gerar relatório de preço de reserva para cada uma pode levar dias se feito de forma manual, cuja tarefa seria: verificar a família da instância, ir até a calculadora da AWS, coletar os preços para as diferentes modalidades (de reservas e pagamento) e incluir todas essas informações em uma planilha. Suado, viu… &lt;/p&gt;

&lt;p&gt;Pensando em uma forma de automatizar este processo, elaborei um script em Python para rodar em uma função Lambda e gerar esse lindo relatório para nós. 😀&lt;/p&gt;

&lt;p&gt;Este script utiliza a API de preços da AWS para preencher um arquivo em CSV com os preços Sob Demanda e de Reservas com as diferentes modalidades de pagamento (sem pagamento adiantado, parcialmente adiantado e totalmente adiantado) para 1 e 3 anos. Também é possível escolher entre os tipos de reservas padrão e conversível, para melhor atender a sua necessidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sobre a API de preços da AWS
&lt;/h2&gt;

&lt;p&gt;A AWS oferece duas APIs que você pode usar para consultar preços. Você pode consultar a documentação &lt;a href="https://docs.aws.amazon.com/pt_br/awsaccountbilling/latest/aboutv2/price-changes.html" rel="noopener noreferrer"&gt;neste link&lt;/a&gt;, mas em resumo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Com a API Price List Bulk da AWS, você pode consultar os preços de serviços da AWS em massa. Essa API retorna um arquivo JSON ou CSV. A API em massa retém todas as versões históricas da lista de preços.&lt;/li&gt;
&lt;li&gt;Com a API Price List Query da AWS, é possível consultar informações específicas sobre serviços, produtos e preços da AWS usando um AWS SDK ou a AWS CLI. Essa API é capaz de recuperar informações sobre determinados produtos ou preços, em vez de recuperar preços em massa. Isso permite obter informações de preços em ambientes que talvez não consigam processar uma lista de preços em massa, como em aplicações móveis ou baseadas em navegador da Web. Por exemplo, é possível utilizar a API de consulta para buscar informações de preços de instâncias do Amazon EC2 com 64 vCPUs, 256 GiB de memória e o SQL Server Enterprise pré-instalado na região Ásia-Pacífico (Mumbai). A API de consulta retorna os preços atuais e não retém preços históricos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para esse script será utilizada a segunda opção nas APIs descritas acima. Passando alguns atributos das instâncias que compõem o seu ambiente como parâmetros na chamada dessa API, ela nos retornará os preços da instância em questão.&lt;/p&gt;

&lt;p&gt;A API Price List Query da AWS fornece os dois endpoints a seguir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://api.pricing.us-east-1.amazonaws.com" rel="noopener noreferrer"&gt;https://api.pricing.us-east-1.amazonaws.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://api.pricing.ap-south-1.amazonaws.com" rel="noopener noreferrer"&gt;https://api.pricing.ap-south-1.amazonaws.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Mão na massa!
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1 - Criar bucket&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O primeiro ponto será a criação do nosso bucket onde ficarão os arquivos que serão gerados pelo script.&lt;/p&gt;

&lt;p&gt;Acesse o console do Amazon S3 e clique em Create bucket. Dê um nome para seu bucket e escolha a região de sua preferência. Deixe o restante das opções como padrão e clique em Create bucket.&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%2Fk61pnbzda8ddqcg6e5kz.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%2Fk61pnbzda8ddqcg6e5kz.png" width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O nome do bucket é globalmente exclusivo, portanto use um nome diferente do meu e anote. Vamos usar esse nome na política que criaremos na próxima etapa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2 - Criar uma função do IAM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No console do IAM, clique em Policies no menu lateral esquerdo e depois em Create policy. Clique na guia JSON e substitua o código JSON por este:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::ec2-princing-reports/*"
        }
    ]
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Substitua o nome do bucket na linha &lt;code&gt;"Resource": "arn:aws:s3:::ec2-princing-reports/*"&lt;/code&gt; pelo nome do bucket que você criou anteriormente. Avance para a parte de Review para dar um nome à sua Policy e depois clique em Create Policy.&lt;/p&gt;

&lt;p&gt;Vamos então criar uma Role e atachar a Policy criada junto com outras necessárias para o funcionamento do script. Clique em Roles no menu lateral esquerdo e depois em Create Role.  Em Trusted entity type escolha AWS service, marque o serviço Lambda e avance para atachar as policies necessárias. &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%2F4tos0mfzpn5zsu4t4csc.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%2F4tos0mfzpn5zsu4t4csc.png" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em Add permissions pesquise pela policy que você criou anteriormente e marque a caixa ao lado do nome para selecioná-la. Faça o mesmo processo para as seguintes policies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWSPriceListServiceFullAccess&lt;/li&gt;
&lt;li&gt;AmazonEC2ReadOnlyAccess&lt;/li&gt;
&lt;li&gt;AmazonSSMReadOnlyAccess&lt;/li&gt;
&lt;li&gt;AWSLambdaBasicExecutionRole&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avance para escolher um nome para sua Role e revise as Policies atachadas. As permissões da sua Role devem se parecer com esta:&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%2Fhzetcjbi0p6grt730wn3.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%2Fhzetcjbi0p6grt730wn3.png" width="800" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3 - Criar função Lambda&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Acesse o console do Lambda e clique em Create function. Escolha a opção Author from scratch para iniciar com um exemplo de código. Dê um nome para sua Função Lambda e escolha o Runtime Python 3.9.&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%2Frwnuq09zso5210hcx0cf.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%2Frwnuq09zso5210hcx0cf.png" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em Change default execution role escolha Use an existing role e selecione a Role que você criou no passo anterior. Feito isso clique em Create function.&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%2Fjiacy5rhiu5x4iyid36o.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%2Fjiacy5rhiu5x4iyid36o.png" width="800" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora que você criou a Função, substitua o código de exemplo pelo código que está &lt;a href="https://github.com/isaque21/lambda/blob/main/get-price/lambda_function.py" rel="noopener noreferrer"&gt;neste repositório&lt;/a&gt;. Após inserir o código, clique em Deploy para Salvar as alterações.&lt;/p&gt;

&lt;p&gt;Feito isso, vá para a aba Configuration e mude o Timeout para 2 minutos (configure um tempo maior ou menor de acordo com a quantidade de instâncias do ambiente).&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%2Fnhxq2kl0ycz80ausvymj.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%2Fnhxq2kl0ycz80ausvymj.png" width="800" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vá para a aba Test para configurar um novo teste. Dê um nome ao evento e clique em Save.&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%2F5gje5dbmjhfviahzw7l3.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%2F5gje5dbmjhfviahzw7l3.png" width="800" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4 - Configuração do script&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Volte para a aba Code. Vamos analisar algumas linhas do código que precisam ser alteradas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Região dos recursos na AWS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Escolha as regiões onde suas instâncias estão. O script verifica todas instâncias EC2 nas regiões setadas na variável &lt;code&gt;AWS_REGIONS&lt;/code&gt; e adiciona todas no mesmo arquivo csv.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Define AWS Region
AWS_REGIONS = ['us-east-1', 'sa-east-1']
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Região do endpoint da API de preços&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Conforme dito anteriormente, a API de preços da AWS fornece dois endpoints com duas regiões diferentes. Aqui usaremos a região da Virgínia, mas você pode trabalhar com outra se preferir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Define AWS Pricing Rregion (us-east-1 or ap-south-1)
AWS_PRICING_REGION = 'us-east-1'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Tipo de reserva que será utilizada no relatório&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Você pode trabalhar com o tipo de reservas padrão ou conversível. Para entender a diferença entre os dois, consulte &lt;a href="https://aws.amazon.com/pt/ec2/pricing/reserved-instances/" rel="noopener noreferrer"&gt;este link&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Define reservation type (standard or convertible)
OFFERING_CLASS = 'standard'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Nome do bucket onde serão armazenados os arquivos csv do relatório&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Altere esta opção e insira o nome do bucket que você criou. Como o bucket é globalmente exclusivo, você terá que mudar de qualquer jeito.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Enter your BUCKET name, e.g 'mybucket'
BUCKET = 'mybucket'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Nome do arquivo CSV que será criado pelo script&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Defina um nome para o arquivo de relatório que será gerado pelo script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# KEY path, e.g.'myec2report'
KEY = 'myec2report'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obs.: esse nome será concatenado com o tipo de reserva e uma hash de identificação única para não haver sobreposição do arquivo ao executar a função novamente.&lt;/p&gt;

&lt;p&gt;Ex: &lt;strong&gt;myec2report&lt;/strong&gt;_standard_1684081195342122923.csv&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5 - Entendendo o filtro&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para que a API retorne os preços correspondentes à nossa instância é preciso passar alguns parâmetros como filtro. Esse filtro é aplicado na seção “product” do arquivo JSON que é retornado pela API. Veja um exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"product": {
       "productFamily": "Compute Instance",
       "attributes": {
           "enhancedNetworkingSupported": "No",
           "intelTurboAvailable": "Yes",
           "memory": "1 GiB",
           "dedicatedEbsThroughput": "Up to 2085 Mbps",
           "vcpu": "2",
           "classicnetworkingsupport": "false",
           "capacitystatus": "Used",
           "locationType": "AWS Region",
           "storage": "EBS only",
           "instanceFamily": "General purpose",
           "operatingSystem": "Linux",
           "intelAvx2Available": "Yes",
           "regionCode": "us-east-1",
           "physicalProcessor": "Intel Skylake E5 2686 v5",
           "clockSpeed": "3.1 GHz",
           "ecu": "Variable",
           "networkPerformance": "Up to 5 Gigabit",
           "servicename": "Amazon Elastic Compute Cloud",
           "vpcnetworkingsupport": "true",
           "instanceType": "t3.micro",
           "tenancy": "Shared",
           "usagetype": "BoxUsage:t3.micro",
           "normalizationSizeFactor": "0.5",
           "intelAvxAvailable": "Yes",
           "processorFeatures": "AVX; AVX2; Intel AVX; Intel AVX2; Intel AVX512; Intel Turbo",
           "servicecode": "AmazonEC2",
           "licenseModel": "No License required",
           "currentGeneration": "Yes",
           "preInstalledSw": "NA",
           "location": "US East (N. Virginia)",
           "processorArchitecture": "64-bit",
           "marketoption": "OnDemand",
           "operation": "RunInstances",
           "availabilityzone": "NA"
       },
       "sku": "CRAJUW7BTXFMT2UJ"
   },
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As chaves principais da seção “products” são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tenancy&lt;/li&gt;
&lt;li&gt;preInstalledSw&lt;/li&gt;
&lt;li&gt;operatingSystem&lt;/li&gt;
&lt;li&gt;licenseModel&lt;/li&gt;
&lt;li&gt;capacitystatus&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para refinar ainda mais nosso filtro, passamos mais alguns parâmetros, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;location&lt;/li&gt;
&lt;li&gt;instanceType&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Observe o trecho do código que contém os parâmetros do filtro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Filters=[
           {
               'Type': 'TERM_MATCH',
               'Field': 'location',
               'Value': region
           },
           {
               'Type': 'TERM_MATCH',
               'Field': 'capacitystatus',
               'Value': 'Used'
           },
           {
               'Type': 'TERM_MATCH',
               'Field': 'tenancy',
               'Value': 'Shared'
           },
           {
               'Type': 'TERM_MATCH',
               'Field': 'instanceType',
               'Value': typeEc2
           },
           {
               'Type': 'TERM_MATCH',
               'Field': 'preInstalledSw',
               'Value': preInstalledSw
           },
           {
               'Type': 'TERM_MATCH',
               'Field': 'operatingSystem',
               'Value': operatingSystem
           },
           {
               'Type': 'TERM_MATCH',
               'Field': 'licenseModel',
               'Value': 'No License required'
           }
       ],
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;6 - Executando a Função&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Feito as alterações necessárias no código, faça um novo Deploy para salvar e depois clique no botão Test. Se tudo correu bem, o resultado do teste será parecido com este:&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%2Fvirf2j6uajz42ajo8e20.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%2Fvirf2j6uajz42ajo8e20.png" width="800" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Volte ao bucket e veja que um novo arquivo (com uma sequência numérica no final) foi gerado.&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%2Fh9a3mo9cgrqydyzifsqt.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%2Fh9a3mo9cgrqydyzifsqt.png" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Abrindo o arquivo podemos ver que o conteúdo é um lindo relatório com os preços Sob Demanda e de Reservas para todas as Instâncias da região inserida no código. Além dos preços, podemos conferir outros atributos como ID, nome, AZ, tipo, memória, vCPU e outros.  &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%2Fj02k1y5811azjkf02i6a.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%2Fj02k1y5811azjkf02i6a.png" width="800" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Espero que este script possa te ajudar a poupar tempo e esforço coletando esses dados manualmente, assim como tem me ajudado.&lt;/p&gt;

&lt;p&gt;Importante: SEMPRE valide os valores do relatório gerado com os valores da &lt;a href="https://calculator.aws/#/" rel="noopener noreferrer"&gt;calculadora de preços da AWS&lt;/a&gt;. Não posso garantir que não haja nenhuma divergência, embora seja muito difícil.&lt;/p&gt;

&lt;p&gt;E por falar em calculadora da AWS, se você observar a planilha de exemplo acima, verá que contém alguns campos com o valor “not available” para a modalidade de preço “no upfront”. Experimente validar esses valores lá na calculadora da AWS. No momento em que escrevo este post, ao selecionar a família da instância e a modalidade de reserva e preço, por não ter disponível, a caixa de preços de instâncias reservadas desaparece e só volta se você atualizar a página. 😀 &lt;/p&gt;

&lt;p&gt;Isso é tudo por hoje!&lt;br&gt;
Se tiver dúvidas ou quer mandar um feedback fique a vontade para comentar.&lt;br&gt;
Abraços!&lt;/p&gt;

</description>
      <category>html</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Implantar rotinas periódicas de Start/Stop em Instâncias EC2 via Lambda</title>
      <dc:creator>Isaque Alcantara</dc:creator>
      <pubDate>Sat, 14 Jan 2023 15:36:18 +0000</pubDate>
      <link>https://forem.com/isaque21/implantar-rotinas-periodicas-de-startstop-em-instancias-ec2-via-lambda-4bbn</link>
      <guid>https://forem.com/isaque21/implantar-rotinas-periodicas-de-startstop-em-instancias-ec2-via-lambda-4bbn</guid>
      <description>&lt;p&gt;&lt;em&gt;Este é meu primeiro post para o DEV e venho trazer uma solução simples, embora muito útil. Mostrarei uma abordagem para gerenciar rotinas de start e stop com a possibilidade de configurar diferentes períodos de dias e horários para uma determinada Instância EC2 através do AWS Lambda.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Introdução&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Suponha que você tenha um Lambda que faz o start/stop de várias instâncias em seu ambiente filtrando-as através de Tags. Se todas as instâncias funcionarem no mesmo período (dias da semana, hora que liga e hora que desliga) tudo bem. Bastaria apenas uma configuração no EventBridge para cuidar do acionamento.&lt;br&gt;
Agora, e se você precisar que apenas algumas instâncias específicas funcionem em um período diferente? Faria outra função com outro EventBridge? E se você tivesse 100 instâncias, cada uma com um período de funcionamento diferente da outra? Já pensou como seria?&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Objetivo&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;O objetivo desse Lambda é oferecer uma maneira de gerenciar o Start/Stop de suas instâncias EC2 em diferentes períodos de dias e horários, além de reduzir seus custos na AWS para ambientes onde você possa interromper esses recursos, como ambiente de DEV, homologação e outros usados para testes. Usaremos uma única função Lambda que irá filtrar as EC2 através de tags, sendo acionada de tempos em tempos conforme agendamento no EventBridge.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Vamos aos passos:&lt;/strong&gt;
&lt;/h2&gt;
&lt;h2&gt;
  
  
  1 - Criar função IAM com permissões para a Função do Lambda.
&lt;/h2&gt;

&lt;p&gt;A primeira parte será dar as devidas permissões para a execução da Função Lambda. Para isso, abra o console do IAM e clique em Roles no menu lateral esquerdo e depois em Create role.&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%2Fonwwb64fh94820x2dbvi.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%2Fonwwb64fh94820x2dbvi.png" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Selecione AWS service, em seguida selecione Lambda e depois clique em Next.&lt;br&gt;
Clique em Create policy. Uma nova guia será aberta, não feche a anterior. Clique na aba JSON da nova guia aberta e cole o seguinte código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{ 
  "Version": "2012-10-17", 
  "Statement": [  
    { 
      "Effect": "Allow", 
      "Action": [ 
            "ec2:DescribeInstances",
            "ec2:DescribeTags",
            "ec2:DescribeInstanceTypes",
            "ec2:DescribeInstanceStatus",
            "ec2:StartInstances",
            "ec2:StopInstances"
      ], 
      "Resource": "*" 
    } 
  ] 
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clique em Next e avance para dar um nome para a Policy e depois clique em Create policy.&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%2F6vnc5bg1e6ean9jt3g3t.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%2F6vnc5bg1e6ean9jt3g3t.png" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Volte na guia anterior, clique no botão de refresh e pesquise pela policy criada. Marque a caixa ao lado do nome da policy e selecione também a seguinte policy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CloudWatchFullAccessV2 &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dê um nome para sua Role e clique em Create role.&lt;br&gt;
Mais detalhes sobre como criar uma Role, acesse &lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-json-editor" rel="noopener noreferrer"&gt;esse link&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  2 - Criar Função Lambda
&lt;/h2&gt;

&lt;p&gt;Acesse o console do Lambda e clique em Create function. Escolha a opção Author from scratch para iniciar com um exemplo de código. Dê um nome para sua Função Lambda e escolha o Runtime Python 3.12.&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%2Fts454hszlu5teg414jfs.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%2Fts454hszlu5teg414jfs.png" width="800" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em Change default execution role escolha Use an existing role e selecione a Role que você criou no passo anterior. Feito isso clique em Create function.&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%2F1b97zg5dsbzpqndi2dv9.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%2F1b97zg5dsbzpqndi2dv9.png" width="800" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora que você criou a Função, substitua o código de exemplo pelo código que está &lt;a href="https://github.com/isaque21/lambda/blob/main/start-stop-routines/start-stop-ec2/lambda_function.py" rel="noopener noreferrer"&gt;neste repositório&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Após inserir o código, clique em Deploy para Salvar as alterações.&lt;br&gt;
Feito isso, vá para a aba Configuration e mude o Timeout para 30 segundos (pode ser necessário um tempo maior de acordo com a quantidade de instâncias do ambiente).&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%2F0vsrtdyhq3e9ch7xutpi.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%2F0vsrtdyhq3e9ch7xutpi.png" alt="Image description" width="800" height="194"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ainda em Configuration, configure as variáveis de ambientes conforme a imagem a seguir:&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%2F9pvgsgtsa4oc2ood7exg.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%2F9pvgsgtsa4oc2ood7exg.png" alt="Image description" width="800" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ALARMS_MANAGER&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Define se os alarmes do CloudWatch referente as instâncias serão habilitados/desabilitados junto com a ação de start/stop.&lt;/p&gt;

&lt;p&gt;O valor chave True define que a fução irá alterar o status dos alarmes. Caso não queira alterar o status dos alarmes, altere o valor para False.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REGIONS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Define as regiões que a função irá percorrer e listar as instâncias.&lt;/p&gt;

&lt;p&gt;O valor deve estar como uma lista de regiões da AWS, separadas por vírgulas (por exemplo: us-east-1,sa-east-1).&lt;/p&gt;
&lt;h2&gt;
  
  
  3 - Configurar EventBridge
&lt;/h2&gt;

&lt;p&gt;Na parte superior da página da função, em Function Overview, clique em Add trigger.&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%2F3ux4ewi0kysix2y515xt.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%2F3ux4ewi0kysix2y515xt.png" alt="Image description" width="800" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em Trigger configuration selecione EventBridge (CloudWatch Events). Crie uma nova regra, dê um nome para a regra e em seguida selecione Schedule expression para inserir uma Cron.&lt;br&gt;
Aqui você pode configurar uma expressão que melhor atende a sua necessidade. Neste exemplo usei uma expressão que chamará a função Lambda de 5 em 5 minutos.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cron(0/5 * * * ? *)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Após inserir o valor clique em Add.&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%2Fm97gwloyw0w0g71xwqtq.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%2Fm97gwloyw0w0g71xwqtq.png" alt="Image description" width="800" height="695"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para mais detalhes sobre Cron Expressions consulte &lt;a href="https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html" rel="noopener noreferrer"&gt;este link&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  4 - Adicionando Tags
&lt;/h2&gt;

&lt;p&gt;Para incluir suas instâncias na rotina de Start/Stop é necessário adicionar Tags que definem o acionamento e os períodos em que serão executadas.&lt;/p&gt;

&lt;p&gt;No console de gerenciamento do EC2, no menu lateral esquerdo selecione Instances. Selecione a instância que deseja incluir na rotina de Start/Stop, vá até a aba Tags e clique em Manage tags. Adicione as seguintes tags (alterando o período e os horários de acordo com sua necessidade) e clique em Save.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scheduled      : Active
Period-1       : Monday-Friday
ScheduleStart-1: 08:00
ScheduleStop-1 : 18:00
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A função tentará filtrar as instâncias que contêm uma Tag chamada '&lt;em&gt;Scheduled&lt;/em&gt;' definida como '&lt;em&gt;Active&lt;/em&gt;'.&lt;/p&gt;

&lt;p&gt;A função utiliza um período de dias da semana para comparar a tag '&lt;em&gt;Period-x&lt;/em&gt;' e verifica se o dia atual está dentro do período. Se esta condição for atendida, a função irá comparar a hora atual (H:M) com um valor das tags adicionais que definem o gatilho '&lt;em&gt;ScheduleStop-x&lt;/em&gt;' ou '&lt;em&gt;ScheduleStart-x&lt;/em&gt;'.&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%2Fp8thnfmign1bi1mavqq7.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%2Fp8thnfmign1bi1mavqq7.png" width="800" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;IMPORTANTE!!!&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;As tags devem seguir a nomenclatura em inglês e são case-sensitive;&lt;/li&gt;
&lt;li&gt;O período começa no domingo e termina no sábado;&lt;/li&gt;
&lt;li&gt;O valor 'Period-x' deve estar no seguinte formato 'Sunday-Saturday';&lt;/li&gt;
&lt;li&gt;O valor de 'ScheduleStop-x' ou 'ScheduleStart-x' deve estar no seguinte formato 'H:M';&lt;/li&gt;
&lt;li&gt;O valor de ‘x' das tags 'ScheduleStop-x' e 'ScheduleStart-x' devem corresponder ao mesmo valor do 'period-x’;&lt;/li&gt;
&lt;li&gt;Não há limite de períodos a serem adicionados;&lt;/li&gt;
&lt;li&gt;Para acionar esta função, certifique-se de configurar o EventBridge para que seja executado em um intervalo de sua escolha (a cada 5 minutos é recomendado);&lt;/li&gt;
&lt;li&gt;Esta função está configurada para funcionar com horário local (UTC-3).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;current_time = datetime.now()-timedelta(hours=3)&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caso queira retirar uma instância da rotina, basta alterar a tag ‘Scheduled’ para ‘Inactive’.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Exemplos de tags de instância do EC2&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scheduled       : Active

Period-1        : Monday-Friday
ScheduleStart-1 : 06:00
ScheduleStop-1  : 18:00

Period-2        : Saturday
ScheduleStart-2 : 09:00

Period-3        : Sunday
ScheduleStop-3  : 02:00

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Espero que este artigo possa ajudar a implantar uma rotina de Start/Stop de recursos de forma centralizada e simplificada. &lt;br&gt;
Feedbacks são bem-vindos ;)&lt;/p&gt;

</description>
      <category>watercooler</category>
    </item>
  </channel>
</rss>
