0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

S3オブジェクトの変更を確認してダウンロードする

Last updated at Posted at 2021-07-15

AWS SDK for JAVA を使用し、S3オブジェクトをアップロード、ダウンロードするScalaプログラムを書いた。依存するプログラムですでにV1が使用されていたのでV1を使用した。
ダウンロード処理ではS3オブジェクトの内容が変更されたときのみダウンロードを実行する。

https://aws.amazon.com/jp/sdk-for-java/
https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/

ハマった箇所が2つあったのでまとめる。

基本的なアップロードとダウンロード

まず、S3オブジェクトのアップロードとダウンロードをサンプルを見ながら基本的な動作を実装した。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/upload-objects.html
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/download-objects.html

アップロード処理については常に実行し、ダウンロードするときに前回のハッシュ値と見比べる方法で実装することにした。

ハッシュ値

オブジェクトのハッシュ値を取得する方法を調べる。

Content-MD5

とりあえずシステム定義のメタデータ一覧を確認する。

Content-MD5 がオブジェクトのハッシュ値のようだ。

しかし、いざAWS SDKで取得してみると空になっていた。アップロード時の整合性を確認するためにローカルで生成したハッシュ値を送信し、さらにオプションで保存してメタデータとして返せるようになると言うもののようだ。

ETag

厳密にはコンテンツのハッシュ値とは限らないのだが、今回の用途では ETag が使用できる。Consoleでもこの値は確認できる。メタデータの一覧には記載されていないが、しっかりメタデータとして取得できるので利用する。

ネットワーク接続のクローズ

SDKでは getObject によりオブジェクトを取得し、コンテンツは getContentInputStream が、 メタデータは getObjectMetadata で取得できるようだ。 getContent のストリームは使い終わったら閉じろとあるのでそのように書いた。

ネットワーク接続は、すべてのデータを読み取るか、入力ストリームを閉じるまで開いたままになります。ストリーミングのコンテンツは可能な限り迅速に読み取ることをお勧めします。

しかし、すぐに接続数が多いとエラーになってしまった。getObjectの時点でネットワーク接続が開始され、ストリームを使い終わるかgetObjectで返されたS3Objectcloseを呼び出すまで切断されないようだ。getObject 以外でメタデータを取得したいところだが、調べると getObjectMetadata があったので使用する。

V2のドキュメントではこのメソッドはClientには見当たらなかったので、もしかするとV2では getObject の挙動が違うかもしれない。

この AmazonS3getObjectMetadataを使うことで問題は解決した。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?