Cloud Storage との間でデータを転送する

Google Cloud Managed Lustre は、Cloud Storage からデータをインポートし、データをエクスポートできます。データ転送は増分です。転送先にまだ存在しないファイル、または転送後に変更されたファイルのみがコピーされます。

階層型名前空間が有効になっている Cloud Storage バケットでは、標準バケットと比較して、Managed Lustre との間で高速な転送速度を実現できます。

制限事項

一度に有効にできる転送オペレーションは、インスタンスごとに 1 つだけです。以前の転送オペレーションがまだ実行中に 2 つ目の転送オペレーションを開始しようとすると、次のようなエラーが発生します。

ERROR: (gcloud.lustre.instances.export-data) ABORTED: unable to queue the operation

Cloud Storage の下り(外向き)帯域幅に関する考慮事項

Cloud Storage では、リージョンごとにプロジェクトあたり最大 200 Gbps のデフォルトの下り(外向き)帯域幅が提供されます。ワークロードでより高速なデータ転送速度が必要な場合は、下り(外向き)帯域幅の上限の引き上げをリクエストできます。詳細については、Cloud Storage の帯域幅の割り当てをご覧ください。

必要な権限

移行を開始する権限

転送の開始に使用されるユーザーまたはサービス アカウントには、次の権限が必要です。

  • lustre.instances.exportData を使用して、Managed Lustre から Cloud Storage に転送します。
  • lustre.instances.importData

これらの権限はどちらも、roles/lustre.admin ロールで付与されます。カスタムロールを作成して、権限を個別に付与できます。

Managed Lustre サービス エージェントの権限

Managed Lustre サービス エージェントを取得する

Managed Lustre サービス エージェントは、プロジェクトで Managed Lustre インスタンスを初めて作成するときに作成されます。サービス エージェント ID の形式は service-PROJECT_NUMBER@gcp-sa-lustre.iam.gserviceaccount.com です。

Managed Lustre サービス エージェントがまだない場合
  1. services identity create コマンドを実行します。

    gcloud beta services identity create \
      --service=lustre.googleapis.com \
      --project=PROJECT_NUMBER_OR_ID
    

    PROJECT_NUMBER_OR_ID は、マネージド Lustre インスタンスを作成するプロジェクトのプロジェクト番号または ID に置き換えます。出力は次のようになります。

    Service identity created: service-1234567890@gcp-sa-lustre.iam.gserviceaccount.com
    
  2. 次の手順で使用するサービス エージェント ID の値をコピーします。

Managed Lustre インスタンスをすでに作成している場合
  1. サービス エージェント ID を作成するには、プロジェクト番号を取得します。PROJECT_NUMBERプロジェクト ID と同じではありません。

    • プロジェクト ID は、文字、数字、ハイフンの組み合わせで構成される一意の文字列です。プロジェクトを作成するときにプロジェクト ID を指定します。例: example-project-123
    • プロジェクト番号は、数字のみで構成される、プロジェクトに対して自動的に生成される一意の識別子です。例: 1234567890

    特定のプロジェクト ID の PROJECT_NUMBER を取得するには、gcloud projects describe コマンドを使用します。

    gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    
  2. 返されたプロジェクト番号をサービス エージェント ID にコピーします。

    service-PROJECT_NUMBER@gcp-sa-lustre.iam.gserviceaccount.com
    
  3. 次の手順で使用するサービス エージェント ID をコピーします。

権限を付与する

Managed Lustre サービス エージェントには、次のいずれかの Cloud Storage ロールが必要です。

  • Cloud Storage 間でデータを転送するには: Cloud Storage バケットに対する roles/storage.objectUser
  • Cloud Storage からのみ転送する場合: Cloud Storage バケットに対する roles/storage.objectViewer

これらのロールのいずれかを付与するには、次の gcloud コマンドを実行します。

gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
  --member=serviceAccount:SERVICE_AGENT_IDENTITY \
  --role=roles/storage.objectViewer_OR_objectUser

SERVICE_AGENT_IDENTITY は、前の手順で取得したマネージド Lustre サービス エージェント ID です。

Managed Lustre にデータをインポートする

Cloud Storage バケットからデータをインポートできます。バケットは、同じプロジェクトに配置することも、別のプロジェクトに配置することもできます。バケットは Managed Lustre インスタンスとは異なるゾーンまたはリージョンに存在できますが、リージョン間の転送はリージョン内の転送よりも遅くなる可能性があります。

gcloud

