概要
Snowpark Container Services(以降 SPCS)を使って「呼び出し元権限」で処理を実行する際、Cortex の COMPLETE 関数を併用しようとするとハマる点があったため、その体験を共有します。
1. 呼び出し元権限下で Cortex COMPLETE を使いたくてハマった点
Snowflake CortexでLLM周りの機能を使いたい場合は、snowflake.cortex_userというデータベースロールを付与する必要があります。Cortex AISQLで必要な権限
呼び出し元権限での実行時にはアクセス権限をサービスのオーナーロールにgrant callerする必要がありますが、データベースロールやアクセスロールを直接付与することができず、模索した結果以下のように権限付与することで解決しました。
SPCSでの呼び出し元権限
GRANT INHERITED CALLER USAGE ON ALL SCHEMAS IN DATABASE snowflake TO ROLE your_service_role;
GRANT INHERITED CALLER USAGE ON ALL FUNCTIONS IN DATABASE snowflake TO ROLE your_service_role;
GRANT CALLER USAGE ON DATABASE snowflake TO ROLE your_service_role;
注意点として、Snowflakeデータベース内の全関数のcaller grant権限を付与しているので、最小権限にならない可能性があります。
以下補足情報を書いていくので、ご参考にしてください。
2. 呼び出し元権限(Caller’s Rights)での実行
SiSやSPCSは原則作成者の権限で動きますが、権限制御をしている状況下では呼び出した人の権限で動かしたいということがあると思います。
そんな時に使えるのが、呼び出し元権限での実行です。
参考チュートリアル
2.1 アクセス許可
以下の流れでアクセスがチェックされます。
- 呼び出し元のロールが対象オブジェクトに対して権限をもっているか
- サービスのオーナーが対象オブジェクトに対するcaller grant権限をもっているか
上記アクセス許可の流れからわかるように、呼び出し元権限による実行では2回権限チェックがあります。
caller grant権限(呼び出し元権限)とは、呼び出し元の権限で実行されたクエリのうち該当サービスで実行してよい権限だけを事前に定義しておくものと考えられます。
2.2 実装の流れ
- 呼び出し元ユーザに適切な権限を付与する
- サービスのownership権限を持っているロールに
grant caller文で対象オブジェクトへの必要な権限を付与する
※caller grantが付与されてもサービスのオーナーロールが直接対象オブジェクトにアクセスすることはできません。適切な権限を持った呼び出し元ロールが該当サービスを使用することで対象オブジェクトへのアクセスが可能となります。 - specファイルにて以下のように
executeAsCallerをTrueに設定する
spec:
containers:
- name: main
image: /tutorial_db/data_schema/tutorial_repository/query_service:latest
env:
SERVER_PORT: 8000
readinessProbe:
port: 8000
path: /healthcheck
endpoints:
- name: execute
port: 8000
public: true
capabilities:
securityContext:
executeAsCaller: true
serviceRoles:
- name: ui_usage
endpoints:
- execute
おわりに
この記事がどなたかの参考になれば幸いです。