Openflow Connector for Slack設定する¶
注釈
このコネクタは、 Snowflakeコネクタ規約 に従うものとします。
このトピックでは、Openflow Connector for Slackを設定する手順について説明します。
前提条件¶
Openflow Connector for Slack について を確認してください。
Ensure that you have Openflowの設定 - BYOC or Set up Openflow - Snowflake Deployments.
If using Openflow - Snowflake Deployments, ensure that you've reviewed configuring required domains and have granted access to the required domains for the Slack connector.
Slack Appを設定する¶
SlackワークスペースにSlackアプリを設定します。Slack Workspaceに対するアクセス権を設定するには、Slack Admin権限が必要です。これは、Slack Appの認証情報を作成または提供し、Slackワークスペースとチャンネルにアプリをインストールすることによって行われます。JSON 構成を使用して、Slack Appを作成することができます。
JSON マニフェストを更新します。下記の JSON マニフェストテキストをコピーします。名前と表示名のプロパティを、
EXAMPLE_NAME_CHANGE_THISからSlack Appの任意の名前に変更します。Appには同じ名前と表示名を使用することを推奨します。{ "display_information": { "name": "EXAMPLE_NAME_CHANGE_THIS" }, "features": { "bot_user": { "display_name": "EXAMPLE_NAME_CHANGE_THIS", "always_online": false } }, "oauth_config": { "scopes": { "bot": [ "channels:history", "channels:read", "groups:history", "groups:read", "im:history", "im:read", "mpim:history", "mpim:read", "users.profile:read", "users:read", "users:read.email", "files:read", "app_mentions:read", "reactions:read" ] } }, "settings": { "event_subscriptions": { "bot_events": [ "message.channels", "message.groups", "message.im", "message.mpim", "reaction_added", "reaction_removed", "file_created", "file_deleted", "file_change" ] }, "interactivity": { "is_enabled": true }, "org_deploy_enabled": false, "socket_mode_enabled": true, "token_rotation_enabled": false } }
Appsページ 経由でSlack Appアプリを作成します。
Your Apps ページで、 Create New App を選択します。
From a manifest を選択します。
アプリを開発する Workspace を選択します。後で他のワークスペースに [アプリを配布](https://api.slack.com/distribution) することもできます。
ステップ1で更新したマニフェスト JSON をコピーします。
アプリレベルトークンを生成します。JSON マニフェストを使用した後でも、アプリレベルトークンを作成する必要があります。Basic Information で、 App-level tokens セクションまでスクロールし、 [アプリレベルトークン](https://api.slack.com/concepts/token-types#app) を生成するボタンをクリックします。トークンに
connections:writeスコープを含めます。アプリをインストールして認証します。
アプリ管理ページの Basic Information セクションに戻ります。
Install to Workspace ボタンを選択して、アプリをインストールします。
Slack OAuth フローが表示されます。以下の画面で Allow を選択します。
自分のワークスペース以外の別のワークスペースにアプリを追加したい場合は、そのワークスペースのユーザーがこれらの手順を実行する必要があります。インストール後、 OAuth & Permissions ページに戻ります。OAuth トークン の下に アクセストークン が表示されます。アクセストークンは、インストールユーザーからアプリに委任された権限を表します。安全に保管してください。公開バージョン管理へのチェックインは避けてください。代わりに、環境変数を通してアクセスします。
チャンネルへのAppの追加アプリはまだどのチャンネルにも属していないので、テストメッセージを追加するチャンネルを選び、アプリの
/inviteを行います。例えば、/invite @Grocery Remindersです。
注釈
プロセッサーを再起動して、新しいチャンネルをロードします。Appが新しいチャンネルに追加されたら、 OpenFlow ランタイムの Consume Slack Conversation プロセッサーを停止し、再起動する必要があります。
必要なエグレスルールを設定する¶
Snowflake管理者は、 エグレスガイド に従って、エンドポイント https://slack.com/api にエグレスルールを適用し、 wss://wss.slack.com で WebSocket エグレスを有効にする必要があります。「slack.com」ドメインでエグレスを有効にするルールを追加するのが最も簡単です。
Snowflakeアカウントを設定する¶
Snowflakeアカウント管理者として、以下のタスクを実行します。
新しいロールを作成するか、既存のロールを使用して データベース権限 を付与します。
タイプを SERVICE として、新しいSnowflakeサービスユーザーを作成します。
Snowflakeサービスユーザーに、前の手順で作成したロールを付与します。
ステップ2のSnowflake SERVICE ユーザーを key-pair auth で構成します。
Snowflakeではこの手順を強く推奨します。Openflowがサポートするシークレットマネージャ(AWS、Azure、Hashicorpなど)を構成し、公開キーと秘密キーを秘密ストアに格納します。
注釈
何らかの理由でシークレットマネージャを使用したくない場合は、組織のセキュリティポリシーに従って、キーペア認証に使用する公開キーと秘密キーファイルを保護する責任があります。
シークレットマネージャを構成したら、その認証方法を決定します。AWS 上では、Openflowに関連付けられた EC2 インスタンスロールが推奨されます。こうすることで、他の秘密を永続化する必要がなくなるからです。
Openflowで、右上のハンバーガーメニューから、このシークレットマネージャーに関連付けられたパラメータープロバイダーを構成します。Controller Settings » Parameter Provider に移動してから、パラメーター値を取得します。
この時点で、すべての認証情報を関連するパラメーターパスで参照することができるため、機密性の高い値をOpenflow内で永続化する必要はありません。
他のSnowflakeユーザーが、コネクタによって取り込まれた生の取り込みドキュメントやとテーブルへのアクセスを必要とする場合は(Snowflakeでのカスタム処理のためなど)、それらのユーザーにステップ1で作成したロールを付与します。
コネクタが使用するウェアハウスを指定します。まずは最小のウェアハウスサイズから始め、複製するテーブルの数や転送するデータ量に応じて異なるサイズを試してみてください。テーブル数が大きい場合は、通常、ウェアハウスのサイズを大きくするよりも、 マルチクラスターウェアハウス を使用した方がスケーリングが向上します。
ユースケース1:Slackコンテンツ取り込みのみ¶
コネクタ定義を使用して、次を行います。
取り込まれたSlackデータに対してカスタム分析を実行します(Cortex Search処理なし)。
Slackのメッセージ、リアクション、添付ファイル、メンバーリストをSnowflakeに取り込み、最新の状態に保ちます。
コネクタを設定する¶
データエンジニアとして、以下のタスクを実行してコネクタを構成します。
コネクタをインストールする¶
取り込んだデータを格納するコネクタ用に、Snowflakeでデータベースとスキーマを作成します。最初のステップで作成したロールに必要な データベース権限 を付与します。ロールのプレースホルダーを実際の値で置き換え、以下の SQL コマンドを使用します。
CREATE DATABASE DESTINATION_DB; CREATE SCHEMA DESTINATION_DB.DESTINATION_SCHEMA; GRANT USAGE ON DATABASE DESTINATION_DB TO ROLE <CONNECTOR_ROLE>; GRANT USAGE ON SCHEMA DESTINATION_DB.DESTINATION_SCHEMA TO ROLE <CONNECTOR_ROLE>; GRANT CREATE TABLE ON SCHEMA DESTINATION_DB.DESTINATION_SCHEMA TO ROLE <CONNECTOR_ROLE>;
Navigate to the Openflow overview page. In the Featured connectors section, select View more connectors.
Openflowのコネクタページでコネクタを探し、 Add to runtime を選択します。
In the Select runtime dialog, select your runtime from the Available runtimes drop-down list and click Add.
注釈
コネクタをインストールする前に、コネクタが取り込んだデータを格納するためのデータベースとスキーマをSnowflakeで作成したことを確認します。
Snowflakeアカウント認証情報でデプロイメントを認証し、Snowflakeアカウントへのランタイムアプリケーションのアクセスを許可するよう求められたられたら、 Allow を選択します。コネクタのインストールプロセスは数分で完了します。
Snowflakeアカウント認証情報でランタイムを認証します。
コネクタプロセスグループが追加されたOpenflowキャンバスが表示されます。
コネクタを構成する¶
インポートしたプロセスグループを右クリックし、 Parameters を選択します。
下記の フローパラメーター: コンテンツ取り込みのみ の説明に従って、必要なパラメーター値を入力します。
キャンバス上で右クリックし、 Enable all controller services を選択します。
インポートしたプロセスグループを右クリックし、 Start を選択します。フローは必要なすべてのSnowflakeオブジェクトを作成し、Slackデータの取り込みを開始します。
フローパラメーター: コンテンツ取り込みのみ¶
パラメーター |
説明 |
|---|---|
アプリ トークン |
Slack Appで生成されたSlack アプリレベルトークン。 |
ボット トークン |
Slack Appで生成されたSlack Botトークン。 |
宛先データベース |
すべてのコネクタオブジェクトを含むデータベース(ない場合は作成)。 |
宛先スキーマ |
データベース内部のスキーマ(ない場合は作成)。 |
Snowflakeアカウント |
Snowflakeアカウント識別子。 |
Snowflakeロール |
認証後にフローが想定するロール。 |
Snowflakeユーザー |
フローが接続に使用するユーザー名。 |
Snowflake秘密キー |
RSA 認証に使用する秘密キー(PKCS8 PEM 形式)。Snowflake秘密キーまたはSnowflake秘密キーファイルのいずれかを定義する必要があることに注意してください。 |
Snowflake秘密キーパスワード |
暗号化された秘密キーのパスワード(暗号化されていない場合は空白のまま)。 |
Snowflake秘密キーファイル |
RSA 秘密キーを含むファイル(PKCS8 PEM 形式)。ヘッダー行は |
Snowflakeウェアハウス |
フローで実行された SQL に使用されたウェアハウス。 |
アップロード間隔 |
Snowflakeにプッシュする前にデータを収集する時間。間隔を長くすると、Snowflakeの負荷は軽減されますが、レイテンシとメモリ使用量が増加する可能性があります。 |
Slackメンバーの更新 |
Slackメンバーシップ(ACL)の更新間隔を分単位で指定します。 |
ユースケース2:Slackコンテンツを取り込み、Cortexを有効化する¶
コネクタ定義を使用して、次を行います。
Snowflake CortexでSlackデータを会話型検索に対応できるようにします。
検索結果でSlackチャンネルのアクセス制御が尊重されるようにします。
コネクタを設定する¶
データエンジニアとして、以下のタスクを実行してコネクタを構成します。
コネクタをインストールする¶
取り込んだデータを格納するコネクタ用に、Snowflakeでデータベースとスキーマを作成します。最初のステップで作成したロールに必要な データベース権限 を付与します。ロールのプレースホルダーを実際の値で置き換え、以下の SQL コマンドを使用します。
CREATE DATABASE DESTINATION_DB; CREATE SCHEMA DESTINATION_DB.DESTINATION_SCHEMA; GRANT USAGE ON DATABASE DESTINATION_DB TO ROLE <CONNECTOR_ROLE>; GRANT USAGE ON SCHEMA DESTINATION_DB.DESTINATION_SCHEMA TO ROLE <CONNECTOR_ROLE>; GRANT CREATE TABLE ON SCHEMA DESTINATION_DB.DESTINATION_SCHEMA TO ROLE <CONNECTOR_ROLE>;
Navigate to the Openflow overview page. In the Featured connectors section, select View more connectors.
Openflowのコネクタページでコネクタを探し、 Add to runtime を選択します。
In the Select runtime dialog, select your runtime from the Available runtimes drop-down list and click Add.
注釈
コネクタをインストールする前に、コネクタが取り込んだデータを格納するためのデータベースとスキーマをSnowflakeで作成したことを確認します。
Snowflakeアカウント認証情報でデプロイメントを認証し、Snowflakeアカウントへのランタイムアプリケーションのアクセスを許可するよう求められたられたら、 Allow を選択します。コネクタのインストールプロセスは数分で完了します。
Snowflakeアカウント認証情報でランタイムを認証します。
コネクタプロセスグループが追加されたOpenflowキャンバスが表示されます。
コネクタを構成する¶
インポートしたプロセスグループを右クリックし、 Parameters を選択します。
下記の フローパラメーター: コンテンツの取り込みとCortexの有効化 の説明に従って、必要なパラメーター値を入力します。
キャンバス上で右クリックし、 Enable all controller services を選択します。
インポートしたプロセスグループを右クリックし、 Start を選択します。
フローが実行されたら、テストのため Cortex Searchサービスをクエリする に進みます。
フローパラメーター: コンテンツの取り込みとCortexの有効化¶
パラメーター |
説明 |
|---|---|
アプリ トークン |
Slack Appで生成されたSlack アプリレベルトークン。 |
ボット トークン |
Slack Appで生成されたSlack Botトークン。 |
宛先データベース |
すべてのコネクタオブジェクトを含むデータベース(ない場合は作成)。 |
宛先スキーマ |
データベース内部のスキーマ(ない場合は作成)。 |
アップロード間隔 |
Snowflakeにプッシュする前にデータを収集する時間。値を大きくすると負荷は減りますが、データのレイテンシは増加します。 |
Snowflakeアカウント |
Snowflakeアカウント識別子。 |
Snowflakeロール |
認証後にフローが想定するロール。 |
Snowflakeユーザー |
フローが接続に使用するユーザー名。 |
Snowflake秘密キー |
PEM-形式の秘密キー鍵をキーペア認証に使用します。 |
Snowflake秘密キーパスワード |
暗号化された秘密キーのパスワード(暗号化されていない場合は空白)。 |
Snowflakeウェアハウス |
Cortexによるフロー および で実行されるすべての SQL に使用されるウェアハウス。 |
Slackメンバーの更新 |
Slackメンバーシップ(ACL)の更新間隔を分単位で指定します。 |
プライベートチャンネル ACLs の有効化¶
各プライベートチャンネルに Slack Appを招待 するだけで、特別な手順は必要ありません。コネクタは、 Slackメンバーの更新 間隔で自動的にメンバーリストを更新し、メンバーシップテーブルに格納します。
Cortex Search serviceをクエリする¶
ユースケース2が実行され、Cortex Searchサービスが作成されると、以下のようにクエリを実行することができます。
SELECT PARSE_JSON(
SNOWFLAKE.CORTEX.SEARCH_PREVIEW(
'<openflow_db>.<openflow_schema>.<<SLACK_CORTEX_SEARCH>',
'{
"query": "What is my vacation carry over policy?",
"columns": ["text","channel","ts","username"],
"filter": {"@contains": {"memberemails": "alice@example.com"}},
"limit": 10
}'
)
)['results'] AS results;
一般的な検索可能列
text、 type、 subtype、 channel、 user、 username、 connectorId、 workspaceId、 ts、 threadTs
例: AI アシスタントに人事(HR)情報をクエリする
Cortex Searchを使用して、Slackの最新投稿についてチャットする従業員向けの AI アシスタントをクエリできます。検索されるメッセージは、generalやit-helpなどの有益なSlackチャンネルから派生します。
SQL ワークシート で、Slackから取り込まれたメッセージに対してCortex Searchサービスをクエリするために以下を実行します。
以下を置き換えます。
cortex_db:Cortex Searchサービスを含むデータベースの名前。Destination Databaseパラメーターで指定します。cortex_schema:Cortex Searchサービスを含むスキーマの名前。Destination Databaseパラメーターで指定します。cortex_search_service_name:Cortex Searchサービスの名前。Cortex Search Nameパラメーターで指定します。user_emailID: 応答をフィルターしたいユーザーのメール ID。
SELECT PARSE_JSON(
SNOWFLAKE.CORTEX.SEARCH_PREVIEW(
'<cortex_db>.<cortex_schema>.<cortex_search_service_name>',
'{
"query": "What is my vacation carry over policy?",
"columns": ["text", "channel", “ts”,”username”],
"filter": {"@contains": {"memberemails": "<user_emailID>"} },
"limit": 1
}'
)
)['results'] AS results
Pythonワークシート で以下のコードを実行し、Slackから取り込まれたメッセージに対してCortex Searchサービスをクエリします。snowflake.core パッケージをデータベースに追加するようにしてください。
以下を置き換えます。
cortex_db:Cortex Searchサービスを含むデータベースの名前。Destination Databaseパラメーターで指定します。cortex_schema:Cortex Searchサービスを含むスキーマの名前。Destination Databaseパラメーターで指定します。cortex_search_service_name:Cortex Searchサービスの名前。Cortex Search Nameパラメーターで指定します。user_emailID: 応答をフィルターしたいユーザーのメール ID。
import snowflake.snowpark as snowpark
from snowflake.snowpark import Session
from snowflake.core import Root
def main(session: snowpark.Session):
root = Root(session)
# fetch service
my_service = (root
.databases["<cortex_db>"]
.schemas["<cortex_schema>"]
.cortex_search_services["<cortex_search_service_name>"]
)
# query service
resp = my_service.search(
query="What is my vacation carry over policy?",
columns = ["text", "channel", "ts","username"],
filter = {"@contains": {"memberemails": "<user_emailID>"} },
limit=1
)
return (resp.to_json())
Execute the following code in a command-line interface to query the Cortex Search service over messages ingested from Slack. You will need to authentication through key pair authentication and OAuth to access the Snowflake REST APIs. For more information, see REST に API and Snowflakeでの Snowflake REST APIs 認証.
以下を置き換えます。
cortex_db:Cortex Searchサービスを含むデータベースの名前。Destination Databaseパラメーターで指定します。cortex_schema:Cortex Searchサービスを含むスキーマの名前。Destination Databaseパラメーターで指定します。cortex_search_service_name:Cortex Searchサービスの名前。Cortex Search Nameパラメーターで指定します。account_url:Snowflakeアカウント URL。アカウント URL の見つけ方については、 アカウントの組織名とアカウント名の検索 を参照してください。
curl --location "https://<account_url>/api/v2/databases/<cortex_db>/schemas/<cortex_schema>/cortex-search-services/<cortex_search_service_name>" \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header "Authorization: Bearer <CORTEX_SEARCH_JWT>" \
--data '{
"query": "What is my vacation carry over policy?",
"columns": ["text", "channel"],
"limit": 1
}'
サンプル応答:
{
"results" : [ {
"channel" : "dev notes",
"text" : "Answer to the question asked."
} ]
}