gcloud lustre instances import-data INSTANCE_ID \
  --location=LOCATION \
  --gcs-path-uri=gs://BUCKET_NAME/ \
  --lustre-path=PS_PATH

ここで

  • INSTANCE_ID は、Managed Lustre インスタンス名です。
  • --location は、Managed Lustre インスタンスのゾーンです。例: us-central1-a
  • --gcs-path-uri は、gs://<bucket_name>/<optional_path_inside_bucket>/ 形式を使用して、Cloud Storage バケットの URI またはバケット内のパスを指定します。バケット内のパスを指定する場合は、スラッシュ(/)で終わる必要があります。
  • --lustre-path には、マネージド Lustre ファイル システムのルート ディレクトリのパスを指定します。/ で始まる必要があります。デフォルトは / です。デフォルト以外の値を指定する場合は、ディレクトリがファイル システムにすでに存在している必要があります。

次のパラメータはオプションです。

  • --request-id を使用すると、このリクエストに一意の ID を割り当てることができます。同じリクエスト ID を使用してこのリクエストを再試行すると、リクエストがすでに完了している場合、サーバーはリクエストを無視します。すべてがゼロではない有効な UUID である必要があります。
  • --async は、オペレーションの完了を待たずに、すぐにレスポンスを返します。

詳細については、Cloud SDK のドキュメントをご覧ください。

REST

POST https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID:importData
Authorization: Bearer [YOUR_ACCESS_TOKEN]

{
  "gcsPath" : {
    "uri" : "gs://BUCKET_NAME/"
  },
  "lustrePath" : {
    "path" : "/PATH"
  }
}

ここで

  • PROJECT_ID は Google Cloud プロジェクト名です。
  • LOCATION は、マネージド Lustre インスタンスのゾーンです。例: us-central1-a
  • INSTANCE_ID は、Managed Lustre インスタンス名です。
  • gcsPath には、値が gs://<bucket_name>/<optional_path_inside_bucket>/ 形式で Cloud Storage バケットの URI またはバケット内のパスを指定する uri キーが含まれます。バケット内のパスを指定する場合は、スラッシュ(/)で終わる必要があります。
  • lustrePath には、値が Managed Lustre ファイル システムのルート ディレクトリ パスを指定する path キーが含まれています。/ で始まる必要があります。デフォルトは / です。デフォルト以外の値を指定する場合は、ディレクトリがファイル システムにすでに存在している必要があります。

Google が管理するサービス エージェントではなく、独自のサービス アカウントを使用するには、リクエストで JSON オブジェクトの serviceAccount フィールドがサポートされています。

"serviceAccount" : "projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_ID"

curl コマンドの例を次に示します。

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID:importData \
  -d '{"gcsPath": {"uri":"gs://BUCKET_NAME/"}, "lustrePath": {"path":"/"}}'

ファイル属性

Cloud Storage バケットから Managed Lustre インスタンスにデータをインポートすると、Managed Lustre インスタンスのファイル属性は次のいずれかの方法で設定されます。

  • Cloud Storage オブジェクトにデータのエクスポートで説明されているカスタム メタデータがある場合:
    • ファイルの UID、GID、モード、mtime は、オブジェクトのカスタム メタデータに基づいて設定されます。
    • ファイルの atimemtime と同じ値に設定されます。
  • Cloud Storage オブジェクトにカスタム メタデータがない場合:
    • ファイルの UID と GID が 0(root)に設定されます。
    • ファイルのモードは rwxr-xr-x755)に設定されます。
    • ファイルの atimemtime は、Cloud Storage オブジェクトの作成時間に設定されます。

どちらの場合も、次のようになります。

  • ファイルの ctime は、ファイルがインスタンスに書き込まれた時刻に設定されます。
  • ディレクトリの atimectimemtime は、インスタンスでディレクトリが作成された時刻に設定されます。

データのエクスポート

Managed Lustre インスタンスから、同じプロジェクトまたは別のプロジェクトの Cloud Storage バケットにデータをエクスポートできます。バケットは Managed Lustre インスタンスとは異なるゾーンまたはリージョンに配置できますが、リージョン間の転送はリージョン内の転送よりも遅くなる可能性があります。

gcloud

gcloud lustre instances export-data \
  INSTANCE_ID \
  --location=LOCATION \
  --gcs-path-uri="gs://BUCKET_NAME/" \
  --lustre-path="/"

