サービス仕様リファレンス¶
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>
- ...
- ...
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
フィールドを指定しなければなりません。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
このアプリケーションコンテナーは1つのエンドポイントを公開します。また、オプションの public
フィールドも含まれており、Snowflake外部(インターネットアクセス)からのエンドポイントへのアクセスを有効にします。デフォルトでは、 public
は false
です。
spec.volumes
フィールド(オプション)¶
このセクションでは、 spec.volumes
および spec.containers.volumeMounts
仕様フィールドの両方について説明します。
spec.volumes
は共有ファイルシステムを定義します。これらのボリュームはコンテナーで利用可能にできます。spec.containers.volumeMount
は、ボリュームが特定のコンテナのどこに表示されるかを定義します。
仕様では、 volumes
フィールドは spec
レベルで指定されていますが、複数のコンテナーが同じボリュームを共有できるため、 volumeMounts
は spec.containers
レベルのフィールドになります。
これらのフィールドを使用して、ボリュームとボリュームマウントの両方を説明します。
spec.volumes
: ボリュームは0個でも複数でもよいです。以下のフィールドを使用してボリュームを説明します。すべてのボリュームタイプで必須項目です。
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.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
コンテナーは、 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
と等価です。
serviceRoles
フィールド(オプション)¶
仕様で serviceRoles
の最上位フィールドを使用して、1つまたは複数のサービスロールを定義します。各サービスロールに対して、名前と、サービスロールに USAGE 権限を付与したい1つ以上のエンドポイント(spec.endpoints
で定義)のリストを指定します。
serviceRoles: # Optional list of service roles
- name: <name>
endpoints:
- <endpoint-name>
- <endpoint-name>
- ...
- ...
次の点に注意してください。
name
とendpoints
の両方が必要です。サービスロール名は以下の形式に従ってください。
英数字または
_
を含む。英文字で始まる。
英数字で終わる。
詳細については、 サービスエンドポイントへのアクセス管理 をご参照ください。