O blog da AWS
Fazendo upload de objetos grandes para o Amazon S3 usando upload multipartes e aceleração de transferência
Por Tam Baghdassarian, Cloud Application Architect, Rama Krishna Ramaseshu, Sr Cloud App Architect, e Anand Komandooru, Sr Cloud App Architect.
Aplicações web e móveis frequentemente precisam fazer upload de objetos para a AWS Cloud. Por exemplo, serviços como Amazon Photos permitem que os usuários façam upload de fotos e arquivos de vídeo grandes a partir de seu navegador ou aplicação móvel.
Amazon S3 pode ser ideal para armazenar objetos grandes devido ao seu tamanho máximo de objeto de 5 TB, juntamente com seu suporte para reduzir tempos de upload via uploads multipartes e aceleração de transferência.
Visão geral
Desenvolvedores que precisam fazer upload de arquivos grandes de suas aplicações web e móveis para a nuvem podem enfrentar vários desafios. Devido às limitações de throughput TCP subjacentes, uma única conexão HTTP não pode usar toda a largura de banda disponível, resultando em tempos de upload mais lentos. Além disso, a latência e qualidade da rede podem resultar em uma experiência do usuário ruim ou inconsistente.
Usando recursos do S3 como URLs pré-assinadas e upload multipartes, desenvolvedores podem aumentar com segurança o throughput e minimizar tentativas de upload devido a erros de rede. Adicionalmente, desenvolvedores podem usar aceleração de transferência para reduzir a latência de rede e fornecer uma experiência de usuário consistente para seus usuários de aplicações web e móveis em todo o mundo.
Esta publicação referencia uma aplicação de exemplo consistindo de um frontend web e uma aplicação backend Serverless. Ela demonstra os benefícios de usar os recursos de upload multipartes e aceleração de transferência do S3.
Visão geral da solução:
- Aplicação web ou móvel (frontend) se comunica com a AWS Cloud (backend) através do Amazon API Gateway para iniciar e completar um upload multipartes.
- Funções AWS Lambda invocam chamadas de API do S3 em nome da aplicação web ou móvel.
- Aplicação web ou móvel faz upload de objetos grandes para o S3 usando aceleração de transferência do S3 e URLs pré-assinadas.
- Uploads de arquivos são recebidos e confirmados pela localização de borda mais próxima para reduzir a latência.
Usando upload multipartes do S3 para fazer upload de objetos grandes
Um upload multipartes permite que uma aplicação faça upload de um objeto grande como um conjunto de partes menores enviadas em paralelo. Após a conclusão, o S3 combina as partes menores no objeto maior original.
Dividir um upload de objeto grande em partes menores tem várias vantagens. Pode melhorar o throughput fazendo upload de várias partes em paralelo. Também pode se recuperar de um erro de rede mais rapidamente reiniciando apenas o upload das partes que falharam.
O upload multipartes consiste em:
- Iniciar o upload multipartes e obter um upload id através da chamada de API CreateMultipartUpload.
- Dividir o objeto grande em várias partes, obter uma URL pré-assinada para cada parte e fazer upload das partes de um objeto grande em paralelo através da chamada de API UploadPart.
- Completar o upload chamando a chamada de API CompleteMultipartUpload.
Quando usado com URLs pré-assinadas, o upload multipartes permite que uma aplicação faça upload do objeto grande usando um método seguro e com tempo limitado sem compartilhar credenciais privadas do bucket.
Esta função Lambda pode iniciar um upload multipartes em nome de uma aplicação web ou móvel:
const multipartUpload = await s3. createMultipartUpload(multipartParams).promise()
return {
statusCode: 200,
body: JSON.stringify({
fileId: multipartUpload.UploadId,
fileKey: multipartUpload.Key,
}),
headers: {
'Access-Control-Allow-Origin': '*'
}
};
O UploadId é necessário para chamadas subsequentes para fazer upload de cada parte e completar o upload.
Fazendo upload de objetos com segurança usando URLs pré-assinadas do S3
Uma aplicação web ou móvel requer permissão de escrita para fazer upload de objetos para um bucket S3. Isso geralmente é realizado concedendo acesso ao bucket e armazenando credenciais dentro da aplicação.
Você pode usar URLs pré-assinadas para acessar buckets S3 com segurança sem a necessidade de compartilhar ou armazenar credenciais na aplicação chamadora. Além disso, URLs pré-assinadas têm tempo limitado (o padrão é 15 minutos) para aplicar as melhores práticas de segurança.
Uma aplicação web chama um recurso de API que usa as chamadas de API do S3 para gerar uma URL pré-assinada com tempo limitado. A aplicação web então usa a URL para fazer upload de um objeto para o S3 dentro do tempo permitido, sem ter acesso explícito de escrita ao bucket S3. Uma vez que a URL pré-assinada expira, ela não pode mais ser usada.
Quando combinado com upload multipartes, uma URL pré-assinada pode ser gerada para cada uma das partes do upload, permitindo que a aplicação web ou móvel faça upload de objetos grandes.
Este exemplo demonstra a geração de um conjunto de URLs pré-assinadas para o número de índice de partes:
const multipartParams = {
Bucket: bucket_name,
Key: fileKey,
UploadId: fileId,
}
const promises = []
for (let index = 0; index < parts; index++) {
promises.push(
s3.getSignedUrlPromise("uploadPart", {
...multipartParams,
PartNumber: index + 1,
Expires: parseInt(url_expiration)
}),
)
}
const signedUrls = await Promise.all(promises)
Antes de chamar getSignedUrlPromise, o cliente deve obter um UploadId via CreateMultipartUpload. Leia Gerando uma URL pré-assinada para compartilhar um objeto para mais informações.
Reduzindo latência usando aceleração de transferência
Ao usar a aceleração de transferência do S3, a aplicação pode aproveitar as localizações de borda distribuídas globalmente no Amazon CloudFront. Quando combinado com uploads multipartes, cada parte pode ser enviada automaticamente para a localização de borda mais próxima do usuário, reduzindo o tempo de upload.
A aceleração de transferência deve ser habilitada no bucket S3. Ela pode ser acessada usando o endpoint bucketname.s3-acceleration.amazonaws.com ou bucketname.s3-accelerate.dualstack.amazonaws.com para conectar ao bucket habilitado sobre IPv6.
Use a ferramenta de comparação de velocidade para testar os benefícios da aceleração de transferência a partir da sua localização.
Você pode usar aceleração de transferência com uploads multipartes e URLs pré-assinadas para permitir que uma aplicação web ou móvel faça upload de objetos grandes de forma segura e eficiente.
A aceleração de transferência precisa ser habilitada no bucket S3. Este exemplo cria um bucket S3 com aceleração de transferência usando CDK e TypeScript:
const s3Bucket = new s3.Bucket(this, "document-upload-bucket", {
bucketName: "BUCKET-NAME",
encryption: BucketEncryption.S3_MANAGED,
enforceSSL: true,
transferAcceleration: true,
removalPolicy: cdk.RemovalPolicy.DESTROY
});
Após ativar a aceleração de transferência no bucket S3, a aplicação backend pode gerar URLs pré-assinadas habilitadas para aceleração de transferência. inicializando o SDK do S3:
s3 = new AWS.S3({useAccelerateEndpoint: true});
A aplicação web ou móvel então usa as URLs pré-assinadas para fazer upload das partes do arquivo.
Veja Aceleração de transferência do S3 para mais informações.
Implantando a solução de teste
Para configurar e executar os testes descritos neste blog, você precisa:
- Uma conta AWS.
- Instalar e configurar a AWS CLI.
- Instalar e fazer bootstrap do AWS CDK.
- Implantar a solução backend e frontend no seguinte repositório git.
- Um arquivo de teste de upload suficientemente grande de pelo menos 100 MB.
Para implantar o backend:
- Clone o repositório para sua máquina local.
- Da pasta backendv2, instale todas as dependências executando:
npm install - Use o CDK para implantar o backend na AWS:
cdk deploy --context env="randnumber" --context whitelistip="xx.xx.xxx.xxx"
Você pode usar uma variável de contexto adicional chamada “urlExpiry” para definir um tempo de expiração específico na URL pré-assinada do S3. O valor padrão é definido em 300 segundos. Um novo bucket S3 com o nome “document-upload-bucket-randnumber” é criado para armazenar os objetos enviados, e o valor whitelistip permite acesso ao API Gateway apenas a partir deste endereço IP.
Anote a URL do endpoint do API Gateway para uso posterior.
Para implantar o frontend:
- Da pasta frontend, instale as dependências:
npm install - Para iniciar a aplicação frontend a partir do navegador, execute:
npm run start
Testando a aplicação
Para testar a aplicação:
- Inicie a interface do usuário a partir da pasta frontend:
npm run - Insira o endereço do API Gateway na caixa de texto API URL. Selecione o tamanho máximo de cada parte do upload (o mínimo é 5 MB) e o número de uploads paralelos. Use sua largura de banda disponível, tamanho da janela TCP e requisitos de tempo de tentativa para determinar o tamanho de parte ideal. Navegadores web têm um limite no número de conexões simultâneas para o mesmo servidor. Especificar um número maior de conexões simultâneas resulta em bloqueio no lado do navegador web.
- Decida se a aceleração de transferência deve ser usada para reduzir ainda mais a latência.
- Escolha um arquivo de teste de upload.
- Use a seção Monitor para observar o tempo total para fazer upload do arquivo de teste.
Experimente com diferentes valores para tamanho de parte, número de uploads paralelos, uso de aceleração de transferência e o tamanho do arquivo de teste para ver os efeitos no tempo total de upload. Você também pode usar as ferramentas de desenvolvedor do seu navegador para obter mais insights.
Resultados dos testes
Os seguintes testes têm as seguintes características:
- O bucket S3 está localizado na Região US East.
- A velocidade média de upload do cliente é de 79 megabits por segundo.
- O navegador Firefox fez upload de um arquivo de 485 MB.
Teste 1 – Upload de parte única sem aceleração de transferência
Para criar uma linha de base, o arquivo de teste é enviado sem aceleração de transferência e usando apenas uma única parte. Isso simula um upload de arquivo grande sem os benefícios do upload multipartes. O resultado da linha de base é 72 segundos.
Teste 2 – Upload único com aceleração de transferência
O próximo teste mediu o tempo de upload usando aceleração de transferência enquanto ainda mantém uma única parte de upload sem benefícios de upload multipartes. O resultado é 43 segundos (40% mais rápido).
Teste 3 – Upload multipartes sem aceleração de transferência
Este teste usa upload multipartes dividindo o arquivo de teste em partes de 5 MB com um máximo de seis uploads paralelos. A aceleração de transferência está desabilitada. O resultado é 45 segundos (38% mais rápido).
Teste 4 – Upload multipartes com aceleração de transferência
Para este teste, o arquivo de teste é enviado dividindo o arquivo em partes de 5 MB com um máximo de seis uploads paralelos. A aceleração de transferência está habilitada para cada upload. O resultado é 28 segundos (61% mais rápido).
O gráfico a seguir resume os resultados dos testes.
| Upload multipartes | Aceleração de transferência | Tempo de upload |
| Não | Não | 72s |
| Sim | Não | 43s |
| Não | Sim | 45s |
| Sim | Sim | 28s |
Conclusão
Este blog mostra como aplicações web e móveis podem fazer upload de objetos grandes para o Amazon S3 de maneira segura e eficiente ao usar URLs pré-assinadas e upload multipartes.
Desenvolvedores também podem usar aceleração de transferência para reduzir a latência e acelerar uploads de objetos. Quando combinado com upload multipartes, você pode ver o tempo de upload reduzido em até 61%.
Use a implementação de referência para começar a incorporar upload multipartes e aceleração de transferência do S3 em suas aplicações web e móveis.
Para mais recursos de aprendizado Serverless, visite Serverless Land.
Este conteúdo foi traduzido do post original do blog, que pode ser encontrado aqui.
Autores
| Jerome Van Der Linden é Senior Solutions Architect na Amazon Web Services. |
Tradutores
![]() |
Nicolas Tarzia é Senior Technical Account Manager na AWS, com mais de 13 anos de experiência, com ampla experiência em arquitetura cloud, engenharia e design de software. Sua área de interesse são tecnologias serverless.
https://www.linkedin.com/in/nicolastarzia |
![]() |
Daniel Abib é Arquiteto de Soluções Sênior e Especialista em Amazon Bedrock na AWS, com mais de 25 anos trabalhando com gerenciamento de projetos, arquiteturas de soluções escaláveis, desenvolvimento de sistemas e CI/CD, microsserviços, arquitetura Serverless & Containers e especialização em Machine Learning. Ele trabalha apoiando Startups, ajudando-os em sua jornada para a nuvem.
https://www.linkedin.com/in/danielabib/ |







