챗봇 만들기 — AWS EC2 서버 관리

챗봇으로 AWS OpsWorks를 관리하여 ChatOps를 시작해보자

AWS OpsWorks

BotHub.Studio에서는 서버 관리를 위해 AWS에 특화된 Chef 도구인 OpsWorks를 사용하고 있습니다. OpsWorks를 통해서, 각 layer의 서버 인스턴스 수를 늘리거나 줄일 수 있고, Git 저장소에 올려진 새 코드를 서버에 배포할 수 있습니다.

처음 OpsWorks를 도입했을 때는, AWS 웹 대시보드에 접속해서 작업을 했지만, 매번 로그인하고 여러 단계의 메뉴를 따라 들어가는 것이 번거롭게 느껴졌습니다. 그래서 빈번하게 사용하는 인스턴스 추가/삭제 등의 작업은 간단한 CLI용 스크립트를 만들어서 사용하곤 했습니다. 하지만 그것도 컴퓨터를 옮겨다니면서 작업을 할 때는 불편함이 있었고, 다른 팀원이 접근하기에도 불편했습니다. 그래서 최근에는 간단한 작업은 챗봇으로 만들어 사용하고 있습니다.

기능 정의

어떤 기능들이 필요한지 정리해봅시다:

  • OpsWorks에 API를 요청할 수 있도록 인증 정보 입력받기
  • 관리할 스택 선택하기
  • 레이어 목록 확인하기
  • 레이어의 instance 상태 확인하기
  • 배포(deployment) 명령 실행하기

더 많은 기능들이 있겠지만, 튜토리얼 수준의 설명을 위해 이 글에서는 최소한의 기능만을 다루겠습니다.

챗봇 구현

이 예제는 텔레그램을 기준으로 설명합니다. 텔레그램 챗봇을 개설하는 방법과, BotHub.Studio의 SDK와 CLI 도구를 설치하는 방법은 아래 문서를 참고하세요.

회사에서 사용할 용도로는 슬랙도 괜찮은 대안일겁니다. BotHub.Studio는 조만간 슬랙도 지원할 예정입니다.

인증 정보 입력

챗봇이 동작할 수 있기 위해서는, 우선 OpsWorks에 API 요청을 할 수 있도록 인증 정보를 입력받아야 합니다.

On-boarding and get credentials

인증 정보는 access token과 secret access token 두 항목으로 이루어집니다. BotHub.Studio SDK는 여러 항목으로 이루어진 intent를 구성할 수 있도록 내장된 기능을 제공합니다.

프로젝트를 생성하면 기본적으로 만들어지는 bothub.yml 파일에, 아래와 같이 intents 항목을 추가해줍니다.

intents 키 아래에는 intent를 여러개 등록할 수 있으며, 키 이름의 intent의 이름이 됩니다. 여기서는 credentials라는 이름의 intent를 등록했습니다. 각 intent는 slots, on_complete항목을 가질 수 있습니다. slots는 여러 slot의 목록이며, 각 slot은 slot ID와 사용자가 그 정보를 응답하도록 챗봇이 물어볼 질문으로 이루어집니다.

이제 /intent credentials 명령을 입력해주면, 챗봇은 차례대로 슬롯에 담긴 질문을 던지고 그 값을 입력받습니다. 모든 슬롯의 정보를 수집했다면 완료 핸들러 함수가 실행됩니다. bothub.yml 파일에서 입력했던 슬롯의 ID가 인자의 이름이 됩니다.

입력받은 인증 정보는 해당 유저의 저장 공간에 credentials라는 키를 만들어 저장해둡니다.

그리고 챗봇에게 처음 말을 걸면 봇에 대한 설명을 하고, 사용자에게 인증 정보를 요청하게 합니다.

텔레그램 챗봇은 처음 대화를 시작할 때 /start라는 메세지를 줍니다. 그래서 on_start 메소드를 구현해주었고, on_help 메소드에서는 지원하는 명령들을 안내해줍니다.

스택 목록 가져오고 선택하기

