В феврале 2022 года Amazon S3 выпустил новую функцию контрольной суммы, которая позволяет проверять целостность без необходимости загрузки данных объекта (сообщение в блоге, документация). Сегодня я рад представить s3verify, новую программу, которую я разработал в связи с этой функцией. Прежде чем рассказать о моей программе, я хочу объяснить, что представляет собой новая функция S3 и почему она так полезна.
Ранее единственным встроенным способом попытаться провести стандартизированную проверку такого рода было использование ETag объекта. Однако ETag можно использовать для этой цели только в том случае, если объект не зашифрован, что неприемлемо для большинства пользователей в наши дни. Для зашифрованных объектов ETag, скорее всего, является контрольной суммой шифротекста, а это, вероятно, все, что требуется процессу проверки ошибок S3, чтобы убедиться, что данные не были повреждены. Такое положение дел уже давно не радует, вынуждая пользователей S3 придумывать собственные схемы проверки. Я предполагаю, что многие крупные клиенты Amazon просили их решить эту проблему, и в начале этого года изменения наконец-то произошли!
Когда вы загружаете файл на S3, теперь вы можете указать алгоритм контрольной суммы (SHA-1, SHA-256, CRC-32 или CRC-32C). Ваш клиент будет вычислять контрольную сумму во время загрузки и отправлять ее в конце с помощью HTTP-трейлера. Пока S3 получает данные, он будет выполнять такое же вычисление контрольной суммы на своей стороне, и по завершении загрузки он отклонит загрузку, если две контрольные суммы не совпадут. Затем эта контрольная сумма неизменно хранится в метаданных объекта на протяжении всего срока его существования, что делает ее доступной впоследствии без необходимости загрузки данных объекта. Контрольную сумму невозможно изменить или случайно удалить из объекта. Легкий доступ к контрольной сумме особенно полезен для объектов на Glacier, извлечение которых может быть очень дорогостоящим и занимать несколько дней.
Если у вас есть существующие объекты, которые не были загружены с алгоритмом контрольной суммы, то вам нужно либо сделать копию объекта (используя CopyObject с заголовком x-amz-checksum-algorithm
), либо загрузить объект с нуля с выбранным алгоритмом контрольной суммы. Эта процедура может стать хорошей темой для будущей статьи в блоге.
Когда у вас есть объект S3 с контрольной суммой, вы можете спросить себя: как теперь ее проверить? 🤔
К сожалению, Amazon не выпустил никакого собственного инструмента для такой проверки, хотя прошло уже 6 месяцев с момента появления этой функции. Я ожидал, что в конце концов появится подкоманда aws cli, но этого не произошло. Они выпустили некоторый справочный код на Java, использующий AWS SDK, на этой странице документации, но он очень сложен для использования большинством людей.
Я решил восполнить этот пробел, создав s3verify. Она позволяет очень легко проверить, что локальный файл идентичен объекту S3, без необходимости загружать данные объекта. Она работает только с объектами, которые были загружены с использованием новой функции контрольной суммы.
Программа очень проста, просто вызовите ее и укажите на локальный файл и объект S3, и она скажет вам, идентичны ли они:
$ s3verify important-backup-2021.zip s3://mybucketname/important-backup-2021.zip
Fetching S3 object information...
S3 object checksum: x5AZd/g+YQp7l0kwcN8Hw+qqXZj2ekjAHG0yztmkWXg=
Object consists of 21 parts.
Part 1: fiP2aEgcQGHHJgmce4C3e/a3m50y/UJHsYFojMS3Oy8= OK
Part 2: /lRdaagPhvRL9PxpQZOTKLxr1+xX64bYN6hknuy9y3k= OK
Part 3: nS/vLGZ13Cq7cGWlwW3QnLkJaDTRrY8PUgsCGs9abKU= OK
Part 4: HJWCIDAo8MY0nk5m4uBvUJ5R0aZzPAWJPE9F9WheEAk= OK
Part 5: JExPU8KHhBJ1K+fh/p0gNT50ueRi6BxOL3XXSvHVUgQ= OK
Part 6: gyp/OaxJqKz1mYWAZadtNhBgqEXpDUvMVuIZybwD1ic= OK
Part 7: 1RcmmE8STey0mE33MXrzFAXbWrjawaVbnXeX5GB/F/Y= OK
Part 8: XdcyPdbc2OYgF0NE/c9Q5vBgI8BXlv8tLZB3g6ETvlI= OK
Part 9: pOKv/u4hlfGEpaBE5YTKA3IlVQDY+hMlySbdh9dfqsI= OK
Part 10: W4WKSjF+blMinRdP9EcJ9mSDQMMyAUn0KfFgCWv8ZxI= OK
Part 11: nP35yqHA+Pgum8yWeeXRZU/jPGF/ntnAR+rqOcwlhqk= OK
Part 12: aoEWVZnc/8ualswzKmMXWZaQg/Bg/4zFs1MGQQTpHV0= OK
Part 13: LVMnzhFxBPzFfVRFzilrfNCPX8zJhu1jNSNn7cZYmew= OK
Part 14: OrcQx1cNqtatD6WGf4kA2R/ld7rVzQTkzbL9rAtYLDY= OK
Part 15: 1+1AxALVTubSsdBW1qXs2toyCLDpq81I+ivFKPAzogs= OK
Part 16: 3kPLbv0PCSlATrTOdzin03KbAezfi165l1Tq09gAN0Q= OK
Part 17: IPTEvMXa/ZZe8IabeFDNWAF8hBV7dwNsu3wXJrBHwRE= OK
Part 18: IOhxLxcmmqWvRi+y6ITVaPyFLzjo4wAB4f7e7I6CFYc= OK
Part 19: tGCw1J2c2dYlZdxlxvLX+w4r6Cp9S5WhN7hJeRXJMUo= OK
Part 20: sMH7Jh9qH/nUOue0/oBaaPYJXf8S81j6p7LoMub+7H8= OK
Part 21: q5W9UMl7As4VVuEJcdvQC1ENyAVM2AlLc9utiEF4v4E= OK
Checksum of checksums: x5AZd/g+YQp7l0kwcN8Hw+qqXZj2ekjAHG0yztmkWXg=
Checksum matches! File and S3 object are identical.
Если контрольные суммы не совпадают, вы увидите следующее:
Checksum MISMATCH! File and S3 object are NOT identical!
Если размер файла и размер объекта S3 не совпадают, то вы увидите аналогичную ошибку (в этом случае хэширование не будет выполняться).
Я надеюсь, что s3verify будет вам полезен. Если у вас возникнут проблемы с ее использованием, пожалуйста, оформите проблему в репозитории GitHub. Это отличный компаньон к моим предыдущим программам для S3, shrimp и s3sha256sum.
P.S. К сожалению, aws s3 cp
пока не имеет аргумента --checksum-algorithm
. Очень странно, что они до сих пор не добавили его. Тем не менее, вы можете использовать shrimp, поскольку он полностью поддерживает загрузку объектов с этой новой функцией контрольной суммы.
P.P.S. Существует еще один старый проект под названием s3verify, который в настоящее время занимает более высокие позиции в большинстве поисковых систем. Он не связан с проверкой целостности объектов. Надеюсь, мой проект скоро обгонит его в рейтинге поисковых систем.