[JAVA] J'étais un peu accro à la comparaison S3 Checksum, alors prenez note.

Comme toujours, c'est une réimpression du blog. https://munchkins-diary.hatenablog.com/entry/2019/10/28/230924 Je n'ai pas beaucoup écrit récemment, mais je veux le reprendre bientôt.

J'ai écrit qu'il est facile de devenir accro à la méthode d'obtention de la somme de contrôle du fichier sur S3, et comment calculer la somme de contrôle du fichier avec Java en bonus en bas.

J'espère que cela aide quelqu'un. (Pas trop)

Je veux comparer la somme de contrôle de S3

J'écrivais un processus répertoriant un fichier de plusieurs Go dans S3 et je voulais réessayer en raison d'un échec du traitement ultérieur.

Dans ce cas, il est inutile de retélécharger le fichier, mais il est possible que le fichier cible dans le stockage source de migration ait été modifié. Par conséquent, je ne veux réessayer le téléchargement que si j'ai déjà le fichier «exactement le même» sur S3.

Dans ce cas, il est facile de comparer les sommes de contrôle, j'ai donc écrit le code comme suit en utilisant l'API getObjectMetaData de S3.

 private boolean shouldSkip(String bucketName, String key, String md5CheckSum) {
      try {
        ObjectMetadata meta = s3Client.getObjectMetadata(bucketName, key);
        if (meta == null || meta.getContentMD5() == null) {
          log.info("meta data not exist for the file {} in bucket {}", key, bucketName);
          return false;
        }
        log.info(
            "Checksum of existing file is {} and present file checksum is {}",
            meta.getContentMD5(),
            md5CheckSum);
        return meta.getContentMD5().equals(md5CheckSum);
      } catch (SdkClientException e) {
        log.error("Exception thrown while validating the checksum of the file {}", key, e);
        return false;
      }
    }

Mais ça ne marche pas. ʻObjectMetaData # contentMD5` est inévitablement nul.

Après vérification, il semble que la somme de contrôle de l'objet existant dans S3 soit donnée à ʻEtag` au lieu de contentMD5.

Ensuite, à quoi sert contentMD5? Il est ajouté à l'en-tête HTTP au moment de la mise à jour et utilisé pour la confirmation de falsification (utilisation correcte) dans S3, de sorte qu'il n'est pas retourné lors de l'obtention d'un objet avec get.

Par conséquent, si vous souhaitez connaître la somme de contrôle du fichier supprimé de S3, vous devez la comparer avec Etag.

Comme ça.

    private boolean shouldSkip(String bucketName, String key, String md5CheckSum) {
      try {
        ObjectMetadata meta = this.s3Client.getObjectMetadata(bucketName, key);
        if (meta == null || meta.getETag() == null) {
          log.info("meta data not exist for the file {} in bucket {}", key, bucketName);
          return false;
        }
        log.info(
            "Checksum of existing file is {} and present file checksum is {}",
            meta.getETag(),
            md5CheckSum);
        return meta.getETag().equals(md5CheckSum);
      } catch (SdkClientException e) {
        log.error("Exception thrown while validating the checksum of the file {}", key, e);
        return false;
      }
    }

Cela fonctionne très bien. J'espère que cela aide quelqu'un.

Bonus Comment vérifier la somme de contrôle en Java

Pour ceux qui ont recherché une somme de contrôle sur Google et sont arrivés par avion, voici comment calculer la somme de contrôle en Java.

  public static String checkMd5Checksum(File file) {
    try (BufferedInputStream is = new BufferedInputStream(new FileInputStream(file))) {
      return DigestUtils.md5Hex(is);
    } catch (Exception e) {
      // Not likely to occur.
      log.error(
          "ERROR Happened while calculating the check sum for file {}", file.getAbsolutePath(), e);
      return "NOT FOUND";
    }
  }

Pour sha256, changez simplement DigestUtils # md5Hex en DigestUtils # sha256Hex.

C'était un mémo.

Recommended Posts

