<?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: Lucas Cândido Araújo</title>
    <description>The latest articles on DEV Community by Lucas Cândido Araújo (@lucasbehrooz).</description>
    <link>https://dev.to/lucasbehrooz</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%2F1260446%2F31d77f77-6056-4833-ab74-822ca6a771fb.jpg</url>
      <title>DEV Community: Lucas Cândido Araújo</title>
      <link>https://dev.to/lucasbehrooz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lucasbehrooz"/>
    <language>en</language>
    <item>
      <title>Configuração de API para Envio de SMS via AWS</title>
      <dc:creator>Lucas Cândido Araújo</dc:creator>
      <pubDate>Fri, 13 Jun 2025 23:28:02 +0000</pubDate>
      <link>https://dev.to/lucasbehrooz/configuracao-de-api-para-envio-de-sms-via-aws-35c3</link>
      <guid>https://dev.to/lucasbehrooz/configuracao-de-api-para-envio-de-sms-via-aws-35c3</guid>
      <description>&lt;p&gt;Este documento contém instruções para configurar um sistema de envio de SMS usando serviços AWS (API Gateway, Lambda e SNS).&lt;/p&gt;

&lt;h2&gt;
  
  
  Índice
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Arquitetura da Solução&lt;/li&gt;
&lt;li&gt;Código da Função Lambda&lt;/li&gt;
&lt;li&gt;Configuração da Infraestrutura&lt;/li&gt;
&lt;li&gt;Configuração de Autenticação com API Key&lt;/li&gt;
&lt;li&gt;Como Usar a API&lt;/li&gt;
&lt;li&gt;Considerações Adicionais&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Arquitetura da Solução
&lt;/h2&gt;

&lt;p&gt;A solução consiste em:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API Gateway&lt;/strong&gt;: Recebe requisições HTTP POST&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lambda&lt;/strong&gt;: Processa as requisições e chama o SNS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SNS&lt;/strong&gt;: Envia as mensagens SMS para os destinatários&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O fluxo de dados é:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cliente envia POST para o API Gateway&lt;/li&gt;
&lt;li&gt;API Gateway aciona a função Lambda&lt;/li&gt;
&lt;li&gt;Lambda extrai os dados e chama o SNS&lt;/li&gt;
&lt;li&gt;SNS envia o SMS para o número especificado&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Código da Função Lambda
&lt;/h2&gt;

&lt;p&gt;Arquivo: &lt;code&gt;send_sms_lambda.py&lt;/code&gt;&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;import&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lambda_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Extrair o corpo da requisição
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Se o corpo vier como string (do API Gateway), converter para dict
&lt;/span&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;'&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;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;

        &lt;span class="c1"&gt;# Extrair número e conteúdo
&lt;/span&gt;        &lt;span class="n"&gt;phone_number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;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;numero&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;message_content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;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;conteudo&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Validar os dados
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;phone_number&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;message_content&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;statusCode&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;message&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;Parâmetros obrigatórios: numero e conteudo&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
                &lt;span class="p"&gt;})&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;# Inicializar cliente SNS
&lt;/span&gt;        &lt;span class="n"&gt;sns_client&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;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sns&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Enviar SMS
&lt;/span&gt;        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sns_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;PhoneNumber&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;phone_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;message_content&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Retornar resposta de sucesso
&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;statusCode&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;message&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;SMS enviado com sucesso&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;messageId&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;MessageId&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Tratar erros
&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;statusCode&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Erro ao enviar SMS: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configuração da Infraestrutura
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Criar a função Lambda
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Primeiro, compacte o código da função&lt;/span&gt;
zip send_sms_function.zip send_sms_lambda.py

&lt;span class="c"&gt;# Crie um perfil de execução para a Lambda com permissões para SNS&lt;/span&gt;
aws iam create-role &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role-name&lt;/span&gt; send-sms-lambda-role &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--assume-role-policy-document&lt;/span&gt; &lt;span class="s1"&gt;'{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": {
          "Service": "lambda.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
      }
    ]
  }'&lt;/span&gt;

