✅ AWS Lambda를 사용하여 Discord 챗봇을 구축하는 작업 수행
✅ Amazon이 제공하는 서버리스 서비스인 AWS Lambda, API Gateway 및 Amazon SNS를 활용하는 실습
✅ Discord 챗봇이 제공할 3-기능
- 현재 시간 표시 (명령어: /time)
- 공학관 식당의 오늘의 점심 메뉴 표시 (명령어: /rice)
- 본인 식별 정보가 포함된 이메일 전송 (명령어: /email)
📌 디스코드 "사용자 설정" > "고급(Advanced)" > "개발자 모드(Developer mode)" 를 활성화해준다.

📌 Setting up the Bot
- Discord 개발자 포털로 이동(https://discord.com/developers/applications)한 후, "New Application" 클릭
- 왼쪽에 있는 "OAuth2 – URL Generator" 클릭 후, "SCOPES"에서 "bot"을 "BOT PERMISSIONS"에서 "Administrator" 선택
- 자신의 자체 서버에 봇을 추가




📌 Setting up the Commands
- 봇에 새로운 슬래시 명령을 등록한다.
- Discord는 봇이 어떤 명령을 가지고 있는지 자동으로 알 수 없으므로 각 사용 가능한 명령을 알려주어야 한다.
- 이 작업을 수행할 수 있는 UI가 없고 현재 HTTP 엔드포인트를 통해서만 가능하기 때문에 이를 위해 Python 스크립트를 실행할 것이다.
- “register_command.py”
- 위의 파일에 사용할 응용 프로그램 ID, 서버 ID, 봇 토큰을 얻는다.
- 응용 프로그램 ID: 개발자 포털의 "General Information" 메뉴로 이동하면 응용 프로그램 ID가 표시됩니다.
- 서버 ID: 서버 아이콘을 마우스 오른쪽 단추로 클릭하면 "Copy Server ID" 버튼이 나타납니다.
- 봇 토큰: 개발자 포털로 돌아가 "Bot" 메뉴를 클릭합니다. "Reset Token" 버튼이 표시됩니다. 클릭하면 토큰이 나타나며 이 토큰을 기억해 둡니다.


📌 AWS Lamda Function 생성
- AWS Lamda 콘솔 > "함수 생성" 버튼 > "새로 작성"
- 함수 이름 지정 후, 런타임은 "python 3.8" 아키텍처는 "x86_64" 으로 설정
- "코드 소스" 페이지에서 "lamda_function.py" 의 코드를 수정
- PUBLIC_KEY 변수에 공개 키를 입력한다.
- Developer Portal > "General Information" > "PUBLIC KEY"
- "Deploy" 버튼 클릭
- AWS Lamda 콘솔 > "추가 리소스 - 계층" > "계층 생성" 버튼 클릭
- 이름을 입력 후, 호환 아키텍처는 "x86_64" 호환 런타임은 "Python 3.8" 로 설정 ( "nacl", "bs", "pytz" 3번 반복 )
- Lamda 함수 > 위에서 생성한 함수 클릭 > 하단 스크롤하여 "계층 추가" 버튼 클릭
- "계층 소스 - 사용자 지정 계층" 선택 > "nacl", "bs", "pytz" 3번 반복하여 추가 ( 버전은 모두 1 )






📌 AWS API Gateway
: 응용 프로그램이 통신할 수 있는 웹 엔드포인트를 생성한다.
: 먼저 기본 API를 만들어 기본 URL을 가져온 다음 API 내에서 리소스를 정의하여 전체 POST 가능한 엔드포인트를 얻는다.
: 마지막으로 API를 배포하여 인터넷을 통해 액세스할 수 있도록 한다.
- API Gaeway 콘솔 > "API 생성" 버튼 클릭
- "Rest API - build(구축)" 버튼 클릭
- "새 API" 선택
- API 이름 지정 후, API 엔드포인트 유형으로 "Regional(지역)" 선택
- "API 생성" 버튼 클릭
- 왼쪽의 "리소스 생성" 버튼 클릭
- "Proxy resource" 비활성화 후, 리소스 이름 지정 및 "CORS" 활성화 > "리소스 생성" 버튼 클릭
- 이 리소스로의 POST를 활성화한다.
- 새 리소스 선택 후, "메소드 생성" 버튼 클릭
- "Method type" 을 "POST" 로 선택
- "Integration type" 을 "Lamda function" 으로 선택
- 위에서 생성한 "Lamda function(HW4Discord)" 을 선택
- "Integration request(통합요청)" > "템플릿 생성" 버튼 클릭
- "Content type" 필드에 "application/json" 입력
- "Template body" 필드에 코드 작성
- "템플릿 생성" 버튼 클릭
- "Method Response(메서드 응답)" > "응답 생성" 버튼 클릭
- "HTTP 상태 코드" 필드에 "401" 입력 후, 저장 버튼 클릭
- 마지막으로 API를 배포한다.
- "리소스" 페이지 > "API 배포" 버튼 클릭
- "*new stage*" 선택 후, 이름 입력 > 배포 버튼 클릭
- 왼쪽 열에서 "POST"를 클릭하면 표시되는 "Invoke URL" 복사






📌 Application Configuration
- Developer Portal > "General Information" > "INTERACTION ENDPOINT URL" 필드에 위에서 복사한 "Invoke URL"을 입력 후, 저장한다.
- Validation errors가 발생할 경우 : CloudWatch를 사용하여 프로세스를 디버깅해야 함
- CloudWatch 콘솔 > 왼쪽 패널에서 "로그 - 로그 그룹" 클릭
- 가장 최신 로그 스트림을 클릭하여 로그를 조사할 수 있으며 마찬가지로 Lamda 함수 디버깅 가능
- 나의 경우 "lamda_function.py" 에서 들여쓰기 오류인걸 확인했음...
- /time 명령어에 대해 디스코드 봇에게 올바른 답 받는 것을 확인!
- 이제 나머지 /email 과 /rice 명령어에 대한 기능도 구현한다.




📌 Simple Notification Service
- 먼저 SNS에서 주제를 생성해야한다.
- SNS(Simple Notification Service) 콘솔 > 왼쪽 패널의 "주제(Topics)" > "주제 생성" 버튼 클릭
- "유형(Type)" 에서 "표준(Standard)" 선택 후, 이름 지정 > "주제 생성" 버튼 클릭
- "구독 생성" 버튼 클릭
- "프로토콜" 에 "이메일" 선택
- "엔드포인트" 에 테스트 이메일 주소 입력 ( 대학 이메일 주소 _ ewhain.net 는 작동하지 않음 주의 )
- "구독 생성" 버튼 클릭
- 해당 이메일 계정으로 온 메일에서 "확인 구독" 클릭
- SNS와 Lamda 함수를 연결한다.
- 위에서 생성한 "Lamda 함수(HW4Discord)" 클릭 > "+ 대상 추가" 버튼 클릭
- "소스" 에서 "비동기식 호출", "조건" 에서 "성공 시" 선택
- "대상 유형" 에서 "SNS 주제", "대상-ARN" 에서 해당하는 ARN(HW4) 선택 후, "저장" 버튼 클릭




📌 Implementation Guideline
- /rice 명령어에 대해 BeautifulSoup 라이브러리를 사용하여 웹 페이지를 파싱한다.
- 파싱할 웹페이지의 URL : 식당 메뉴 페이지
- BeautifulSoup 라이브러리의 튜토리얼 참고 블로그 : Beautiful Soup를 사용한 Python 웹 스크래핑 튜토리얼
- /email 명령어에 대해 이메일 메시지 보내기 위해 boto3 라이브러리를 사용해야 한다.
- 관련 공식 문서 : boto3 SNS publish API 문서


❗️주의❗️ dt.weekday(): 0~6이고 크롤링하는 페이지의 요일별 식단 정보 리스트: 1~7 이므로 +1 해서 selector를 작성해줘야 한다.





'Cloud Computing' 카테고리의 다른 글
| [이론] Cloud Platforms 및 AWS Intro (0) | 2023.09.19 |
|---|---|
| [이론] Cloud Infrastructure (0) | 2023.09.08 |