Openflow Connector for Slack 설정

Openflow Connector for Slack 설정

이 페이지에서는 Slack용 Openflow Connector를 설정하는 전체 절차를 설명해요. Slack 앱 생성·설치, 인그레스 규칙, Snowflake 계정 준비, 그리고 두 가지 사용 사례(콘텐츠 수집만 / Cortex 검색 활성화)별 흐름 파라미터를 차례로 다룹니다.

출처: Snowflake 문서

본문

Note

이 커넥터는 Snowflake Connector Terms에 의해 규율됩니다.

이 토픽은 Slack용 Openflow Connector를 설정하는 단계를 설명합니다.

전제 조건

  1. About Openflow Connector for Slack을 검토했는지 확인하세요.

  2. Set up Openflow - Snowflake Deployments 또는 Set up Openflow - BYOC를 완료했는지 확인하세요.

  3. Openflow - Snowflake Deployments를 사용한다면 required domains 구성을 검토하고 Slack 커넥터에 필요한 도메인 접근을 부여했는지 확인하세요.

Slack 앱 설정

Slack 워크스페이스에 Slack 앱을 설정하세요. Slack 워크스페이스에 대한 접근을 설정하려면 Slack 관리자가 필요합니다. Slack 앱에 자격 증명을 만들거나 제공하고, Slack 워크스페이스와 채널에 앱을 설치하면 됩니다. JSON 구성으로 Slack 앱을 만들 수 있습니다:

  1. 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
}
  1. Apps page를 통해 Slack 앱을 만듭니다.

  2. Your Apps 페이지에서 Create New App을 선택합니다.

  3. From a manifest를 선택합니다.

  4. 앱을 개발할 Workspace를 선택합니다. 원하면 나중에 다른 워크스페이스로 앱을 배포할 수 있습니다.

  5. 1단계에서 업데이트한 매니페스트 JSON을 복사합니다.

  6. 앱 수준 토큰(app-level token)을 생성합니다. JSON 매니페스트를 사용한 뒤에도 앱 수준 토큰을 만들어야 합니다. Basic Information 아래에서 App-level tokens 섹션까지 스크롤하고, 앱 수준 토큰을 생성하는 버튼을 클릭합니다. 토큰에 connections:write 스코프를 포함하세요.

  7. 앱을 설치하고 인가합니다.

  8. 앱 관리 페이지의 Basic Information 섹션으로 돌아갑니다.

  9. Install to Workspace 버튼을 선택해 앱을 설치합니다.

  10. 이후 Slack OAuth 흐름을 거칩니다. 다음 화면에서 Allow를 선택합니다.

자신의 워크스페이스가 아닌 다른 워크스페이스에 앱을 추가하려면 해당 워크스페이스의 사용자가 이 단계를 수행해야 합니다. 설치 후 OAuth & Permissions 페이지로 돌아가면 OAuth Tokens 아래에 access token이 표시됩니다. 접근 토큰은 설치 사용자가 앱에 위임한 권한을 나타냅니다. 안전하게 보관하세요. 공개 버전 관리 시스템에 체크인하지 마세요. 대신 환경 변수를 통해 접근하세요.

  1. 앱을 채널에 추가합니다. 앱은 아직 어떤 채널의 멤버도 아니므로 테스트 메시지를 추가할 채널을 하나 골라 /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에 접근할 때 사용하는 신원이므로, 그 역할에 아래 권한을 부여합니다.

  1. 커넥터가 수집한 데이터를 저장할 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;
  1. 커넥터가 수집한 원시 문서와 테이블에 접근해야 하는 다른 Snowflake 사용자가 있다면(예: Snowflake에서 커스텀 처리를 위해), 그 사용자들에게 execute-as 역할을 부여하세요.

  2. 커넥터가 사용할 웨어하우스를 지정합니다. 가장 작은 웨어하우스 크기로 시작한 뒤 복제되는 테이블 수와 전송되는 데이터 양에 따라 크기를 조정하세요. 테이블 수가 많으면 큰 웨어하우스 크기보다 다중 클러스터 웨어하우스로 확장하는 것이 일반적으로 더 좋습니다.

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로 수집하고 최신 상태로 유지.

