Skip to content

Resumo dos limites de upload de arquivo AWS S3 e CloudFront | Multiparte e URL assinada

Categoria:Nuvem・AWS
Este artigo está disponível atualmente apenas em japonês. As versões traduzidas serão publicadas sequencialmente.

Ao construir recursos de upload de arquivo usando AWS, é extremamente importante compreender que S3, CloudFront, API Gateway e Lambda têm diferentes limites de tamanho e qual camada se torna o gargalo. Este artigo organiza os limites de cada serviço, explica como usar uploads em múltiplas partes e URLs assinadas para lidar com arquivos grandes, e fornece exemplos de implementação em PHP.

Método e tamanho de upload do S3 PUT (single) ≤ 5 GB Multipart upload 5 MB ~ 5 TB / object Object size limit (S3) 5 TB max Verifique separadamente os limites anteriores ao CloudFront/API Gateway/Lambda
Figura: Camadas de tamanho de upload do S3 (PUT único 5GB / Multipart 5TB)

Limite de upload do Amazon S3

O upload de objetos para S3 tem limites de tamanho diferentes dependendo do método utilizado.

Método de upload Tamanho máximo Observações
<code>PUT Object</code> (único) 5 GB Limite de upload em 1 requisição
Multipart Upload 5 TB Tamanho máximo de 1 objeto
Por 1 parte Mínimo de 5 MB até máximo de 5 GB Apenas a última parte pode ser menor que 5 MB
Número de partes Máximo de 10.000 partes Limite durante multipart

A AWS recomenda o upload em múltiplas partes para arquivos de 100 MB ou mais, e deve ser usado ativamente para arquivos grandes tanto pela eficiência de retransmissão em caso de falha de rede quanto pela melhoria de throughput por transferência paralela.

Casos em que o upload multipart é necessário

O upload multipart é um método que divide um objeto em múltiplas partes, envia cada uma em requisições independentes e as combina ao final. É eficaz nos seguintes casos.

  • <strong>Arquivos acima de 100 MB</strong>: Este é o ponto de corte para multipart recomendado pela AWS.
  • <strong>ambientes com rede instável</strong>:mesmo se ocorrer erro, você pode reenviar apenas as partes que falharam.
  • <strong>maximizar throughput</strong>:fazer upload de múltiplas partes em paralelo para melhorar a velocidade de transferência.
  • <strong>pausar e retomar o upload</strong>:ao salvar o ID de Upload, você pode retomar entre sessões.

O fluxo de upload multipart tem basicamente 3 etapas.

  1. <strong>Início</strong> (CreateMultipartUpload): obter o ID do Upload
  2. <strong>Envio de partes</strong> (UploadPart): fazer upload de cada parte e registrar a ETag
  3. <strong>Concluído</strong> (CompleteMultipartUpload): Enviar uma lista de números de partes e ETags para confirmar o objeto

Se cancelar no meio do caminho sem chamar <code>AbortMultipartUpload</code>, as partes incompletas continuarão sendo cobradas como taxa de armazenamento. É altamente recomendável configurar uma política de ciclo de vida do bucket S3 para 「削除未完了のマルチパートアップロードを N 日後に削除」.

Prazo de validade e tamanho da URL pré-assinada

Ao usar URLs pré-assinadas (Presigned URL), clientes sem permissão de acesso ao S3 (como navegadores e aplicativos móveis) podem fazer upload de arquivos diretamente para o S3. Como não passa por um servidor intermediário, é eficiente mesmo para arquivos de grande volume.

Item Limitações e especificações
Validade máxima (emitido por usuário IAM) 7 dias (604.800 segundos)
Validade máxima (emitido por função IAM) Dentro do tempo de sessão da função(máximo 12 horas)
Tamanho de arquivo que pode ser enviado Para PUT único, máximo de 5 GB
Suporte a multipart Emitir uma Presigned URL individual para cada parte

A URL pré-assinada é gerada no backend e retornada ao cliente, e o cliente envia uma solicitação PUT diretamente para essa URL. Como a URL contém uma assinatura, ela só terá sucesso se o arquivo correto for enviado dentro do prazo de validade.

Limite de tamanho de body do CloudFront

