

# AWS Glue Studio에서 Slack에 연결
<a name="connecting-to-data-slack"></a>

 Slack은 사용자가 다양한 공개 및 비공개 채널을 통해 메시지와 첨부 파일을 보낼 수 있는 엔터프라이즈 커뮤니케이션 앱입니다. Slack 사용자인 경우 Slack 계정에 AWS Glue를 연결할 수 있습니다. 그런 다음, Slack을 ETL 작업에서의 데이터 소스로 사용할 수 있습니다. 이러한 작업을 실행하여 Slack 및 AWS 서비스 또는 기타 지원되는 애플리케이션 간에 데이터를 전송합니다.

**Topics**
+ [Slack에 대한 AWS Glue의 지원](slack-support.md)
+ [연결을 생성하고 사용하기 위한 API 작업이 포함된 정책](slack-configuring-iam-permissions.md)
+ [Slack 구성](slack-configuring.md)
+ [Slack 연결 구성](slack-configuring-connections.md)
+ [Slack 엔터티에서 읽기](slack-reading-from-entities.md)
+ [Slack 연결 옵션](slack-connection-options.md)
+ [제한 사항](slack-limitations.md)
+ [새 Slack 계정 생성 및 클라이언트 앱 구성](slack-new-account-creation.md)

# Slack에 대한 AWS Glue의 지원
<a name="slack-support"></a>

AWS Glue에서는 다음과 같이 Slack을 지원합니다.

**소스로 지원되나요?**  
예. AWS Glue ETL 작업을 사용하여 Slack에서 데이터를 쿼리할 수 있습니다.

**대상으로서 지원되나요?**  
아니요.

**지원되는 Slack API 버전**  
 Slack API v2.

# 연결을 생성하고 사용하기 위한 API 작업이 포함된 정책
<a name="slack-configuring-iam-permissions"></a>

 다음 샘플 정책은 연결을 생성하고 사용하는 데 필요한 IAM 권한을 설명합니다. 새 역할을 생성하는 경우 다음을 포함하는 정책을 생성합니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:ListConnectionTypes",
        "glue:DescribeConnectionType",
        "glue:RefreshOAuth2Tokens",
        "glue:ListEntities",
        "glue:DescribeEntity"
      ],
      "Resource": "*"
    }
  ]
}
```

------

아래 관리형 IAM 정책을 사용하여 다음에 대한 액세스를 허용할 수 있습니다.
+  [AWSGlueServiceRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole) – 다양한 AWS Glue 프로세스를 대신 실행하는 데 필요한 리소스에 대한 액세스 권한을 부여합니다. 이러한 리소스에는 AWS Glue, Amazon S3, IAM, Amazon CloudWatch Logs, Amazon EC2가 포함됩니다. 이 정책에 지정된 리소스의 이름 변환을 따르고자 한다면 AWS Glue 절차는 필요한 권한을 소유합니다. 이 정책은 크롤러, 작업 및 개발 엔드포인트를 정의할 때 지정된 역할에 일반적으로 추가됩니다.
+  [AWSGlueConsoleFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AWSGlueConsoleFullAccess) - 정책이 연결된 자격 증명이 AWS Management Console을 사용하는 경우 AWS Glue 리소스에 대한 전체 액세스 권한을 부여합니다. 이 정책에 지정된 리소스의 이름 변환을 따르면 사용자는 콘솔 전체 용량을 소유합니다. 이 정책은 보통 AWS Glue 콘솔의 사용자에게 해당됩니다.

# Slack 구성
<a name="slack-configuring"></a>

AWS Glue를 사용하여 Slack에서 데이터를 전송하려면 먼저 다음 요구 사항을 충족해야 합니다.

## 최소 요구 사항
<a name="slack-configuring-min-requirements"></a>
+  Slack 계정이 있어야 합니다. 자세한 내용은 [새 Slack 계정 생성 및 클라이언트 앱 구성](slack-new-account-creation.md) 섹션을 참조하세요.

 이러한 요구 사항을 충족하면 Slack 계정에 AWS Glue를 연결할 준비가 된 것입니다.

# Slack 연결 구성
<a name="slack-configuring-connections"></a>

 Slack에서는 OAuth 2에 대한 `AUTHORIZATION_CODE` 권한 부여 유형을 지원합니다.

 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. AWS Glue 콘솔은 사용자를 Slack으로 리디렉션합니다. 사용자가 로그인하고 Slack 인스턴스에 액세스하도록 요청된 권한을 AWS Glue에 허용해야 합니다.

 사용자는 여전히 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Slack에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Slack으로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.

 이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 생성 후 1시간 후에 만료됩니다. 새로 고침 토큰을 사용하여 새 액세스 토큰을 가져올 수 있습니다.

 권한 부여 코드 OAuth 흐름을 위한 연결된 앱 생성에 대한 자세한 내용은 [Slack API](https://api.slack.com/quickstart)를 참조하세요.

Slack 연결을 구성하는 방법:

1.  AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성하세요. AWS Glue에서 연결에 대한 보안 암호를 생성해야 합니다.

   1.  고객 관리형 연결된 앱의 경우 - 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

1. AWS Glue Glue Studio의 **데이터 연결**에서 아래 단계에 따라 연결을 생성하세요.

   1. **연결 유형**을 선택할 때 Slack을 선택하세요.

   1. Slack 환경을 제공합니다.

   1.  다음 작업에 대한 권한이 있고 AWS Glue에서 수임할 수 있는 IAM 역할을 선택하세요.

------
#### [ JSON ]

****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "secretsmanager:DescribeSecret",
              "secretsmanager:GetSecretValue",
              "secretsmanager:PutSecretValue",
              "ec2:CreateNetworkInterface",
              "ec2:DescribeNetworkInterfaces",
              "ec2:DeleteNetworkInterface"
            ],
            "Resource": "*"
          }
        ]
      }
      ```