J'étais un peu accro à la comparaison S3 Checksum, alors prenez note.
J'étais accro à la méthode du rouleau
J'étais accro au test Spring-Batch
Une histoire à laquelle j'étais accro lors du test de l'API à l'aide de MockMVC
J'étais un peu accro à la connexion ssh de mac à linux (ubuntu)
J'étais accro à NoSuchMethodError dans Cloud Endpoints
J'ai lu le code lisible, alors prends note
Notez que j'étais accro aux paramètres du projet Android d'IntelliJ IDEA
Ce à quoi j'étais accro lors de l'introduction de la bibliothèque JNI
J'étais accro à la mise à jour de la déclaration dans MyBatis
J'ai essayé JAX-RS et pris note de la procédure
J'étais accro au réglage de laradock + VSCode + xdebug
Ce à quoi j'étais accro avec l'API REST Redmine
L'histoire à laquelle j'étais accro lors de la création de STS
clone de kintone? J'étais assez accro au lancement de l'extension OSS WebDB avec Lightsail + Docker, alors prenez-en note.
J'étais accro au démarrage de sbt
[Circle CI] Une histoire à laquelle j'étais accro chez Start Building
J'ai réussi le test Java niveau 2, je vais donc laisser une note
J'ai fait un petit bijou pour poster le texte du mode org sur qiita
À propos de la question pour laquelle j'étais accro à l'utilisation de hashmap
J'ai créé un outil pour afficher la différence du fichier CSV
J'étais accro au paramètre API version min23 de registerTorchCallback
Les rails étaient difficiles, alors j'ai fait quelque chose comme un contrôleur Spring Framework pour faire une pause
Un mémo sobrement accro à la demande de multipart / form-data
Mémorandum: Ce à quoi j'étais accro quand j'ai frappé l'API de comptabilité freee
[Rails] J'étais accro aux paramètres nginx lors de l'utilisation d'Action Cable.
Une histoire à laquelle j'étais accro à deux reprises avec le paramètre de démarrage automatique de Tomcat 8 sur CentOS 8
J'avais des problèmes au travail, j'ai donc créé un plug-in IntelliJ
J'étais accro à un simple test de Jedis (bibliothèque Java-> Redis)
Problèmes auxquels j'étais accro lors de la création de l'environnement digdag avec docker
J'étais accro à la réécriture sur @ SpringApplicationConfiguration-> @SpringBootTest
C'était une vie que je voulais réinitialiser le compteur associatif thread-safe
J'étais accro au scrollview car je ne pouvais pas appuyer sur la taille variable UIView
[Circle CI] J'étais accro au test automatique de Circle CI (rails + mysql) [Memo]
J'étais accro aux tests unitaires avec l'opérateur de tampon dans RxJava
J'ai pu obtenir OCJP Silver SE 11 en toute sécurité, donc un résumé
[Java débutant] J'ai une compréhension un peu plus approfondie de "Il est temps d'utiliser le nouveau", alors prenez note
SpringSecurity J'étais accro à essayer de me connecter avec un mot de passe haché (résolu)
[Petite histoire] J'ai essayé de rendre java ArrayList un peu plus pratique
J'étais accro à l'utilisation de RXTX avec Sierra
J'ai créé un conteneur Docker pour exécuter Maven
J'étais accro à faire onActivityResult () avec DialogFragment
Ce à quoi j'étais accro lors du développement d'une application Spring Boot avec VS Code
Notez que j'étais accro au traitement par lots avec Spring Boot
La partie à laquelle j'étais accro dans "Introduction à Ajax dans les applications Web Java" de NetBeans
Une histoire à laquelle j'étais accro lors de l'obtention d'une clé qui a été automatiquement essayée sur MyBatis
J'ai créé un outil de vérification pour le module de version
J'ai fait une méthode pour demander la prime vendredi
J'ai lu le "Guide pratique orienté objet", donc un mémorandum
Je souhaite ajouter une fonction de suppression à la fonction de commentaire
Une histoire dans laquelle j'étais accro à la conversion de type implicite d'ActiveRecord lors du test unitaire
J'ai été inspiré par l'article destiné aux nouveaux arrivants, alors prenez-en note pour ne pas oublier votre intention initiale
Ce que j'ai corrigé lors de la mise à jour vers Spring Boot 1.5.12 ・ Ce à quoi j'étais accro
Ce à quoi j'étais accro en utilisant rspec sur des rails
J'ai créé un plug-in qui exécute jextract avec des tâches Gradle