PythonでGCSのファイルをコピーしようとしたらこんなエラーが出ました。
from google.cloud import storage storage_client = storage.Client() src_bucket = storage_client.bucket(BUCKET_NAME) dst_bucket = storage_client.bucket(OUTPUT_BUCKET_NAME) src_file_name = "hoge.gz" dst_file_name = "hoge.gz" src_blob = src_bucket.blob(src_file_name) new_blob = dst_bucket.copy_blob(src_blob, dst_bucket, new_name=dst_file_name, timeout=180) new_blob.acl.save(src_blob.acl)
エラー内容
Copy spanning locations and/or storage classes could not complete within 30 seconds. Please use the Rewrite method (https://cloud.google.com/storage/docs/json_api/v1/objects/rewrite) instead.
なんかtimeout=180も効いてないみたいです。
どうやらコピーしようとしているファイルが数GBと少々大きい場合このようなエラーが出るそうです。
メッセージにあるようにrewriteメソッドを使えとあります。
書き直してみました。
from google.cloud import storage storage_client = storage.Client() src_bucket = storage_client.bucket(BUCKET_NAME) dst_bucket = storage_client.bucket(OUTPUT_BUCKET_NAME) src_file_name = "hoge.gz" dst_file_name = "hoge.gz" src_blob = src_bucket.blob(src_file_name) dst_blob = dst_bucket.blob(dst_file_name) rewrite_token = None while True: rewrite_token, bytes_rewritten, total_bytes = dst_blob.rewrite(src_blob, token=rewrite_token) progress_percent = (bytes_rewritten * 100) // total_bytes print(f"Progress : {bytes_rewritten} / {total_bytes} bytes {progress_percent}%.") if rewrite_token is None: print("Copy has done !!") break
実行してみると
Progress : 461373440 / 1899448698 bytes 24%. Progress : 964689920 / 1899448698 bytes 50%. Progress : 1509949440 / 1899448698 bytes 79%. Progress : 1899448698 / 1899448698 bytes 100%. Copy has done !!
気になったrewrite_tokenはなんかランダムな値でしたので省略します。