끄적이는 보송

[AWS] Lambda를 이용해 Slack에 메세지 보내기 본문

STUDY/AWS

[AWS] Lambda를 이용해 Slack에 메세지 보내기

끄적이는 보송 2022. 5. 28. 21:48
반응형

오늘은 AWS Lambda를 이용해 S3에 파일 업로드 시, 이벤트 코드를 Slack에 보내는 것을 한번 해보려 한다. 본 실습 내용을 대략 정리하자면 Slack Integration의 Webhooks 코드를 AWS Lambda 코드에 적용할 것이고, 그리고 그 코드는 S3 버킷에 오브젝트 업로드라는 이벤트 발생 시, 실행하도록 구현할 것이다.

 

Slack 작업

먼저 해야 할 것은 Slakc Application 생성이다. 하단의 링크 접속 전에 먼저 로그인하고 Lambda 테스트를 위한 슬랙 방과 채널을 미리 파두자. 

https://api.slack.com/apps

 

Slack API: Applications | Slack

Your Apps Don't see an app you're looking for? Sign in to another workspace.

api.slack.com

링크에 접속하면 아래처럼 Application 생성 화면이 나온다. 적당한 이름과 미리 준비해둔 슬랙 방을 선택하자.

Application 생성이 완료되면 'Incoming Webhooks'를 클릭해 아래와 같이 활성화시켜준 뒤, 페이지 제일 하단의 'Add New Webhook to Workspace' 버튼을 클릭해 채널을 추가해준다.

밑의 curl 명령어를 실행하면 Slack 방에 "Hello, World"라고 application이 챗을 날리는 것을 볼 수 있다. 이로서 Slack에서의 작업은 끝이다.

curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' YOUR_WEBHOOK_URL_HERE

 

 

AWS Lambda 작업

자잘한 권한 설정이나 S3 버킷 이벤트 트리거 등등은 스킾하겠다. 크게 어려울 것 없으니 생성하면 직관적으로 알 수 있다. 대충 Lambda는 아래와 같이 구성했으며, 크게 별 것 없다.

Webhook url을 Python 코드에 담아 아래와 같이 짜보았다. 그냥 순수 이벤트 레코드를 통째로 Slack에 보낼 수도 있지만, 보기 쉽지 않아 나름 띄어쓰기를 해줬다.

import boto3
import json
import urllib.parse
import requests

output_string = ""

def get_dict_string(input, log_string,cnt):
    for k, v in input.items():
        
        if isinstance(v,dict):
            for i in range(cnt):
                log_string += '        '
            if cnt == 0 : 
                log_string += str(k) + ' : '
            else : 
                log_string += '┖' + str(k) + ' : '
            log_string += '\n'
            log_string = get_dict_string(v,log_string,cnt+1)
            
        else:
            for i in range(cnt):
                log_string += '        '
            if cnt == 0 : 
                log_string += str(k) + ' : ' + str(v) + '\n'
            else:
                log_string += '┖' + str(k) + ' : ' + str(v) + '\n'
    return log_string
        
def lambda_handler(event, context):
    s3 = boto3.client("s3")
    webhook_url = "https://hooks.slack.com/services/your_webhook_url"
    log_string = ""
    
    if event:
        bucket = event['Records'][0]['s3']['bucket']['name']
        key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
        response = s3.get_object(Bucket=bucket, Key=key)
        data = event['Records'][0]
        log_string = get_dict_string(data,log_string,0)
        
        data = {
            'text' : "%s\n" %log_string
        }
        
        response = requests.post(webhook_url, data=json.dumps(data), headers={'Content-Type': 'application/json'})

테스트로 S3 버킷에 파일을 업로드해보니 정상적으로 Slack에 이벤트 레코드를 뱉어냈다. 내가 원하는 그림처럼 나왔다. 

트리거 발생 시, 람다 코드 실행 관련 로그는 'CloudWatch > Log groups > /aws/lambda/Your_Lambda_Function'에서 찾아볼 수 있다. 만약 에러가 발생했다면 해당 경로에서 그 로그를 찾아보아 고치면 된다. 로그가 쌓이지 않는다면 Lambda 생성 시, 설정했다면 IAM 권한 부족 이슈일 수도 있으니 참고하자.

반응형
Comments