Amazon Web Services 한국 블로그

ChatOps를 위한 AWS Lambda를 통한 Slack 통합 샘플 코드

여러분이 속한 개발팀이 채팅 기반 운영(ChatOps)?를 하고 계신가요? 대회를 기반으로 하는 새로운 운영 방식을 의미하는 것으로 하나 이상의 봇(bots)을 활용하여 대화에 빠르게 대응하여 상태 확인 및 보고를 해주는 용어입니다.

채팅 환경은 실시간 소통이 가능하고, 손쉽게 여러 사람이 웹 혹은 모바일 기기를 통해 접근할 뿐만 아니라 이전 메시지 기록까지 볼 수 있는 장점이 있습니다. 봇 기반의 통합 작업은 운영팀이 좀 더 협업을 하는데 도움을 주고, 갑작스런 문제에 동시 다발적으로 함께 추적하여 문제를 해결 할 수 있는 방식을 지원 합니다.

신규 Slack 통합 방식
AWS 고객들이 시스템 환경을 좀 더 새롭고 혁신 적인 방식으로 운영을 하기 위해, 최근 AWS Lambda 기반의 Slack 통합 함수 예제 를추가하였습니다.

여러분은 이러한 샘플 예제를 통해 채팅 기반 운영을 할 수 있는 도구를 만들어, 현재 사용하고 계신  Slack 대화안에 넣으실 수 있습니다. slack-echo- 샘플 코드는 특정 명령어에 대응하는 봇을 만들 수 있게 해주고, cloudwatch-alarm-to-slack- 샘플 코드는 알림 및 상태 보고를 도와줍니다. 여러분이 봇에게 AWS API 접근 권한을 부여하기 때문에, (봇을 통해) AWS 자원과 원하는 방법으로 상호 작용할 수 있습니다. 상태를 조회하거나, 오류 조건, 설정 변경 및 새로운 자원 생성도 가능합니다.

CloudWatch 알람을 통해 오토 스케일링 그룹을 모니터링하고, 제한 용량이 초과했을 경우 이를 Slack 채널의 ChatOps 팀에 메시지를 보낸다고 가정해 봅시다. 운영팀에서는 상황을 좀 더 자세히 살펴 보고 빠르게 스케일업을 통해 문제를 해결 할 수 있습니다. 다양한 AWS  자원과 Slack 통합을 통해, 아래와 같이 전체적은 운영 프로세스의 효율화가 가능합니다. (붉은 화살표는 알림, 녹색은 그에 대한 대응입니다.)

이러한 시스템 개발을 위해, 채널에 메시지를 보내기 위한 Slack webhook 을 사용하고, 메시지 내용은  cloudwatch-alarm-to-slack-python 샘플 예제로 보내면 됩니다. 샘플 예제를 기반으로  AWS Key Management Service (KMS) 키를 만든 후, webhook 주소를 암호화하고 base-64 인코딩을 통해  데이터 보안을 할 수 있습니다. 그리고, IAM Role을 통해 KMS Decrypt 함수를 호출 할 수 있는 권한을 부여하면, 됩니다. 슬랙 채널에 메시지를 전달하는 간단한 이벤트 핸들러 함수는 다음과 같습니다.

slack_message = {
    'channel': SLACK_CHANNEL,
    'text': "%s state is now %s: %s" % (alarm_name, new_state, reason)
}

req = Request(HOOK_URL, json.dumps(slack_message))

이벤트 핸들러를 통해 호출을 통해 나오는 모든 예외 처리를 할 수 있으며, 샘플 코드에 포함되어 있습니다.

또한, 맞춤형 슬랙 명령어를 구현하는 함수를 만들 수도 있습니다. 이를 위해 Amazon API Gateway를 활용하여, 각 함수의 HTTP 엔드 포인트를 만들고 엔드 포인트에서 명령어를 실행할 슬랙 채널을 설정하면 됩니다. 예를 들어, 아래 설정은 /scale/forcealarm 명령어를 위한 것입니다.

이벤트 핸들러 함수는 사용자, 명령어, 채널 등에 대한 접근 권한이 있습니다.

def lambda_handler(event, context):
    req_body = event['body']
    params = parse_qs(req_body)

    user = params['user_name'][0]
    command = params['command'][0]
    channel = params['channel_name'][0]
    command_text = params['text'][0]

POST 메서드에 대한 엔드 포인트를 설정하고 NONE에게 권한을 설정하면 됩니다. 또한, JSON에 요청하는 본문을 연결하면 됩니다. 각 샘플 코드에 포함되어 있는 상단의 주석 부분에 좀 더 자세한 정보들이 있으니 참고하시면 됩니다.

여러분의 함수를 공유해 주세요!
이러한 방법을 통해 여러분의 운영 방식을 획기적으로 개선할 다양한 Lambda  함수에 대한 아이디어 및 코드를 공유해 주시면 소개해 드리겠습니다.

Jeff;

이 글은 New – Slack Integration Blueprints for AWS Lambda의 한국어 번역입니다.