BESPIN Tech Blog
  • Home
  • Tech
    • CSP

      AWS

      GCP

      NCP

      Cloud

      Migration

      LZ, Control Tower

      Backup

      Monitoring

      Container

      Infra

      OS

      Middleware

      Data

      RDB

      Big Data Platform

      Application

      CI/CD

      BESPICK 구독하기 ㅣ 1668-1280

  • Trend
  • IT
최신 리포트 다운로드 지금 바로 문의하기
BESPIN Tech Blog
  • Home
  • Tech
    • CSP

      AWS

      GCP

      NCP

      Cloud

      Migration

      LZ, Control Tower

      Backup

      Monitoring

      Container

      Infra

      OS

      Middleware

      Data

      RDB

      Big Data Platform

      Application

      CI/CD

      BESPICK 구독하기 ㅣ 1668-1280

  • Trend
  • IT
최신 리포트 다운로드 지금 바로 문의하기
BESPIN Tech Blog
BESPIN Tech Blog
  • Tech
    • CSP
      • AWS
      • GCP
      • NCP
    • Cloud
      • Migration
      • LZ, Control Tower
      • Backup
      • Monitoring
      • Container
    • Infra
      • OS
      • Middleware
    • Data
      • RDB
      • Big Data Platform
    • Application
      • CI/CD
  • Trend
  • IT
  • Contact US
AWS

AWS LAMBDA를 활용한 Account Helth Event 발생 정보 슬랙 전송(2)

by 민우 서 2025년 04월 08일
2025년 04월 08일
25

안녕하세요 오늘은 BESPIN GLOBAL AI실 박성환님이 작성해주신 ‘AWS LAMBDA를 활용한 Account Helth Event 발생 정보 슬랙 전송(2)’에 대해 소개해드리도록 하겠습니다.

목차

  1. Lambda 함수 생성
  2. API GATEWAY생성
  3. Slack APP 설정
  4. 이벤트 관리테스트

지난 포스팅 ‘AWS LAMBDA를 활용한 EVENT발생 정보 슬랙 전송(1)’에 이어 발생된 이벤트를 슬랙에서 관리하도록 설정해보겠습니다.

1. Lambda 함수 생성

1.1 환경변수

  • 이벤트발생 Lambda(z-psh-event-test)와 동일하게 환경변수를 설정합니다.

1.2 소스 코드

  • Lambda명 z_psh_test2으로 아래와 같이 코드를 작성합니다.


import json
import os
from slack_sdk import WebClient
from urllib.parse import parse_qs
from io import StringIO
import requests
from base64 import b64decode
from tabulate import tabulate
import pandas as pd
from botocore.exceptions import ClientError
import boto3
from urllib.parse import unquote

SLACK_APP_TOKEN = os.environ['slackToken']
SLACK_CHANNEL = os.environ['slackChannel']
s3_bucket = os.environ['BUCKET']
s3_full_key = os.environ['FULL_KEY']
s3_client = boto3.client('s3')

def send_slack_message(token, channel, message):
    client = WebClient(token=token)
    try:
        response = client.chat_postMessage(
            channel=channel,
            text=message
        )
        return response
    except Exception as e:
        return str(e)
    
