ChatGPT를 이용하여 현재 구성이 AWS Well-Architected에 가까운지 확인할 수 있을까 – 첫 번째

ChatGPT를 이용하여 AWS Well-Architected 한 구성을 만들어가는 과정을 기재한 글입니다
2023.06.15

안녕하세요 클래스메소드의 수재입니다.
발전해가는 AI 기술을 다양한 분야에서 도입하여 업무 효율성이 높아지고 있다는 소식을 자주 듣게 되었습니다.
특히 ChatGPT는 접근성이 좋아서 여러 방면에서 사용되고 있습니다.
ChatGPT를 활용하면 현재의 AWS 환경도 평가할 수 있을지 궁금해져서 이를 찾아본 글을 작성하려합니다.

AWS Well Architected란?

AWS Well-Architected(이하WA)에 대해 간략하게 알아보겠습니다.

AWS Well-Architected는 클라우드 설계자가 다양한 애플리케이션 및 워크로드를 위한 안전하고 고성능의 탄력적이며 효율적인 인프라를 구축할 수 있도록 지원합니다. 운영 우수성, 보안, 안정성, 성능 효율성, 비용 최적화, 지속 가능성이라는 6가지 원칙을 중심으로 구축된 AWS Well-Architected는 고객과 파트너가 아키텍처를 평가하고 확장 가능한 설계를 구현할 수 있도록 일관된 접근 방식을 제공합니다. - AWS Well-Architected

WA는 다음과 같은 분야를 포함합니다.

  • 운영 우수성
  • 보안
  • 신뢰성
  • 성능 효율성
  • 비용 최적화
  • 지속 가능성

즉, WA는 아키텍쳐가 보다 안전한지, 비용 및 성능적으로 효율적인지를 평가할 수 있는 기준입니다.

ChatGPT에게 물어보았다

일단 가능은 하다고 합니다.
추가로 질문해보니 Terraform 뿐만 아니라 CloudFormation 코드도 가능하다고 합니다.

환경의 코드화

처음부터 코드로 관리된 환경이라면 바로 ChatGPT에 확인을 하면 되지만 AWS 콘솔에서 직접 작성한 환경이라면 이를 코드로 옮길 필요가 있습니다.
간단한 환경이라면 손으로 직접 적을 수 있겠지만 IaC 툴을 모르거나 구축되어있는 리소스가 많은 경우라면 하나하나 옮겨 적는 것은 많은 시간이 소요될 것 같습니다.

그래서 기존 환경을 코드로 옮겨주는 Former2를 이용하려 합니다.

테스트를 위해 만든 현재의 구성은 다음과 같습니다.

  • 어디까지 체크해줄 수 있는지 확인해보고자 모두 퍼블릭 서브넷에 구축하였으며 RDS도 퍼블릭 액세스가 가능한 구성입니다.
  • 인터넷 게이트웨이만 연결되어 있습니다.
  • EC2의 보안 그룹은 모든 HTTP 액세스를 허용하며 RDS의 보안 그룹은 VPC CIDR가 소스 IP라면 3306 포트로의 액세스를 허용하는 구성이 되어 있습니다.
  • 루트 테이블은 별다른 수정을 하지 않았습니다.
  • 한 인스턴스에는 탄력적 IP가 연결되어 있고 다른 하나의 인스턴스는 퍼블릭 IP를 자동으로 할당하도록 되어 있습니다.

Former2 사용

ChatGPT로 확인을 하기 위해 이미 구성된 환경을 코드화 합니다.

Setup의 Credential에서 인증 정보를 입력합니다.
IAM 유저에게는 ReadOnly 권한이 필요하니 Scan 전에 해당 권한을 연결해주세요.

이후 위의 Scan Again을 클릭하여 현재 환경을 스캔합니다.
해당 내용은 인터넷으로 전송되지 않으며 사용자의 브라우져 환경에만 저장됩니다.