&lt;span class="c"&gt;# Anexe a política para permitir que a Lambda envie SMS via SNS&lt;/span&gt;
aws iam attach-role-policy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role-name&lt;/span&gt; send-sms-lambda-role &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy-arn&lt;/span&gt; arn:aws:iam::aws:policy/AmazonSNSFullAccess

&lt;span class="c"&gt;# Aguarde alguns segundos para a propagação do perfil&lt;/span&gt;
&lt;span class="nb"&gt;sleep &lt;/span&gt;10

&lt;span class="c"&gt;# Crie a função Lambda&lt;/span&gt;
aws lambda create-function &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--function-name&lt;/span&gt; SendSMSFunction &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--zip-file&lt;/span&gt; fileb://send_sms_function.zip &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--handler&lt;/span&gt; send_sms_lambda.lambda_handler &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--runtime&lt;/span&gt; python3.9 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;aws iam get-role &lt;span class="nt"&gt;--role-name&lt;/span&gt; send-sms-lambda-role &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Role.Arn'&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Criar o API Gateway
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Criar o API Gateway REST API&lt;/span&gt;
aws apigateway create-rest-api &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"SMS-API"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--description&lt;/span&gt; &lt;span class="s2"&gt;"API para envio de SMS via SNS"&lt;/span&gt;

&lt;span class="c"&gt;# Obter o ID do API Gateway criado&lt;/span&gt;
&lt;span class="nv"&gt;API_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;aws apigateway get-rest-apis &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"items[?name=='SMS-API'].id"&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Obter o ID do recurso raiz&lt;/span&gt;
&lt;span class="nv"&gt;ROOT_RESOURCE_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;aws apigateway get-resources &lt;span class="nt"&gt;--rest-api-id&lt;/span&gt; &lt;span class="nv"&gt;$API_ID&lt;/span&gt; &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"items[?path=='/'].id"&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Criar um recurso para o endpoint de SMS&lt;/span&gt;
aws apigateway create-resource &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rest-api-id&lt;/span&gt; &lt;span class="nv"&gt;$API_ID&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--parent-id&lt;/span&gt; &lt;span class="nv"&gt;$ROOT_RESOURCE_ID&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--path-part&lt;/span&gt; &lt;span class="s2"&gt;"send-sms"&lt;/span&gt;

&lt;span class="c"&gt;# Obter o ID do recurso criado&lt;/span&gt;
&lt;span class="nv"&gt;RESOURCE_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;aws apigateway get-resources &lt;span class="nt"&gt;--rest-api-id&lt;/span&gt; &lt;span class="nv"&gt;$API_ID&lt;/span&gt; &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"items[?path=='/send-sms'].id"&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Criar o método POST&lt;/span&gt;
aws apigateway put-method &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rest-api-id&lt;/span&gt; &lt;span class="nv"&gt;$API_ID&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--resource-id&lt;/span&gt; &lt;span class="nv"&gt;$RESOURCE_ID&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--http-method&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--authorization-type&lt;/span&gt; NONE

&lt;span class="c"&gt;# Obter o ARN da função Lambda&lt;/span&gt;
&lt;span class="nv"&gt;LAMBDA_ARN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;aws lambda get-function &lt;span class="nt"&gt;--function-name&lt;/span&gt; SendSMSFunction &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Configuration.FunctionArn'&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Integrar o método POST com a função Lambda&lt;/span&gt;
aws apigateway put-integration &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rest-api-id&lt;/span&gt; &lt;span class="nv"&gt;$API_ID&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--resource-id&lt;/span&gt; &lt;span class="nv"&gt;$RESOURCE_ID&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--http-method&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--type&lt;/span&gt; AWS_PROXY &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--integration-http-method&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--uri&lt;/span&gt; arn:aws:apigateway:&lt;span class="si"&gt;$(&lt;/span&gt;aws configure get region&lt;span class="si"&gt;)&lt;/span&gt;:lambda:path/2015-03-31/functions/&lt;span class="nv"&gt;$LAMBDA_ARN&lt;/span&gt;/invocations

