[JAVA] Ich war ein wenig süchtig nach dem S3-Prüfsummenvergleich, machen Sie sich also eine Notiz.

Wie immer ist es ein Nachdruck aus dem Blog. https://munchkins-diary.hatenablog.com/entry/2019/10/28/230924 Ich habe in letzter Zeit nicht viel geschrieben, aber ich möchte es bald wieder aufnehmen.

Ich schrieb, dass es leicht ist, süchtig nach der Methode zu werden, die Prüfsumme der Datei in S3 abzurufen, und wie man die Prüfsumme der Datei mit Java als Bonus unten berechnet.

Ich hoffe es hilft jemandem. (Nicht zu viel)

Ich möchte die Prüfsumme von S3 vergleichen

Ich habe einen Prozess geschrieben, in dem eine Datei mit mehreren GB in S3 aufgelistet ist, und wollte es aufgrund eines Fehlers bei der nachfolgenden Verarbeitung erneut versuchen.

In diesem Fall ist es erneut verschwenderisch, die Datei erneut hochzuladen. Es besteht jedoch die Möglichkeit, dass die Zieldatei im Migrationsquellenspeicher geändert wurde. Daher möchte ich den Upload nur wiederholen, wenn ich bereits die "genau gleiche" Datei in S3 habe.

In diesem Fall ist es einfach, Prüfsummen zu vergleichen, daher habe ich den folgenden Code mit der getObjectMetaData-API von S3 geschrieben.

 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;
      }
    }

Aber es funktioniert nicht. ObjectMetaData # contentMD5 ist unweigerlich null.

Nach der Überprüfung scheint die Prüfsumme des vorhandenen Objekts in S3 an "Etag" anstatt an contentMD5 übergeben zu werden.

Wofür wird contentMD5 dann verwendet? Es wird zum Zeitpunkt der Aktualisierung zum HTTP-Header hinzugefügt und zur Manipulationsbestätigung (korrekte Verwendung) in S3 verwendet, sodass es nicht zurückgegeben wird, wenn ein Objekt mit get abgerufen wird.

Wenn Sie also die Prüfsumme der aus S3 abgelegten Datei wissen möchten, müssen Sie sie mit Etag vergleichen.

So was.

    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;
      }
    }

Das funktioniert gut. Ich hoffe es hilft jemandem.

Bonus So überprüfen Sie die Prüfsumme in Java

Für diejenigen, die mit Prüfsumme gegoogelt haben und eingeflogen sind, erfahren Sie hier, wie Sie die Prüfsumme in Java berechnen.

  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";
    }
  }

Ändern Sie für sha256 einfach DigestUtils # md5Hex in DigestUtils # sha256Hex.

Das war ein Memo.

Recommended Posts

