<?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: Thiago Crespo</title>
    <description>The latest articles on DEV Community by Thiago Crespo (@thiagofelippi).</description>
    <link>https://dev.to/thiagofelippi</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%2F424430%2Fba256a41-fd72-427d-8174-469ce00daac6.jpeg</url>
      <title>DEV Community: Thiago Crespo</title>
      <link>https://dev.to/thiagofelippi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thiagofelippi"/>
    <language>en</language>
    <item>
      <title>Workload Identity GKE - Service account k8s com permissões na GCP</title>
      <dc:creator>Thiago Crespo</dc:creator>
      <pubDate>Tue, 27 Jun 2023 21:20:25 +0000</pubDate>
      <link>https://dev.to/thiagofelippi/workload-identity-gke-service-account-k8s-com-permissoes-na-gcp-2l0j</link>
      <guid>https://dev.to/thiagofelippi/workload-identity-gke-service-account-k8s-com-permissoes-na-gcp-2l0j</guid>
      <description>&lt;p&gt;O Workload Identity é um recurso do GKE (Google Kubernetes Engine) que nos permite linkar uma service account do Kubernetes com uma service account da GCP, fazendo assim, com que os Pods que utilizem esta service account, possam fazer ações permitidas na service account da GCP.&lt;/p&gt;

&lt;p&gt;Por exemplo, temos um microserviço que faz operações em um Bucket. Então podemos criar uma service account na GCP com permissões para fazer ações em buckets, criar uma service account no Kubernetes, linkar as duas através do Workload Identity e a aplicação será automaticamente autenticada como a service account da GCP que definirmos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SjADL0Tq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xkr5hu052fot3zh7awsj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SjADL0Tq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xkr5hu052fot3zh7awsj.png" alt="fluxo do usuario utilizando Workload Identity na GCP" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Habilitando Workload Identity
&lt;/h2&gt;

&lt;p&gt;Antes de começarmos a utilizar, precisamos habilitar esta funcionalidade no cluster:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xW4zOFiU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3zacax8atadh86j124gl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xW4zOFiU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3zacax8atadh86j124gl.png" alt="habilitando workload identity no control plane" width="720" height="217"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois, precisamos habilitar o GKE Metadata Server nos node pools que possuem os worker nodes que queremos alocar os pods que irão usar a funcionalidade de Workload Identity.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--64z56EtK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mukfq7c6hfw1urf7wrhv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--64z56EtK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mukfq7c6hfw1urf7wrhv.png" alt="habilitando gke metadata server nos worker nodes" width="587" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando service account's
&lt;/h2&gt;

&lt;p&gt;Criamos uma service account na GCP, que terá as permissões que o nosso Pod irá utilizar. Então criamos a service account do Kubernetes que será linkada com esta criada na GCP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create sa -n &amp;lt;namespace&amp;gt; workload-identity-test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Então rodamos comandos com gcloud no terminal, primeiro conectamos ao project na GCP que a service account que criamos está, e depois adicionamos a role de workloadIdentityUser na service da GCP para conseguirmos linkar as duas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gcloud config set project &amp;lt;nome_projeto&amp;gt;
gcloud iam service-accounts add-iam-policy-binding \
    &amp;lt;email_da_service_account_GCP&amp;gt; \
    --role roles/iam.workloadIdentityUser \
    --member "serviceAccount:production-261711.svc.id.goog[&amp;lt;namespace&amp;gt;/workload-identity-test]"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Possíveis erros:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Falta de permissão&lt;/strong&gt;: Precisa mudar o project default do gcloud para o que você está tentando mexer: &lt;code&gt;gcloud config set project &amp;lt;id_do_project&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;gcloud crashed&lt;/strong&gt;: Rodar gcloud components update para atualizar as dependências.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linkar service accounts
&lt;/h2&gt;

&lt;p&gt;Agora para linkar as duas service accounts, adicionamos uma annotation na do Kubernetes (k edit sa -n  workload-identity-test):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v1
kind: ServiceAccount
metadata:
  # Adiciona esta annotation
  annotations:
    iam.gke.io/gcp-service-account: &amp;lt;email_service_account_GCP&amp;gt;
  name: workload-identity-test
  namespace: &amp;lt;namespace&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para pegar achar o email da service account criada na GCP, basta ir até a service account:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t4NyA-oR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iiccu06xmddnerwvp78p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t4NyA-oR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iiccu06xmddnerwvp78p.png" alt="mostrando email da service account na GCP" width="710" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Hands on
&lt;/h2&gt;

