はじめに
Google Cloud Storage(GCS)を使っていて「ファイル名をちょっと変えたいな」と思いやってみたのですが、びっくりする結果だったので地味にハマる人の助けになればと思います。
ローカルのファイルシステムであれば、
mv old.txt new.txt
と一発で終わる作業...
きっとGCSでも同じように「リネーム」ができるだろうと軽く考えていました。
しかし、ここで思わぬ壁にぶつかりました。
リネームは存在しない
GCSには 「リネーム」という概念が存在しません。
最初はコンソール画面を探しまわり、「詳細メニューに隠れているのでは?」とか「CLIに専用コマンドがあるのでは?」と試行錯誤したのですが、どうしても見つからず。
GCSは「オブジェクトストレージ」なので、ファイル名というのは実は「オブジェクトキー」そのもの。
つまりキーを変える = 新しいオブジェクトを作ることを意味し、既存のものをちょっと書き換えるような操作はできないらしい。
どう対応したらいいか
ではどうするのか。
正解は「コピーして、元のファイルを削除する」つまり「rename = copy + delete」
これを自動でやってくれるのが gsutil mv コマンド。
便利ではあるのですが、実態を知ってしまうと少し怖い。なぜなら、数GBの大きなファイルを「ちょっと名前を変えるだけ」のつもりが、裏側ではフルコピーが走ってしまうからです。しかも、元ファイルを消していいのかという業務的な問題もあります。
また、転送料や時間が想定以上にかかる可能性があります。
特に大量のファイルを一気に処理するときには要注意です。
僕はこれを知らずに「なぜこんなに時間がかかるんだ…?」と不思議に思い、調べてようやく納得しました。ローカルと同じ感覚で扱うと痛い目を見る典型例ですね。
クラウドのストレージは便利ですが、仕組みが違う以上、設計思想を理解して使うことが大事だと改めて感じました。
まとめ
まとめると、「GCSにリネームはない。コピーして削除するしかない」。
これを知らないと地味にハマります。
僕のように「簡単に名前変えられるでしょ」と思い込んで探し回る人もきっといるはず。
同じような場面に遭遇した方の参考になれば幸いです。