------

   1.  토큰을 넣기 위해 AWS Glue에서 이 연결에 사용할 `secretName`을 선택합니다.

   1.  네트워크를 사용하려는 경우 네트워크 옵션을 선택합니다.

1.  AWS Glue 작업 권한과 연결된 IAM 역할에 `secretName`을 읽을 수 있는 권한을 부여합니다.

# Slack 엔터티에서 읽기
<a name="slack-reading-from-entities"></a>

 **사전 조건** 
+  읽으려는 Slack 객체.

 **지원되는 엔터티** 


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| 대화 | 예 | 예 | 아니요 | 예 | 예 | 

 **예제** 

```
slack_read = glueContext.create_dynamic_frame.from_options(
    connection_type="slack",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "conversations/C058W38R5J8"
    }
)
```

 **Slack 엔터티 및 필드 세부 정보** 


| 개체 | 필드 | 데이터 형식 | 지원되는 연산자 | 
| --- | --- | --- | --- | 
| 대화 | attachments | 나열 | NA | 
| 대화 | bot\$1id | String | NA | 
| 대화 | 블록 | 나열 | NA | 
| 대화 | client\$1msg\$1id | String | NA | 
| 대화 | is\$1starred | 불 | NA | 
| 대화 | last\$1read | String | NA | 
| 대화 | latest\$1reply | String | NA | 
| 대화 | reactions | 나열 | NA | 
| 대화 | replies | 나열 | NA | 
| 대화 | reply\$1count | Integer | NA | 
| 대화 | reply\$1users | 나열 | NA | 
| 대화 | reply\$1users\$1count | Integer | NA | 
| 대화 | subscribed | 불 | NA | 
| 대화 | subtype | String | NA | 
| 대화 | 텍스트 | String | NA | 
| 대화 | team | String | NA | 
| 대화 | thread\$1ts | String | NA | 
| 대화 | ts | String | EQUAL\$1TO, BETWEEN, LESS\$1THAN, LESS\$1THAN\$1OR\$1EQUAL\$1TO, GREATER\$1THAN, GREATER\$1THAN\$1OR\$1EQUAL\$1TO | 
| 대화 | type | String | NA | 
| 대화 | 사용자 | String | NA | 
| 대화 | inviter | String | NA | 
| 대화 | root | Struct | NA | 
| 대화 | is\$1locked | 불 | NA | 
| 대화 | files | 나열 | NA | 
| 대화 | room | Struct | NA | 
| 대화 | 업로드 | 불 | NA | 
| 대화 | display\$1as\$1bot | 불 | NA | 
| 대화 | 채널 | String | NA | 
| 대화 | no\$1notifications | 불 | NA | 
| 대화 | permalink | String | NA | 
| 대화 | pinned\$1to | 나열 | NA | 
| 대화 | pinned\$1info | Struct | NA | 
| 대화 | edited | Struct | NA | 
| 대화 | app\$1id | String | NA | 
| 대화 | bot\$1profile | Struct | NA | 
| 대화 | metadata | Struct | NA | 

 **분할 쿼리** 

 Spark에서 동시성을 활용하려는 경우 추가 Spark 옵션(`PARTITION_FIELD`, `LOWER_BOUND`, `UPPER_BOUND`, `NUM_PARTITIONS`)을 제공할 수 있습니다. 이러한 파라미터를 사용하면 Spark 태스크에서 동시에 실행할 수 있는 `NUM_PARTITIONS`개의 하위 쿼리로 원본 쿼리가 분할됩니다.