def lambda_handler(event, context):
    # Slack으로부터 전송된 데이터 파싱
    body = parse_qs(event.get("body", ""))
    command = body.get("command", [""])
    command = command[0]
    text_values = body.get('text', [""])[0].split()
    s3_df_full = s3_df_full_download()
    
    if command == "/update_event_complete":
       if len(text_values) == 2:
          text_values = ' '.join(text_values) 
          ID = int(text_values.split()[0])
          complete = text_values.split()[1]
          if (s3_df_full['ID'] == ID).any() and complete.upper() in ['Y', 'N']:
             s3_df_full.loc[s3_df_full['ID'] == ID, 'Process_comple'] = complete.upper()
             csv_file = '/tmp/result_full.csv'
             s3_df_full.to_csv(csv_file, index=False, encoding='utf-8')
             with open(csv_file, 'rb') as upload_file:
                  s3_client.upload_file(csv_file, s3_bucket, s3_full_key)
             message = f"이벤트번호: {ID}, 완료여부(Y/N): {complete}"     
             response = send_slack_message(SLACK_APP_TOKEN, SLACK_CHANNEL, message)
          else:
               message = "TEST : ID&VALUE 순서로 사용가능합니다."
               response = send_slack_message(SLACK_APP_TOKEN, SLACK_CHANNEL, message)   

       elif len(text_values) == 1:
            event_list = ''.join(text_values)
            if event_list == 'list':
               # 수정된 부분: s3_df_full 변수에 s3_df_full_download 함수의 반환값을 할당
               s3_df_full = s3_df_full[s3_df_full['Process_comple'] != 'Y']
               message = "TEST : 미처리된 이벤트 내역입니다."
               event_list_info(s3_df_full, message)
            elif event_list == 'full_list':
                 message = "TEST : 전체 이벤트 내역입니다."    
                 event_list_info(s3_df_full, message)
            elif event_list == 'del_list': 
                 filtered_df = s3_df_full[s3_df_full['Process_comple'] == 'Y']
                 print(filtered_df)
                 if not filtered_df.empty:
                    s3_df_full.drop(filtered_df.index, inplace=True)
                    csv_file = '/tmp/result_full.csv'
                    s3_df_full.to_csv(csv_file, index=False, encoding='utf-8')
                    with open(csv_file, 'rb') as upload_file:
                       s3_client.upload_file(csv_file, s3_bucket, s3_full_key)
                    message ="TEST : 완료된 이벤트정보 삭제 되었습니다."     
                    response = send_slack_message(SLACK_APP_TOKEN, SLACK_CHANNEL, message)
                 else: 
                     message ="TEST : 삭제대상의 이벤트정보가 없습니다."
                     response = send_slack_message(SLACK_APP_TOKEN, SLACK_CHANNEL, message)
            else:
               message = "TEST : [list], [full_list], [del_list]  만 사용가능합니다."
               response = send_slack_message(SLACK_APP_TOKEN, SLACK_CHANNEL, message)

    return {
        'statusCode': 200,
        'body': json.dumps({'message': 'Lambda function executed successfully'})
    }
    
def s3_df_full_download():  
    try:
       response = s3_client.head_object(Bucket=s3_bucket, Key=s3_full_key)
    except ClientError as e:
        if e.response['Error']['Code'] == '404':
            response = None  
            raise  
            
    if response:
        # S3에서 파일 다운로드
        response = s3_client.get_object(Bucket=s3_bucket, Key=s3_full_key)
        csv_content = response['Body'].read().decode('utf-8')
        # 로컬에서 pandas DataFrame으로 읽기
        s3_df_full = pd.read_csv(StringIO(csv_content)) 
        return s3_df_full  # 수정된 부분: DataFrame을 반환하도록 수정
    
def event_list_info(s3_df_full, message):   
    s3_df_full = s3_df_full.drop(columns=['arn', 'eventScopeCode', 'eventTypeCategory', 'latestDescription', 'entityValue'])
    new_order = ['ID', 'service', 'eventTypeCode', 'Region', 'startTime', 'lastUpdatedTime', 'statusCode', 'deprecated_versions', 'Process_comple']
    s3_df_full = s3_df_full.loc[:, new_order]
    s3_df_full = s3_df_full.reset_index(drop=True)
    result_text = tabulate(s3_df_full, headers='keys', tablefmt='pretty', stralign='left')    
    
    txt_file = '/tmp/result.txt'
    with open(txt_file, 'w', encoding='utf-8') as file:
        file.write(result_text)
    slack_upload_url = "https://slack.com/api/files.upload"
    headers = {
           "Authorization": f"Bearer {SLACK_APP_TOKEN}"
    }
    # Slack API 업로드 매개변수
    params = {
        "channels": SLACK_CHANNEL,
        "filename": txt_file,
        "initial_comment": message
    }
    
    # 파일 업로드
    with open(txt_file, "rb") as file_content:
        files = {"file": (txt_file, file_content)}
        response = requests.post(slack_upload_url, headers=headers, params=params, files=files)

2. API GATEWAY생성

2.1 API & Resource 생성

  • Slack과 AWS Lambda함수통신을 위해 API Gateway를 사용하도록 합니다.
  • HTTP API나 REST API를 사용하여 생성합니다.
  • 생성된 API에 리소스생성 작업을 진행합니다.(리소스이름은 test로 생성)

2. API GATEWAY생성

2.2 Method 생성

  • 생성된 API에 메서드 생성을 진행합니다.
  • 메서드 생성 : POST, 통합유형 : Lambda 함수, Lambda 프록시 통합 : on, Lambda함수 : z_psh_test2
  • 메서드를 생성하면 lambda의 트리거에 연결됩니다.
  • 메서드의 통합요청을 선택하고 편집을하여 매핑탬플릿을 아래와 같이 설정합니다.

