[AWS] 봇진성 개발 & AWS Rookie Championship 참여 후기
봇진성 개발을 시작하게 된 계기
2023 2학기 새롭게 개설된 클라우드 컴퓨팅 수업에 TA 로 참여하였습니다. 마지막 주차에 진행되는 팀별 프로젝트 발표에서 수강생 분들이 긴장하셔서 준비한 것을 다 보여주지 못하실까봐,, 긴장을 풀어드릴 수 있는 재밌는 프로젝트를 준비해보자! 해서 시작한 프로젝트가 봇진성 입니다.(그 누구보다 긴장해서 벌벌벌 떨면서 발표한건 비밀입니다.)
슬랙 워크스페이스의 기술 QnA 채널에 올라오는 대부분의 글은 IAM 사용자 권한 요청 글입니다. 제공 받은 IAM 사용자 계정은 S3, Lambda 와 같은 가장 많이 사용되는 서비스들에 대한 권한만 부여된 상태이며, 다른 서비스에 권한이 필요할 때는 위 사진과 같이 권한 요청 글을 올려 부여 받아야 합니다. 이때, 권한 요청 글을 작성하고 IAM 관리자가 이를 확인해주시기 전까지 학생들은 기다리기만 해야 합니다. 그러나 IAM 관리자 분이 워낙 바쁘셔서 바로바로 이런 권한 요청 글을 확인하실 수 없습니다.
그 래 서
IAM 사용자 권한 부여를 반자동화 해주는 솔루션이 있으면 좋겠다 라는 생각을 가지고 봇진성 개발을 시작하였습니다.
봇진성
봇진성은 AWS Lambda Function 2개와 API GW 2개, 그리고 GPT, Slack API 만 사용된 아주 간단한 아키텍처를 가지고 있습니다.
봇진성의 기능은 아래와 같습니다.
1. 사용자가 #help-me-botjinseong 채널에 워크플로 양식에 맞게 제출
RDS 와 같이 권한이 부여되어 있지 않은 서비스를 이용하고자 할 때, 왼쪽 사진과 같이 Not Authorized 에러 문구가 뜨게 됩니다. 해당 에러 메시지를 복사해 오른쪽 사진의 워크플로에 입력하고 제출합니다.
2. AWS Lambda 가 해당 에러문을 분석해서, 해당 사용자에 Attach 해야 하는 AWS Managed Policy ARN 을 확인
GPT API 에 해당 에러문으로부터 AWS Managed Policy ARN 을 뽑아와달라고 요청하여 이를 json 형태로 리턴받습니다. 구현할 때 이 부분에서 제일 고생했는데요, boto3 를 이용해서 attach 하려고 하니 계속 알맞은 형태가 아니라고 에러가 떴습니다.
import boto3
iam = boto3.resource('iam)
iam.User([권한을 부여할 IAM User ID]).attach_policy(PolicyArn=[권한 정책])
권한 부여 부분은 위와 같은 코드로 작성되어 있는데, 권한 정책 부분에는 AWS Managed Policy ARN 이 들어가야 합니다. 이 형식을 지키지 않아서 계속 튕겨져 나오는 에러가 발생했었습니다. GPT 에게 AWS Managed Policy ARN 형태로 던져줘! 라고 했는데도, 가끔가다가 이상한 형태로 던져주는 경우가 발생해서 이를 요 링크를 함께 던져주는 것으로 해결했습니다. 안정화 됐을 때, 이런 방식을 개편하고자 합니다.
3. 해당 권한을 부여했을 때의 위험도를 측정 및 권한 부여
IAM User 가 처음부터 모든 권한을 부여받지 않는 이유는, 아무래도 비용이 커질 수 있기 때문입니다. AWS 는 결코 저렴하지는 않기에, 계정 관리자 입장에서는 괜히 권한을 모두 부여했다가 비용 폭탄을 맞을 수 있기에, 최소 권한만 부여한 채로 주어집니다. 그랬는데.. 봇진성이 권한 요청이 들어왔다고 무작정 부여하면 큰일 나겠죠!? 그래서, GPT 에게 해당 권한의 위험도를 측정해달라고 부탁합니다. 이때 작성한 프롬프트 메시지는 아래와 같습니다.
You're in charge of AWS authorization, and you're trying to authorize an IAM user who's been using AWS for less than half a year. Express the risk, in terms of cost, of granting the permissions listed below as a real number between 1 and 100. Return an array in JSON with "pocliy" as the key for policy name, "risk" as the key for risk value and 'reason' as the key for a short reason why you made that determination for each permission. The return should look like this {[{name: 'policy_name1', 'risk': 80, 'reason': '~~~'}, {name: 'policy_name2', 'risk': 40, 'reason': '~~~'}]}
이렇게 부여해야 하는 권한들의 위험도를 각각 측정, 그리고 그렇게 측정한 이유에 대해서 리턴 받습니다. 이때 기준으로 설정한 % 이상인 위험도가 책정되었을 때는 권한 관리자의 DM 으로 '이런 권한 요청이 들어왔는데, 부여해도 될까요?' 와 같은 메시지가 전송됩니다. 권한 관리자는 승인 혹은 거절을 할 수 있고, 그 선택에 따라서 권한이 부여될지가 정해집니다. 기준으로 설정한 % 미만의 위험도가 책정됐다면, 관리자의 승인 없이 바로 부여되게 됩니다.
그렇다면 권한을 요청한 사용자는 자신의 요청 상황을 어떻게 알까요?
권한 요청 워크플로에 위와 같은 이모지 리액션을 달아서 현재 처리 상황을 알려줍니다. 사용자는 이 이모지로 자신의 권한 요청이 어떻게 처리되고 있는지와 처리 결과까지 확인할 수 있습니다.
내가 루키 챔피언십을!?
봇진성 메인 기능들을 개발하기 위해 열심히 테스트를 하던 중,, 이사님께서 엄청난 제안을 해주셨습니다.
발표는 생각만 해도 몸이 벌벌 떨리는 내가,, 그 많은 사람들 앞에서 발표를 할 수 있을까? 라는 생각이 먼저 들었습니다.
하지만 좋은 경험이 될 것이라고 생각해서, 바로! 하겠다고 말씀드렸습니다ㅎㅎ
Rookie Championship
아침 일찍 AWS 에 도착해서, 상품&간식 옮기기 와 JAM 참여자분들을 위한 선물 세팅을 했습니다. 아직도 다리가 아프네요.. 다른 분들이 도착하셨을 때, 멋있게 준비되어 있는걸 보고 놀라시는 모습을 상상하며,, 열심히 했습니다! 물론 이사님이 다 하셨습니다..ㅎㅎ
AWS JAM 도 구경하고, 많은 분들과 얘기를 나누다 보니,, 빠르게 발표 시간이 다가왔습니다. 생각보다 너무 많은 분들이 오셔서, 옆방에서 급하게 의자를 옮기면서도 머리 속으로는 '내가 여기서 발표를 어떻게 해ㅠㅠㅠㅠ' 라고만 계속 생각했던 것 같네요..
작성해갔던 대본 중 가장 첫 멘트가 "이렇게 창의적인 아이디어와 높은 기술력을 가진 팀들 사이에서,, 속된 말로 꼽 껴서 발표를 할 수 있게 된걸 진심으로 영광으로 생각합니다" 였습니다. 긴장해서 당연히 말은 못했습니다.. 정말 영광이었습니다!!!
이게 진짜 대학생이 진행한 프로젝트가 맞나.. 싶은 생각이 매 발표마다 들 정도로 놀라웠습니다. 역시 선발된 팀들이구나.. 생각이 들더라구요..! 덕분에 아이디어를 어떻게 실 서비스로 구현할까 에 대한 인사이트를 얻어갈 수 있었습니다. 안되는건 없다
덕분에 발표가 진행될 수록, 계속해서 긴장감은 커져갔습니다. 그때 등장한 귀여운 존재, 시우 덕분에 조금 긴장을 풀고 발표에 들어갈 수 있었습니다. Shout out to Seewoo!
정말 빠르게 대본을 읽어가며 발표를 끝냈습니다. 다들 제 좋지 않은 발음을 알아들으셨을까 싶네요. 지난번 학교에서 진행했던 발표에서는 시연 영상을 보여드리지 못했었는데, 이번 발표에서는 시연 영상까지 추가했다는거에,, 저 혼자 만족하고 있습니다
저는 봇진성으로 진성님이 IAM 사용자 관리를 위해 AWS 콘솔에 들어가시는 일이 없게끔 만드는 것이 목표입니다. 목표를 이루기 위해,, 현재 있는 기능을 안정화 시키고, 계속해서 기능들을 추가할 계획입니다. 앞으로도,, 봇진성에게 많은 관심 부탁드리옵니다
사진 사용 허락과 프로젝트에 대한 피드백을 해주신 5works 박진성님, 그리고 제게 좋은 기회를 주신 AWS 김병준 이사님께 다시 한 번 감사드립니다 🦦