안녕하세요, 교보정보통신 클라우드기술팀에서 Cloud Solutions Architect 일을 하고 있는 엄 신영 입니다.
오늘은 교보문고 온라인몰 프로젝트 때 유용하게 사용했던 SSM Automation을 이용한 RDS Instance Class resizing 자동화 방법에 대해 이야기 해보려합니다.
서비스 오픈 전부터 운영 환경에서는 실제 사용할 높은 스펙의 RDS Instance Class를 사용하다보니 트래픽이 없는데도 비용이 많이 나와서 부담되는 상황이었습니다. 비용을 줄이기 위한 방법으로 RDS Instance Class 변경을 위한 SSM Automation Documents를 작성했습니다.
SSM Automation Documetns 는 yaml 파일로 작성하였으며, 오늘 Hands On 에서는 Terraform 을 이용하여 배포할 것입니다.
1. Systems Manager(SSM) 이란?
- 클라우드 환경을 위한 AWS 관리 솔루션
- 여러 AWS 서비스의 운영 데이터를 중앙 집중화하고 AWS 리소스에 대한 작업을 자동화 할 수 있음
- AWS 애플리케이션 및 리소스의 운영 허브로 운영 관리, 애플리케이션 관리, 변경 관리, 노드 관리 4개의 핵심 기능 그룹으로 분류됨
2. Terraform으로 리소스 배포
2.1. tfenv를 사용하여 Terraform 버전관리 하기
- macOS인 경우 brew를 사용해 tfenv를 설치
$ brew install tfenv
- Linux 계열인 경우 git 소스를 클론해 PATH에 추가
$ git clone https://github.com/tfutils/tfenv.git ~/.tfenv
$ echo 'export PATH="$HOME/.tfenv/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
- tfenv 설치 후, 1.4.5 버전보다 높은 버전을 설치
# 설치 가능한 Terraform 버전 목록 확인
$ tfenv list-remote
1.5.0-alpha20230405
1.4.6
1.4.5
1.4.4
1.4.3
...
# 특정 버전 설치
$ tfenv install 1.4.5
- 설치된 Terraform 버전 목록 확인
$ tfenv list
* 1.4.5 (set by /usr/local/Cellar/tfenv/3.0.0/version)
1.1.5
- 특정 버전의 Terraform 사용
$ tfenv use 1.4.5
Switching default version to v1.4.5
Default version (when not overridden by .terraform-version or TFENV_TERRAFORM_VERSION) is now: 1.4.5
2.2. Terraform Code Clone 받기
오늘 Hands On 에서는 Systems Manager Automation에서 사용할 Custom Document 생성 및 IAM Role 생성이 필요합니다. 필요한 Resource를 Terraform Code로 작성해뒀습니다. 미리 만들어둔 코드를 clone 받아서 사용할 것입니다.
- Terraform Code Clone
# Terraform Code를 다운 받을 곳을 지정합니다.
# 여기서는 문서(Document)에 다운받을 것입니다.
$ cd Document
$ git clone https://github.com/nari1021/modify-rds-instance-class.git
- Terraform Code 배포
# 다운받은 폴더로 이동
$ cd modify-rds-instance-class/
# Terraform 초기화
$ terraform init
Initializing the backend...
Initializing provider plugins...
- Finding hashicorp/aws versions matching ">= 4.52.0"...
...
Terraform has been successfully initialized!
...
# Terraform 배포 시, 생성 될 리소스 확인
$ terraform plan
...
Plan: 5 to add, 0 to change, 0 to destroy.
Changes to Outputs:
+ ssm_automation_document_arn = (known after apply)
+ ssm_automation_document_name = "ModifyRDSInstanceClass"
───────────────────────────────────────────────────────────────────────────────
Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these
actions if you run "terraform apply" now.
# Terraform 배포
$ terraform apply
...
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
Apply complete! Resources: 5 added, 0 changed, 0 destroyed.
Outputs:
...
3. 배포된 리소스 확인
3.1. SSM Document 확인
- Systems Manager 서비스 검색
- 배포된 Documents 확인
- Document 내용 확인
SSM에서 Automation Document를 생성하여 RDS Scale Up/Down과 관련된 절차를 수행하게 합니다. 이후에 EventBridge의 Schedule Rule에 따라 실행되도록 구성합니다.
3.2. IAM Role 확인
- modify-rds-ssm-automation-role : SSM에서 Automation Document를 실행하여 RDS Scale Up/Down과 관련된 절차를 수행하는데 필요한 역할
- modify-rds-ssm-automation-eventbridge-role : EventBridge에서 SSM을 실행하기 위해 Assume 받아서 절차를 수행하는데 필요한 역할
4. Automation 테스트 실행
- 테스트를 진행하기 위해서는 RDS 생성이 선행되어야 합니다.
- Automation Documents는 변경 가능한 인스턴스 타입을 지정하고 있습니다. (무조건 db.r5.2xlarge / db.r5.12xlarge 타입만 지정 가능)
- 이렇게 인스턴스 타입을 코드에서 지정하는 이유는 휴먼에러를 방지하기 위함입니다.
- 만약 db.r5.2xlarge / db.r5.12xlarge 가 아닌 다른 타입으로 변경하고자 하신다면 Automation Documents 에서 3번째 단계 코드에서 변경하시면 됩니다.
- 오늘 테스트 시나리오에서는 db.r5.2xlarge -> db.r5.12xlarge 로 변경할 예정입니다.
- Systems Manager > Documents > Owned by me > ModifyRDSInstanceClass 에 가서 Execute automation 을 통해 실행합니다.
- Simple execution 모드를 사용합니다.
- Input parameters 값을 넣어 줍니다.
- WebhookUrl : MS Teams Webhook URL
- DBClusterId : 변경하려는 인스턴스가 속해있는 RDS Cluster Id
- InstanceClass : 변경하려는 인스턴스 클래스
- Automation의 상태를 확인 할 수 있습니다.
- 모든 단계가 성공적으로 마무리되면 아래와 같이 Status가 변경됩니다.
- Step #7 SendFailMessage 는 앞의 6개의 단계를 실행 중에 실패가 일어났을 때 실행되는 단계로 Pending 상태여야 성공적으로 마무리가 된 것이며,
- Step #8 SendCancelMessage는 앞의 6개의 단계를 실행 중에 사용자가 취소를 했을 때 실행되는 단계로 Pending 상태여야 성공적으로 마무리가 되는 것입니다.
팀즈에서는 아래와 같이 Automation 실행과 성공적으로 마무리가 될 때 메시지를 보내게 됩니다. Fail / Cancel의 상태에서도 메시지를 보내게 됩니다.
5. EventBridge 연결하기
- 앞에서 배포한 SSM Automation Documents를 EventBridge에 연결하면, Cron 을 이용하여 원하는 시간에 자동으로 실행할 수 있습니다.
- EventBridge Rule을 생성합니다.
- EventBridge Scheduler 라는 새로운 기능이 추가 되었지만, cron을 사용하실 예정이라면 기존 방식으로 해도 되고, 새로운 스케줄러를 이용하여 생성하셔도 무관합니다.
- 원하는 일정으로 Cron 표현식을 작성합니다.
- EventBridge 를 이용해서 실행시킬 Target 을 지정합니다.
- Automation에서 필요한 Input parameter 와 사용할 Role 을 지정해줍니다.
- 여기서 사용할 Role 은 이미 Terraform을 배포하며 생성되었습니다.
마무리하며
Automation이 실행되면 인스턴스 크기 및 개수에 따라 최소 10분 ~ 20분 정도 소요가 되며, RDS Instance가 Modifying 상태가 되면 DB Connection이 끊어지게 됩니다. 이로인한 잠깐의 순단 현상이 발생합니다. 하지만, 순단 현상보다도 비용 절감의 효과가 더 필요하신 경우라면 이 기능을 활용하여 RDS 사용량을 줄일 수 있습니다.
긴 글 읽어주셔서 감사합니다.
– 클라우드기술팀 엄 신영 (sye2112@kico.co.kr)