<?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>DEV Community: Rudney eduardo souza vieira</title>
    <description>The latest articles on DEV Community by Rudney eduardo souza vieira (@rudneyeduardo).</description>
    <link>https://dev.to/rudneyeduardo</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%2F880770%2F9802d1ad-547c-4725-96f1-1ded5f6fa40b.jpeg</url>
      <title>DEV Community: Rudney eduardo souza vieira</title>
      <link>https://dev.to/rudneyeduardo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rudneyeduardo"/>
    <language>en</language>
    <item>
      <title>Migração de Elasticsearch para Opensearch na AWS</title>
      <dc:creator>Rudney eduardo souza vieira</dc:creator>
      <pubDate>Fri, 13 Dec 2024 22:08:14 +0000</pubDate>
      <link>https://dev.to/rudneyeduardo/migracao-de-elasticsearch-para-opensearch-na-aws-g4p</link>
      <guid>https://dev.to/rudneyeduardo/migracao-de-elasticsearch-para-opensearch-na-aws-g4p</guid>
      <description>&lt;h2&gt;
  
  
  O que é o RFS
&lt;/h2&gt;

&lt;p&gt;O RFS (Reindex from Snapshot) é um processo de migração de dados entre versões de Elasticsearch e Opensearch, ou até mesmo entre versões de Opensearch, que vem para facilitar o processo completo de migração, incluindo até mesmo um processo de proxy para migração in flight!&lt;/p&gt;

&lt;h2&gt;
  
  
  Iniciando o processo de migração
&lt;/h2&gt;

&lt;p&gt;Para iniciar o processo de migração, é importante ter um setup preparado para evitar problemas durante a migração, para o começo é importante ter o cdk na conta configurado (o RFS utiliza bastante o cdk da AWS), e para isso segue o primeiro passo:&lt;/p&gt;

&lt;p&gt;Para configurar o cdk, rodar no seu terminal local:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cdk bootstrap aws://id_da_conta/região_do_opensearch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora com o cdk configurado, é possivel continuar com o passo a passo, o próximo ponto importante é importar no cloudformation o template migration-assistant-for-amazon-opensearch-service.template (ele vai automaticamente para o cloudformation já com a stack), ponto para consideração ao subir a stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Se atentar ao stage que vai ser indicado ao Stack, ele vai ser utilizado em outros passos da migração!&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ao final do processo da stack, será criada uma EC2, assim que possível se conecte a ela via SSM, ao entrar na EC2 (algo do tipo bootstrap-instance-STAGE-REGION), rodar o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo su
cd /opensearch-migrations #entrar na pasta correta para dar inicio ao bootstrap que ajudará na migração
./initBootstrap.sh &amp;amp;&amp;amp; cd deployment/cdk/opensearch-service-migration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Esse processo geralmente, leva algo em torno de 15 minutos (é bem demorado, mas configura partes importantes a migração)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agora, ao fim do processo, na pasta atual (opensearch-migrations/deployment/cdk/opensearch-service-migration) existe um arquivo cdk.context.json, ele é o responsável sobre como a migração vai se comportar (&lt;a href="https://github.com/opensearch-project/opensearch-migrations/wiki/Configuration-Options" rel="noopener noreferrer"&gt;guia de configuração&lt;/a&gt;), para uma migração com o assistente via console, o arquivo deve ser parecido com algo do tipo a seguir :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "NOME_DO_OBJETO_PRINCIPAL_DO_CDK_CONTEXT": {
      "stage": "STAGE",
      "targetCluster": {
        "endpoint": "TARGET_CLUSTER_URL",
        "auth": {
          "type": "sigv4",
          "region": "us-east-1",
          "serviceSigningName": "es"
        }
      },
      "sourceCluster": {
        "endpoint": "SOURCE_CLUSTER_URL",
        "version": "ES_7.1", 
        "auth": {
          "type": "sigv4",
          "region": "us-east-1",
          "serviceSigningName": "es"
        }
      },
      "vpcId": "VPC_ID",
      "reindexFromSnapshotServiceEnabled": true, //habilita o RFS
      "artifactBucketRemovalPolicy": "RETAIN", // ou DESTROY Após utilizar o snapshot de dados via s3, mantém os arquivos no bucket
      "migrationConsoleServiceEnabled": true, // assistente de migração ativo
      "migrationAssistanceEnabled": true, // assistente de migração ativo
      "reindexFromSnapshotExtraArgs": "--s3-repo-uri s3://migration-artifacts-ACCOUNT_ID-STAGE-REGION/rfs-snapshot-repo --s3-region REGION --snapshot-name rfs-snapshot",
      "managedServiceSourceSnapshotEnabled": true // Configuração para que seja possivel usar o comando de snapshot
    }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h6&gt;
  
  
  &lt;strong&gt;OBS: Para substituir o arquivo, pode ser usado o seguinte comando:&lt;/strong&gt;
