サービスでのブロックストレージボリュームの使用

Snowflake は、コンテナ化アプリケーション用に、Snowflake内部ステージ、ローカルストレージ、メモリストレージボリューム、ブロックストレージボリュームのストレージボリュームタイプをサポートしています。

サービス仕様におけるブロックストレージの指定

ブロックストレージを使用するサービス(ジョブサービスを含む)を作成するには、以下のようにサービス仕様書に必要な構成を記述します。

  1. spec.volumes フィールドを指定して、作成するブロックストレージボリュームを定義します。

    volumes:
      - name: <name>
        source: block
        size: <size-in-Gi>
        blockConfig:                             # optional
          initialContents:
            fromSnapshot: <snapshot-name>
          iops: <number-of-operations>
          throughput: <MiB-per-second>
          encryption: SNOWFLAKE_SSE | SNOWFLAKE_FULL
    
    Copy

    以下のフィールドは必須です。

    • name: ボリュームの名前。

    • source: ボリュームのタイプ。ブロックストレージボリュームの場合、値は block です。

    • size: ブロックストレージボリュームのストレージ容量(バイト単位)。値は常に整数でなければならず、Gi単位のサフィックスを使って指定します。たとえば、 5Gi5*1024*1024*1024 バイトを意味します。クラウドプロバイダーのサイズ値の範囲:

      • AWS とAzureに対して 1Gi16384Gi に。

      • Google Cloudに対して 4Gi16384Gi に。

    以下はオプションのフィールドです。

    • blockConfig.initialContents.fromSnapshot: ブロックボリュームを初期化するために、別のボリュームの以前に取得したスナップショットを指定します。スナップショット名には、 完全修飾オブジェクト識別子、例えば TUTORIAL_DB.DATA_SCHEMA.MY_SNAPSHOT を使用することができます。また、スナップショット名は、データベースとサービスのスキーマに関連して解決されます。つまり、 TUTORIAL_DB.DATA_SCHEMA でサービスを作成した場合、 fromSnapshot: MY_SNAPSHOTfromSnapshot: TUTORIAL_DB.DATA_SCHEMA.MY_SNAPSHOT と同等です。

      次の点に注意してください。

      • スナップショットは、ボリュームの作成に使用する前に CREATED の状態になっている必要があります。そうでないと、サービスの作成は失敗します。

      • スナップショットの暗号化タイプは、作成されるボリュームの暗号化タイプと一致する必要があります。

      スナップショットのステータスと暗号化タイプを取得するには、 DESCRIBE SNAPSHOT コマンドを使用します。

    • blockConfig.iops: 1秒間にサポートされる入出力操作のピーク数を指定します。なお、1回あたりのデータサイズの上限は256 KiB です。

      • AWS の場合: 対応範囲は3000~16000で、デフォルトは3000です。

      • Azureの場合: 対応範囲は3000~80000で、デフォルトは3000です。

      • Google Cloudの場合:

        • Google Cloud CPU インスタンス: 対応範囲は2000~160000で、デフォルトは以下のとおりです。

          • 4 Giディスクサイズの場合、2000 IOPS

          • 5 Giディスクサイズの場合、2500 IOPS

          • その他すべてのディスクサイズの場合、3000 IOPS

        • Google Cloud GPU インスタンス: Snowflakeでは、スループットのみを指定することを推奨しています。Google Cloudの GPU インスタンスの場合、 blockConfig.iops は16 * blockConfig.throughput である必要があります。

    • blockConfig.throughput: ボリュームにプロビジョニングするピークスループットを MiB/秒で指定します。

      • AWS の場合: 対応範囲は125~1000で、デフォルトは125です。

      • Azureの場合: 対応範囲は125~1200で、デフォルトは125です。

      • Google Cloudの場合:

        • Google Cloud CPU インスタンス: 対応範囲は140~2400で、デフォルトは140です。

        • Google Cloud GPU インスタンス: 対応範囲は400~1,200,000で、デフォルトは400ですが、ボリュームサイズの GB あたり0.12を下回ることはありません。

    • blockConfig.encryption: ボリュームの暗号化タイプを指定: SNOWFLAKE_SSE または SNOWFLAKE_FULL。詳細については、 暗号化のサポート をご参照ください。

    例:

    volumes:
      - name: vol-1
        source: block
        size: 200Gi
        blockConfig:
          initialContents:
            fromSnapshot: snapshot1
          iops: 3000
          throughput: 125
    
    Copy
  2. spec.containers.volumeMount フィールドに、ブロックストレージボリュームをマウントするアプリケーションコンテナの場所を指定します。このフィールドに入力する情報は、サポートされるすべてのストレージボリュームで同じです。

