Cloud Storage でオブジェクトを書き換えると、既存のオブジェクトがコピーまたは変換されます。たとえば、ロケーション間の移動、暗号鍵のローテーション、ストレージ クラスの変更などが行われます。オブジェクトのサイズと書き換えパラメータによっては、Cloud Storage が 1 回の呼び出しでオペレーションを完了するか、rewrite_token で中間進行状況を返す場合があります。呼び出しが rewrite_token を返したら、書き換えが完了するまで、そのトークンを後続のリクエストに渡します。
このドキュメントでは、Cloud Client Libraries for Rust で rewrite_until_done ヘルパーまたは手動ループを使用して、書き換えリクエストを構成し、書き換えループを駆動する方法について説明します。クライアント ライブラリを初めて使用する場合は、まず Rust で Cloud Storage を使用するをご覧ください。
始める前に
このドキュメントのコードを実行する前に、次の前提条件を満たしてください。
- 課金が有効になっている Google Cloud プロジェクトを作成または選択します。
- プロジェクトに専用のテスト用 Cloud Storage バケットを作成します。
- 使用する環境のアプリケーションのデフォルト認証情報を構成します。
- バケット内のオブジェクトの読み取り、書き込み、削除を行う権限(ストレージ管理者(
roles/storage.admin)など)を持つ Identity and Access Management(IAM)ロールをプリンシパルに付与します。
依存関係
Cloud Storage クライアント ライブラリとサポート クレートを Cargo.toml ファイルに追加します。
cargo add google-cloud-storage google-cloud-gax anyhow bytes
cargo add tokio --features macros,rt-multi-thread
クライアントと書き換えリクエストを準備する
自動ヘルパーと手動ループはどちらも、構成済みの StorageControl クライアントと RewriteObject リクエスト ビルダーから開始されます。projects/_/buckets/BUCKET_ID 形式で bucket_name を受け入れるスコープ内で、次の手順を完了します。
再試行ポリシーを使用して
StorageControlクライアントを初期化します。リクエストごとに少なくとも 30 秒を許可することをおすすめします。この例では、RetryableErrorsを使用して、試行回数を 5 回に制限し、オペレーションごとの全体的な時間制限を設定していません。rewrite_objectリクエスト ビルダーを作成し、クライアントが一時的なエラーを再試行できるようにリクエストをべき等としてマークし、ソースと宛先のバケット名とオブジェクト名を設定します。省略可: 呼び出しごとに書き換えられる最大バイト数を制限して、個々のリクエストがより長いリクエスト タイムアウトを必要とせずに、より速く進行状況を返すようにします。この例では、1 MiB の小さな上限を設定して、複数のイテレーションを強制的に実行します。本番環境では、より大きな値を使用します。
省略可: 宛先オブジェクトのメタデータを指定します。たとえば、ストレージ クラスを Nearline(
NEARLINE)に変更します。
書き換えループを自動的に実行する
ほとんどのユースケースでは、RewriteObjectExt トレイトをスコープに含め、リクエスト ビルダーで rewrite_until_done を呼び出します。このヘルパーは、反復処理全体で rewrite_token を管理し、書き換えが完了した後に宛先 Object メタデータを解決します。
書き換えループを手動で実行する
中間バイト数のログ、チェックポイントの進行状況、別のプロセスからの書き換えの再開が必要な場合は、書き換えループを手動で実行します。
1 つの
RewriteObjectリクエストを送信し、進行状況をログに記録して、resp.doneがtrueの場合は完了したObjectメタデータを、それ以外の場合は次のrewrite_tokenを返すヘルパー関数を定義します。ループ内でヘルパーを呼び出し、各イテレーションでリクエスト ビルダーのクローンを作成し、
make_one_requestがRewriteProgress::Incompleteを返すたびに、返されたトークンをset_rewrite_tokenに渡します。
コードを補完する
次の例では、3 MiB のソース オブジェクトをアップロードし、手動ループを使用して 1 MiB 単位で Nearline Storage ストレージ クラスに書き換えます。書き換えが完了すると、この例ではテスト オブジェクトと空のテストバケットが削除されます。
出力は次のようになります。3 回の反復処理の進行状況と、宛先オブジェクトのメタデータが表示されます。
PROGRESS: total_bytes_rewritten=1048576; object_size=3145728
PROGRESS: total_bytes_rewritten=2097152; object_size=3145728
DONE: total_bytes_rewritten=3145728; object_size=3145728
dest_object=Object { name: "rewrite-object-clone", ... }
クリーンアップ
サンプルが早期に終了した場合、またはクリーンアップ ヘルパーなしで個々のスニペットを実行した場合は、 Google Cloud アカウントに継続的な料金が発生しないように、残りのテスト オブジェクトを削除し、完了したらテストバケットを削除します。