Tutorial: Fazer upload de um objeto por meio do carregamento fracionado e conferir a integridade dos dados
O multipart upload permite que você faça upload de um único objeto como um conjunto de partes. Cada parte é uma parte contígua de dados do objeto. O upload dessas partes de objetos pode ser feito de maneira independente e em qualquer ordem. Se a transmissão de alguma parte falhar, você poderá retransmitir essa parte sem afetar outras partes. Depois que todas as partes do objeto forem carregadas, o Amazon S3 montará essas partes e criará o objeto. Geralmente, quando seu objeto alcança 100 MB de tamanho, você deve considerar o uso de multipart uploads em vez de fazer upload do objeto em uma única operação. Para obter mais informações sobre multipart uploads, consulte Carregar e copiar objetos usando upload fracionado no Amazon S3. Para ver os limites relacionados a carregamentos fracionados, consulte Limites do multipart upload do Amazon S3.
É possível usar somas de verificação para verificar se os ativos não são alterados quando copiados. A execução de uma soma de verificação consiste em usar um algoritmo para iterar sequencialmente sobre cada byte em um arquivo. O Amazon S3 oferece várias opções de soma de verificação para conferir a integridade dos dados. Recomendamos que você execute essas verificações de integridade como prática recomendada de durabilidade e para garantir que cada byte seja transferido sem alteração. O Amazon S3 também é compatível com os seguintes algoritmos: SHA-1, SHA-256, CRC32 e CRC32C. O Amazon S3 usa um ou mais desses algoritmos para calcular um valor de soma de verificação adicional e armazená-lo como parte dos metadados do objeto. Para ter mais informações sobre somas de verificação, consulte Verificar a integridade do objeto no Amazon S3.
Objetivo
Neste tutorial, você aprenderá a fazer upload de um objeto no Amazon S3 usando um carregamento fracionado e uma soma de verificação SHA-256 adicional por meio da AWS Command Line Interface (AWS CLI). Você também aprenderá a conferir a integridade dos dados do objeto calculando o hash MD5 e a soma de verificação SHA-256 do objeto carregado.
Tópicos
Pré-requisitos
-
Antes de iniciar este tutorial, confira se você tem acesso a um bucket do Amazon S3 para o qual possa fazer upload. Para obter mais informações, consulte Criar um bucket de uso geral.
-
É necessário ter a AWS CLI instalada e configurada. Se você ainda não tiver a AWS CLI instalada, consulte Install or update to the latest version of the AWS CLI no Guia do usuário da AWS Command Line Interface.
-
Também é possível executar comandos da AWS CLI pelo console usando o AWS CloudShell. O AWS CloudShell é um shell pré-autenticado e baseado em navegador que você pode iniciar diretamente do AWS Management Console. Para ter mais informações, consulte What is CloudShell? e Getting started with AWS CloudShell no Guia do usuário do AWS CloudShell.
Etapa 1: criar um arquivo grande
Se você já tiver um arquivo pronto para upload, poderá usá-lo para este tutorial. Caso contrário, crie um arquivo de 15 MB usando as etapas a seguir. Para ver os limites relacionados a carregamentos fracionados, consulte Limites do multipart upload do Amazon S3.
Como criar um arquivo grande
Use um dos seguintes comandos para criar o arquivo, dependendo do sistema operacional que estiver usando.
Linux ou macOS
Para criar um arquivo de 15 MB, abra o terminal local e execute o seguinte comando:
dd if=/dev/urandom of=census-data.bin bs=1M count=15
Esse comando cria um arquivo de 15 MB denominado census-data.bin
preenchido com bytes aleatórios.
Windows
Para criar um arquivo de 15 MB, abra o terminal local e execute o seguinte comando:
fsutil file createnew census-data.bin 15728640
Esse comando cria um arquivo denominado census-data.bin
com um tamanho de 15 MB de dados arbitrários (15.728.640 bytes).
Etapa 2: dividir o arquivo em vários arquivos
Para realizar o carregamento fracionado, é necessário dividir o arquivo grande em partes menores. Depois, é possível fazer upload das partes menores usando o processo de carregamento fracionado. Esta etapa demonstra como dividir em partes menores o arquivo grande criado na Etapa 1. O exemplo a seguir usa um arquivo de 15 MB denominado census-data.bin
.
Como dividir um arquivo grande em partes
Linux ou macOS
Para dividir o arquivo grande em partes de 5 MB, use o comando split
. Abra o terminal e execute o seguinte:
split -b 5M -d census-data.bin census-part
Esse comando divide census-data.bin
em partes de 5 MB denominadas census-part**
, em que **
é um sufixo numérico de 00
.
Windows
Para dividir o arquivo grande, use o PowerShell. Abra o PowerShell
$inputFile = "census-data.bin" $outputFilePrefix = "census-part" $chunkSize = 5MB $fs = [System.IO.File]::OpenRead($inputFile) $buffer = New-Object byte[] $chunkSize $fileNumber = 0 while ($fs.Position -lt $fs.Length) { $bytesRead = $fs.Read($buffer, 0, $chunkSize) $outputFile = "{0}{1:D2}" -f $outputFilePrefix, $fileNumber $fileStream = [System.IO.File]::Create($outputFile) $fileStream.Write($buffer, 0, $bytesRead) $fileStream.Close() $fileNumber++ } $fs.Close()
O script do PowerShell lê o arquivo grande em partes de 5 MB e grava cada uma em um novo arquivo com um sufixo numérico.
Depois de executar o comando apropriado, você deverá ver as partes no diretório no qual executou o comando. Cada parte terá um sufixo correspondente ao número da parte, por exemplo:
census-part00 census-part01 census-part02
Etapa 3: criar o carregamento fracionado com uma soma de verificação adicional
Para iniciar o processo de carregamento fracionado, é necessário criar a solicitação de carregamento fracionado. Essa etapa envolve iniciar o carregamento fracionado e especificar uma soma de verificação adicional para a integridade dos dados. O exemplo a seguir usa a soma de verificação SHA-256. Se você quiser fornecer metadados que descrevam o objeto que está sendo carregado, deverá fornecê-los na solicitação para iniciar o carregamento fracionado.
nota
Nesta etapa e nas etapas subsequentes, este tutorial usa o algoritmo adicional SHA-256. Também é possível usar outra soma de verificação adicional para essas etapas, como CRC32, CRC32C ou SHA-1. Se você usar um algoritmo diferente, deverá usá-lo em todas as etapas do tutorial.
Como iniciar o carregamento fracionado
No terminal, use o comando create-multipart-upload
a seguir para iniciar um carregamento fracionado para o bucket. Substitua
pelo nome do bucket real. Além disso, substitua o amzn-s3-demo-bucket1
census_data_file
pelo nome do arquivo escolhido. Esse nome de arquivo torna-se a chave do objeto quando o upload é concluído.
aws s3api create-multipart-upload --bucket
amzn-s3-demo-bucket1
--key 'census_data_file
' --checksum-algorithm sha256
Se a solicitação for bem-sucedida, você verá uma saída JSON como a seguinte:
{ "ServerSideEncryption": "AES256", "ChecksumAlgorithm": "SHA256", "Bucket": "
amzn-s3-demo-bucket1
", "Key": "census_data_file", "UploadId": "cNV6KCSNANFZapz1LUGPC5XwUVi1n6yUoIeSP138sNOKPeMhpKQRrbT9k0ePmgoOTCj9K83T4e2Gb5hQvNoNpCKqyb8m3.oyYgQNZD6FNJLBZluOIUyRE.qM5yhDTdhz" }
nota
Quando você envia uma solicitação para iniciar um multipart upload, o Amazon S3 retorna uma resposta com um ID de upload, que é um identificador exclusivo do seu multipart upload. É necessário incluir esse ID de upload sempre que fizer upload de partes, listar as partes, concluir um upload ou interromper um upload. Será necessário usar os valores UploadId
, Key
e Bucket
para as etapas posteriores; portanto, lembre-se de salvá-los.
Além disso, se você estiver usando um carregamento fracionado com somas de verificação adicionais, os números das partes deverão ser consecutivos. Se você usar números de parte não consecutivos, a solicitação complete-multipart-upload
poderá gerar um HTTP 500
Internal Server Error
.
Etapa 4: fazer upload das partes do carregamento fracionado
Nesta etapa, você fará upload das partes do carregamento fracionado no bucket do S3. Use o comando upload-part
para fazer upload de cada parte individualmente. Esse processo requer a especificação do ID do upload, do número da parte e do arquivo a ser carregado para cada parte.
Como fazer upload das partes
-
Ao fazer upload de uma parte, além do ID do upload, é necessário especificar o número da parte usando o argumento
--part-number
. Você pode escolher qualquer número de parte entre 1 e 10.000. Um número de parte identifica com exclusividade a parte e sua posição no objeto do qual você está fazendo upload. O número da parte que você escolher não precisa estar em uma sequência consecutiva (por exemplo, pode ser 1, 2 ou 3). Se você fizer upload de uma nova parte usando o mesmo número da parte anteriormente carregada, a parte anteriormente carregada será substituída. -
Use o comando
upload-part
para fazer upload de cada parte do carregamento fracionado. O--upload-id
é o mesmo que estava na saída criada pelo comandocreate-multipart-upload
na Etapa 3. Para fazer upload da primeira parte dos dados, use o seguinte comando:aws s3api upload-part --bucket
amzn-s3-demo-bucket1
--key 'census_data_file
' --part-number1
--bodycensus-part00
--upload-id "cNV6KCSNANFZapz1LUGPC5XwUVi1n6yUoIeSP138sNOKPeMhpKQRrbT9k0ePmgoOTCj9K83T4e2Gb5hQvNoNpCKqyb8m3.oyYgQNZD6FNJLBZluOIUyRE.qM5yhDTdhz
" --checksum-algorithmSHA256
Após a conclusão de cada comando
upload-part
, você deverá ver uma saída como a seguinte:{ "ServerSideEncryption": "AES256", "ETag": "\"e611693805e812ef37f96c9937605e69\"", "ChecksumSHA256": "QLl8R4i4+SaJlrl8ZIcutc5TbZtwt2NwB8lTXkd3GH0=" }
-
Para as partes subsequentes, aumente o número da parte apropriadamente:
aws s3api upload-part --bucket
amzn-s3-demo-bucket1
--key 'census_data_file
' --part-number<part-number>
--body <file-path> --upload-id "<your-upload-id>" --checksum-algorithm SHA256Por exemplo, use o seguinte comando para fazer upload da segunda parte:
aws s3api upload-part --bucket
amzn-s3-demo-bucket1
--key 'census_data_file' --part-number 2 --body census-part01 --upload-id "cNV6KCSNANFZapz1LUGPC5XwUVi1n6yUoIeSP138sNOKPeMhpKQRrbT9k0ePmgoOTCj9K83T4e2Gb5hQvNoNpCKqyb8m3.oyYgQNZD6FNJLBZluOIUyRE.qM5yhDTdhz" --checksum-algorithm SHA256O Amazon S3 exibe uma tag de entidade (ETag) e somas de verificação adicionais para cada parte carregada como cabeçalho na resposta.
-
Continue usando o comando
upload-part
até fazer upload de todas as partes do objeto.
Etapa 5: listar todas as partes do carregamento fracionado
Para concluir o carregamento fracionado, você precisará de uma lista de todas as partes que foram carregadas para esse carregamento fracionado específico. A saída do comando list-parts
fornece algumas informações, como nome do bucket, chave, ID do upload, número da parte, ETag, somas de verificação adicionais etc. É útil salvar essa saída em um arquivo para que você possa usá-la na próxima etapa ao concluir o processo de carregamento fracionado. É possível criar um arquivo de saída JSON chamado parts.json
usando o método a seguir.
Como criar um arquivo que liste todas as partes
-
Para gerar um arquivo JSON com os detalhes de todas as partes carregadas, use o comando
list-parts
a seguir. Substitua
pelo nome real do bucket eamzn-s3-demo-bucket1
<your-upload-id>
pelo ID de upload recebido na Etapa 3. Para ter mais informações sobre o comandolist-parts
, consulte list-parts no Guia do usuário da AWS Command Line Interface.aws s3api list-parts --bucket
amzn-s3-demo-bucket1
--key 'census_data_file
' --upload-id<your-upload-id>
--query '{Parts: Parts[*].{PartNumber: PartNumber, ETag: ETag, ChecksumSHA256: ChecksumSHA256}}' --output json > parts.jsonUm novo arquivo chamado
parts.json
é gerado. O arquivo contém as informações em formato JSON de todas as partes carregadas. O arquivoparts.json
inclui informações essenciais para cada parte do carregamento fracionado, como os números de parte e os valores de ETag correspondentes, os quais são necessários para concluir o processo de carregamento fracionado. -
Abra
parts.json
usando qualquer editor de texto ou pelo terminal. Veja a saída de exemplo:{ "Parts": [ { "PartNumber": 1, "ETag": "\"3c3097f89e2a2fece47ac54b243c9d97\"", "ChecksumSHA256": "fTPVHfyNHdv5VkR4S3EewdyioXECv7JBxN+d4FXYYTw=" }, { "PartNumber": 2, "ETag": "\"03c71cc160261b20ab74f6d2c476b450\"", "ChecksumSHA256": "VDWTa8enjOvULBAO3W2a6C+5/7ZnNjrnLApa1QVc3FE=" }, { "PartNumber": 3, "ETag": "\"81ae0937404429a97967dffa7eb4affb\"", "ChecksumSHA256": "cVVkXehUlzcwrBrXgPIM+EKQXPUvWist8mlUTCs4bg8=" } ] }
Etapa 6: concluir o carregamento fracionado
Depois de fazer upload de todas as partes do carregamento fracionado e listá-las, a etapa final é concluir o carregamento fracionado. Essa etapa mescla todas as partes carregadas em um único objeto no bucket do S3.
nota
É possível calcular a soma de verificação do objeto antes de chamar complete-multipart-upload
incluindo --checksum-sha256
na solicitação. Se as somas de verificação não coincidirem, o Amazon S3 rejeitará a solicitação. Consulte mais informações em complete-multipart-upload no Guia de Usuário AWS Command Line Interface.
Como concluir o carregamento fracionado
Para finalizar o carregamento fracionado, use o comando complete-multipart-upload
. Esse comando requer o arquivo parts.json
criado na Etapa 5, o nome do bucket e o ID do upload. Substitua <
pelo nome do bucket e amzn-s3-demo-bucket1
><your-upload-id>
pelo ID do upload de parts.json
.
aws s3api complete-multipart-upload --multipart-upload file://parts.json --bucket
amzn-s3-demo-bucket1
--key 'census_data_file' --upload-id <your-upload-id>
Veja a saída de exemplo:
{ "ServerSideEncryption": "AES256", "Location": "https://
amzn-s3-demo-bucket1
.s3.us-east-2.amazonaws.com/census_data_file", "Bucket": "amzn-s3-demo-bucket1
", "Key": "census_data_file", "ETag": "\"f453c6dccca969c457efdf9b1361e291-3\"", "ChecksumSHA256": "aI8EoktCdotjU8Bq46DrPCxQCGuGcPIhJ51noWs6hvk=-3" }
nota
Não exclua ainda os arquivos de parte individuais. Você precisará das partes individuais para poder realizar somas de verificação e conferir a integridade do objeto mesclado.
Etapa 7: confirmar se o objeto foi carregado no bucket
Depois de concluir o carregamento fracionado, você poderá verificar se o objeto foi carregado com êxito no bucket do S3. Para listar os objetos no bucket e confirmar a presença do arquivo recém-carregado, use o comando list-objects-v2
Como listar o objeto carregado
Para listar os objetos no bucket, use o bucket de comando list-objects-v2
. Substitua
pelo nome do bucket real. amzn-s3-demo-bucket1
aws s3api list-objects-v2 --bucket
amzn-s3-demo-bucket1
Esse comando exibe uma lista de objetos no bucket. Procure o arquivo carregado (por exemplo, census_data_file
) na lista de objetos.
Para ter mais informações, consulte a seção Examples do comando list-objects-v2
no Guia do usuário do AWS Command Line Interface.
Etapa 8: verificar a integridade do objeto com uma soma de verificação MD5
Ao fazer upload de um objeto, é possível especificar um algoritmo de soma de verificação a ser usado pelo Amazon S3. Por padrão, o Amazon S3 armazena o resumo MD5 de bytes como ETag do objeto. Para carregamentos fracionados, a ETag não é a soma de verificação do objeto completo, mas um composto de somas de verificação de cada parte.
Como verificar a integridade do objeto usando uma soma de verificação MD5
-
Para recuperar a ETag do objeto carregado, faça uma solicitação
head-object
:aws s3api head-object --bucket
amzn-s3-demo-bucket1
--keycensus_data_file
Veja a saída de exemplo:
{ "AcceptRanges": "bytes", "LastModified": "2024-07-26T19:04:13+00:00", "ContentLength": 16106127360, "ETag": "\"f453c6dccca969c457efdf9b1361e291-3\"", "ContentType": "binary/octet-stream", "ServerSideEncryption": "AES256", "Metadata": {} }
Essa ETag tem “-3” anexado ao final. Isso indica que o objeto foi carregado em três partes usando o carregamento fracionado.
-
Depois, calcule a soma de verificação MD5 de cada parte usando o comando
md5sum
. Forneça o caminho correto para os arquivos de parte:md5sum census-part*
Veja a saída de exemplo:
e611693805e812ef37f96c9937605e69 census-part00 63d2d5da159178785bfd6b6a5c635854 census-part01 95b87c7db852451bb38b3b44a4e6d310 census-part02
-
Para esta etapa, combine manualmente os hashes MD5 em uma string. Depois, execute o comando a seguir para converter a string em binário e calcular a soma de verificação MD5 do valor binário:
echo "
e611693805e812ef37f96c9937605e6963d2d5da159178785bfd6b6a5c63585495b87c7db852451bb38b3b44a4e6d310
" | xxd -r -p | md5sumVeja a saída de exemplo:
f453c6dccca969c457efdf9b1361e291 -
Esse valor de hash deve corresponder ao valor de hash do valor da ETag original na Etapa 1, que valida a integridade do objeto
census_data_file
.
Quando você instrui o Amazon S3 a usar somas de verificação adicionais, ele calcula o respectivo valor para cada parte e armazena os valores. Se você quiser recuperar os valores da soma de verificação para partes individuais de carregamentos fracionados ainda em andamento, poderá usar list-parts
.
Consulte mais informações sobre como as somas de verificação funcionam com objetos de carregamento fracionado em Verificar a integridade do objeto no Amazon S3.
Etapa 9: verificar a integridade do objeto com uma soma de verificação adicional
Nesta etapa, este tutorial usa o SHA-256 como uma soma de verificação adicional para validar a integridade do objeto. Se você usou uma soma de verificação adicional diferente, use esse valor de soma de verificação.
Como verificar a integridade do objeto com SHA256
-
Execute o seguinte comando no terminal, incluindo o argumento
--checksum-mode enabled
, para exibir o valorChecksumSHA256
do objeto:aws s3api head-object --bucket
amzn-s3-demo-bucket1
--key census_data_file --checksum-mode enabledVeja a saída de exemplo:
{ "AcceptRanges": "bytes", "LastModified": "2024-07-26T19:04:13+00:00", "ContentLength": 16106127360, "ChecksumSHA256": "aI8EoktCdotjU8Bq46DrPCxQCGuGcPIhJ51noWs6hvk=-3", "ETag": "\"f453c6dccca969c457efdf9b1361e291-3\"", "ContentType": "binary/octet-stream", "ServerSideEncryption": "AES256", "Metadata": {} }
-
Use os comandos a seguir para decodificar os valores
ChecksumSHA256
das partes individuais em base64 e salvá-los em um arquivo binário chamadooutfile
. Esses valores podem ser encontrados no arquivoparts.json
. Substitua as strings base64 de exemplo pelos valoresChecksumSHA256
reais.echo "
QLl8R4i4+SaJlrl8ZIcutc5TbZtwt2NwB8lTXkd3GH0=
" | base64 --decode >> outfile echo "xCdgs1K5Bm4jWETYw/CmGYr+m6O2DcGfpckx5NVokvE=
" | base64 --decode >> outfile echo "f5wsfsa5bB+yXuwzqG1Bst91uYneqGD3CCidpb54mAo=
" | base64 --decode >> outfile -
Execute o seguinte comando para calcular a soma de verificação SHA256 do
outfile
:sha256sum outfile
Veja a saída de exemplo:
688f04a24b42768b6353c06ae3a0eb3c2c50086b8670f221279d67a16b3a86f9 outfile
Na próxima etapa, converta o valor do hash em um valor binário. Esse valor binário deve corresponder ao valor
ChecksumSHA256
da Etapa 1. -
Converta a soma de verificação SHA256 da Etapa 3 em um valor binário e, depois, codifique-o em base64 para verificar se ele corresponde ao valor
ChecksumSHA256
da Etapa 1:echo "688f04a24b42768b6353c06ae3a0eb3c2c50086b8670f221279d67a16b3a86f9" | xxd -r -p | base64
Veja a saída de exemplo:
aI8EoktCdotjU8Bq46DrPCxQCGuGcPIhJ51noWs6hvk=
Essa saída deve confirmar se a saída base64 corresponde ao valor
ChecksumSHA256
da saída do comandohead-object
. Se a saída corresponder ao valor da soma de verificação, o objeto será válido.
Importante
-
Quando você instrui o Amazon S3 a usar somas de verificação adicionais, ele calcula os respectivos valores para cada parte e armazena esses valores.
-
Se você quiser recuperar os valores da soma de verificação para partes individuais de carregamentos fracionados ainda em andamento, poderá usar o comando
list-parts
.
Etapa 10: Limpar os recursos
Se você quiser limpar os arquivos criados neste tutorial, use o método a seguir. Para obter instruções sobre como excluir os arquivos carregados no bucket do S3, consulte Excluir objetos do Amazon S3.
Exclua os arquivos locais criados na Etapa 1:
Para remover os arquivos criados para o carregamento fracionado, execute o seguinte comando no diretório de trabalho:
rm
census-data.bin
census-part* outfile parts.json