IOPS とスループットについて

サービス IO のパフォーマンスが期待に満たず、サービスがブロック量 IO またはスループットの影響を受けている場合、 IOPS またはスループットの増加を検討することができます。現在の実装では、そのような変更はサービスを再作成する必要があります。

これらの 利用可能なプラットフォーム・メトリクス を確認することで、サービスがブロック・ストレージ上でボトルネックになっているかどうかを特定することができます。

  • container.cpu.usage

  • volume.read.iops

  • volume.write.iops

  • volume.read.throughput

  • volume.write.throughput

クラウドプロバイダーによっては、以下の考慮事項が適用されます。

  • AWS のiopsとスループットの構成:

    • 設定可能な最大 IOPS は、ボリュームサイズ GiB ごとに 500 IOPS で、最大16,000 IOPS です。例えば、10 GiB のボリュームの最大 IOPS は 500 * 10 = 5000 となります。したがって、最大16,000の IOPS は、ボリュームが32 GiB 以上の場合にのみ設定できることに注意してください。

    • 設定可能な最大スループットは、4 IOPS ごとに1 MiB/秒、最大1000 MiBs/秒です。例えば、デフォルトの3000 IOPS では、最大750 MiB/秒(3000/4=750)のスループットを設定できます。

  • Azureのiopsとスループットの構成:

    • ボリュームサイズが6 GB の後、サポートされる IOPS の数は、6 GB (ディスクタイプ)を超える GB ごとに500ずつ増加します。10GB ボリュームの最大 IOPS は500 * 4 + 3000 = 5000です。したがって、最大80,000の IOPS は、ボリュームが160 GiB 以上の場合にのみ設定できることに注意してください。

    • 6 GB 以降、設定可能な最大スループットは、IOPS 毎に0.25 MiB/秒、最大1200 MiBs/秒です。例えば、デフォルトの3000 IOPS では、最大750 MiB/秒(3000*0.25=750)のスループットを設定できます。

  • Google Cloudのiopsとスループットの構成:

    • CPU インスタンスの場合:

      • IOPS は、ボリュームサイズ1 Giあたり最大500 IOPS まで構成可能で、最大160,000 IOPS です。例えば、10 Giのボリュームは最大5,000 IOPS (500 IOPS * 10 Gi)を達成することができます。最大160,000 IOPS を達成するには、320 Gi以上のボリュームサイズが必要です。

      • 最大スループットは2400 MiB/秒の構成が可能で、4 IOPS ごとに1 MiB/秒のレートとなります。例えば、3000 IOPS の場合、最大750 MiB/秒のスループットが可能になります(3000 / 4 = 750)。

    • GPU インスタンスの場合:

      • IOPS はスループットとは独立してセットすることはできません。 IOPS は16にスループット値を掛けて計算されます。したがって、スループットを指定すると、自動的に IOPS が決まります。GPU インスタンスで使用するディスクには、 IOPS の構成はお勧めしません。

      • 最小スループットを構成する必要があります。少なくとも400 MiB/秒、またはボリュームサイズ GiB ごとに0.12 MiB/秒のいずれか高い方でなければなりません。

      • 構成可能なスループットレートは、最大1,200,000 MiB/秒まで、ボリュームサイズ GiB あたり1600 MiB/秒です。一例として、10 GiB のボリュームで最大スループット16,000 MiB/秒(1600 * 10)を達成できます。なお、上限の1,200,000 MiB/秒は、750 GiB 以上のボリュームでのみ達成可能です。

