📚

【Azure Blob Storage × AzCopy】フォルダ移行での失敗と正しいコピー方法

に公開

はじめに

業務でAzure Storage(Azure Blob Storage)を扱う中で/配下のファイル全てを引っ越したい場面があり、少し工程を踏む必要があったので記事に残します。
※az及びazcopyはインストールされている想定です。

状況について

例えになりますが以下のような状況です。

<AsIs>

aaa/bbb/ccc/ddd.txt

上記のccc配下には複数のファイルがある想定。

<ToBe>

zzz/bbb/ccc/ddd.txt

bbb配下をzzz配下へ移行したい。

SAS の用意

以下を実行

az storage container generate-sas \
  --account-name {ストレージ名} \
  --name sample-container \
  --permissions rlw \
  --expiry 2026-01-01 \
  --output tsv

上記コマンドは、Blob コンテナに対して
読み取り(Read)・書き込み(Write)・一覧(List) の操作を許可する
SAS トークンを発行する例です。

実行

azcopy copy \
  "https://storage.blob.core.windows.net/container/aaa/bbb/*?{発行したSAS}" \
  "https://storage.blob.core.windows.net/container/zzz/?{発行したSAS}" \
  --recursive=true

上記実行後ストレージを確認すると

zzz/aaa/bbb/ccc/ddd.txt

コピー元のパスが連結されてしまいました。。。

パスが連結されてしまった原因

コピー先がzzzのみだったため元の階層が保持されなかった
そのため、コピー元のパスに「bbb/」を含めるを含めてあげる必要がありました。

実行

$ azcopy copy \
  "https://example.blob.core.windows.net/container/aaa/bbb/*?{発行したSAS}" \
  "https://example.blob.core.windows.net/container/zzz/bbb/?{発行したSAS}" \
  --recursive=true

結果を見てみてみると

zzz/bbb/ccc/ddd.txt

理想通りの形式になっていました。

終わりに

Azure blob Storageや他のクラウドサービスのストレージは/ごとに階層分けされているように思いがちですが、区切り文字でしかないため改めて注意が必要と感じました。
今後もAzure関連でトラブルシュートなどした際はまとめたいと思います。

Discussion