Ao encaminhar requisições através do CloudFront para uma origem (como S3 ou EC2), há um limite no tamanho do corpo da requisição.

Configuração Valor padrão Valor máximo
Tamanho do corpo da requisição (padrão) 1 MB Pode ser alterado na configuração de distribuição
No caso de estar passando por Lambda@Edge 1 MB 1 MB (não editável)
No caso de CloudFront Functions Acesso ao corpo da requisição indisponível

Nas configurações de distribuição do CloudFront, você pode habilitar 「Allow requests with body」 e aumentar o limite, mas observe que em Lambda@Edge o limite de 1 MB não pode ser alterado. Para upload de arquivos grandes, recomendamos adotar uma arquitetura que faz upload direto de S3 do cliente usando Presigned URL, sem passar pelo CloudFront.

Limite de Payload do API Gateway

O API Gateway (tanto REST API quanto HTTP API) possui um limite máximo de tamanho de payload.

Tipo de API Tamanho máximo de payload Observações
REST API 10 MB O mesmo se o suporte binário estiver habilitado
HTTP API 10 MB
WebSocket API 128 KB (mensagem) / 32 KB (frame)

O limite de 10 MB do API Gateway é classificado como cota de serviço da AWS e não pode ser aumentado. Considere fazer upload de arquivos maiores que 10 MB via Presigned URL em vez de API Gateway, pois contornar esse limite é considerado um erro de design.

Limitações de arquivo via Lambda

Ao receber arquivos em uma função Lambda, há um limite para o payload de evento passado do API Gateway. Além disso, o Lambda em si tem as seguintes limitações.

Itens de limite Valor
Carga útil de chamada síncrona (Request) 6 MB
Carga útil de chamada síncrona (Response) 6 MB
Carga assíncrona de chamadas 256 KB
Capacidade do diretório <code>/tmp</code> Padrão 512 MB (máximo 10 GB)
Tempo máximo de execução 15 minutos

Ao processar arquivos no Lambda, arquivos temporários são gravados em <code>/tmp</code>. O padrão é 512 MB, mas você pode estender o armazenamento efêmero até 10 GB máximo nas configurações do Lambda (com custo adicional).

Exemplo de código de upload multipart S3 em PHP

Este é um exemplo de implementação de upload em múltiplas partes usando AWS SDK for PHP (v3). Ao usar a classe <code>MultipartUploader</code> do SDK, a divisão de chunks, retentativas e processamento de conclusão são tratados automaticamente.

use Aws\S3\S3Client;
use Aws\S3\MultipartUploader;
use Aws\Exception\MultipartUploadException;

$s3 = new S3Client([
    'region'  => 'ap-northeast-1',
    'version' => 'latest',
]);

$uploader = new MultipartUploader($s3, '/path/to/large-file.mp4', [
    'bucket'          => 'your-bucket-name',
    'key'             => 'uploads/' . basename('/path/to/large-file.mp4'),
    'before_initiate' => function (\Aws\Command $command) {
        // アップロード開始前のフック
    },
    'before_upload'   => function (\Aws\Command $command) {
        // 各パートアップロード前のフック(プログレス表示など)
    },
    'concurrency'     => 5,    // 並列アップロード数
    'part_size'       => 10 * 1024 * 1024, // 1パート = 10 MiB
]);

try {
    $result = $uploader->upload();
    echo 'アップロード完了: ' . $result['ObjectURL'];
} catch (MultipartUploadException $e) {
    // 失敗したパートから再開する例
    $uploader = new MultipartUploader($s3, '/path/to/large-file.mp4', [
        'state' => $e->getState(),
    ]);
    $result = $uploader->upload();
}

Este é o método para emitir uma URL pré-assinada e permitir que o cliente faça upload diretamente para o S3.

use Aws\S3\S3Client;

$s3 = new S3Client([
    'region'  => 'ap-northeast-1',
    'version' => 'latest',
]);

// 署名付きURLを生成(有効期限: 15分)
$cmd = $s3->getCommand('PutObject', [
    'Bucket'       => 'your-bucket-name',
    'Key'          => 'uploads/' . uniqid('', true) . '.jpg',
    'ContentType'  => 'image/jpeg',
]);

