課題
AWS SDK for Javaで、S3メタデータを扱うとき、日本語でまとまった情報を入手するのに苦労しました。
解決方針
どのようにSDKを利用したか、この記事にまとめます。
方法
前提
- Javaバージョン: 17
- AWS SDKバージョン: v2
書き込み
アップロードのリクエストにメタデータを付加します。メタデータはMap<String, String>
の型で付加します。
例として、指定したバケットにファイルをアップロードするuploadFileToS3
メソッドを、以下に記載します。
// S3クライアントを用意
private final S3Client s3Client;
private void uploadFileToS3(
byte[] file
, String bucketName
, String key
, Map<String, String> metadata
) {
try {
s3Client.putObject(builder -> builder.bucket(bucketName).key(key).metadata(metadata).build(), RequestBody.fromBytes(file));
} catch (Exception e) {
throw new RuntimeException("ファイルのS3へのアップロードに失敗しました。", e);
}
}
注意点
メタデータのキーにはx-amz-meta-
というプレフィックスを付ける必要があります。例えば、date
というキーのメタデータを付加したい場合、以下のようにマップを作成する必要があります。
Map<String, String> metadata = new HashMap<>();
metadata.put("x-amz-meta-date", "2024-04-01");
読み込み
まず、オブジェクトの情報をHeadObjectResponse
型で取得し、そこからメタデータを取り出します。書き込み時と同じく、メタデータはMap<String, String>
の型で取得できます。
例として、指定したオブジェクトのメタデータを取得するgetMetadata
メソッドを、以下に記載します。
// S3クライアントを用意
private final S3Client s3Client;
public Map<String, String> getMetadata(String bucketName, String key) {
return s3Client.headObject(builder -> builder.bucket(bucketName).key(key).build()).metadata();
}
注意点
メタデータのキーは、書き込み時とは逆に、プレフィックスx-amz-meta-
が外された状態で返却されます。例えば、date
というキーのメタデータを取得したい場合、そのままdate
というキーを指定して、値を取得します。
Map<String, String> metadata = getMetadata("sample-backet", "sample-object");
System.out.println(metadata.get("date"));
// "2024-04-01"