サービス仕様リファレンス

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 / HTTPS >
    - 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>
      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>
      ...
serviceRoles:                   # Optional list of service roles
- name: <service-role-name>
  endpoints:
  - <endpoint_name1>
  - <endpoint_name2>
  - ...
- ...
Copy

specserviceRoles が仕様の最上位フィールドであることに注意してください。

  • 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 はイメージ名です。この名前は、観測可能性の目的のために、特定のコンテナーを識別するために使用することができます(例えば、 logsmetrics)。

  • image フィールドは、SnowflakeアカウントのSnowflakeイメージリポジトリにアップロードしたイメージの名前を指します。

例:

spec:
  containers:
    - name: echo
      image: /tutorial_db/data_schema/tutorial_repository/echo_service:dev
Copy

containers.command および containers.args フィールド

これらのオプション・フィールドを使用して、コンテナー内で起動される実行ファイルと、その実行ファイルに渡される引数を制御します。イメージの作成時に、通常はDockerfileでこれらのデフォルトを設定することができます。これらのサービス仕様フィールドを使用することで、コンテナー・イメージを再構築することなく、これらのデフォルトを変更できます(つまり、コンテナーの動作を変更できます)。

  • containers.commandDockerfile ENTRYPOINT を上書きします。これにより、コンテナー内で別の実行ファイルを実行することができます。

  • containers.argsDockerfile CMD を上書きします。これにより、コマンド(実行ファイル)に異なる引数を付与することができます。

Dockerfile には、以下のコードが含まれています。

ENTRYPOINT ["python3", "main.py"]
CMD ["Bob"]
Copy

これらの Dockerfile エントリは python3 コマンドを実行し、 main.pyBob の2つの引数を渡します。これらの値は、以下のように仕様ファイルで上書きすることができます。

  • ENTRYPOINT を上書きするには、仕様ファイルに containers.command フィールドを追加します。

    spec:
      containers:
      - name: echo
        image: <image_name>
        command:
        - python3.9
        - main.py
    
    Copy
  • 引数「Bob」を上書きするには、仕様ファイルに containers.args フィールドを追加します。

    spec:
      containers:
      - name: echo
        image: <image_name>
        args:
          - Alice
    
    Copy

containers.env フィールド

containers.env フィールドを使ってコンテナー環境変数を定義します。コンテナー内のすべてのプロセスは、これらの環境変数にアクセスできます。

spec:
  containers:
  - name: <name>
    image: <image_name>
    env:
      ENV_VARIABLE_1: <value1>
      ENV_VARIABLE_2: <value2>
      
      
Copy

チュートリアル1 では、アプリケーション・コード(echo_service.py)は、図のように環境変数を読み込みます。

CHARACTER_NAME = os.getenv('CHARACTER_NAME', 'I')
SERVER_PORT = os.getenv('SERVER_PORT', 8080)
Copy

この例では、 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
Copy