이제는 인증 정보를 바탕으로, 해당 계정이 보유하고 있는 OpsWorks 스택 목록을 가져옵니다. 스택 중 하나를 선택하고, 이후에 수행할 레이어 목록 보기, 새 코드 배포하기 등의 작업은 그 스택을 기준으로 수행합니다.

Choose a stack

이제 실제로 OpsWorks에 API를 요청하여 정보를 가져올 차례입니다.

OpsWorks에 접근하기 위해서 boto3 라이브러리를 사용할 것입니다. 프로젝트 디렉토리를 생성하면 루트 디렉토리에 생기는 requirements.txt 파일에 아래와 같이 boto3를 추가합니다.

bothub
boto3

아래와 같이 스택 정보를 다루기 위한 2개의 메소드, 그리고 헬퍼 메소드 한개를 추가했습니다.

get_boto_client 메소드는 앞서 입력한 인증 정보를 바탕으로 boto3 client 객체를 만들어 반환합니다.

/stacks 명령은 해당 계정이 보유하고 있는 스택 목록을 반환합니다. 메소드 내용은 간단합니다. boto3를 통해서 스택 목록을 받아오고, 그것을 Message 객체에 담아서 메신저 채널에 송신합니다.

응답을 쉽게 하기 위해서 각 스택을 버튼으로 표시하고, 버튼을 클릭하면 스택 선택 명령(/use_stack)이 실행되게 합니다.

/use_stack 명령은 선택된 스택의 ID를 사용자 데이터 저장 공간에 저장하고, 스택에 대해서 수행할 수 있는 명령들을 안내해줍니다.

레이어 확인하기

이번에는 스택이 보유하는 레이어의 목록을 출력하고, 각 레이어에 속한 인스턴스(서버)의 목록과 상태를 출력합니다.

Layer list and instance status

이제는 계속 반복적인 적용입니다.

/layers 명령은 레이어의 목록을 출력하는데, 레이어의 이름을 버튼으로 표시하고, 버튼을 클릭하면 /layer <layer_id>를 입력합니다. /layer 명령은 해당 레이어에 속한 인스턴스(서버)의 목록과 현재 상태를 출력합니다.

배포하기

이번에는 스택에 배포 명령을 실행하는 작업을 해보겠습니다. OpsWorks가 지원하는 배포 명령 중 여기서는 deployupdate_custom_cookbooks만을 다룹니다.

Execute a deployment

앞서와 같은 형식으로, 버튼을 클릭하면 명령(command)이 입력되고, boto3을 사용해 OpsWorks에 질의를 한 결과를 다시 텍스트와 버튼으로 돌려줍니다.

사용자가 배포를 하겠다고 Deploy 버튼을 클릭하면, 스택에 속한 앱 목록을 보여줍니다. 앱을 선택하면 배포할 명령 목록을 보여주고, 명령을 선택하면 배포를 시작합니다.

on_deploy_app() 메소드에서 command 인자에 대해 축약어를 사용하는 트릭을 사용했는데, payload의 길이를 줄이기 위해서입니다. 텔레그램은 InlineKeyboardButton에 담을 수 있는 Payload의 길이를 64byte로 제한하고 있습니다.

완성된 코드는 GitHub 저장소에서 확인하실 수 있습니다.

마무리

ChatOps에서의 챗봇은, 기본적으로 터미널 기반의 CLI 도구와 비슷하지만 메신저가 있는 곳 어디에서나 접근할 수 있다는 점에서 CLI 도구와 차이가 있습니다.

예제에서는 간단한 기능만을 다루어보았지만, 서버 운영에 필요한 여러 가지 기능들을 더 추가하면 더 쓸만한 챗봇이 될겁니다. 모니터링 수치를 확인한다던가, 인스턴스를 추가한다던가, 자동 확장(auto-scaling) 기준을 조절할 수도 있겠지요. AWS CloudWatch와 연동해서 특이한 상황이 왔을 때 알람을 받을 수도 있겠습니다.

BotHub.Studio에 지금 가입하셔서 무료로 당신의 챗봇을 만들어보세요.


본 아티클 관련 문의는 BotHub.Studio Community를 통해 지원받으실 수 있습니다. 챗봇 도입 및 제휴 문의는 bothub@bothub.sutdio로 연락해주세요.