Upload de arquivo para um bucket na Amazon S3 utilizando AWS SDK for JavaScript v3 no Next.js

Marcelo Albuquerque
3 min readOct 27, 2022

No tutorial anterior já abordei como se trabalhar com a SDK for JavaScript v3 da AWS. Porém, nesse tutorial, abordei uma forma comum de se fazer um Upload, que é a partir de um "FormData". Neste tutorial, quero abordar uma forma diferente, que é através da função "getStaticProps" do Next.js que é executada diretamente no servidor e não no front-end da aplicação.

Photo by Beatriz Pérez Moya on Unsplash

Cenário

Ao desenvolver uma aplicação, me deparei com a seguinte necessidade: Realizar o upload de uma imagem para um Bucket S3 a partir da URL de uma imagem. Porém, aqui, preciso realizar esse upload no momento do "build" da aplicação, que no Next.js é executado através da função "getStaticProps".

Arquitetura da aplicação

Front-end

O front-end da aplicação foi desenvolvida utilizando o framework Next.js e é servido através de uma URL.

Back-end

O back-end possuí uma API desenvolvida sob o framework Next.js e servida em uma URL diferente do front-end.

Lembrando que o Next.js fornece a possibilidade de construção do front-end e da API dentro da mesma aplicação, porém, optei pela separação desses serviços.

Requisitos

Como vamos trabalhar com a AWS SDK, necessitamos do correto nível de acesso e as informações que nos garantem a devida comunicação com os serviços da AWS. Essas informações devem estar definidas como variáveis de ambiente:

A AWS SDK em sua versão 3 vai reconhecer automaticamente as variáveis de ambiente definidas nesse padrão. “Cuidado para não trocar seus nomes.”

Código, código e código…

Aqui começam as diferenças. A função getStaticProps é executada no "server-side", ou seja, no servidor! Ela não é executada no navegador do usuário. Portanto, não posso construir aqui um "FormData" e realizar o "Fetch".

Vamos ter uma abordagem ainda mais simples aqui. Basicamente, o que preciso é a URL da imagem. Vou enviar para minha API apenas uma "string", somente a URL do arquivo (neste caso, uma imagem), e na API é que vou realizar todo o tratamento.

Tratamento na API

Para tratarmos as informações e obtermos a imagem através da URL, necessitamos dos seguintes pacotes:

@aws-sdk/client-s3: Este pacote realiza toda comunicação com o Amazon S3.

fetch: Este pacote é necessário para obtermos as informações da imagem no server-side.

Basta realizarmos suas intalações:

  • npm install @aws-sdk/client-s3
  • npm install fetch

E agora trato a URL recebida na API:

A lógica aqui é realmente mais simples, a função "PutObjectCommand" espera receber os parâmetros, o parâmetro que de fato envia o arquivo é o "Body", e conforme sua documentação, espera receber: string | Uint8Array | Buffer. Ou seja, podemos enviar apenas o Buffer do arquivo.

Obviamente os serviços da AWS merecem uma abordagem mais técnica e teórica para seu devido entendimento. Aqui apenas abordei como os scripts irão funcionar, tome o devido cuidado ao possibilitar acesso público aos seus Buckets.

--

--