커넥터 설정

데이터 엔지니어로 커넥터를 구성하려면 다음 작업을 수행하세요:

커넥터 설치

  1. Set up Snowflake account에 설명된 대로 커넥터가 수집한 데이터를 저장할 Snowflake 데이터베이스와 스키마를 만들고, 필요한 데이터베이스 권한을 execute-as 역할에 부여합니다.

데이터 엔지니어로 커넥터를 설치하려면:

  1. Openflow의 Connector library 탭으로 이동합니다.

  2. Openflow 커넥터 페이지에서 커넥터를 찾아 Install을 선택합니다.

  3. Select runtime 대화상자에서 Available runtimes 드롭다운 목록에서 런타임을 선택하고 Install을 클릭합니다.

Note

커넥터를 설치하기 전에 커넥터가 수집한 데이터를 저장할 데이터베이스와 스키마를 Snowflake에 만들었는지 확인하세요.

  1. Snowflake 계정 자격 증명으로 배포에 인증하고, 런타임 앱이 Snowflake 계정에 접근하도록 허용하라는 메시지가 나오면 Allow를 선택합니다. 커넥터 설치 과정은 완료하는 데 몇 분 정도 걸립니다.

  2. Snowflake 계정 자격 증명으로 런타임에 인증합니다.

Openflow 캔버스에 커넥터 프로세스 그룹이 추가됩니다.

커넥터 구성

  1. 가져온 프로세스 그룹을 우클릭하고 Parameters를 선택합니다.

  2. 아래 Flow parameters: Ingest content only에 설명된 대로 필수 파라미터 값을 입력합니다.

  3. 캔버스를 우클릭하고 Enable all controller services를 선택합니다.

  4. 가져온 프로세스 그룹을 우클릭하고 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 채널 접근 제어가 존중되도록 보장.

커넥터 설정

데이터 엔지니어로 커넥터를 구성하려면 다음 작업을 수행하세요:

커넥터 설치

  1. Set up Snowflake account에 설명된 대로 커넥터가 수집한 데이터를 저장할 Snowflake 데이터베이스와 스키마를 만들고, 필요한 데이터베이스 권한을 execute-as 역할에 부여합니다.

데이터 엔지니어로 커넥터를 설치하려면:

  1. Openflow의 Connector library 탭으로 이동합니다.

  2. Openflow 커넥터 페이지에서 커넥터를 찾아 Install을 선택합니다.

  3. Select runtime 대화상자에서 Available runtimes 드롭다운 목록에서 런타임을 선택하고 Install을 클릭합니다.

Note

커넥터를 설치하기 전에 커넥터가 수집한 데이터를 저장할 데이터베이스와 스키마를 Snowflake에 만들었는지 확인하세요.

  1. Snowflake 계정 자격 증명으로 배포에 인증하고, 런타임 앱이 Snowflake 계정에 접근하도록 허용하라는 메시지가 나오면 Allow를 선택합니다. 커넥터 설치 과정은 완료하는 데 몇 분 정도 걸립니다.

  2. Snowflake 계정 자격 증명으로 런타임에 인증합니다.

Openflow 캔버스에 커넥터 프로세스 그룹이 추가됩니다.

커넥터 구성

  1. 가져온 프로세스 그룹을 우클릭하고 Parameters를 선택합니다.

  2. 아래 Flow parameters: Ingest content and enable Cortex에 설명된 대로 필수 파라미터 값을 입력합니다.

  3. 캔버스를 우클릭하고 Enable all controller services를 선택합니다.

  4. 가져온 프로세스 그룹을 우클릭하고 Start를 선택합니다.

  5. 흐름이 실행되면 테스트를 위해 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."
  } ]
}

더 알아보기 (Learn more)