Scan 후 각 리소스를 확인해보면 다음과 같이 추가되어 있는 것을 확인할 수 있습니다. 이 중 코드화 할 리소스를 체크한 후 Add Selected 를 클릭합니다. 그리고 왼쪽의 Outputs에서 다음과 같이 해당 리소스가 코드로 바뀐 것을 확인할 수 있습니다.

지금은 이미지와 같이 EC2만 추가하면 서브넷의 ID가 기입되어 있습니다.
하지만 리소스에서 서브넷을 추가하면 해당 부분이 코드 내의 서브넷 블록으로 바뀝니다. 즉, 리소스 생성 간에 종속성을 알아서 지정해줍니다.
그러니 코드화가 필요한 리소스(EC2 인스턴스, 추가 EBS 볼륨, 볼륨 연결 등 세세한 부분까지 모두 포함)는 모두 체크하여 추가해줍니다.

모두 추가한 후 코드 카피합니다.
코드를 에디터에 붙여넣은 후 필요없는 부분(EBS 볼륨의 스냅샷 ID 등)을 지우거나 RDS의 패스워드를 환경 변수로 지정하는 등 수정해줍니다.
이번에는 CloudFormation 템플릿을 이용하도록 하겠습니다.
결과적으로 다음과 같은 코드가 되었습니다.

ChatGPT에게 물어보기

그럼 작성된 코드를 가지고 ChatGPT에 물어보겠습니다.

첫 번째 수정

AWS Well-Architected 를 바탕으로 내 코드에서 어떤 부분이 부족한지 자세히 설명해줘

Well Architected 의 각 항목과 비교하여 부족한 부분을 설명해주었습니다.
특히 보안에 관한 설명이 길어졌네요.

그럼 이런 피드백을 바탕으로 코드 수정을 부탁해보겠습니다.

네가 말한 보안 모범 사례(Security Best Practice)에 적합하게 코드를 수정해줘

어떤 부분이 부족해서 바꾸었는지 설명을 덧붙여서 수정받았습니다.
AllowedCIDR 라는 파라미터가 필요하지만 이걸 입력받도록 수정되지는 않았습니다.
그리고 이 상태라면 RDS의 보안그룹과 RDS 인스턴스가 순환 종속성 에러가 발생하기 때문에 문제가 있을 부분의 수정을 부탁했습니다.
- 코드

클라우드포메이션 디자이너에서 확인해보면 다음과 같은 구성이 됩니다.

ChatGPT가 수정이 필요하다고 말한 부분(AMI ID, RDS Password 등)을 수정한 후 템플릿을 실행해보니 리소스는 문제없이 생성되었습니다.

첫 번째 수정 정리 및 마무리

리소스 자체는 문제없이 완성되었습니다. 처음 작성했던 코드와 비교해보면 보안적인 측면으로 개선된 부분은 확실히 있습니다.

우선 EC2의 퍼블릭 IP 나 탄력적 IP가 없어졌습니다.
대신 SSH/HTTP로 허용하는 IP로부터 접근할 수 있도록 수정되었습니다.

하지만 HTTP는 외부 환경에서 접근할 수 있도록 만들 필요가 있습니다.
SSH와 HTTP의 접근을 허용하는 IP 범위를 같은 파라미터로 받으면 제대로 된 설정이 힘들겠네요. 아마 처음 작성한 코드에는 2개의 퍼블릭 서브넷에 인스턴스가 배치되어 있었던 영향인 것 같습니다.

RDS의 보안 그룹도 3306 포트의 접근을 EC2의 보안 그룹을 대상으로 하도록 바뀌었습니다.

바라던 결과가 실제 결과에 차이가 크다 가 첫 작업의 결과네요.
아마 이 상태라면 원하는 환경을 구성하기 위해 좀 더 진행해야 될 것 같습니다.
그리고 아직 ChatGPT에 익숙하지 않아서 원하는 결과를 도출하는 접근 방법이 조금 틀렸을지도 모르겠네요. 다음 글에서는 어떤 과정을 거쳐 현재 구성에서 더 발전할 수 있는지 공유하겠습니다.

피드백 및 오탈자 피드백은 언제나 환영합니다.
must01940 지메일로 보내주시면 감사합니다.