サービスがリッスンするポート番号を変更したため、仕様ではエンドポイント(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():
Copy

したがって、仕様ファイルには 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
Copy

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は cpumemory について、これらのリソース要件を個別に評価します。

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
Copy

この例では、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
    
    Copy
  • 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>;
    
    Copy

    MIN_INSTANCESMAX_INSTANCES の両方を2に設定します。したがって、Snowflakeはサービスのインスタンスを2つ実行します。

では、これらのシナリオを考えてみましょう。

  • アプリケーションの仕様にリソース要件を明示的に含めない場合、Snowflakeはこれらのインスタンスを同じノードで実行するか、コンピューティングプール内の異なるノードで実行するかを決定します。

  • サービス仕様にリソース要件を含めて、 10 GB のコンテナー用のメモリをリクエストします。

    - name: resource-test
      image: ...
      resources:
        requests:
          memory: 15G
    
    Copy

    コンピューティングプールノードには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
    
    Copy

    コンテナーごとに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
    ...
Copy

サービス仕様の 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 フィールドを指定しなければなりません。

    protocol フィールドが TCP に設定され、 public フィールドがfalseの場合のみ、 portRange フィールドを指定できることに注意してください。

  • public: このエンドポイントをインターネットからアクセスできるようにする場合は、このフィールドを true に設定します。パブリックエンドポイントは、 TCP プロトコルではサポートされていません。

  • protocol: エンドポイントがサポートするプロトコル。サポートされている値は、 TCP、 HTTP、および HTTPS です。デフォルトでは、プロトコルは HTTP です。 protocol を指定する場合、以下が適用されます。

    • このエンドポイントがパブリックまたはサービス関数のターゲットである場合、プロトコルは HTTP または HTTPS にする必要があります(サービスの使用 を参照)。

    • ジョブサービスでは、指定されたすべてのエンドポイントが TCP プロトコルを使用する必要があります。HTTP/HTTPS プロトコルはサポートされていません。

注釈

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
Copy

このアプリケーションコンテナーは1つのエンドポイントを公開します。また、オプションの public フィールドも含まれており、Snowflake外部(インターネットアクセス)からのエンドポイントへのアクセスを有効にします。デフォルトでは、 publicfalse です。

spec.volumes フィールド(オプション)

このセクションでは、 spec.volumes および spec.containers.volumeMounts 仕様フィールドの両方について説明します。

  • spec.volumes は共有ファイルシステムを定義します。これらのボリュームはコンテナーで利用可能にできます。

  • spec.containers.volumeMount は、ボリュームが特定のコンテナのどこに表示されるかを定義します。

仕様では、 volumes フィールドは spec レベルで指定されていますが、複数のコンテナーが同じボリュームを共有できるため、 volumeMountsspec.containers レベルのフィールドになります。

これらのフィールドを使用して、ボリュームとボリュームマウントの両方を説明します。

  • spec.volumes: ボリュームは0個でも複数でもよいです。以下のフィールドを使用してボリュームを説明します。

    • すべてのボリュームタイプで必須項目です。

      • name: ボリュームの一意の名前。これは、 spec.containers.volumeMounts.name によって参照されます。

      • source: localmemoryblock または "@<ステージ名>" のいずれか。次のセクションでは、これらのボリュームタイプについて説明します。

      • sizememoryblock ボリュームサイズ用のみ必須): メモリおよびブロックボリュームの場合、これはボリュームのサイズです。ブロックストレージの場合、値は常に整数になり、Gi単位のサフィックスで指定する必要があります。たとえば、 5Gi5*1024*1024*1024 バイトを意味します。

    • block タイプ・ボリュームでは、以下のオプションのフィールドを指定できます。詳細については、 サービス仕様におけるブロックストレージの指定 をご参照ください。

      • blockConfig.initialContents.fromSnapshot: ブロックボリュームを初期化するために、別のボリュームの以前に取得したスナップショットを指定します。スナップショットは、ボリュームの作成に使用する前に、 CREATED の状態になっている必要があります。そうでない場合は、サービスの作成に失敗します。スナップショットのステータスを取得するには、 DESCRIBE SNAPSHOT コマンドを使用します。

      • blockConfig.iops: 1秒間にサポートされるピーク入出力操作数を指定します。サポートされる範囲は、 AWS では 3000-16000、Azure では 3000-80000、デフォルトは 3000です。ブロック・ボリュームの場合、1操作あたりのデータ・サイズの上限は256 KiB であることに注意してください。

      • blockConfig.throughput: ボリュームにプロビジョニングするピークスループットを MiB /秒で指定します。サポートされる範囲は、 AWS では 125-1000、Azure では 125-1200 で、デフォルトは 125です。

  • 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 コンテナーは、 logsmodels の両方のボリュームをマウントし、 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"
Copy

サービスの複数のインスタンスが実行されている場合、サービスインスタンス内の logging-agentapp コンテナーは 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
Copy

ボリューム source として memory を指定する場合は、メモリサイズを示す volumes.size フィールドも指定する必要があることに注意してください。指定できるメモリサイズの単位については、 単位について をご参照ください。

マウントされたボリュームのファイル・権限について

Snowflakeステージまたはブロックストレージボリュームをマウントするコンテナーは通常、ルートユーザーとして実行されます。しかし、コンテナーが非ルートユーザーとして実行されることもあります。例:

  • アプリケーションがサードパーティライブラリを使用する場合、ライブラリはコンテナー内でアプリケーションコードを実行するために非ルートユーザーを使用します。

  • セキュリティなどの他の理由から、コンテナー内で非ルートユーザーとしてアプリケーションを実行することもあります。