ここで

  • INSTANCE_ID は、Managed Lustre インスタンス名です。
  • --location は、マネージド Lustre インスタンスのゾーンです。例: us-central1-a
  • --gcs-path-uri は、gs://<bucket_name>/<optional_path_inside_bucket>/ 形式を使用して、Cloud Storage バケットの URI またはバケット内のパスを指定します。バケット内のパスを指定する場合は、スラッシュ(/)で終わる必要があります。
  • --lustre-path は、Managed Lustre ファイル システムのルート ディレクトリ パスを指定します。/ で始まる必要があります。デフォルトは / です。

次のパラメータはオプションです。

  • --request-id を使用すると、このリクエストに一意の ID を割り当てることができます。同じリクエスト ID を使用してこのリクエストを再試行すると、リクエストがすでに完了している場合、サーバーはリクエストを無視します。すべてがゼロではない有効な UUID である必要があります。
  • --async は、オペレーションの完了を待たずに、すぐにレスポンスを返します。

REST

POST https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID:exportData
Authorization: Bearer [YOUR_ACCESS_TOKEN]

{
  "lustrePath" : {
    "path" : "/"
  },
  "gcsPath" : {
    "uri" : "gs://BUCKET_NAME/"
  }
}

ここで

  • PROJECT_ID は Google Cloud プロジェクト名です。
  • INSTANCE_ID は、Managed Lustre インスタンス名です。
  • LOCATION は、マネージド Lustre インスタンスのゾーンです。例: us-central1-a
  • lustrePath には path キーが含まれており、その値はマネージド Lustre ファイル システムのルート ディレクトリ パスを指定します。/ で始まる必要があります。デフォルトは / です。
  • gcsPath には、値が gs://<bucket_name>/<optional_path_inside_bucket>/ 形式で Cloud Storage バケットの URI またはバケット内のパスを指定する uri キーが含まれます。バケット内のパスを指定する場合は、スラッシュ(/)で終わる必要があります。

Google が管理するサービス エージェントではなく、独自のサービス アカウントを使用するには、リクエストで JSON オブジェクトの serviceAccount フィールドがサポートされています。

"serviceAccount" : "projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_ID"

curl コマンドの例を次に示します。

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json"
  https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID:exportData \
  -d '{"lustrePath": {"path":"/"}, "gcsPath": {"uri":"gs://BUCKET_NAME/"}}'

ファイル属性

Managed Lustre インスタンスから Cloud Storage バケットにデータをエクスポートすると、次のファイル属性が Cloud Storage のカスタム メタデータとして保持されます。

  • ファイルの UID は goog-reserved-posix-uid キーとともに保存されます。
  • ファイルの GID は goog-reserved-posix-gid キーで保存されます。
  • ファイルの数値モードは goog-reserved-posix-mode キーで保存されます。
  • ファイルの mtimegoog-reserved-file-mtime キーで保存されます。

これらのカスタム メタデータ キー名は、POSIX ファイル システムでの転送に Storage Transfer Service で使用されるものと同じです。

次のファイル属性は保持されません。

  • シンボリック リンクは保持されません。
  • ハードリンクは個別の Cloud Storage オブジェクトとしてエクスポートされるため、複数のコピーが作成されます。
  • lfs setstripe または lfs setdirstripe を使用して明示的に設定された Lustre ストライピングは保持されません。
  • ファイルの atimectime は保持されません。
  • ディレクトリの mtime は保持されません。
  • 空のディレクトリは保持されません。

オペレーションの取得

インポート オペレーションまたはエクスポート オペレーションのステータスを確認するには、オペレーション ID が必要です。この ID は、インポートまたはエクスポートのリクエストを行うとサービスから返され、次の形式で使用されます。

  • operation-1234567890123-6127783ad26ea-88913969-02748053

gcloud

gcloud lustre operations describe OPERATION_ID \
  --location=LOCATION

REST

GET https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/operations/OPERATION_ID
Authorization: Bearer [YOUR_ACCESS_TOKEN]

curl コマンドの例を次に示します。

curl -X GET \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/operations/OPERATION_ID

オペレーションのキャンセル

インポート オペレーションまたはエクスポート オペレーションをキャンセルするには、オペレーション ID が必要です。この ID は、インポートまたはエクスポートのリクエストを行うとサービスから返され、次の形式で使用されます。

  • operation-1234567890123-6127783ad26ea-88913969-02748053

gcloud

gcloud lustre operations cancel OPERATION_ID \
  --location=LOCATION

REST

POST https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/operations/OPERATION_ID:cancel
Authorization: Bearer [YOUR_ACCESS_TOKEN]

curl コマンドの例を次に示します。

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/operations/OPERATION_ID:cancel