&lt;span class="c"&gt;# Dar permissão para o API Gateway invocar a função Lambda&lt;/span&gt;
aws lambda add-permission &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--function-name&lt;/span&gt; SendSMSFunction &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--statement-id&lt;/span&gt; apigateway-test &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--action&lt;/span&gt; lambda:InvokeFunction &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--principal&lt;/span&gt; apigateway.amazonaws.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--source-arn&lt;/span&gt; &lt;span class="s2"&gt;"arn:aws:execute-api:&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;aws configure get region&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;aws sts get-caller-identity &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s1"&gt;'Account'&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$API_ID&lt;/span&gt;&lt;span class="s2"&gt;/*/POST/send-sms"&lt;/span&gt;

&lt;span class="c"&gt;# Implantar a API&lt;/span&gt;
aws apigateway create-deployment &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rest-api-id&lt;/span&gt; &lt;span class="nv"&gt;$API_ID&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--stage-name&lt;/span&gt; prod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configuração de Autenticação com API Key
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Criar uma API Key&lt;/span&gt;
aws apigateway create-api-key &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"SMSAPIKey"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--description&lt;/span&gt; &lt;span class="s2"&gt;"API Key para o serviço de SMS"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--enabled&lt;/span&gt;

&lt;span class="c"&gt;# Guardar o ID da API Key&lt;/span&gt;
&lt;span class="nv"&gt;API_KEY_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;aws apigateway get-api-keys &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"items[?name=='SMSAPIKey'].id"&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# 2. Criar um plano de uso&lt;/span&gt;
aws apigateway create-usage-plan &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"SMSUsagePlan"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--description&lt;/span&gt; &lt;span class="s2"&gt;"Plano de uso para o serviço de SMS"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--throttle&lt;/span&gt; &lt;span class="nv"&gt;burstLimit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10,rateLimit&lt;span class="o"&gt;=&lt;/span&gt;5 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--quota&lt;/span&gt; &lt;span class="nv"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100,offset&lt;span class="o"&gt;=&lt;/span&gt;0,period&lt;span class="o"&gt;=&lt;/span&gt;DAY &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--api-stages&lt;/span&gt; &lt;span class="nv"&gt;apiId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$API_ID&lt;/span&gt;,stage&lt;span class="o"&gt;=&lt;/span&gt;prod

&lt;span class="c"&gt;# Guardar o ID do plano de uso&lt;/span&gt;
&lt;span class="nv"&gt;USAGE_PLAN_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;aws apigateway get-usage-plans &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"items[?name=='SMSUsagePlan'].id"&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# 3. Associar a API Key ao plano de uso&lt;/span&gt;
aws apigateway create-usage-plan-key &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--usage-plan-id&lt;/span&gt; &lt;span class="nv"&gt;$USAGE_PLAN_ID&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--key-id&lt;/span&gt; &lt;span class="nv"&gt;$API_KEY_ID&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--key-type&lt;/span&gt; &lt;span class="s2"&gt;"API_KEY"&lt;/span&gt;

&lt;span class="c"&gt;# 4. Atualizar o método para exigir API Key&lt;/span&gt;
aws apigateway update-method &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rest-api-id&lt;/span&gt; &lt;span class="nv"&gt;$API_ID&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--resource-id&lt;/span&gt; &lt;span class="nv"&gt;$RESOURCE_ID&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--http-method&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--patch-operations&lt;/span&gt; &lt;span class="nv"&gt;op&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;replace,path&lt;span class="o"&gt;=&lt;/span&gt;/apiKeyRequired,value&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;

&lt;span class="c"&gt;# 5. Reimplantar a API para aplicar as alterações&lt;/span&gt;
aws apigateway create-deployment &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rest-api-id&lt;/span&gt; &lt;span class="nv"&gt;$API_ID&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--stage-name&lt;/span&gt; prod

&lt;span class="c"&gt;# Obter o valor da API Key&lt;/span&gt;
aws apigateway get-api-key &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--api-key&lt;/span&gt; &lt;span class="nv"&gt;$API_KEY_ID&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--include-value&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Como Usar a API
&lt;/h2&gt;

&lt;p&gt;Após a implantação, você terá um endpoint com o seguinte formato:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://{API_ID}.execute-api.{region}.amazonaws.com/prod/send-sms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para enviar um SMS, faça uma requisição POST para este endpoint com o seguinte corpo JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"numero"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"+5511999999999"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"conteudo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Segue abaixo o código de autenticação: 000000"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo de como fazer isso com curl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  https://&lt;span class="o"&gt;{&lt;/span&gt;API_ID&lt;span class="o"&gt;}&lt;/span&gt;.execute-api.&lt;span class="o"&gt;{&lt;/span&gt;region&lt;span class="o"&gt;}&lt;/span&gt;.amazonaws.com/prod/send-sms &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'x-api-key: sua-api-key-aqui'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "numero": "+5511999999999",
    "conteudo": "Segue abaixo o código de autenticação: 000000"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Segurança&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A API Key deve ser mantida em segredo&lt;/li&gt;
&lt;li&gt;Considere implementar autenticação mais robusta para ambientes de produção&lt;/li&gt;
&lt;li&gt;Todas as comunicações devem ser feitas via HTTPS&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Monitoramento&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure CloudWatch para monitorar as chamadas à API e à função Lambda&lt;/li&gt;
&lt;li&gt;Crie alarmes para notificar sobre falhas ou uso excessivo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Limites de SMS&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verifique os limites de envio de SMS na sua conta AWS&lt;/li&gt;
&lt;li&gt;Solicite aumento de limites se necessário&lt;/li&gt;
&lt;li&gt;Por padrão, novas contas AWS estão no modo sandbox para SMS&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Custos&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O preço do envio de SMS varia por país&lt;/li&gt;
&lt;li&gt;Consulte a página de preços do SNS para mais detalhes&lt;/li&gt;
&lt;li&gt;Configure orçamentos e alertas de custo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Conformidade&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Certifique-se de cumprir as regulamentações locais para envio de SMS&lt;/li&gt;
&lt;li&gt;Obtenha consentimento dos destinatários antes de enviar mensagens&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>Como montar um disco de Swap no Ubuntu</title>
      <dc:creator>Lucas Cândido Araújo</dc:creator>
      <pubDate>Fri, 26 Jan 2024 22:50:21 +0000</pubDate>
      <link>https://dev.to/lucasbehrooz/como-montar-um-disco-de-swap-no-ubuntu-2fp7</link>
      <guid>https://dev.to/lucasbehrooz/como-montar-um-disco-de-swap-no-ubuntu-2fp7</guid>
      <description>&lt;p&gt;Se você se encontra em uma instância com recursos de memória limitados, mas deseja melhorar o desempenho, este tutorial é para você.Adicionar um disco de swap pode ser a solução ideal para otimizar o uso da memória.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Montando uma Partição Swap em um Disco:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1.Atualize o sistema para garantir que você tenha as versões mais recentes dos pacotes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get upgrade &lt;span class="nt"&gt;-yqq&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2.Configure o fuso horário para garantir registros de tempo precisos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo &lt;/span&gt;timedatectl set-timezone America/Sao_Paulo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3.Liste os discos disponíveis para identificar o disco desejado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   lsblk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4.Crie uma partição Swap no disco desejado (substitua &lt;code&gt;/dev/nvme1n1&lt;/code&gt; pelo nome do seu disco):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo &lt;/span&gt;mkswap /dev/nvme1n1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5.Abra o arquivo &lt;code&gt;/etc/fstab&lt;/code&gt; para configurar a montagem automática da Swap no sistema:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/fstab
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicione a seguinte linha ao final do arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nv"&gt;UUID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;UUID_do_disco&amp;gt;     swap swap defaults 0 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;6.Ative a partição Swap:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;sudo &lt;/span&gt;swapon /dev/nvme1n1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;7.Para confirmar se o Swap está ativo, digite o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   free &lt;span class="nt"&gt;-m&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>ubuntu</category>
      <category>linux</category>
      <category>tutorial</category>
      <category>aws</category>
    </item>
    <item>
      <title>Azure DevOps Pipelines e Release - Build And Push to ECR With Deploy to ECS Fargate PT-2</title>
      <dc:creator>Lucas Cândido Araújo</dc:creator>
      <pubDate>Fri, 19 Jan 2024 01:01:04 +0000</pubDate>
      <link>https://dev.to/lucasbehrooz/azure-devops-pipelines-e-release-build-and-push-to-ecr-with-deploy-to-ecs-fargate-pt-2-26lb</link>
      <guid>https://dev.to/lucasbehrooz/azure-devops-pipelines-e-release-build-and-push-to-ecr-with-deploy-to-ecs-fargate-pt-2-26lb</guid>
      <description>&lt;h2&gt;
  
  
  Deploy no AWS ECS usando Azure DevOps
&lt;/h2&gt;

&lt;p&gt;Com a nossa imagem Docker já armazenada no AWS ECR, estamos prontos para avançar para a etapa de Deploy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pré-requisitos:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Um Cluster ECS configurado&lt;/li&gt;
&lt;li&gt;Definição de Tarefa (Task Definition)&lt;/li&gt;
&lt;li&gt;Serviço de Tarefa (Service Task)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para este processo de Deploy, optarei pelo modo clássico do Azure DevOps, pois acredito que isso facilita a visualização no dia a dia.&lt;/p&gt;

&lt;p&gt;Na aba lateral esquerda, selecione a opção "Releases" e clique em "New" e "New release pipeline".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IFJRpuLq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g5923bdrvk3k2yr7hoqo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IFJRpuLq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g5923bdrvk3k2yr7hoqo.png" alt="Release Step" width="570" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para todas as etapas, utilizei apenas o Recurso Bash da Pipeline, permitindo sua utilização em outros serviços de pipeline, como GitHub Actions, GitLab, entre outros.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pmpvF_Nf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c7omi83k7r1k8v40uunj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pmpvF_Nf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c7omi83k7r1k8v40uunj.png" alt="Release Bash" width="642" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Os 6 passos são bem simples, foram separados para detalhar cada um deles. Obs: Nos passos seguintes, onde estiver &lt;code&gt;$(NOME_VARIAVEL)&lt;/code&gt;, você irá armazenar em variáveis.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Auth:&lt;/strong&gt; Autenticação com a AWS para realizar os processos seguintes.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws configure set aws_access_key_id $(AWS_ACCESS_KEY_ID)
aws configure set aws_secret_access_key $(AWS_SECRET_ACCESS_KEY)
aws configure set region $(AWS_REGION)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2.&lt;strong&gt;ECS Describe:&lt;/strong&gt; Faz o download do JSON da Task Definition para criar uma nova versão.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ecs describe-task-definition --task-definition $(TASK_DEFINITION_NAME) --query taskDefinition | jq 'del(.taskDefinitionArn, .revision, .status, .requiresAttributes, .compatibilities, .registeredAt, .registeredBy)' &amp;gt; temp-task-definition.json

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

&lt;/div&gt;



&lt;p&gt;3.&lt;strong&gt;Replace Version:&lt;/strong&gt; Altera a versão da imagem do container para a versão recém-criada na &lt;a href="https://dev.to/lucasbehrooz/azure-devops-pipelines-e-release-build-and-push-to-ecr-with-deploy-to-ecs-fargate-175f"&gt;Parte 1&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;jq '.containerDefinitions[0].image = "$(AWS_ECR):$(Build.BuildNumber)"' temp-task-definition.json &amp;gt; task-definition.json 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando gera como output o número da versão da Task Definition, que será armazenado para ser usado no próximo passo.&lt;br&gt;
4.&lt;strong&gt;Register Task Definition:&lt;/strong&gt; Após atualizar a versão, registra a nova versão da Task Definition.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;task_version=$(aws ecs register-task-definition --cli-input-json file://task-definition.json | jq --raw-output '.taskDefinition.revision')

echo "##vso[task.setvariable variable=task_version;]$task_version"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5.&lt;strong&gt;Update Service Cluster:&lt;/strong&gt; Este passo realiza a efetiva publicação da nossa nova versão.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ecs update-service \
    --cluster $CLUSTER_NAME \
    --service $SERVICE_NAME \
    --task-definition $TASK_DEFINITION_NAME:$(task_version)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;6.&lt;strong&gt;Wait Service Stability:&lt;/strong&gt; Aguarda a validação do serviço para finalizar a publicação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ecs wait services-stable \
    --cluster $CLUSTER_NAME \
    --service $SERVICE_NAME \
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por fim, mas não menos importante, todas as variáveis utilizadas estão armazenadas na aba "Variable".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--S_Kh3IjL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z38osohq1pcot2uo3jli.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S_Kh3IjL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z38osohq1pcot2uo3jli.png" alt="Variáveis" width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>azure</category>
      <category>aws</category>
      <category>docker</category>
    </item>
    <item>
      <title>Azure DevOps Pipelines e Release - Build And Push to ECR With Deploy to ECS Fargate PT-1</title>
      <dc:creator>Lucas Cândido Araújo</dc:creator>
      <pubDate>Fri, 19 Jan 2024 00:45:33 +0000</pubDate>
      <link>https://dev.to/lucasbehrooz/azure-devops-pipelines-e-release-build-and-push-to-ecr-with-deploy-to-ecs-fargate-175f</link>
      <guid>https://dev.to/lucasbehrooz/azure-devops-pipelines-e-release-build-and-push-to-ecr-with-deploy-to-ecs-fargate-175f</guid>
      <description>&lt;h2&gt;
  
  
  Meu Primeiro Post!
&lt;/h2&gt;

&lt;p&gt;Para começar, escolhi um tópico com pouca documentação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pré Requisitos:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Extensão instalada no Azure DevOps: &lt;a href="https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.aws-vsts-tools" rel="noopener noreferrer"&gt;AWS Toolkit for Azure DevOps&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AWS ECR já criado&lt;/li&gt;
&lt;li&gt;Credencial programática no AWS IAM criada&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em Pipelines, vou exemplificar no modo clássico e também com o &lt;code&gt;azure-pipelines.yml&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Modo Clássico
&lt;/h3&gt;

&lt;p&gt;1.&lt;strong&gt;Build Image:&lt;/strong&gt; utilizará o &lt;code&gt;docker@2&lt;/code&gt;&lt;/p&gt;

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

&lt;p&gt;2.&lt;strong&gt;Push to ECR:&lt;/strong&gt; utilizará a task &lt;code&gt;AmazonWebServices.aws-vsts-tools.ECRPushImage.ECRPushImage@1&lt;/code&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Modo YAML utilizando &lt;code&gt;azure-pipelines.yml&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;trigger:
  branches:
    include:
    - refs/heads/master
name: $(date:yyyyMMdd)$(rev:.r)
jobs:
- job: Job_1
  displayName: BuildAndPush
  pool:
    vmImage: ubuntu-latest
  steps:
  - checkout: self
    fetchDepth: 1
  - task: Docker@2
    displayName: build
    inputs:
      repository: $(DOCKER_REPOSITORY_NAME)
      command: build
      Dockerfile: Dockerfile
      tags: $(Build.BuildNumber)
  - task: AmazonWebServices.aws-vsts-tools.ECRPushImage.ECRPushImage@1
    displayName: 'Push Image: '
    inputs:
      awsCredentials: 
      regionName: us-east-1
      sourceImageName: $(DOCKER_REPOSITORY_NAME)
      sourceImageTag: $(Build.BuildNumber)
      repositoryName: $(DOCKER_REPOSITORY_NAME)
      pushTag: $(Build.BuildNumber)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obs. Lembre-se de armazenar as variaveis, na aba &lt;code&gt;Variables&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Criar Service Connection AWS
&lt;/h3&gt;

&lt;p&gt;Após instalar a extensão, clique em &lt;code&gt;Project Settings&lt;/code&gt; (ícone no canto inferior esquerdo) e, em seguida, em &lt;code&gt;Service Connections&lt;/code&gt;. No botão New Service Connection, selecione "AWS" e insira o &lt;strong&gt;Access key ID&lt;/strong&gt; e a &lt;strong&gt;Secret access key&lt;/strong&gt;. Defina um nome em Service Connection name, principalmente se usar mais de uma conta AWS, e clique em &lt;strong&gt;Save&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para não alongar demais este post, criarei a &lt;a href="https://dev.to/lucasbehrooz/azure-devops-pipelines-e-release-build-and-push-to-ecr-with-deploy-to-ecs-fargate-pt-2-26lb"&gt;Parte 2 - Deploy da imagem no AWS ECS Fargate&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>devops</category>
      <category>aws</category>
      <category>docker</category>
    </item>
  </channel>
</rss>