+  `PARTITION_FIELD`: 쿼리 분할에 사용할 필드의 이름입니다.
+  `LOWER_BOUND`: 선택한 파티션 필드의 하한 값(경계 포함).

   날짜의 경우 Spark SQL 쿼리에 사용된 Spark 날짜 형식을 허용합니다. 유효한 값의 예제: `"2024-07-01T00:00:00.000Z"`.
+  `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(경계 제외).
+  `NUM_PARTITIONS`: 파티션 수.

 엔터티 수준 분할 필드 지원 세부 정보는 아래 표에 캡처되어 있습니다.


| Entity Name | 분할 필드 | 데이터 형식 | 
| --- | --- | --- | 
| 대화 | ts | String | 

 **예제** 

```
slack_read = glueContext.create_dynamic_frame.from_options(
    connection_type="slack",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "conversations/C058W38R5J8",
        "PARTITION_FIELD": "ts"
        "LOWER_BOUND": "2022-12-01T00:00:00.000Z"
        "UPPER_BOUND": "2024-09-23T15:00:00.000Z"
        "NUM_PARTITIONS": "2"
    }
)
```

# Slack 연결 옵션
<a name="slack-connection-options"></a>

다음은 Slack에 대한 연결 옵션입니다.
+  `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. 지원되는 엔터티 이름. 예시: `conversations/C058W38R5J8`.
+  `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 필드.
+  `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+  `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+  `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.

# 제한 사항
<a name="slack-limitations"></a>

다음은 Slack 커넥터에 대한 제한 사항입니다.
+  커넥터는 주어진 대화에서 사용할 수 있는 총 레코드(메시지) 수를 가져올 수 있는 수단을 제공하지 않으므로 레코드 기반 분할은 지원되지 않습니다.

# 새 Slack 계정 생성 및 클라이언트 앱 구성
<a name="slack-new-account-creation"></a>

**Slack 계정 생성**