&lt;p&gt;Criei um código de exemplo em NodeJS que é uma API com apenas uma rota que lista os buckets quando chamada. Para isto, eu uso a SDK da Google Cloud e a autenticação é esperada através de variáveis de ambiente.&lt;/p&gt;

&lt;p&gt;O código está no meu Github:&lt;br&gt;
&lt;a href="https://github.com/ThiagoFelippi/workload-identity-example"&gt;https://github.com/ThiagoFelippi/workload-identity-example&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para subir no kubernetes, usei o private registry do Gitlab, e os seguintes manifestos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  name: workload-identity-example
  namespace: pocs
spec:
  selector:
    matchLabels:
      app: workload-identity-example
  template:
    metadata:
      labels:
        app: workload-identity-example
    spec:
      imagePullSecrets:
      - name: workload-identity-example
      containers:
      - name: workload-identity-example
        image: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
        imagePullPolicy: IfNotPresent
        envFrom:
          - configMapRef:
              name: workload-identity-example
        ports:
        - containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
  name: workload-identity-example
  namespace: pocs
spec:
  type: ClusterIP
  selector:
    app: workload-identity-example
  ports:
    - port: 80
      targetPort: 3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao subir, podemos rodar um port-forward para não precisar expor a poc através de um ingress: k port-forward svc/workload-identity-example -n pocs 3001:80&lt;/p&gt;

&lt;p&gt;Ao acessar a rota /buckets, temos o seguinte resultado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pRLMJBTx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bulfq62idm4xiplijkca.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pRLMJBTx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bulfq62idm4xiplijkca.png" alt="mensagem de erro antes do workload identity" width="526" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E podemos ver os logs do container apontando que não estamos autenticados:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FeL5IYgP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/etz2lndx7843n7d68a1b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FeL5IYgP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/etz2lndx7843n7d68a1b.png" alt="logs do container mostrando erro de autenticação" width="720" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos colocar a service account que criamos para gerenciar o Deployment e ver qual o resultado. Para isto, a única coisa que muda no deployment é adicionarmos o campo serviceAccoutName dentro de spec:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
spec:
  selector:
    matchLabels:
      app: workload-identity-example
  template:
    metadata:
      labels:
        app: workload-identity-example
    spec:
      serviceAccountName: workload-identity-test
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E ao rodar a aplicação e entrar na rota /buckets de novo, conseguimos ver os buckets sendo listados:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Cy5NON05--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qwcp5w9apscxbs1ubz77.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Cy5NON05--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qwcp5w9apscxbs1ubz77.png" alt="lista de buckets após aplicar workload identity" width="635" height="657"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusões
&lt;/h2&gt;

&lt;p&gt;Desta forma, aumentamos a segurança das nossas aplicações, não precisando expor dados sensíveis com a aplicação. Ensinarei em outros posts como usar isto na prática, com Helm Charts, por exemplo, com Vault, ArgoCD, etc.&lt;/p&gt;

&lt;p&gt;Caso tenha alguma dúvida, deixe um comentário ou me chame no Linkedin: &lt;a href="https://www.linkedin.com/in/thiago-crespo-felippi/"&gt;https://www.linkedin.com/in/thiago-crespo-felippi/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>cloud</category>
      <category>gcp</category>
      <category>security</category>
    </item>
    <item>
      <title>Migração de serverless framework v1 para v2</title>
      <dc:creator>Thiago Crespo</dc:creator>
      <pubDate>Mon, 08 Nov 2021 18:41:43 +0000</pubDate>
      <link>https://dev.to/thiagofelippi/migracao-de-serverless-framework-v1-para-v2-1je</link>
      <guid>https://dev.to/thiagofelippi/migracao-de-serverless-framework-v1-para-v2-1je</guid>
      <description>&lt;p&gt;Recentemente em alguns projetos que participei tive alguns desafios com relação a mudança do serverless framework de v1 para v2. No projeto utilizei NodeJS com Typescript, toda infra na AWS.&lt;/p&gt;

&lt;p&gt;Estava utilizando a versão 1.83.2 juntamente com a imagem do docker softinstigate/serverless:1.83.0&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Link da imagem:&lt;/strong&gt; &lt;a href="https://hub.docker.com/layers/softinstigate/serverless/1.83.0/images/sha256-b5a30b60ade46b74b42114001256ffb502fc4cd501ffc5e5193001c6e0b1f991?context=explore"&gt;Docker Hub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Queríamos utilizar a imagem:&lt;/strong&gt; &lt;a href="https://hub.docker.com/layers/softinstigate/serverless/2.43.1/images/sha256-6db65e1456ad7ad49944e45e7635cd13a728d3d3038df902d4ca343046dfe81e?context=explore"&gt;Docker Hub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Que no momento era a mais atual. Porém tivemos alguns desafios e é sobre isto que falarei hoje&lt;/p&gt;

