サービス仕様リファレンス¶
Snowpark Container Services仕様は、 YAML (https://yaml.org/spec/)にあります。サービスの構成と実行に必要な情報をSnowflakeに提供します。サービス作成時に仕様を提供します。
一般的な構文は次のとおりです。
spec:
  containers:                           # container list
  - name: <name>
    image: <image-name>
    command:                            # optional list of strings
      - <cmd>
      - <arg1>
    args:                               # optional list of strings
      - <arg2>
      - <arg3>
      - ...
    env:                                # optional
        <key>: <value>
        <key>: <value>
        ...
    readinessProbe:                     # optional
        port: <TCP port-num>
        path: <http-path>
    volumeMounts:                       # optional list
      - name: <volume-name>
        mountPath: <mount-path>
      - name: <volume-name>
        ...
    resources:                          # optional
        requests:
          memory: <amount-of-memory>
          nvidia.com/gpu: <count>
          cpu: <cpu-units>
        limits:
          memory: <amount-of-memory>
          nvidia.com/gpu: <count>
          cpu: <cpu-units>
    secrets:                                # optional list
      - snowflakeSecret:
          objectName: <object-name>         # specify this or objectReference
          objectReference: <reference-name> # specify this or objectName
        directoryPath: <path>               # specify this or envVarName
        envVarName: <name>                  # specify this or directoryPath
        secretKeyRef: username | password | secret_string # specify only with envVarName
  endpoints:                             # optional endpoint list
    - name: <name>
      port: <TCP port-num>                     # specify this or portRange
      portRange: <TCP port-num>-<TCP port-num> # specify this or port
      public: <true / false>
      protocol : < TCP / HTTP >
      corsSettings:                  # optional CORS configuration
        Access-Control-Allow-Origin: # required list of allowed origins, for example, "http://example.com"
          - <origin>
          - <origin>
            ...
        Access-Control-Allow-Methods: # optional list of HTTP methods
          - <method>
          - <method>
            ...
        Access-Control-Allow-Headers: # optional list of HTTP headers
          - <header-name>
          - <header-name>
            ...
        Access-Control-Expose-Headers: # optional list of HTTP headers
          - <header-name>
          - <header-name>
            ...
    - name: <name>
      ...
  volumes:                               # optional volume list
    - name: <name>
      source: local | @<stagename> | memory | block
      size: <bytes-of-storage>           # specify if memory or block is the volume source
      blockConfig:                       # optional
        initialContents:
          fromSnapshot: <snapshot-name>
        iops: <number-of-operations>
        throughput: <MiB-per-second>
        encryption: SNOWFLAKE_SSE | SNOWFLAKE_FULL
      uid: <UID-value>                   # optional, only for stage volumes
      gid: <GID-value>                   # optional, only for stage volumes
    - name: <name>
      source: local | @<stagename> | memory | block
      size: <bytes-of-storage>           # specify if memory or block is the volume source
      ...
  logExporters:
    eventTableConfig:
      logLevel: <INFO | ERROR | NONE>
  platformMonitor:                      # optional, platform metrics to log to the event table
    metricConfig:
      groups:
      - <group-1>
      - <group-2>
      ...
capabilities:
  securityContext:
    executeAsCaller: <true / false>     # optional, indicates whether application intends to use caller’s rights
serviceRoles:                   # Optional list of service roles
- name: <service-role-name>
  endpoints:
  - <endpoint_name1>
  - <endpoint_name2>
  - ...
- ...
spec、 serviceRoles が仕様の最上位フィールドであることに注意してください。
- spec: 仕様の詳細を記入する場合は、このフィールドを使用します。これらのトップレベル・フィールドが含まれます。- spec.containers (必須):1つ以上のアプリケーションコンテナーのリスト。コンテナー化されたアプリケーションには、少なくとも1つのコンテナーが必要です。 
- spec.endpoints (オプション): サービスが公開するエンドポイントのリスト。エンドポイントをパブリックにする選択を行い、サービスへのネットワークイングレスアクセスを許可することもできます。 
- spec.volumes (オプション): コンテナーが使用するストレージボリュームのリスト。 
- spec.logExporters (オプション): このフィールドは、アカウントのイベントテーブルにエクスポートされるコンテナーログのレベルを管理します。 
 
- serviceRoles: このフィールドを使用して、1つまたは複数のサービス・ロールを定義します。サービス・ロールは、サービスが公開するエンドポイントへの権限を管理するために使用するメカニズムです。
一般的なガイドライン¶
- nameフィールド(コンテナー名、エンドポイント名、ボリューム名)には、以下の形式ガイドラインが適用されます。- 長さは63文字までです。 
- 小文字の英数字または - -を含めることができます。
- 英文字で始まる。 
- 英数字で終わる。 
 
- Snowflakeサービスを使用する場合、個人データ、機密データ、エクスポート制限データ、またはその他の規制されたデータがメタデータとして入力されていないことを確認する必要があります。詳細については、 Snowflakeのメタデータフィールド をご参照ください。 
以下のセクションでは、最上位 spec フィールドのそれぞれについて説明します。
spec.containers フィールド(必須)¶
spec.containers フィールドを使用して、アプリケーションの OCI コンテナーのそれぞれを記述します。
次の点に注意してください。
- サービス(ジョブサービスを含む)を作成すると、Snowflakeはこれらのコンテナーを指定されたコンピューティングプール内の単一ノード上で実行し、同じネットワークインターフェイスを共有します。 
- 入ってくるリクエストのロードバランスをとるために、複数のサービスインスタンスを実行することを選択するかもしれません。Snowflakeは、指定されたコンピュートプール内の同じノードまたは異なるノード上でこれらのサービスインスタンスを実行することを選択する可能性があります。与えられたインスタンスのすべてのコンテナーは、常に1つのノード上で実行されます。 
- 現在、Snowpark Container Servicesにはlinux/amd64プラットフォームイメージが必要です。 
以下のセクションでは、コンテナーフィールドの型について説明します。
containers.name および containers.image フィールド¶
各コンテナーについて、名前とイメージのみが必須フィールドです。
- nameはイメージ名です。この名前は、観測可能性の目的のために、特定のコンテナーを識別するために使用することができます(例えば、 logs、 metrics)。
- imageフィールドは、SnowflakeアカウントのSnowflakeイメージリポジトリにアップロードしたイメージの名前を指します。
例:
spec:
  containers:
    - name: echo
      image: /tutorial_db/data_schema/tutorial_repository/echo_service:dev
containers.command および containers.args フィールド¶
これらのオプション・フィールドを使用して、コンテナー内で起動される実行ファイルと、その実行ファイルに渡される引数を制御します。イメージの作成時に、通常はDockerfileでこれらのデフォルトを設定することができます。これらのサービス仕様フィールドを使用することで、コンテナー・イメージを再構築することなく、これらのデフォルトを変更できます(つまり、コンテナーの動作を変更できます)。
- containers.commandは- Dockerfile- ENTRYPOINTを上書きします。これにより、コンテナー内で別の実行ファイルを実行することができます。
- containers.argsは- Dockerfile- CMDを上書きします。これにより、コマンド(実行ファイル)に異なる引数を付与することができます。
例
Dockerfile には、以下のコードが含まれています。
ENTRYPOINT ["python3", "main.py"]
CMD ["Bob"]
これらの Dockerfile エントリは python3 コマンドを実行し、 main.py と Bob の2つの引数を渡します。これらの値は、以下のように仕様ファイルで上書きすることができます。
- ENTRYPOINT を上書きするには、仕様ファイルに - containers.commandフィールドを追加します。- spec: containers: - name: echo image: <image_name> command: - python3.9 - main.py 
- 引数「Bob」を上書きするには、仕様ファイルに - containers.argsフィールドを追加します。- spec: containers: - name: echo image: <image_name> args: - Alice 
containers.env フィールド¶
containers.env フィールドを使ってコンテナー環境変数を定義します。コンテナー内のすべてのプロセスは、これらの環境変数にアクセスできます。
spec:
  containers:
  - name: <name>
    image: <image_name>
    env:
      ENV_VARIABLE_1: <value1>
      ENV_VARIABLE_2: <value2>
      …
      …
例
チュートリアル1 では、アプリケーション・コード(echo_service.py)は、図のように環境変数を読み込みます。
CHARACTER_NAME = os.getenv('CHARACTER_NAME', 'I')
SERVER_PORT = os.getenv('SERVER_PORT', 8080)
この例では、 getenv 関数に変数のデフォルト値を渡していることに注意してください。環境変数が定義されていない場合は、これらのデフォルトが使用されます。
- CHARACTER_NAME:Echoサービスは、文字列(例: 「Hello」)を含む HTTP POST リクエストを受信すると、「I said Hello」を返します。 このデフォルト値は、仕様ファイルで上書きすることができます。たとえば、値を「Bob」に設定すると、Echoサービスは「Bob said Hello」という応答を返します。
- SERVER_PORT: このデフォルト構成では、Echoサービスはポート8080でリッスンします。デフォルト値を上書きして、別のポートを指定することができます。
以下のサービス仕様は、これらの環境変数の値を上書きします。
spec:
  containers:
  - name: echo
    image: <image_name>
    env:
      CHARACTER_NAME: Bob
      SERVER_PORT: 8085
  endpoints:
  - name: echo-endpoint
    port: 8085
サービスがリッスンするポート番号を変更したため、仕様ではエンドポイント(endpoints.port field フィールド値)も更新されていることに注意してください。
containers.readinessProbe フィールド¶
containers.readinessProbe フィールドを使用して、アプリケーションの準備完了プローブを特定します。Snowflakeはこのプローブを呼び出して、アプリケーションがいつリクエストを処理できるようになったかを判断します。
Snowflakeは、指定されたポートおよびパスで、指定されたreadinessプローブに対して HTTP GET リクエストを実行し、健全なコンテナーのみがトラフィックを提供できるように、 HTTP 200 OK ステータスを返すサービスを探します。
以下のフィールドを使用して、必要な情報を入力します。
- port: サービスがreadinessプローブリクエストをリッスンしているネットワークポート。このポートをエンドポイントとして宣言する必要はありません。
- path:Snowflakeは、このパスを持つサービスに HTTP GET リクエストを実行します。
例
チュートリアル1では、アプリケーションコード(echo_python.py)は以下のreadinessプローブを実装します。
@app.get("/healthcheck")
def readiness_probe():
したがって、仕様ファイルには containers.readinessProbe フィールドが含まれます。
spec:
  containers:
  - name: echo
    image: <image_name>
    env:
      SERVER_PORT: 8088
      CHARACTER_NAME: Bob
    readinessProbe:
      port: 8088
      path: /healthcheck
  endpoints:
  - name: echo-endpoint
    port: 8088
readinessプローブが指定するポートは、構成されたエンドポイントである必要はありません。使用するサービスは、readinessプローブ専用に別のポートをリッスンすることができます。
containers.volumeMounts フィールド¶
spec.volumes フィールドと spec.containers.volumeMounts フィールドは連動しているため、1つのセクションでまとめて説明します。詳細については、 spec.volumes フィールド(オプション) をご参照ください。
containers.resources フィールド¶
コンピューティングプールは、利用可能なリソース(CPU 、メモリ、ストレージ)のセットを定義し、Snowflakeはコンピューティングプールのどこでサービスを実行するかを決定します。
指定コンテナーのリソース要件を明示的に示し、仕様に適切な制限を設定することを推奨します。指定するリソースは、コンピューティングプール内のノードのインスタンスファミリーに制約されることに注意してください。詳細については、 CREATE COMPUTE POOL をご参照ください。
containers.resources フィールドを使用して、特定のアプリケーションコンテナーに対する明示的なリソース要件を指定します。
- containers.resources.requests: 指定するリクエストは、サービスによって予想される平均的なリソース使用量でなければなりません。Snowflakeはこの情報を使って、コンピューティングプールにおけるサービスインスタンスの配置を決定します。Snowflakeは、指定されたノードに配置されたリソース要件の合計が、そのノードで利用可能なリソース内に収まることを保証します。
- containers.resources.limits: 指定した制限値は、指定した制限値以上のリソースを割り当てないようにSnowflakeに指示します。こうして、コスト超過を防ぐことができます。
以下のリソースのリクエストと制限を指定できます。
- memory: アプリケーションコンテナーに必要なメモリ。値を表す単位は 10進数でも2進数 でも構いません。例えば、2Gは2,000,000,000バイトのリクエストを表し、2Giは2×1024×1024×1024バイトのリクエストを表します。- メモリを指定する場合は、単位が必要です。例: - 100Mまたは- 5Gi。サポートされている単位は、M、Mi、G、Giです。
- cpu: 仮想コア(vCPU)単位を指します。たとえば、1 CPU 単位は1 vCPU と等価です。0.5のような小数リクエストも可能で、500mと表すこともできます。
- nvidia.com/gpu: GPUs が必要な場合は、それらをリクエストしなければならず、同じ数量に対して- limitも指定する必要があります。コンテナーが GPU の容量に対するリクエストと制限を指定しない場合は、 GPUs にアクセスできません。リクエストできる GPUs の数は、 コンピューティングプール を作成するときに選択した- INSTANCE_TYPEがサポートする最大 GPUs によって制限されます。
resource.requests および resource.limits は、関連する コンピューティングプール のインスタンスファミリのノード容量(vCPU およびメモリ)に対する相対値です。
- リソースリクエスト(CPU、メモリ、またはその両方)が提供されない場合、Snowflakeはリソースを導出します。 - cpuの場合は、0.5か、指定した- cpuの制限値のいずれか小さい方が導出値になります。
- memoryの場合は、0.5 GiB か、指定した- memoryの制限値のいずれか小さい方が導出値になります。
 
- リソース制限(CPU、メモリ、またはその両方)が提供されていない場合、Snowflakeは関連する コンピューティングプール のインスタンスファミリーのノード容量をデフォルトの制限とします。 
- resource.limitsを提供し、それらがノード容量を超える場合、Snowflakeはノード容量に制限を設定します。
- Snowflakeは - cpuと- memoryについて、これらのリソース要件を個別に評価します。
Snowflakeが指定されたコンピューティングプールでサービスをスケジュールすることが理論的に不可能な場合は、 CREATE SERVICE が失敗します。理論的に不可能なのは、コンピューティングプールが許可された最大ノード数を持ち、コンピューティングプール上で他のサービスが実行されていない場合です。つまり、Snowflakeがコンピューティングプールの制限内でリクエストされたリソースを割り当てることはできないということです。理論的には可能でも、必要なリソースが使用中であれば、 CREATE SERVICE は成功します。一部のサービスインスタンスは、リソースが利用可能になるまで、リソース不足のためにサービスをスケジュールできないことを示すステータスを報告します。
例1
以下の仕様では、 containers.resources フィールドにコンテナーのリソース要件を説明します。
spec:
  containers:
  - name: resource-test-gpu
    image: ...
    resources:
      requests:
        memory: 2G
        cpu: 0.5
        nvidia.com/gpu: 1
      limits:
        memory: 4G
        nvidia.com/gpu: 1
この例では、Snowflakeはコンテナーに対して、少なくとも2 GB のメモリ、1個の GPU および半個の CPU コアを割り当てるようにリクエストされます。同時に、コンテナーは4 GB を超えるメモリと1個を超える GPU を使用することが禁止されます。
例2
仮に
- 2つのノードのコンピューティングプールを作成します。各ノードに27 GB のメモリと1個の GPU があります。 - CREATE COMPUTE POOL tutorial_compute_pool MIN_NODES = 2 MAX_NODES = 2 INSTANCE_FAMILY = gpu_nv_s 
- Snowflakeにサービスのインスタンスを2つ実行するように依頼するサービスを作成します。 - CREATE SERVICE echo_service MIN_INSTANCES=2 MAX_INSTANCES=2 IN COMPUTE POOL tutorial_compute_pool FROM @<stage_path> SPEC=<spec-file-stage-path>; - MIN_INSTANCESと- MAX_INSTANCESの両方を2に設定します。したがって、Snowflakeはサービスのインスタンスを2つ実行します。
では、これらのシナリオを考えてみましょう。
- アプリケーションの仕様にリソース要件を明示的に含めない場合、Snowflakeはこれらのインスタンスを同じノードで実行するか、コンピューティングプール内の異なるノードで実行するかを決定します。 
- サービス仕様にリソース要件を含めて、 10 GB のコンテナー用のメモリをリクエストします。 - - name: resource-test image: ... resources: requests: memory: 15G - コンピューティングプールノードには27 GB のメモリがあり、Snowflakeは同じノード上で2つのコンテナーを実行できません。Snowflakeは2つのサービスインスタンスをコンピューティングプールの別々のノードで実行します。 
- サービス仕様にリソース要件を含めて、コンテナー用に1 GB のメモリと1個の GPU をリクエストします。 - spec: containers: - name: resource-test-gpu image: ... resources: requests: memory: 2G nvidia.com/gpu: 1 limits: nvidia.com/gpu: 1 - コンテナーごとに1個の GPU をリクエストしており、各ノードには1個の GPU しかありません。この場合、メモリには問題がありませんが、Snowflakeは1つのノードに両方のサービスをスケジュールすることができません。この要件により、Snowflakeは2つのコンピューティングプールノードで2つのサービスインスタンスを実行することになります。 
containers.secrets フィールド¶
secrets:                                # optional list
  - snowflakeSecret:
      objectName: <object-name>         # specify this or objectReference
      objectReference: <reference-name> # specify this or objectName
    directoryPath: <path>               # specify this or envVarName
    envVarName: <name>                  # specify this or directoryPath
    secretKeyRef: username | password | secret_string # specify only with envVarName
  - snowflakeSecret: <object-name>      # equivalent to snowflakeSecret.objectName
    ...
サービス仕様の containers.secrets フィールドを使用して、Snowflake が管理する認証情報をアプリケーションコンテナーに提供します。まず、 Snowflake secret オブジェクトに認証情報を格納します。次に、サービス仕様の中で、シークレットオブジェクトを参照し、コンテナー内のどこに認証情報を配置するかを指定します。
以下は、 containers.secrets フィールドの使い方の要約です。
- Snowflake secret の指定: - snowflakeSecretフィールドを使用して、Snowflake secret オブジェクト名またはオブジェクト参照のいずれかを指定します。オブジェクト参照は、Snowpark コンテナーサービスを使用してNative App(コンテナー付きアプリ)を作成する場合に適用できます。- secretKeyRefを使用して、Snowflake シークレットのキー名を指定します。
 
- アプリケーション・コンテナ内のシークレットの配置を指定する: - envVarNameフィールドを使用して、シークレットを環境変数として渡すか、- directoryPathを使用して、シークレットをローカル・コンテナー・ファイルに書き込みます。
詳細については、 Snowflakeシークレットを使用してコンテナーに認証情報を引き渡す をご参照ください。
サービスを作成するロール(所有者ロール)には、参照されるシークレットの READ 権限が必要であることに注意してください。
spec.endpoints フィールド(オプション)¶
spec.endpoints フィールドを使用して、アプリケーションが公開する TCP ネットワークポートの名前のリストを指定します。サービスはゼロから多くのエンドポイントを公開する可能性があります。以下のフィールドを使用してエンドポイントを説明します。
- name: エンドポイントの一意の名前。この名前は、 サービス機能 および サービスロール 仕様において、エンドポイントを識別するために使用されます。
- port: アプリケーションがリッスンしているネットワークポート。このフィールドか、- portRangeフィールドを指定しなければなりません。
- portRange: アプリケーションがリッスンしているネットワークポート範囲。このフィールドか、- portフィールドを指定しなければなりません。- portRangeで定義されたポートは、サービスインスタンス IP のアドレスを直接呼び出すことによってのみアクセスできます。サービスインスタンス IP アドレスを取得するには、- instances.プレフィックスされた DNS 名前を使用します。- instances.<Snowflake_assigned_service_DNS_name>- 詳細については、 サービス間通信 をご参照ください。 - protocolフィールドが TCP に設定され、- publicフィールドがfalseの場合のみ、- portRangeフィールドを指定できることに注意してください。
- public:このエンドポイントをSnowpark Container Servicesネットワークの外部からアクセスできるようにする場合は、このフィールドを- trueに設定します。パブリックエンドポイントは- protocolフィールドの「HTTP」値のみをサポートしています。
- protocol: エンドポイントがサポートするプロトコル。サポートされている値は、 TCP および HTTP です。デフォルトでは、プロトコルは HTTP です。- protocolを指定する場合、以下が適用されます。- このエンドポイントがパブリックまたはサービス関数のターゲットである場合、プロトコルは HTTP または HTTPS にする必要があります(サービスの使用 を参照)。 
- ジョブサービスでは、指定されたすべてのエンドポイントが TCP プロトコルを使用する必要があります。HTTP/HTTPS プロトコルはサポートされていません。 
 
- corsSettings:- endpointsのフィールドでは、パブリックエンドポイントへの HTTP リクエストの CORS に対するSnowflakeサポートを構成できます。- corsSettings.Access-Control-Allow-Origin: 提供された CORS 許可および公開レスポンスヘッダーを使用してSnowflakeが応答するオリジンを指定します。値は、パスを指定しない有効な URL でなければなりません。例えば、- https://example.com/, https://example.com:12345です。セキュリティ上の理由から、"*"ワイルドカードは- Access-Control-Allow-Originには使えません。
- Snowflakeは以下の CORS レスポンスヘッダーをサポートしています。 - corsSettings.Access-Control-Allow-Methods: HTTP- Access-Control-Allow-MethodsCORS レスポンスヘッダーの値を指定します。このエンドポイントにリクエストを送るときに、どの HTTP メソッド(GET、 POST など)を許可すべきかをブラウザーに伝えます。
- corsSettings.Access-Control-Allow-Headers: HTTP- Access-Control-Allow-HeadersCORS レスポンスヘッダーの値を指定します。このエンドポイントにリクエストを送るときに、どの HTTP ヘッダーを許可すべきかをブラウザーに伝えます。
- corsSettings.Access-Control-Expose-Headers: HTTP- Access-Control-Expose-HeadersCORS レスポンスヘッダーの値を指定します。このエンドポイントからのレスポンスを公開するときに、どの HTTP ヘッダーを許可すべきかをブラウザーに伝えます。
 
 
注釈
Snowflakeは、パブリックアクセスに対して認証および承認チェックを実行し、サービスを使用する権限のあるSnowflakeユーザーのみがアクセスできるようにします。エンドポイントへのパブリックアクセスにはSnowflake認証が必要です。認証されたユーザーは、このサービスエンドポイントに対する権限も持っていなければなりません(ユーザーは、エンドポイントにアクセスできるロールの使用権限を持っています)。
例
以下は、 チュートリアル1 で使用したアプリケーション仕様です。
spec:
  container:
  - name: echo
    image: <image-name>
    env:
      SERVER_PORT: 8000
      CHARACTER_NAME: Bob
    readinessProbe:
      port: 8000
      path: /healthcheck
  endpoint:
  - name: echoendpoint
    port: 8000
    public: true
このアプリケーションコンテナーは1つのエンドポイントを公開します。また、オプションの public フィールドも含まれており、Snowflake外部(インターネットアクセス)からのエンドポイントへのアクセスを有効にします。デフォルトでは、 public は false です。
spec.volumes フィールド(オプション)¶
このセクションでは、 spec.volumes および spec.containers.volumeMounts 仕様フィールドの両方について説明します。
- spec.volumesは共有ファイルシステムを定義します。これらのボリュームはコンテナーで利用可能にできます。
- spec.containers.volumeMountは、ボリュームが特定のコンテナのどこに表示されるかを定義します。
仕様では、 volumes フィールドは spec レベルで指定されていますが、複数のコンテナーが同じボリュームを共有できるため、 volumeMounts は spec.containers レベルのフィールドになります。
これらのフィールドを使用して、ボリュームとボリュームマウントの両方を説明します。
- spec.volumes: 以下のフィールドを使用してボリュームを説明します。- すべてのボリュームタイプで必須項目です。 - name: ボリュームの一意の名前。これは、- spec.containers.volumeMounts.nameによって参照されます。
- source:- local、- memory、- blockまたは- "@<ステージ名>"のいずれか。次のセクションでは、これらのボリュームタイプについて説明します。
- size(- memoryと- blockボリュームサイズ用のみ必須): メモリおよびブロックボリュームの場合、これはボリュームのサイズです。ブロックストレージの場合、値は常に整数になり、Gi単位のサフィックスで指定する必要があります。たとえば、- 5Giは- 5*1024*1024*1024バイトを意味します。
 
- blockタイプ・ボリュームでは、以下のオプションのフィールドを指定できます。詳細については、 サービス仕様におけるブロックストレージの指定 をご参照ください。- blockConfig.initialContents.fromSnapshot: ブロックボリュームを初期化するために、別のボリュームの以前に取得したスナップショットを指定します。次の点に注意してください。- スナップショットは、ボリュームの作成に使用する前に CREATED の状態になっている必要があります。そうでないと、サービスの作成は失敗します。 
- スナップショットの暗号化タイプは、作成されるボリュームの暗号化タイプと一致する必要があります。 
 - スナップショットのステータスと暗号化タイプを取得するには、 DESCRIBE SNAPSHOT コマンドを使用します。 
- blockConfig.iops:1秒間にサポートされるピーク入出力操作数を指定します。サポートされる範囲は、 AWS では 3000-16000、Azure では 3000-80000、デフォルトは 3000です。ブロック・ボリュームの場合、1操作あたりのデータ・サイズの上限は256 KiB であることに注意してください。
- blockConfig.initialContents.fromSnapshot: ブロックボリュームを初期化するために、別のボリュームの以前に取得したスナップショットを指定します。スナップショットは、ボリュームの作成に使用する前に CREATED の状態になっている必要があります。そうでないと、サービスの作成は失敗します。スナップショットのステータスを取得するには、 DESCRIBE SNAPSHOT コマンドを使用します。
- blockConfig.iops:1秒間にサポートされる入出力操作のピーク数を指定します。詳細については、 サービス仕様におけるブロックストレージの指定 をご参照ください。
- blockConfig.throughput: ボリュームにプロビジョニングするピークスループットを MiB/秒で指定します。詳細については、 サービス仕様におけるブロックストレージの指定 をご参照ください。
- blockConfig.encryption: ボリュームの暗号化タイプを指定します:- SNOWFLAKE_SSEまたは- SNOWFLAKE_FULL。詳細については、 暗号化のサポート をご参照ください。
 
 
- spec.containers.volumeMounts: それぞれのコンテナーは0かそれ以上のボリュームマウントを持つことができます。- containers.volumeMountsもリストです。つまり、各コンテナーは複数のボリュームマウントを持つことができる。以下のフィールドを使用してボリュームマウントを説明します。- name: マウントするボリュームの名前。単一のコンテナーは同じボリュームを複数回参照できます。
- mountPath: コンテナーをマウントするためのボリュームへのファイルパス。
 
サポートされているボリュームタイプについて¶
Snowflakeは、アプリケーションコンテナが使用するボリュームタイプとして、ローカル、メモリ、ブロック、およびSnowflakeステージをサポートしています。
- ローカルボリューム: サービスインスタンス内のコンテナーは、ローカルディスクを使用してファイルを共有できます。たとえば、アプリケーションにアプリケーションコンテナーとログアナライザーの2つのコンテナーがある場合、アプリケーションはローカルボリュームにログを書き込むことができ、ログアナライザーはログを読み取ることができます。 - サービスの複数のインスタンスを実行している場合、ボリュームを共有できるのはサービスインスタンスに属するコンテナーだけであることに注意してください。異なるサービスインスタンスに属するコンテナーは、ボリュームを共有しません。 
- **メモリ 
- ブロック: コンテナはブロックストレージボリュームを使用することもできます。詳細については、 サービスでのブロックストレージボリュームの使用 をご参照ください。 
- Snowflake ステージ: 自分のアカウントにあるSnowflake・ステージ上のファイルへの便利なアクセスをコンテナーに与えることもできます。詳細については、 サービスでのSnowflakeステージボリュームの使用 をご参照ください。 
例
機械学習アプリケーションには、以下の2つのコンテナーが含まれています。
- メインアプリケーション用 - appコンテナー
- ログを収集し、Amazon S3にアップロードする - logger-agentコンテナー。
これらのコンテナーは、以下の2つのボリュームを使用します。
- localボリューム: このアプリケーションは、ログエージェントが読み取るログを書き込みます。
- Snowflakeステージ、 - @model_stage: メインアプリケーションはこのステージからファイルを読み取ります。
以下の仕様例では、 app コンテナーは、 logs と models の両方のボリュームをマウントし、 logging-agent コンテナーは logs ボリュームのみをマウントします。
spec: containers: - name: app image: <image1-name> volumeMounts: - name: logs mountPath: /opt/app/logs - name: models mountPath: /opt/models - name: logging-agent image: <image2-name> volumeMounts: - name: logs mountPath: /opt/logs volumes: - name: logs source: local - name: models source: "@model_stage"
サービスの複数のインスタンスが実行されている場合、サービスインスタンス内の logging-agent と app コンテナーは logs ボリュームを共有します。logs ボリュームはサービスインスタンス間では共有されません。
これらのボリュームに加えて、 app コンテナーが2 GB メモリボリュームも使用する場合は、仕様を修正して volumes リストにボリュームを含め、 app コンテナー volumeMounts リストに別のボリュームマウントも追加します。
spec: containers: - name: app image: <image1-name> volumeMounts: - name: logs mountPath: /opt/app/logs - name: models mountPath: /opt/models - name: my-mem-volume mountPath: /dev/shm - name: logging-agent image: <image2-name> volumeMounts: - name: logs mountPath: /opt/logs volumes: - name: logs source: local - name: models source: "@model_stage" - name: "my-mem-volume" source: memory size: 2G
ボリューム source として memory を指定する場合は、メモリサイズを示す volumes.size フィールドも指定する必要があることに注意してください。指定できるメモリサイズの単位については、 単位について をご参照ください。
マウントされたボリュームのファイルアクセス権について¶
Snowflakeステージまたはブロックストレージボリュームをマウントするコンテナーは通常、ルートユーザーとして実行されます。しかし、コンテナーが非ルートユーザーとして実行されることもあります。例:
- アプリケーションがサードパーティライブラリを使用する場合、ライブラリはコンテナー内でアプリケーションコードを実行するために非ルートユーザーを使用します。 
- セキュリティなどの他の理由から、コンテナー内で非ルートユーザーとしてアプリケーションを実行することもあります。 
ファイルユーザー権限に関連する潜在的なエラーを避けるために、コンテナーの UID (ユーザー ID)と GID (グループ ID)を仕様の一部として設定することが重要です。これは特に、コンテナー内でアプリケーションの起動や実行に特定のユーザーとグループを使用するコンテナーに関係があります。適切な UID と GID を設定すると、非ルートユーザーとして実行するコンテナーを使用できます。例:
spec:
  ...
  volumes:
  - name: stagemount
    source: "@test"
    uid: <UID-value>
    gid: <GID-value>
Snowflakeはこの情報を使用して、適切な権限でステージをマウントします。
コンテナーの UID と GID を取得するには、以下を行います。
- docker runを使用してコンテナーをローカルで実行します。
- docker container listコマンドを使用してコンテナー ID を検索します。サンプル出力の一部は次のとおりです。- CONTAINER ID IMAGE COMMAND —---------------------------------------------------------- a6a1f1fe204d tutorial-image "/usr/local/bin/entr…" 
- コンテナー内で - docker idコマンドを実行し、 UID と GID を取得します。- docker exec -it <container-id> id - サンプル出力: - uid=0(root) gid=0(root) groups=0(root)
spec.logExporters フィールド(オプション)¶
Snowflakeは、アプリケーションコンテナーが標準出力や標準エラーに出力するものをすべて収集します。詳細については、 Accessing local container logs。spec.logExporters を使用して、Snowflake がどの出力を イベントテーブル にエクスポートするかを構成します。
logExporters:
  eventTableConfig:
    logLevel: < INFO | ERROR | NONE >
サポートされている logLevel 値は次のとおりです。
- INFO(デフォルト): すべてのユーザーログをエクスポートします。
- ERROR: エラーログのみをエクスポートします。Snowflakeは標準エラーストリームからログのみをエクスポートします。
- NONE: イベントテーブルにログをエクスポートしません。
spec.platformMonitor フィールド(オプション)¶
個々のサービスがメトリクスを公表しています。Snowflakeが提供するこれらのメトリクスは、プラットフォーム・メトリクスとも呼ばれます。仕様に spec.platformMonitor フィールドを追加して、Snowflake がサービスからアカウント用に設定されたイベントテーブルにメトリクスを送信するように指示します。このユースケースのターゲットは、特定のサービスのリソース使用率を観察することです。
platformMonitor:
  metricConfig:
    groups:
    - <group_1>
    - <group_2>
    ...
group_N は、 predefined metrics groups を指します。サービスの実行中、Snowflakeは指定されたグループのメトリクスをイベントテーブルにログに記録します。その後、イベント・テーブルからメトリクスをクエリできます。詳細については、 Monitoring Services をご参照ください。
単位について¶
サービス仕様は、複数の場所で数値を取得します。これらの値を表現するために、さまざまな単位がサポートされています。大きな値と小さな値には、表示のように2進数と10進数の単位を使うことができます。以下のリストでは、「#」は整数値を表します。
- 2進数単位: - numberKiは- number*1024を意味します。 たとえば、4Kiは4096と等価です。
- numberMiは- number*1024*1024を意味します。
- numberGiは- number*1024*1024*1024を意味します。
 
- 10進数単位: - numberkは- number*1000を意味します。たとえば、4kは4000と等価です。
- numberMは- number*1000*1000を意味します。
- numberGは- number*1000*1000*1000を意味します。
 
- 分数単位: - numbermは- number*0.001を意味します。たとえば、- cpu: 500mは- cpu: 0.5と等価です。
 
capabilities フィールド(オプション)¶
仕様書の capabilities トップレベルフィールドでは、 securityContext.executeAsCaller フィールドを使用して、アプリケーションが 発呼者の権利 を使用するつもりであることを示します。
capabilities:
  securityContext:
    executeAsCaller: <true / false>    # optional, indicates whether application intends to use caller’s rights
デフォルトでは、 executeAsCaller は false です。
serviceRoles フィールド(オプション)¶
仕様で serviceRoles の最上位フィールドを使用して、1つまたは複数のサービスロールを定義します。各サービスロールに対して、名前と、サービスロールに USAGE 権限を付与したい1つ以上のエンドポイント(spec.endpoints で定義)のリストを指定します。
serviceRoles:                   # Optional list of service roles
- name: <name>
  endpoints:
  - <endpoint-name>
  - <endpoint-name>
  - ...
- ...
次の点に注意してください。
- nameと- endpointsの両方が必要です。
- サービスロール名は以下の形式に従ってください。 - 英数字または - _を含む。
- 英文字で始まる。 
- 英数字で終わる。 
 
詳細については、 サービス関連権限の管理 をご参照ください。