Ich war ein wenig süchtig nach dem S3-Prüfsummenvergleich, machen Sie sich also eine Notiz.
Ich war süchtig nach der Rollmethode
Ich war süchtig nach dem Spring-Batch-Test
Eine Geschichte, der ich beim Testen der API mit MockMVC verfallen war
Ich war ein wenig süchtig nach SSH-Verbindung von Mac zu Linux (Ubuntu)
Ich war süchtig nach NoSuchMethodError in Cloud-Endpunkten
Ich habe den lesbaren Code gelesen, machen Sie sich also eine Notiz
Beachten Sie, dass ich von den Einstellungen des Android-Projekts von IntelliJ IDEA abhängig war
Wovon ich bei der Einführung der JNI-Bibliothek süchtig war
Ich war süchtig danach, die Update-Anweisung in MyBatis zu wiederholen
Ich habe JAX-RS ausprobiert und mir das Verfahren notiert
Ich war süchtig nach Laradock + VSCode + xdebug
Was ich mit der Redmine REST API süchtig gemacht habe
Die Geschichte, nach der ich beim Einrichten von STS süchtig war
Kintone-Klon? Ich war ziemlich süchtig danach, die OSS WebDB-Erweiterung mit Lightsail + Docker zu starten. Notieren Sie sich dies.
Ich war süchtig danach, sbt zu starten
[Circle CI] Eine Geschichte, der ich bei Start Building verfallen war
Ich habe den Java-Test Level 2 bestanden und werde eine Notiz hinterlassen
Ich habe ein Juwel gemacht, um den Text des Org-Modus in Qiita zu posten
Über die Sache, dass ich süchtig danach war, wie man Hashmap benutzt
Ich habe ein Tool erstellt, um den Unterschied zwischen CSV-Dateien auszugeben
Ich war süchtig nach der API-Version min23 von registerTorchCallback
Rails war schwierig, deshalb habe ich so etwas wie einen Spring Framework-Controller gemacht, um eine Pause einzulegen
Ein Memo, das nüchtern von der Anfrage nach mehrteiligen / Formulardaten abhängig war
Memorandum: Wovon ich süchtig war, als ich auf die Accounting Freee API traf
[Rails] Ich war süchtig nach den Nginx-Einstellungen, als ich Action Cable verwendete.
Eine Geschichte, der ich mit der automatischen Starteinstellung von Tomcat 8 unter CentOS 8 zweimal verfallen war
Ich hatte Probleme bei der Arbeit und habe ein IntelliJ-Plug-In erstellt
Ich war süchtig nach einem einfachen Test von Jedis (Java-> Redis-Bibliothek)
Probleme, denen ich beim Erstellen der Digdag-Umgebung mit Docker verfallen war
Ich war süchtig danach, in @ SpringApplicationConfiguration-> @SpringBootTest umzuschreiben
Es war ein Leben, in dem ich den thread-sicheren assoziativen Zähler zurücksetzen wollte
Ich war süchtig nach Scrollview, weil ich nicht auf die UIView mit variabler Größe tippen konnte
[Circle CI] Ich war süchtig nach dem automatischen Test von Circle CI (Rails + MySQL) [Memo]
Ich war süchtig nach Unit-Tests mit dem Pufferoperator in RxJava
Ich konnte OCJP Silver SE 11 sicher erhalten, also eine Zusammenfassung
[Java-Anfänger] Ich habe ein etwas tieferes Verständnis von "Es ist Zeit, neue zu verwenden", also machen Sie sich eine Notiz
SpringSecurity Ich war süchtig danach, mich mit einem Hash-Passwort anzumelden (gelöst)
[Kleine Geschichte] Ich habe versucht, die Java-ArrayList etwas komfortabler zu gestalten
Ich war süchtig nach RXTX mit Sierra
Ich habe einen Docker-Container erstellt, um Maven auszuführen
Ich war süchtig danach, onActivityResult () mit DialogFragment zu machen
Wovon ich süchtig war, als ich eine Spring Boot-Anwendung mit VS Code entwickelte
Beachten Sie, dass ich süchtig nach Stapelverarbeitung mit Spring Boot war
Der Teil, dem ich in "Einführung in Ajax in Java-Webanwendungen" von NetBeans verfallen war
Eine Geschichte, nach der ich süchtig war, als ich einen Schlüssel bekam, der automatisch auf MyBatis ausprobiert wurde
Ich habe ein Check-Tool für das Release-Modul erstellt
Ich habe eine Methode entwickelt, um nach Premium Friday zu fragen
Ich habe den "Object-Oriented Practice Guide" gelesen, also ein Memorandum
Ich möchte der Kommentarfunktion eine Löschfunktion hinzufügen
Eine Geschichte, die mich während des Komponententests von der impliziten Typkonvertierung von ActiveRecord abhängig machte
Der Artikel für Neuankömmlinge hat mich inspiriert. Notieren Sie ihn sich, damit Sie Ihre ursprünglichen Absichten nicht vergessen.
Was ich beim Update auf Spring Boot 1.5.12 behoben habe ・ Wovon ich süchtig war
Wovon ich süchtig war, als ich rspec auf Schienen benutzte
Ich habe ein Plug-In erstellt, das Jextract mit Gradle-Aufgaben ausführt