&lt;h2&gt;
  
  
  Porque?
&lt;/h2&gt;

&lt;p&gt;Primeiramente, porque quisemos mudar? Simplesmente porque queríamos mexer com tecnologias mais modernas, usar features novas e nos atualizarmos afim de não termos um projeto depreciado ao longo do tempo.&lt;/p&gt;

&lt;p&gt;Queriamos estar disponíveis para testar novas features da versão v2, aumentar a versão do node, que estava a 10 e iria começar a parar de ter suporte, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como?
&lt;/h2&gt;

&lt;p&gt;Para mudar tudo precisávamos atualizar nosso &lt;strong&gt;pipeline&lt;/strong&gt; de &lt;strong&gt;CI/CD&lt;/strong&gt; que optamos pelo &lt;strong&gt;bitbucket pipeline&lt;/strong&gt;, assim como as dependências de cada microserviço, juntamente com as &lt;strong&gt;imagens&lt;/strong&gt; do &lt;strong&gt;docker&lt;/strong&gt; utilizadas para rodar o pipeline.&lt;/p&gt;

&lt;p&gt;Além de mudar a versão do serverless framework queríamos atualizar nossos plugins, afim de usar a &lt;strong&gt;última versão LTS&lt;/strong&gt; de todas as dependências.&lt;/p&gt;

&lt;p&gt;Então primeiramente atualizamos todos os pacotes relacionados ao serverless no &lt;strong&gt;package.json&lt;/strong&gt;. Sejam estes os pacotes do &lt;strong&gt;serverless&lt;/strong&gt; normal, &lt;strong&gt;plugins&lt;/strong&gt; ou libs adicionais para rodar o &lt;strong&gt;serverless-offline&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atualizamos&lt;/strong&gt; tudo, &lt;strong&gt;instalamos&lt;/strong&gt; novamente as deps e &lt;strong&gt;mudamos&lt;/strong&gt; os &lt;strong&gt;scripts&lt;/strong&gt; do &lt;strong&gt;package.json&lt;/strong&gt; para ficarem compatíveis com a nova versão (precisamos adicionar coisas de package para funcionar com o artifacts do serverless v2)&lt;/p&gt;

&lt;p&gt;Nosso scripts de rodar local tinha algumas configs a mais para outros fins, mas poderia ser algo parecido com isto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scripts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;debug:dev&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tsc &amp;amp;&amp;amp; ./node_modules/serverless/bin/serverless.js dynamodb install &amp;amp;&amp;amp; ./node_modules/serverless/bin/serverless.js offline start --noAuth --noTimeout --noPrependStageInUrl&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste caso utilizamos a &lt;strong&gt;dependência&lt;/strong&gt; do &lt;strong&gt;dynamodb&lt;/strong&gt; e o &lt;strong&gt;serverless-offline&lt;/strong&gt;. Colocamos as flags:&lt;/p&gt;

&lt;p&gt;--noAuth = Para não chamar o authorizer da lambda quando roda local&lt;/p&gt;

&lt;p&gt;--noTimeout  = Sem timeout fixo&lt;/p&gt;

&lt;p&gt;--noPrependStageInUrl = Para não ter prefixo do stage nas urls, por exemplo: &lt;strong&gt;/dev/&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Aleḿ disto a versão do node no serverless para a mais recente suportada pelo framework. E também a versão da imagem no pipeline, que optamos pelo que integra com o bitbucket.&lt;/p&gt;

&lt;p&gt;Além disto, pesquisamos e vimos que seria bom adicionar isto no &lt;strong&gt;serverless.yml&lt;/strong&gt; acima da declaração do &lt;strong&gt;plugins&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;frameworkVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mf"&gt;2.64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="nx"&gt;useDotenv&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nx"&gt;variablesResolutionMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20210326&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também vimos que graças a esta atualização poderíamos remover os ~true ou ~split das enviroments chamadas lá no s3. Dado que agora ele resolve sozinho&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DISCLAIMER:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Com a atualização do serverless de v1 para v2, algumas variáveis de ambiente como a LAMBDA_TASK_ROOT, tem alguns comportamentos um pouco diferentes, alguns erros que venham a acontecer podem ser graças a isto.&lt;/p&gt;