메서드의 통합요청을 선택하고 편집을하여 매핑탬플릿을 아래와 같이 설정한다

3. Slack APP 설정

  • 메세지 전송시 사용했던 슬랙 app을 계속 사용 하도록 합니다.(z_psh_test_event)
  • z_psh_test_event을 선택하고 메뉴에서 Slash Commands 선택하여 새로운 명령을 생성합니다.
  • Command : /update_event_complete, Request URL : Lambda함수의 api gateway 트리거 API Endpoint 입력하고 생성합니다.

Command : /update_event_complete, Request URL : Lambda함수의 api gateway 트리거 API Endpoint 입력 하고 생성

4. 이벤트 관리테스트

4. 이벤트 관리테스트

  • 9:00 미처리 이벤트 내역 remind 메세지를 자동 발신합니다.

9:00 미처리 이벤트 내역 remind 메세지 자동 발신

  • 조치 완료 이벤트(AWS_EKS_PLANNED_LIFECYCLE_EVENT) 

조치 완료 이벤트(AWS_EKS_PLANNED_LIFECYCLE_EVENT) 

  • 전체 이벤트 조회 

전체 이벤트 조회 

  • 조치 완료 이벤트(AWS_EKS_PLANNED_LIFECYCLE_EVENT) 삭제

전체 이벤트 조회 

  • 전체 이벤트 조회 

전체 이벤트 조회 

  • 미처리 이벤트 조회
미처리 이벤트 조회

여기까지 ‘AWS LAMBDA를 활용한 Account Helth Event 발생 정보 슬랙 전송(2)’에 대해 소개해드렸습니다. 유익한 정보가 되셨길 바랍니다. 감사합니다. 

Written by 박 성환

BESPIN GLOBAL

관련

awsLambdaAccount Helth Event발생 정

HOT Trend

Recent Posts

  • 딜로이트도, 맥킨지도, 베스핀글로벌도: AI 에이전트로 일 바꾸는 시대

    2025년 07월 04일 클라우드베스핀글로벌clouddata데이터AI인공지능HelpNow AIbespinglobalAI에이전트helpnow업무자동화딜로이트
  • ⚔️데이터센터에서 시작된 전쟁? 요즘 뜨는 AIDC 개념부터 트렌드까지!

    2025년 06월 27일 클라우드clouddata데이터AI데이터센터클라우드 데이터센터bespinglobalAIDCAI 인프라베스핀글로벌
  • 구글부터 엔비디아까지, 빅테크 기업들의 AI 전략 최신본📖

    2025년 06월 20일 cloud베스핀글로벌클라우드data데이터AI구글마이크로소프트엔비디아AI에이전트google I/ONVIDIA GTC 2025Microsoft build 2025
  • AI를 연결한다고? 업계가 주목하는 ‘MCP’ 알아보기🔍

    2025년 06월 13일 베스핀글로벌클라우드cloudAIMCP
  • [WhaTap] RDS Failover/Reboot 관제 2 – RDS Failover

    2025년 05월 30일 RDSRDS FailoverRebootFailoverbespin global

베스핀글로벌은 모든 기업의 AI 혁신을 실현하기 위해, 세상에서 가장 혁신적이고 자동화된 AI 서비스와 솔루션을 만들어갑니다.
상호 : 베스핀글로벌 주식회사 ㅣ 대표자명 : 김써니, 허양호 ㅣ 사업자등록증번호 : 638-87-00223 ㅣ 통신판매번호 : 2019-서울서초-0347 ㅣ 대표전화 : 1668-1280
사업장주소지 : 서울특별시 서초구 강남대로 327, 13,14,15,16층(서초동,대륭서초타워) ㅣ 이메일 : info@bespinglobal.com ㅣ 개인정보 처리방침 ㅣ 개인정보 처리방침 안내

© 2026 BESPIN GLOBAL, All Rights Reserved.

BESPINGLOBAL
패밀리 사이트
China MEA SEA US

BESPIN Tech Blog
  • Home
  • Tech
    • CSP

      AWS

      GCP

      NCP

      Cloud

      Migration

      LZ, Control Tower

      Backup

      Monitoring

      Container

      Infra

      OS

      Middleware

      Data

      RDB

      Big Data Platform

      Application

      CI/CD

      BESPICK 구독하기 ㅣ 1668-1280

  • Trend
  • IT