Objetivo
Esse conteúdo tem como objetivo mostrar de forma simples uma das maneiras de fazermos streaming de arquivos PDF ou imagens direto de um Bucket S3, da AWS.
Como premissa, a aplicação deve ser em Node.JS.
Instalando SDK AWS
npm install @aws-sdk/client-s3
Configurando Client
Basicamente, o objeto de configuração do cliente S3 precisa receber a região e as credenciais - que são adquiridas no IAM da AWS. Talvez, dependendo do contexto da sua aplicação é necessário usar um proxy. Sobre isso, no final desse artigo tem um exemplo de como configurar um proxy.
const awsConfig = {
region: 'us-east-1',
credentials: {
accessKeyId: '',
secretAccessKey: '',
}
};
s3Client = new S3Client(awsConfig);
Buscando Objeto no S3
Com o cliente configurado, agora é possível buscar um arquivo no S3. Para isso, é necessário um objeto informando o nome do Bucket e o ID do arquivo. Geralmente esse ID é o nome do arquivo. Então, cuidado com acentuações e caracteres especiais ao fazer o upload de arquivos.
Para buscar o arquivo, usamos o getObjectCommand
, conforme abaixo.
const object = {
Bucket: 'bucket-name',
Key: 'file-id'
};
const getObjectCommand = new GetObjectCommand(object);
return s3Client.send(getObjectCommand);
Retornando o Arquivo para o Frontend
Para retornar o arquivo para o navegador usando seu tipo correto, podemos fazer uso do Content-Type
que é disponibilizado pelo response
no caso de estar usando o Express
.
streamFile = async (request, response, next) => {
const fileStream = new GetStreamFileService();
const responseStream = await fileStream.execute({ fileId, bucket });
response.setHeader('Content-Type', responseStream.ContentType);
return responseStream.Body.pipe(response);
}
Note que no return
é usada a função pipe
, que é do próprio SDK da AWS, que existe dentro do Body
. Essa função tem o recurso de stream dentro dela. Então, passamos apenas o response
do Express
como parâmetro.
Feito isso, provavelmente você terá uma rota configurada para acessar esse serviço. Geralmente, fazemos assim:
<img src="/routes/files/id-do-arquivo" alt="Stream de Imagem do S3" />
Se for um arquivo PDF, você pode abrir direto no browser, ou object
usando o link.
<object data="/routes/files/id-do-arquivo" type="application/pdf">
Não foi possível fazer o streaming desse arquivo.
</object>
Proxy
Baseada na minha experiência, tive dificuldades em fazer streaming de arquivos certa vez. Estava configurado corretamente, mas sempre retornava algum erro. Buscando pela engenharia dos servidores, entendi que era necessário usar um proxy para acessar o S3.
Na própria documentação do SDK do S3 encontrei uma solução, usando as bibliotecas hpagent
e @aws-sdk/node-http-handler
. Depois, usamos o proxy dentro do objeto de configuração do S3.
const agent = new HttpsProxyAgent({ proxy: '' });
const requestHandler = new NodeHttpHandler({
httpAgent: agent,
httpsAgent: agent,
});
const awsConfig = {
region: 'us-east-1',
requestHandler,
credentials: {
accessKeyId: '',
secretAccessKey: '',
}
};
Espero que esse artigo te ajude em algum momento de sua carreira.
Top comments (0)