アクセス制御の要件

既存のスナップショット(fromSnapshot は仕様にあります)を使用してボリュームを初期化する場合は、サービスの所有者ロールがスナップショットで USAGE 権限を持っている必要があります。

サービスの所有者ロールには、スナップショットを含むデータベースとスキーマに対する USAGE 権限も必要です。

スナップショットの管理

ブロックストレージボリュームのスナップショットを取り、後でそのバックアップを以下のように使用できます。

  • スナップショットバックアップを使用して、既存のブロックストレージボリュームを復元します。

  • スナップショットバックアップは、新しいサービスを作成する際に、新しいブロックストレージボリュームを初期化するためのシードデータとして使用します。

スナップショットを取る前に、すべてのアップデートがディスクにフラッシュされていることを確認する必要があります。

Snowflakeには、スナップショットを作成および管理するための以下のコマンドがあります。

また、既存のブロックストレージボリューム上のスナップショットを復元するには、 ALTER SERVICE...RESTORE VOLUME コマンドを実行します。スナップショットを復元する前に、サービスを一時停止する必要があることに注意してください。ボリュームの復元後、サービスは自動的に再開されます。

ブロックストレージコスト

クレジット消費の詳細については、 Snowflake Service Consumption Table をご参照ください。

ブロックストレージボリュームがジョブサービスで使用されている場合、Snowflakeは、ジョブサービスがユーザーによって停止されるか、完了後にSnowflakeによってクリーンアップされた後、ブロックストレージコストの課金を停止します。

暗号化のサポート

ブロックストレージボリュームとスナップショットは、他のSnowflake管理ストレージでも使用されている同じ2つの暗号化モードをサポートしています。

  • SNOWFLAKE_SSE: サーバー側の暗号化のみ。これは、SnowflakeアカウントでTri-Secret-Secureを有効にしていないお客様のデフォルト構成です。

    Snowflakeは、ブロックストレージボリュームとスナップショットにクラウドサービスプロバイダー(CSP)の暗号化を使用します。

  • SNOWFLAKE_FULL: クライアント側およびサーバー側の暗号化。これは、SnowflakeアカウントでTri-Secret-Secureを有効にしているお客様のデフォルト構成です。

    データはまずクライアント(Snowpark Container Services ホスト)で暗号化されてから、 CSP に送信されストレージされます。各ボリュームは一意のボリュームキーで暗号化されます。同じキーは、そのボリュームから作成するスナップショットの暗号化にも使用されます。

    Snowflakeはデータの暗号化を追加で実行するため、 SNOWFLAKE_FULL ボリュームを使用するとパフォーマンスとリソース使用量に影響があります。SnowflakeはLinuxカーネルが提供する暗号化メカニズムを使用しているため、影響は大きくないはずです。パフォーマンスへの影響はワークロードに依存する可能性が高いため、サービスまたはジョブのボトルネックを特定するか、ボリュームのスループットを向上させるか、より強力なサーバーを提供することをお勧めします。

    現在、Snowflakeのブロックストレージボリュームとスナップショットでは、キーのローテーションやキー更新はサポートされていません。ボリュームの暗号化キーを変更するには、新しいボリュームを作成し、元のボリュームからデータをコピーします。

    アカウントでTri-Secret Secureを有効にしているお客様の場合、お客様が管理するキーへのアクセスが取り消された場合でも、そのボリュームを使用して現在実行中のサービスでは、ボリュームのデータは引き続きご利用いただけます。お客様が管理するキーへのアクセスを取り消す際には、これらのサービスを停止し、データが利用できないようにすることをお勧めします。また、キーを取り消すと、暗号化されたボリュームのサービスは開始できなくなります。

ボリュームのスナップショットは、ソースボリュームの暗号化タイプを保持します。たとえば、 SNOWFLAKE_SSE ボリュームのスナップショットも、 SNOWFLAKE_SSE 暗号化を使用します。スナップショットをボリュームの初期コンテンツとして使用する場合、または ALTER SERVICE ... RESTORE VOLUME コマンドで使用する場合、その暗号化タイプはボリュームの暗号化タイプと一致する必要があります。そうでなければコマンドは失敗します。

