サービス仕様リファレンス¶
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 | stage | memory | block
size: <bytes-of-storage> # specify if memory or block is the volume source
uid: <UID-value> # optional, only for stage volumes
gid: <GID-value> # optional, only for stage volumes
blockConfig: # optional
initialContents:
fromSnapshot: <snapshot-name>
iops: <number-of-operations>
throughput: <MiB-per-second>
encryption: SNOWFLAKE_SSE | SNOWFLAKE_FULL
stageConfig: # optional
name: <stage_name>
medataCache: <time_period>. # optional
resources: # optional
requests:
memory: <amount-of-memory>
cpu: <cpu-units>
limits:
memory: <amount-of-memory>
cpu: <cpu-units>
- name: <name>
source: local | stage| 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はDockerfileENTRYPOINTを上書きします。これにより、コンテナー内で別の実行ファイルを実行することができます。containers.argsはDockerfileCMDを上書きします。これにより、コマンド(実行ファイル)に異なる引数を付与することができます。
例
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はリソースを導出します。
For
cpu, the derived value is either 0.5 or thecpulimit you provided, whichever is greater.For
memory, the derived value is either 0.5 GiB or thememorylimit you provided, whichever is greater.
リソース制限(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: HTTPAccess-Control-Allow-MethodsCORS レスポンスヘッダーの値を指定します。このエンドポイントにリクエストを送るときに、どの HTTP メソッド(GET、 POST など)を許可すべきかをブラウザーに伝えます。corsSettings.Access-Control-Allow-Headers: HTTPAccess-Control-Allow-HeadersCORS レスポンスヘッダーの値を指定します。このエンドポイントにリクエストを送るときに、どの HTTP ヘッダーを許可すべきかをブラウザーに伝えます。corsSettings.Access-Control-Expose-Headers: HTTPAccess-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: This can belocal,memory,block,stage, or"@<stagename>"(which is deprecated). The next section explains these volume types.size(memoryとblockボリュームサイズ用のみ必須): メモリおよびブロックボリュームの場合、これはボリュームのサイズです。ブロックストレージの場合、値は常に整数になり、Gi単位のサフィックスで指定する必要があります。たとえば、5Giは5*1024*1024*1024バイトを意味します。
For the
blocktype volume, you can specify these optional fields:blockConfig.initialContents.fromSnapshot,blockConfig.iops,blockConfig.throughput, andblockConfig.encryption. For more information, see サービス仕様におけるブロックストレージの指定.For the
stagetype volume,nameis a required field. It identifies the stage. You can also specify the optional fieldsstageConfig.resourcesandstageConfig.metadataCache. For more information, see サービスでのSnowflakeステージボリュームの使用.
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の両方が必要です。サービスロール名は以下の形式に従ってください。
英数字または
_を含む。英文字で始まる。
英数字で終わる。
詳細については、 サービス関連権限の管理 をご参照ください。