AWS S3でフォルダの名称を変更(Java)


AWS S3でフォルダの名称を変更したい

そもそもAWS S3にはフォルダという概念はないので、「フォルダ」という呼称は不適なんですが。
(この場合は、「キー」と呼称するほうが適切なのかな?)

とりあえず便宜上「フォルダ」と呼びます。

AWS S3は一度作ったフォルダの名前は変更できない

いきなり出来ねえってなんだよ、と思われるかもですが出来ません。
ManagementConsoleから変更しようとしてもダメ。

ナンデ?と思った自分は、とりあえず下を見て理解しました。
そらそうだ。Key-Value型の単なるデータストアなんだもんね…

「Amazon S3における「フォルダ」という幻想をぶち壊し、その実体を明らかにする」
https://dev.classmethod.jp/cloud/aws/amazon-s3-folders/

新規フォルダを作成→中身コピー→元フォルダを削除

どないせいっちゅうんじゃ、となりますが以下で実現可能できました。
Unix/Linuxにおけるリネームコマンドと同じ要領ですね。

public void changeFolderName(String bucketName, String oldPrefix, String newPrefix){
    AmazonS3 s3 = new AmazonS3Client(new ClasspathPropertiesFileCredentialsProvider());
    ObjectListing listing = s3.listObjects(bucketName, oldPrefix);

    for (S3ObjectSummary summary: listing.getObjectSummaries()) {
      String oldKey = summary.getKey();
      String newKey = new StringBuilder().append(newPrefix).append(oldKey.substring(oldPrefix.length())).toString();
      s3.copyObject(bucketName, oldKey, bucketName, newKey);
      s3.deleteObject(bucketName, oldKey);
    }
}