&lt;/h6&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vi cdk.context.json
# Dentro do arquivo usando o VIM, usar a seguinte combinação de teclas:
# g g D Shift G # após isso pressionar i (para entrar em modo de edição no Vim)
# assim todo o arquivo antigo sera apagado e será mais fácil de colar sua nova configuração
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após a nova configuração adicionada, será necessário rodar os comandos de bootstrap:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cdk bootstrap --c contextId=NOME_DO_OBJETO_PRINCIPAL_DO_CDK_CONTEXT
cdk deploy "*" --c contextId=NOME_DO_OBJETO_PRINCIPAL_DO_CDK_CONTEXT --require-approval never --concurrency 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h6&gt;
  
  
  &lt;strong&gt;OBS2: É importante garantir que o arquivo cdk.context.json esteja devidamente configurado, de maneira que se não estiver, será um problema futuro na migração via RFS&lt;/strong&gt;
&lt;/h6&gt;

&lt;p&gt;Agora será iniciada a criação das stacks necessárias para rodar os comandos de migração de dados, após a finalização do último comando (lembre do stage configurado no cloudformation!):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./accessContainer.sh migration-console STAGE REGION
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Rodando a migração - Etapa de verificação da configuração
&lt;/h2&gt;

&lt;p&gt;Ao executar o comando mencionado acima, será redirecionado para o console do assistente de migração, onde o primeiro passo importante é executar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console clusters connection-check #comando que checa a conexão com o cluster de source e de target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se o comando retornar a conexão com sucesso, então é possível seguir para a criação do snapshot (Tome cuidado, pois a criação afeta diretamente o consumo de CPU do cluster de Source):&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%2Fjjwgbwsrzopdttdk1nzl.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%2Fjjwgbwsrzopdttdk1nzl.png" alt="Imagem de uma dashboard do opensearch demonstrando aumento da CPU Utilization" width="719" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Criação do Snapshot
&lt;/h3&gt;

&lt;p&gt;Agora para dar inicio ao snapshot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#AFETA PERFORMANCE DO CLUSTER (Se for snapshot total do cluster ou parcial com maior parte dos indexes)
console snapshot create #inicia a criação do snapshot do cluster completo de source

# para criar apenas o snapshot de um index usar --index-allowlist index
# para checar o status do snapshot em progresso

console snapshot status --deep-check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h6&gt;
  
  
  &lt;strong&gt;OBS3: Antes de seguirmos, é importante que todos os shards do snapshot estejam completos!&lt;/strong&gt;
&lt;/h6&gt;

&lt;p&gt;O retorno do comando de status será algo do tipo (algumas informações podem estar discrepantes, mas é apenas um bug do terminal)&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%2Fqjtl7et6eqvv551rgcoa.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%2Fqjtl7et6eqvv551rgcoa.png" alt="Imagem de um terminal linux com informações sobre o progresso do snapshot" width="446" height="204"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao finalizar a criação do snapshot, será possível iniciar o metadata migration (que é importante para migração prévia de metadados dos indexes e aliases do cluster de source):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console metadata evaluate # importante para checar se todos os indices vão ser migrados
console metadata migrate # migração de metadados | --index-allowlist index  # para migrar metadata de apenas um indice
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Rodando a migração - Etapa de migração dos dados
&lt;/h2&gt;

&lt;p&gt;Para darmos inicio à migração de dados é necessário executar o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console backfill start # inicio da migração
#Para checar o status da migração:

console backfill status --deep-check
#Para escalar o número de tasks do ECS*:

console backfill scale NUM_DESEJADO_DE_TASKS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h6&gt;
  
  
  OBS*: Tome cuidado ao elevar o número de tasks, pois, a depender do número de data nodes e da capacidade do cluster de target, isso pode causar erro 429 no cluster e atrapalhar a migração por completo!
&lt;/h6&gt;

&lt;p&gt;A migração via RFS não para sozinha ao finalizar todas as shards disponíveis no snapshot, para isso, é muito importante que seja parada via execução de comando humano, que segue abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console backfill stop
# caso precise pausar a migração
console backfill pause
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Finalizando a migração - Limpando o ambiente
&lt;/h2&gt;

&lt;p&gt;Agora que tudo foi concluído (tome cuidado e confira se todas as shards foram finalizadas com sucesso), chega ao fim a migração !&lt;/p&gt;

&lt;p&gt;Para evitar gastos e limpar o ambiente, execute os seguintes passos, mas primeiro no console, fora da venv:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cdk destroy "*" --c contextId=NOME_DO_OBJETO_PRINCIPAL_DO_CDK_CONTEXT
# é necessário o aceite no console para remover!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao terminar a exclusão via cdk destroy, é necessário ir ao cloudformation e deletar a stack referente ao RFS!&lt;/p&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;p&gt;Nessa seção será disponibilizados algumas maneiras de debuggar os possíveis erros da solução:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Erro de token ‘Too’ (Erro 429 Too many requests)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nesse caso é necessário regular a quantidade de documentos por bulk request da solução, pois, o cluster não está aguentando o número de requisições da solução&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Erro de versão do cluster&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Será necessário criar novamente o cluster&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Erro de conexão aos clusters&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Esse erro é interessante analizar a VPC que foi cadastrada no cdk.context.json, onde é necessário que os domínios estejam dentro da vpc (Ambos), se ao menos 1 dos domínios estiver fora da VPC, será necesário conceder acesso a ele com um NatGateway.&lt;/li&gt;
&lt;li&gt;Se ambos domínios estiverem fora da VPC, a solução do RFS cria uma VPC para uso, que possibilita o uso para o desenvolver da migração&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Como rodar a solução após algum ajuste necessário no arquivo cdk.context.json ?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para tal sera necessário rodar novamente o comando:&lt;/li&gt;
&lt;li&gt;Onde será refeito o deploy de todas as stacks necessárias para a migração.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cdk deploy "*" --c contextId=NOME_DO_OBJETO_PRINCIPAL_DO_CDK_CONTEXT --require-approval never --concurrency 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Erro de total de shards&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para ajustar é necessário no domínio de target rodar o seguinte comando:
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PUT /_cluster/settings
{
  "persistent": {
    "cluster.max_shards_per_node": NUM_DESEJADO
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso algum erro esteja fora deste guia:&lt;/p&gt;

&lt;p&gt;Entre em contato com &lt;a href="https://www.linkedin.com/in/rudney-eduardo-souza-vieira/" rel="noopener noreferrer"&gt;Rudney Eduardo Souza Vieira&lt;/a&gt; ou também abra uma issue direta no &lt;a href="https://github.com/opensearch-project/opensearch-migrations" rel="noopener noreferrer"&gt;github do projeto do RFS&lt;/a&gt; (o projeto será migrado para utilizar k8s, então dependendo da data que você está lendo o guia serão necessários outros ajustes)&lt;/p&gt;

</description>
      <category>aws</category>
      <category>lucene</category>
      <category>opensearch</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Keda in EKS</title>
      <dc:creator>Rudney eduardo souza vieira</dc:creator>
      <pubDate>Sun, 21 Jan 2024 19:05:39 +0000</pubDate>
      <link>https://dev.to/rudneyeduardo/how-to-use-keda-in-eks-with-sqs-as-trigger-37h8</link>
      <guid>https://dev.to/rudneyeduardo/how-to-use-keda-in-eks-with-sqs-as-trigger-37h8</guid>
      <description>&lt;p&gt;Keda on EKS allows for unparalleled scaling flexibility, where its easy configuration and strengths regarding infrastructure architecture will be demonstrated in this article&lt;/p&gt;

&lt;p&gt;When to use Keda ?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your AutoScalling cant handle event driven cenarios&lt;/li&gt;
&lt;li&gt;Need to handle varying levels of traffic &lt;/li&gt;
&lt;li&gt;Need to cara about costs in the EKS cluster&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What problem Keda will solve in this case cenario ? &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Event Driven requests to start new pods in eks&lt;/li&gt;
&lt;li&gt;Manage to save costs in stand by pods&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to install keda in eks:
&lt;/h2&gt;

&lt;p&gt;We can download it from &lt;a href="https://github.com/kedacore/keda/releases/download/v2.13.0/keda-2.13.0-core.yaml" rel="noopener noreferrer"&gt;here&lt;/a&gt; and apply it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl apply -f keda-2.13.0-core.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or just execute it like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl apply --server-side -f https://github.com/kedacore/keda/releases/download/v2.13.0/keda-2.13.0-core.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Making it work in EKS:
&lt;/h2&gt;

&lt;p&gt;Then when it is installed we can go and make an sample Python App&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;

&lt;span class="c1"&gt;#Sample Python App for getting queue messages
&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;getQueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;sqs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sqs&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;region_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Get the queue
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sqs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_queue_by_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;QueueName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;QMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;receive_messages&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;QMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;QMessage&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/getQueue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;returnList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getQueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;queue Message list&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;returnList&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/ping&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ping&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ok&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now lets make an Deployment file for it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python-app&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keda&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python-app&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python-app&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;serviceAccount&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keda-operator&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python-app&lt;/span&gt;
          &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ecr_url&lt;/span&gt;
          &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;uvicorn"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
          &lt;span class="na"&gt;args &lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;app.main:app"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--host"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0.0.0.0"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--port"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;80"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
          &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1"&lt;/span&gt;
              &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2Gi"&lt;/span&gt;
            &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1"&lt;/span&gt;
              &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2Gi"&lt;/span&gt;
          &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;


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

&lt;/div&gt;



&lt;p&gt;Then add the Service Account for permissions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ServiceAccount&lt;/span&gt;
&lt;span class="na"&gt;automountServiceAccountToken&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keda-operator&lt;/span&gt;
    &lt;span class="na"&gt;app.kubernetes.io/part-of&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keda-operator&lt;/span&gt;
    &lt;span class="na"&gt;app.kubernetes.io/version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keda-operator&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keda&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
   &lt;span class="na"&gt;eks.amazonaws.com/role-arn&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;arn:aws:iam::accountId:role/KedaSqsExecutionRole&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then add the scaled object for the SQS Queue and the Auth Trigger:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keda.sh/v1alpha1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TriggerAuthentication&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keda-trigger-auth-aws-credentials&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keda&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;podIdentity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-eks&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keda.sh/v1alpha1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ScaledObject&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-sqs-queue-scaledobject&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keda&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;minReplicaCount&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;  &lt;span class="c1"&gt;#-&amp;gt; min pods that will be when there is smt in queue&lt;/span&gt;
  &lt;span class="na"&gt;maxReplicaCount&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="c1"&gt;#-&amp;gt; max pods&lt;/span&gt;
  &lt;span class="na"&gt;pollingInterval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10&lt;/span&gt; 
  &lt;span class="na"&gt;cooldownPeriod&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;25&lt;/span&gt; 
  &lt;span class="na"&gt;scaleTargetRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python-app&lt;/span&gt;
  &lt;span class="na"&gt;triggers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-sqs-queue&lt;/span&gt;
    &lt;span class="na"&gt;authenticationRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keda-trigger-auth-aws-credentials&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;queueURL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sqs_queue_url&lt;/span&gt;
      &lt;span class="na"&gt;queueLength&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1"&lt;/span&gt;
      &lt;span class="na"&gt;awsRegion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aws_regiion"&lt;/span&gt;
      &lt;span class="na"&gt;identityOwner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;operator&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Keda gives a lot of flexibility when event driven is needed, because of it various built in scalers, like in this article with AWS SQS, and could scale in various other cenarios, as example, with AWS DynamoDB, granting a cost friendly way to handle EKS needs to scale with your business.&lt;/p&gt;

</description>
      <category>keda</category>
      <category>aws</category>
      <category>kubernetes</category>
      <category>eks</category>
    </item>
  </channel>
</rss>