$request = $s3->createPresignedRequest($cmd, '+15 minutes');
$presignedUrl = (string) $request->getUri();

// このURLをクライアントに返す
// クライアントはこのURLに PUT リクエストでファイルを直接送信する
echo json_encode(['upload_url' => $presignedUrl]);

Diretrizes para seleção de arquitetura

  • <strong>~10 MB</strong>:implementação simples com API Gateway → Lambda → S3
  • <strong>10 MB até 100 MB</strong>: Recomenda-se upload direto do cliente para S3 usando Presigned URL
  • <strong>100 MB até 5 GB</strong>: Presigned URL + upload multipart para transferência estável
  • <strong>Acima de 5 GB</strong>: Upload multipart obrigatório (PUT sozinho não funciona)

Procedimento de teste usando arquivos de limite do DevLab

Para validar as configurações de upload do S3 na prática, é necessário um arquivo de teste com tamanho exato. Usando os arquivos de teste de valor limite do DevLab, você pode verificar eficientemente o comportamento antes e depois de tamanhos específicos.

  1. Baixe o arquivo do tamanho desejado para teste a partir da <a href="/ja/files/threshold/">lista de arquivos para teste de valor limite</a> do DevLab.
  2. Ao validar a linha de alternância multipart, você também pode usar a versão de tamanho grande da <a href="/ja/files/images/png/">imagem de teste PNG</a>.
  3. Faça upload do arquivo baixado usando o comando <code>aws s3 cp</code> ou as APIs <code>PutObject</code> / <code>MultipartUploader</code> do SDK e verifique o sucesso/falha em arquivos próximos ao limite.

Arquivo de teste disponível para usar neste artigo

  • <a href="/ja/files/threshold/" class="text-primary-600 dark:text-primary-400 hover:underline">Lista de arquivos de teste de valor limite</a> — Para verificação dos limites de S3, API Gateway e Lambda
  • <a href="/ja/files/threshold/10mb/" class="text-primary-600 dark:text-primary-400 hover:underline">Conjunto de teste de limite de 10MB</a> — Verificar antes e depois do limite de 10 MB do API Gateway
  • <a href="/ja/files/threshold/25mb/" class="text-primary-600 dark:text-primary-400 hover:underline">Conjunto de teste de limite de 25MB</a> — Para verificação de comportamento antes e depois da linha recomendada de multipart
  • <a href="/ja/files/images/png/" class="text-primary-600 dark:text-primary-400 hover:underline">Lista de imagens de teste PNG</a> — Para verificar o funcionamento do pipeline de upload de imagens

Artigos relacionados

  • <a href="/ja/blog/how-to-test-upload-limit/" class="text-primary-600 dark:text-primary-400 hover:underline">Como Testar Corretamente o Limite de Upload de Arquivo</a>
  • <a href="/ja/blog/php-file-upload/" class="text-primary-600 dark:text-primary-400 hover:underline">Como Implementar Upload de Arquivo em PHP | Guia Completo de Validação, Armazenamento e Segurança</a>
  • <a href="/ja/blog/multipart-form-data-overhead/" class="text-primary-600 dark:text-primary-400 hover:underline">Calcular com Precisão o Overhead de multipart/form-data</a>
  • <a href="/ja/blog/mb-vs-mib-file-size/" class="text-primary-600 dark:text-primary-400 hover:underline">MB e MiB são Diferentes! Armadilhas nas Unidades de Tamanho de Arquivo</a>

Perguntas frequentes

Qual é o tamanho máximo que pode ser enviado com uma única solicitação PUT do S3?

Uma única operação PUT suporta até 5GB. Acima disso, use upload multipartes, que suporta até 5TB.

Qual é a validade da URL pré-assinada (Presigned URL) do S3?

O padrão é 15 minutos e pode ser configurado até no máximo 7 dias (604800 segundos). Este é o limite máximo quando gerado com credenciais de usuário IAM.

Como fica o limite de tamanho de upload ao passar pelo CloudFront?

O limite de tamanho de body de requisição do CloudFront é, por padrão, 0 para GET e máximo de 20 MB para POST/PUT. É recomendado adotar um design que faça upload de arquivos grandes diretamente no S3.