例については、 チュートリアル をご参照ください。このチュートリアルでは、ブロックストレージボリュームがマウントされたサービスを作成するための手順を順を追って説明します。

ガイドラインと制約

ブロックストレージボリュームを使用するサービスには、以下の制限が適用されます。

  • 一般的な制限これらの制限に関する問題が発生した場合は、担当者にお問い合わせください。

    • 1サービスあたりのブロックストレージボリュームの最大数は3です。

    • Snowflakeアカウントあたりのブロックストレージボリュームの最大数は100です。

    • 次のテーブルは、ノードのインスタンスタイプに応じて、コンピューティングプールノードごとにマウントできるブロックストレージボリュームの最大数をリストしたものです。Snowflakeは、ブロックストレージボリュームを使用するサービスインスタンスがこれらの制限に従って配置されるようにします。その結果、 PENDING 状態のサービスが追加リソースを待つことになるかもしれません。

      インスタンスファミリー

      AWS 制限

      Azure制限

      CPU_X64_XS

      22

      3

      CPU_X64_S

      22

      8

      CPU_X64_M

      22

      16

      CPU_X64_L

      22

      32

      HIGHMEM_X64_S

      22

      16

      HIGHMEM_X64_M

      22

      32

      HIGHMEM_X64_L

      22

      32

      GPU_NV_XS (Azureのみ)

      なし

      8

      GPU_NV_S (AWS のみ)

      22

      なし

      GPU_NV_SM (Azureのみ)

      なし

      32

      GPU_NV_M (AWS のみ)

      21

      なし

      GPU_NV_2M (Azureのみ)

      なし

      32

      GPU_NV_3M (Azureのみ)

      なし

      16

      GPU_NV_SL (Azureのみ)

      なし

      32

      GPU_NV_L (AWS のみ)

      14

      なし

    • Snowflakeアカウントごとに許可されるスナップショットの最大数は100です。

  • サービスの最小インスタンス数と最大インスタンス数は同じでなければなりません。

  • サービスが作成された後、以下が適用されます。

    • サービスがブロック・ストレージ・ボリュームを使用している場合、 ALTER SERVICE ... SET ...コマンドを使用してサービスインスタンス数を変更することはできません。

    • ブロックストレージボリュームの sizeiopsthroughput、または encryption フィールドは変更できません。

    • 新しいブロックストレージボリュームを追加したり、既存のブロックストレージボリュームを削除することはできません。

    • ブロックストレージボリュームは、サービスがアップグレードされたり、一時停止して再開された場合でも保持されます。サービスが一時停止されても、そのボリュームは維持されるため、引き続き料金を支払うことになります。サービスをアップグレードまたは再開すると、Snowflakeは各ブロックストレージボリュームを以前と同じサービスインスタンス ID にアタッチします。

    • ブロックストレージボリュームは、サービスがドロップすると削除されます。ボリューム内のデータを保存するために、 ボリュームのスナップショット を取るようにしてください。スナップショットは、後で新しいボリュームの初期化に使用できます。

    • ブロックストレージボリュームは、 Tri-Secret Secure および 定期的なキー更新 をサポートしていません。つまり、アカウントで Tri-Secret Secure や定期的なキー更新が有効になっている場合は、他のすべてのSnowflakeデータには引き続きセキュリティが追加されますが、Snowpark Container Servicesのブロックストレージボリュームに格納されているイメージはこの追加セキュリティの恩恵は受けません。

      Tri-Secret Secure や定期的なキー更新を使用するアカウントでブロックストレージボリュームを作成するには、まず、ブロックストレージボリュームに対するこの追加セキュリティの恩恵を受けずに継続することを理解し、同意することを確認する必要があります。同意を確認するには、アカウント管理者(ACCOUNTADMIN ロールを持つユーザー)がアカウントレベルのパラメーター ENABLE_TRI_SECRET_AND_REKEY_OPT_OUT_FOR_SPCS_BLOCK_STORAGETRUE に設定する必要があります。