ファイルユーザー権限に関連する潜在的なエラーを避けるために、コンテナーの UID (ユーザー ID)と GID (グループ ID)を仕様の一部として設定することが重要です。これは特に、コンテナー内でアプリケーションの起動や実行に特定のユーザーとグループを使用するコンテナーに関係があります。適切な UID と GID を設定すると、非ルートユーザーとして実行するコンテナーを使用できます。例:

spec:
  ...

  volumes:
  - name: stagemount
    source: "@test"
    uid: <UID-value>
    gid: <GID-value>
Copy

Snowflakeはこの情報を使用して、適切な権限でステージをマウントします。

コンテナーの UID と GID を取得するには、以下を行います。

  1. docker run を使用してコンテナーをローカルで実行します。

  2. docker container list コマンドを使用してコンテナー ID を検索します。サンプル出力の一部は次のとおりです。

    CONTAINER ID   IMAGE                       COMMAND
    —----------------------------------------------------------
    a6a1f1fe204d  tutorial-image         "/usr/local/bin/entr…"
    
  3. コンテナー内で docker id コマンドを実行し、 UID と GID を取得します。

    docker exec -it <container-id> id
    
    Copy

    サンプル出力:

    uid=0(root) gid=0(root) groups=0(root)
    

spec.logExporters フィールド(オプション)

Snowflakeは、アプリケーションコンテナーが標準出力や標準エラーに出力するものをすべて収集します。詳細については、 Accessing local container logsspec.logExporters を使用して、Snowflake がどの出力を イベントテーブル にエクスポートするかを構成します。

logExporters:
  eventTableConfig:
    logLevel: < INFO | ERROR | NONE >
Copy

サポートされている logLevel 値は次のとおりです。

  • INFO (デフォルト): すべてのユーザーログをエクスポートします。

  • ERROR: エラーログのみをエクスポートします。Snowflakeは標準エラーストリームからログのみをエクスポートします。

  • NONE: イベントテーブルにログをエクスポートしません。

spec.platformMonitor フィールド(オプション)

個々のサービスがメトリクスを公表しています。Snowflakeが提供するこれらのメトリクスは、プラットフォーム・メトリクスとも呼ばれます。仕様に spec.platformMonitor フィールドを追加して、Snowflake がサービスからアカウント用に設定されたイベントテーブルにメトリクスを送信するように指示します。このユースケースのターゲットは、特定のサービスのリソース使用率を観察することです。

platformMonitor:
  metricConfig:
    groups:
    - <group_1>
    - <group_2>
    ...
Copy

group_N は、 predefined metrics groups を指します。サービスの実行中、Snowflakeは指定されたグループのメトリクスをイベントテーブルにログに記録します。その後、イベント・テーブルからメトリクスをクエリできます。詳細については、 Monitoring Services をご参照ください。

単位について

サービス仕様は、複数の場所で数値を取得します。これらの値を表現するために、さまざまな単位がサポートされています。大きな値と小さな値には、表示のように2進数と10進数の単位を使うことができます。以下のリストでは、「#」は整数値を表します。

  • 2進数単位:

    • numberKinumber*1024 を意味します。たとえば、4Kiは4096と等価です。

    • numberMinumber*1024*1024 を意味します。

    • numberGinumber*1024*1024*1024 を意味します。

  • 10進数単位:

    • numberknumber*1000 を意味します。たとえば、4kは4000と等価です。

    • numberMnumber*1000*1000 を意味します。

    • numberGnumber*1000*1000*1000 を意味します。

  • 分数単位:

    • numbermnumber*0.001 を意味します。たとえば、 cpu: 500mcpu: 0.5 と等価です。

serviceRoles フィールド(オプション)

仕様で serviceRoles の最上位フィールドを使用して、1つまたは複数のサービスロールを定義します。各サービスロールに対して、名前と、サービスロールに USAGE 権限を付与したい1つ以上のエンドポイント(spec.endpoints で定義)のリストを指定します。

serviceRoles:                   # Optional list of service roles
- name: <name>
  endpoints:
  - <endpoint-name>
  - <endpoint-name>
  - ...
- ...
Copy

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

  • nameendpoints の両方が必要です。

  • サービスロール名は以下の形式に従ってください。

    • 英数字または _ を含む。

    • 英文字で始まる。

    • 英数字で終わる。

詳細については、 サービスエンドポイントへのアクセス管理 をご参照ください。