&lt;p&gt;Depois disto tudo, rodamos nosso projeto e finalmente conseguimos ver ele funcionando no &lt;strong&gt;postman&lt;/strong&gt;, isto foi muito legal, sentimos que deu tudo certo, então subimos o PR e na hora de fazer o &lt;strong&gt;deploy&lt;/strong&gt; em &lt;strong&gt;HLG&lt;/strong&gt; ele rolou com sucesso. Porém fomos revisar tudo e vimos que o nosso &lt;strong&gt;swagger&lt;/strong&gt; tinha parado de funcionar.&lt;/p&gt;

&lt;h2&gt;
  
  
  A documentação no swagger foi um desafio
&lt;/h2&gt;

&lt;p&gt;Para o &lt;strong&gt;swagger&lt;/strong&gt; utilizávamos a biblioteca: &lt;a href="https://www.npmjs.com/package/serverless-aws-documentation"&gt;serverless-aws-documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando fizemos o deploy pela primeira vez, nada se alterou no &lt;strong&gt;swagger&lt;/strong&gt;, então apagamos o mesmo do nosso &lt;strong&gt;s3&lt;/strong&gt;, e rodamos o pipeline novamente, mas não funcionou.&lt;/p&gt;

&lt;p&gt;Então depois de muita pesquisa, descobrimos um fork desta mesma lib que é compatível com o &lt;strong&gt;serverless v2&lt;/strong&gt; : &lt;br&gt;
 &lt;a href="https://www.npmjs.com/package/@kakkuk/serverless-aws-apigateway-documentation"&gt;@kakkuk/serverless-aws-apigateway-documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A ideia é que conseguissemos mudar a versão mexendo o mínimo possível no código, visto que temos muitos projetos é difícil migrar em todo e ficar fazendo várias coisas pra funcionar. Esta lib é 100% compatível com a que utilizávamos, assim a única coisa que tivemos que fazer pra resolver este desafio foi:&lt;/p&gt;

&lt;p&gt;Mudar a dependência no package.json e mudar o plugin do serverless.yml do antigo para este, conforme está na descrição da dependência&lt;/p&gt;

&lt;p&gt;Mudando isto e um pouco na parte do deploy do swagger no nosso s3 (deu problema com o staging, mas mudando um pouco resolvemos) conseguimos resolver o problema e deployar o projeto com sucesso&lt;/p&gt;
&lt;h2&gt;
  
  
  Mais um problema
&lt;/h2&gt;

&lt;p&gt;No primeiro projeto que fizemos estávamos mexendo com &lt;strong&gt;Jenkins&lt;/strong&gt;, e deu certo de primeira. Fomos replicar para os que mexiam com o &lt;strong&gt;bitbucket pipeline&lt;/strong&gt; e ele começou a dar alguns erros que não estava achando as &lt;strong&gt;credenciais&lt;/strong&gt; da &lt;strong&gt;AWS&lt;/strong&gt; para resolver as &lt;strong&gt;variáveis&lt;/strong&gt; do &lt;strong&gt;parameter store&lt;/strong&gt; declaradas no &lt;strong&gt;serverless.yml&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Investigamos e vimos que tinhamos adicionado um job a mais fora do step de deploy e isto fazia com que o bitbucket não conseguisse resolver a variável de ambiente, dado que ele só exporta as variáveis aonde tem o deployment igual ao setado nas variáveis de ambiente do repositório&lt;/p&gt;

&lt;p&gt;Para ficar mais claro, o bitbucket pipeline tinha um step de deploy assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;DeployHomolog&lt;/span&gt;
    &lt;span class="nx"&gt;deployment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;staging&lt;/span&gt;
    &lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;softinstigate&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;serverless&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;2.43&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Deploy to Homolog&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DEBIAN_FRONTEND=noninteractive apt-get install -y jq&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;npm run deploy:hlg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;npm run publish:reports&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E queríamos adicionar um script que usava as credencias setadas na variáveis de ambiente do projeto no ambiente de staging, porém adicionamos em outro step, porém ele não reconhecia as credenciais porque o step que tem o ambiente de staging é este, podemos ver isto pela tag deployment. Ai bastou adicionar o script neste step que funcionou&lt;/p&gt;

&lt;h2&gt;
  
  
  Dúvidas
&lt;/h2&gt;

&lt;p&gt;De primeira pode não ser algo tão simples de resolver esta migração, mas com pesquisa e estudo vai ficando mais fácil, se alguma coisa não ficou clara e quiserem que eu esclareça podem me chamar no Linkedin e esclarecer:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/thiago-crespo-felippi/"&gt;Thiago Crespo Felippi - FullstackDeveloper - NTConsult | LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>serverless</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
