Openflow Connector for Slack 설정
Openflow Connector for Slack 설정
이 페이지에서는 Slack용 Openflow Connector를 설정하는 전체 절차를 설명해요. Slack 앱 생성·설치, 인그레스 규칙, Snowflake 계정 준비, 그리고 두 가지 사용 사례(콘텐츠 수집만 / Cortex 검색 활성화)별 흐름 파라미터를 차례로 다룹니다.
출처: Snowflake 문서
본문
Note
이 커넥터는 Snowflake Connector Terms에 의해 규율됩니다.
이 토픽은 Slack용 Openflow Connector를 설정하는 단계를 설명합니다.
전제 조건
-
About Openflow Connector for Slack을 검토했는지 확인하세요.
-
Set up Openflow - Snowflake Deployments 또는 Set up Openflow - BYOC를 완료했는지 확인하세요.
-
Openflow - Snowflake Deployments를 사용한다면 required domains 구성을 검토하고 Slack 커넥터에 필요한 도메인 접근을 부여했는지 확인하세요.
Slack 앱 설정
Slack 워크스페이스에 Slack 앱을 설정하세요. Slack 워크스페이스에 대한 접근을 설정하려면 Slack 관리자가 필요합니다. Slack 앱에 자격 증명을 만들거나 제공하고, Slack 워크스페이스와 채널에 앱을 설치하면 됩니다. JSON 구성으로 Slack 앱을 만들 수 있습니다:
- JSON 매니페스트를 업데이트합니다. 아래 JSON 매니페스트 텍스트를 복사합니다.
EXAMPLE_NAME_CHANGE_THIS에서 원하는 Slack 앱 이름으로 name·display name 속성을 변경하세요. 앱의 name과 display name을 같게 사용하는 것을 권장합니다.
{
"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 page를 통해 Slack 앱을 만듭니다.
-
Your Apps 페이지에서 Create New App을 선택합니다.
-
From a manifest를 선택합니다.
-
앱을 개발할 Workspace를 선택합니다. 원하면 나중에 다른 워크스페이스로 앱을 배포할 수 있습니다.
-
1단계에서 업데이트한 매니페스트 JSON을 복사합니다.
-
앱 수준 토큰(app-level token)을 생성합니다. JSON 매니페스트를 사용한 뒤에도 앱 수준 토큰을 만들어야 합니다. Basic Information 아래에서 App-level tokens 섹션까지 스크롤하고, 앱 수준 토큰을 생성하는 버튼을 클릭합니다. 토큰에 connections:write 스코프를 포함하세요.
-
앱을 설치하고 인가합니다.
-
앱 관리 페이지의 Basic Information 섹션으로 돌아갑니다.
-
Install to Workspace 버튼을 선택해 앱을 설치합니다.
-
이후 Slack OAuth 흐름을 거칩니다. 다음 화면에서 Allow를 선택합니다.
자신의 워크스페이스가 아닌 다른 워크스페이스에 앱을 추가하려면 해당 워크스페이스의 사용자가 이 단계를 수행해야 합니다. 설치 후 OAuth & Permissions 페이지로 돌아가면 OAuth Tokens 아래에 access token이 표시됩니다. 접근 토큰은 설치 사용자가 앱에 위임한 권한을 나타냅니다. 안전하게 보관하세요. 공개 버전 관리 시스템에 체크인하지 마세요. 대신 환경 변수를 통해 접근하세요.
- 앱을 채널에 추가합니다. 앱은 아직 어떤 채널의 멤버도 아니므로 테스트 메시지를 추가할 채널을 하나 골라
/invite로 앱을 초대하세요. 예:/invite @Grocery Reminders.
Note
새 채널을 로드하려면 프로세서를 다시 시작하세요. 앱이 새 채널에 추가된 후에는 OpenFlow 런타임의 Consume Slack Conversation 프로세서를 중지·재시작해야 합니다.
필요한 인그레스 규칙 설정
Snowflake 관리자가 egress guide를 따라 엔드포인트 https://slack.com/api에 이그레스 규칙을 적용하고 wss://wss.slack.com에 WebSocket 이그레스를 활성화해야 합니다. "slack.com" 도메인에 이그레스를 활성화하는 규칙을 추가하면 가장 쉽습니다.
Snowflake 계정 설정
Snowflake 계정 관리자로 다음 작업을 수행하세요. 기본 SNOWFLAKE_MANAGED 인증 전략에서는 런타임의 execute-as 역할이 커넥터가 Snowflake에 접근할 때 사용하는 신원이므로, 그 역할에 아래 권한을 부여합니다.
- 커넥터가 수집한 데이터를 저장할 Snowflake 데이터베이스와 스키마를 만들고, 커넥터의 테이블과 내부 스테이지에 필요한 권한을 execute-as 역할에 부여합니다.
CREATE DATABASE IF NOT EXISTS <destination_database>;
CREATE SCHEMA IF NOT EXISTS <destination_database>.<destination_schema>;
GRANT USAGE ON DATABASE <destination_database> TO ROLE OPENFLOW_<RUNTIME_NAME>_EXECUTE_AS_RL;
GRANT USAGE ON SCHEMA <destination_database>.<destination_schema> TO ROLE OPENFLOW_<RUNTIME_NAME>_EXECUTE_AS_RL;
GRANT CREATE TABLE, CREATE STAGE, CREATE SEQUENCE ON SCHEMA <destination_database>.<destination_schema> TO ROLE OPENFLOW_<RUNTIME_NAME>_EXECUTE_AS_RL;
Use case 2: Ingest Slack content and enable Cortex를 사용한다면 선택적 Cortex Search 서비스 생성 권한도 부여하세요:
GRANT CREATE CORTEX SEARCH SERVICE ON SCHEMA <destination_database>.<destination_schema> TO ROLE OPENFLOW_<RUNTIME_NAME>_EXECUTE_AS_RL;
-
커넥터가 수집한 원시 문서와 테이블에 접근해야 하는 다른 Snowflake 사용자가 있다면(예: Snowflake에서 커스텀 처리를 위해), 그 사용자들에게 execute-as 역할을 부여하세요.
-
커넥터가 사용할 웨어하우스를 지정합니다. 가장 작은 웨어하우스 크기로 시작한 뒤 복제되는 테이블 수와 전송되는 데이터 양에 따라 크기를 조정하세요. 테이블 수가 많으면 큰 웨어하우스 크기보다 다중 클러스터 웨어하우스로 확장하는 것이 일반적으로 더 좋습니다.
CREATE WAREHOUSE IF NOT EXISTS <openflow_warehouse>
WITH
WAREHOUSE_SIZE = 'XSMALL'
AUTO_SUSPEND = 300
AUTO_RESUME = TRUE;
GRANT USAGE, OPERATE ON WAREHOUSE <openflow_warehouse> TO ROLE OPENFLOW_<RUNTIME_NAME>_EXECUTE_AS_RL;
Note
Openflow - BYOC Deployments에 커넥터를 배포하고 권장되는 SNOWFLAKE_MANAGED 대신 KEY_PAIR 인증 전략을 사용한다면, 런타임의 관리 토큰에 의존하는 대신 이 동일한 execute-as 역할을 서비스 사용자에게 부여하게 됩니다. 서비스 사용자 생성은 Set up key-pair authentication for Openflow - BYOC Deployments를 참고하세요.
사용 사례 1: Slack 콘텐츠만 수집
커넥터 정의를 다음 용도로 사용합니다:
-
수집된 Slack 데이터에 대한 사용자 정의 분석 수행(Cortex Search 처리 없음).
-
Slack 메시지·반응·파일 첨부·멤버 목록을 Snowflake로 수집하고 최신 상태로 유지.
커넥터 설정
데이터 엔지니어로 커넥터를 구성하려면 다음 작업을 수행하세요:
커넥터 설치
- Set up Snowflake account에 설명된 대로 커넥터가 수집한 데이터를 저장할 Snowflake 데이터베이스와 스키마를 만들고, 필요한 데이터베이스 권한을 execute-as 역할에 부여합니다.
데이터 엔지니어로 커넥터를 설치하려면:
-
Openflow의 Connector library 탭으로 이동합니다.
-
Openflow 커넥터 페이지에서 커넥터를 찾아 Install을 선택합니다.
-
Select runtime 대화상자에서 Available runtimes 드롭다운 목록에서 런타임을 선택하고 Install을 클릭합니다.
Note
커넥터를 설치하기 전에 커넥터가 수집한 데이터를 저장할 데이터베이스와 스키마를 Snowflake에 만들었는지 확인하세요.
-
Snowflake 계정 자격 증명으로 배포에 인증하고, 런타임 앱이 Snowflake 계정에 접근하도록 허용하라는 메시지가 나오면 Allow를 선택합니다. 커넥터 설치 과정은 완료하는 데 몇 분 정도 걸립니다.
-
Snowflake 계정 자격 증명으로 런타임에 인증합니다.
Openflow 캔버스에 커넥터 프로세스 그룹이 추가됩니다.
커넥터 구성
-
가져온 프로세스 그룹을 우클릭하고 Parameters를 선택합니다.
-
아래 Flow parameters: Ingest content only에 설명된 대로 필수 파라미터 값을 입력합니다.
-
캔버스를 우클릭하고 Enable all controller services를 선택합니다.
-
가져온 프로세스 그룹을 우클릭하고 Start를 선택합니다. 흐름이 필요한 테이블을 만들고 Slack 데이터 수집을 시작합니다.
흐름 파라미터: 콘텐츠만 수집
| Parameter | Description |
|---|---|
| App Token | Slack App에서 생성한 Slack App-level token. |
| Bot Token | Slack App에서 생성한 Slack Bot token. |
| Destination Database | 모든 커넥터 객체를 담을 데이터베이스. 이미 존재해야 합니다. |
| Destination Schema | 데이터베이스 안의 스키마. 이미 존재해야 합니다. |
| Snowflake Authentication Strategy | 다음을 사용할 때: |
Snowflake Openflow Deployment 또는 BYOC: SNOWFLAKE_MANAGED 사용. 이 토큰은 Snowflake가 자동으로 관리합니다. BYOC 배포는 SNOWFLAKE_MANAGED를 사용하려면 execute-as roles를 미리 구성해야 합니다. BYOC: 대안으로 KEY_PAIR를 인증 전략 값으로 사용할 수 있습니다. |
| Snowflake Account | 다음을 사용할 때:
SNOWFLAKE_MANAGED: 비어 있어야 합니다.
KEY_PAIR: Snowflake 계정 식별자. |
| Snowflake Role | 다음을 사용할 때:
SNOWFLAKE_MANAGED: 런타임의 execute-as 역할(또는 그 역할에 부여된 하위 역할) 사용.
KEY_PAIR: 서비스 사용자에게 구성된 유효한 역할 사용. |
| Snowflake User | 다음을 사용할 때:
SNOWFLAKE_MANAGED: 비어 있어야 합니다.
KEY_PAIR: 흐름이 연결하는 데 사용하는 사용자 이름. |
| Snowflake Private Key | 다음을 사용할 때:
SNOWFLAKE_MANAGED: 비어 있어야 합니다.
KEY_PAIR: 인증에 사용하는 RSA 개인 키(PKCS8 PEM 형식). Snowflake Private Key 또는 Snowflake Private Key File 중 하나는 정의되어야 합니다. |
| Snowflake Private Key Password | 다음을 사용할 때:
SNOWFLAKE_MANAGED: 비어 있어야 합니다.
KEY_PAIR: 암호화된 개인 키의 비밀번호(비암호화면 비워 둠). |
| Snowflake Private Key File | 다음을 사용할 때:
SNOWFLAKE_MANAGED: 비어 있어야 합니다.
KEY_PAIR: RSA 개인 키가 든 파일(PKCS8 PEM 형식). 헤더 줄은 -----BEGIN PRIVATE로 시작합니다. |
| Snowflake Warehouse | 흐름이 실행하는 SQL에 사용되는 웨어하우스. |
| Upload Interval | Snowflake로 푸시하기 전에 데이터를 모으는 시간. 간격이 길수록 Snowflake 부하는 줄지만 지연·메모리 사용이 늘 수 있습니다. |
| Refresh Slack Members | Slack 멤버십(ACL) 새로고침 사이의 분. |
사용 사례 2: Slack 콘텐츠 수집 및 Cortex 활성화
커넥터 정의를 다음 용도로 사용합니다:
-
Snowflake Cortex로 Slack 데이터를 대화형 검색에 사용할 수 있게 준비.
-
검색 결과에 Slack 채널 접근 제어가 존중되도록 보장.
커넥터 설정
데이터 엔지니어로 커넥터를 구성하려면 다음 작업을 수행하세요:
커넥터 설치
- Set up Snowflake account에 설명된 대로 커넥터가 수집한 데이터를 저장할 Snowflake 데이터베이스와 스키마를 만들고, 필요한 데이터베이스 권한을 execute-as 역할에 부여합니다.
데이터 엔지니어로 커넥터를 설치하려면:
-
Openflow의 Connector library 탭으로 이동합니다.
-
Openflow 커넥터 페이지에서 커넥터를 찾아 Install을 선택합니다.
-
Select runtime 대화상자에서 Available runtimes 드롭다운 목록에서 런타임을 선택하고 Install을 클릭합니다.
Note
커넥터를 설치하기 전에 커넥터가 수집한 데이터를 저장할 데이터베이스와 스키마를 Snowflake에 만들었는지 확인하세요.
-
Snowflake 계정 자격 증명으로 배포에 인증하고, 런타임 앱이 Snowflake 계정에 접근하도록 허용하라는 메시지가 나오면 Allow를 선택합니다. 커넥터 설치 과정은 완료하는 데 몇 분 정도 걸립니다.
-
Snowflake 계정 자격 증명으로 런타임에 인증합니다.
Openflow 캔버스에 커넥터 프로세스 그룹이 추가됩니다.
커넥터 구성
-
가져온 프로세스 그룹을 우클릭하고 Parameters를 선택합니다.
-
아래 Flow parameters: Ingest content and enable Cortex에 설명된 대로 필수 파라미터 값을 입력합니다.
-
캔버스를 우클릭하고 Enable all controller services를 선택합니다.
-
가져온 프로세스 그룹을 우클릭하고 Start를 선택합니다.
-
흐름이 실행되면 테스트를 위해 Cortex Search 서비스 조회로 진행합니다.
흐름 파라미터: 콘텐츠 수집 및 Cortex 활성화
| Parameter | Description |
|---|---|
| App Token | Slack App에서 생성한 Slack App-level token. |
| Bot Token | Slack App에서 생성한 Slack Bot token. |
| Destination Database | 모든 커넥터 객체를 담을 데이터베이스. 이미 존재해야 합니다. |
| Destination Schema | 데이터베이스 안의 스키마. 이미 존재해야 합니다. |
| Upload Interval | Snowflake로 푸시하기 전에 데이터를 모으는 시간. 값이 클수록 부하는 줄지만 데이터 지연이 늘어납니다. |
| Snowflake Authentication Strategy | 다음을 사용할 때: |
Snowflake Openflow Deployment 또는 BYOC: SNOWFLAKE_MANAGED 사용. 이 토큰은 Snowflake가 자동으로 관리합니다. BYOC 배포는 SNOWFLAKE_MANAGED를 사용하려면 execute-as roles를 미리 구성해야 합니다. BYOC: 대안으로 KEY_PAIR를 인증 전략 값으로 사용할 수 있습니다. | | Snowflake Account | 다음을 사용할 때: SNOWFLAKE_MANAGED: 비어 있어야 합니다. KEY_PAIR: Snowflake 계정 식별자. | | Snowflake Role | 다음을 사용할 때: SNOWFLAKE_MANAGED: 런타임의 execute-as 역할(또는 그 역할에 부여된 하위 역할) 사용. KEY_PAIR: 서비스 사용자에게 구성된 유효한 역할 사용. | | Snowflake User | 다음을 사용할 때: SNOWFLAKE_MANAGED: 비어 있어야 합니다. KEY_PAIR: 흐름이 연결하는 데 사용하는 사용자 이름. | | Snowflake Private Key | 다음을 사용할 때: SNOWFLAKE_MANAGED: 비어 있어야 합니다. KEY_PAIR: 키 페어 인증용 PEM 형식 개인 키. | | Snowflake Private Key Password | 다음을 사용할 때: SNOWFLAKE_MANAGED: 비어 있어야 합니다. KEY_PAIR: 암호화된 개인 키의 비밀번호(비암호화면 비워 둠). | | Snowflake Warehouse | 흐름과 Cortex가 실행하는 모든 SQL에 사용되는 웨어하우스. | | Refresh Slack Members | Slack 멤버십(ACL) 새로고침 사이의 분. |
비공개 채널 ACL 활성화
각 비공개 채널에 Slack 앱 초대 외에 추가 단계는 필요 없습니다. 커넥터는 각 Refresh Slack Members 간격에 멤버 목록을 자동으로 새로고침해 멤버십 테이블에 저장합니다.
Cortex Search 서비스 조회
사용 사례 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": "[email protected]"}},
"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 채널에서 올 수 있습니다.
Slack에서 수집한 메시지에 대해 Cortex Search 서비스를 조회하려면 Python worksheet에서 다음 코드를 실행하세요. 데이터베이스에 snowflake.core 패키지를 추가해야 합니다.
다음을 바꾸세요:
-
*cortex_db*: Cortex Search 서비스가 담긴 데이터베이스 이름. Destination Database 파라미터로 지정. -
*cortex_schema*: Cortex Search 서비스가 담긴 스키마 이름. Destination Schema 파라미터로 지정. -
*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())
Slack에서 수집한 메시지에 대해 Cortex Search 서비스를 조회하려면 커맨드라인 인터페이스에서 다음 코드를 실행하세요. Snowflake REST API에 접근하려면 키 페어 인증과 OAuth를 통한 인증이 필요합니다. 자세한 내용은 REST API와 Snowflake로 Snowflake REST API 인증을 참고하세요.
다음을 바꾸세요:
-
*cortex_db*: Cortex Search 서비스가 담긴 데이터베이스 이름. Destination Database 파라미터로 지정. -
*cortex_schema*: Cortex Search 서비스가 담긴 스키마 이름. Destination Schema 파라미터로 지정. -
*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 <CORTE...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."
} ]
}