1. [Slack 홈 페이지](https://slack.com/intl/en-in/)를 열어 계정에 가입하세요.

1. **SIGN UP WITH EMAIL ADDRESS**를 선택하세요. 이메일 ID를 입력하고 **계속**을 선택하세요.

1. 이메일 주소로 전송된 6자리 코드를 입력하세요. 그러면 워크스페이스를 생성하거나 기존 워크스페이스에 가입하도록 리디렉션됩니다.

1. **Create a workspace**를 선택하여 새 워크스페이스를 생성하세요. 설정 프로세스의 일환으로 몇 가지 질문에 답하도록 리디렉션됩니다.
   + 회사 이름
   + 이름.
   + 이메일로 동료를 추가하는 방법
   + 함께 작업하는 팀? (채널 이름이 됩니다.)

1. 이러한 질문에 대한 입력 필드를 채우고 계속하세요. 이제 계정을 사용할 준비가 되었습니다.



**Slack 개발자 앱 생성**

1. Slack 계정에 로그인하고 Slack 워크스페이스에 로그인하세요.

1. 워크스페이스 메뉴에서 **Tools and settings**를 선택하고 **Manage apps**를 선택하세요.

1. Slack App Directory 메뉴에서 **Build**를 선택하세요.

1. **Your Apps** 페이지에서 **Create an App**을 선택하세요.

1. **앱 생성** 페이지에서 **처음부터 생성**을 선택합니다.

1. 열리는 **Name app & choose workspace** 대화 상자에서 앱 이름을 추가하고 **Pick a workspace to deploy your app in**을 선택하세요. 그런 다음, **Create App**을 선택하세요.

1. 앱 자격 증명에 표시된 클라이언트 ID 및 보안 암호를 기록하세요.

1. OAuth & Permissions 사이드바에서 Scopes로 이동하고 **Add an OAuth Scope**를 선택하세요. 구성을 위해 리디렉션 URL을 앱에 추가하여 'Add to Slack' 버튼을 자동으로 생성하거나 앱을 배포할 수 있습니다. 리디렉션 URL 섹션까지 스크롤하여 **Add New Redirect URL**을 선택하고 저장하세요.

1. 그런 다음, OAuth Tokens for Your Workspace 섹션으로 스크롤하고 **Install to Workspace**를 선택하세요.

1. 생성한 앱에서 연결하려는 Slack 워크스페이스에 액세스할 수 있는 권한을 요청하고 있음을 알리는 대화 상자가 열리면 **Allow**을 선택하세요.

1. 성공적으로 완료되면 콘솔에 OAuth Tokens for Your Workspace 화면이 표시됩니다.

1. OAuth Tokens for Your Workspace 화면에서 AWS Glue에 연결하는 데 사용할 OAuth 토큰을 복사하고 저장하세요.

1. 다음으로, Slack 팀 ID를 검색하세요. Slack 워크스페이스 메뉴에서 **Tools and settings**를 선택하고 **Manage apps**를 선택하세요. 열리는 페이지의 URL에서 팀 ID를 찾을 수 있습니다.

1. 앱의 퍼블릭 배포를 위해 사이드바의 **Manage Distribution** 버튼으로 이동하여 활성화할 수 있습니다. 아래로 스크롤하여 Share Your App with Other Workspaces 섹션으로 이동하고 **Remove Hard Coded Information**을 선택하세요. 동의를 제공하고 **Active Public Distribution**을 선택하세요.

1. 이제 앱의 퍼블릭 배포가 수행됩니다. 엔터티 API에 액세스하려면 사용자가 액세스하려는 모든 워크스페이스 채널에 앱을 추가해야 합니다.

1. Slack 계정에 로그인하고 채널에 액세스해야 하는 워크스페이스를 여세요.

1. 워크스페이스에서 앱이 액세스하려는 채널을 열고 채널 제목을 선택하세요. 팝업에서 **Integrations** 탭을 선택하고 앱을 추가하세요. 그러면 앱이 채널과 통합되어 API에 액세스할 수 있습니다.

   OAuth 2.0 클라이언트 ID에는 하나 이상의 승인된 리디렉션 URL이 포함되어야 합니다. 리디렉션 URL 형식은 다음과 같습니다.
**참고**  
 Appflow 리디렉션 URL은 변경 가능하며, AWS Glue 플랫폼의 사후 리디렉션 URL을 사용할 수 있습니다. 클라이언트 ID 및 클라이언트 보안 암호는 OAuth 2.0 클라이언트 ID의 설정에서 가져옵니다.    
<a name="slack-redirect-url-detail"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/slack-new-account-creation.html)