Terraform을 이용한 MongoDB Replicaset 프로비저닝
카카오클라우드에서 제공하는 인프라 구성 요소를 사용하여 3개의 MongoDB 인스턴스로 구성된 Replicaset을 구축합니다.
- 예상 소요 시간: 30분
- 권장 운영 체제: MacOS, Ubuntu
- Region: kr-central-2
- Terraform 버전: 1.6.3
- 참고 가이드
사전 준비
구성 요소
예제에서 확인할 수 있는 자동화된 구성요소와 사용자가 예제를 사용하기 위해 준비해야 하는 구성요소는 다음과 같습니다.
자동화된 구성요소
항목 | 설명 |
---|---|
자동화된 구성요소 | - 가상 머신(Virtual Machine) - Security Group(Security Group) - 블록 스토리지(Block Storage) |
사전 준비가 필요한 구성요소
카카오클라우드 콘솔을 통해 해당 요소를 준비합니다.
항목 | 설명 |
---|---|
Key Pair | Virtual Machine > Key pair 탭 > 키 페어 목록에서 퍼블릭 키 확인 |
Public Subnet | VPC > Subnet 탭 > Subnet 목록에서 확인 |
액세스 키 | 사용자 설정 > 액세스 키 탭에서 확인 |
사용 리소스
시나리오 상에서 사용할 리소스의 정보는 다음과 같습니다.
가상 머신
인스턴스 이름 | 인스턴스 유형 | 볼륨 크기(GB) | 공인 IP | 이미지 |
---|---|---|---|---|
handson-node-1 | m2a.large | 30 | N | Ubuntu 20.04 |
handson-node-2 | m2a.large | 30 | N | Ubuntu 20.04 |
handson-node-3 | m2a.large | 30 | N | Ubuntu 20.04 |
볼륨
볼륨 이름 | 연결할 인스턴스 | 크기(GB) |
---|---|---|
mongo-data-volume-1 | handson-node-1 | 500 |
mongo-data-volume-2 | handson-node-2 | 500 |
mongo-data-volume-3 | handson-node-3 | 500 |
Security Group
Security Group명 | 연결할 인스턴스 | 설명 |
---|---|---|
sg-mongodb | handson-node-1 handson-node-2 handson-node-3 | MongoDB 인스턴스에 적용할 Security Group |
Security Group별 인바운드 정책
Security Group 명 | CIDR | 프로토콜 | 포트 | 역할 |
---|---|---|---|---|
sg-mongodb | ${SUBNET_CIDR} | ICMP | ALL | ping-mongo |
sg-mongodb | ${BASTION_PRIVATE_IP}/32 | TCP | 22 | ssh-mongo |
sg-mongodb | ${SUBNET_CIDR} | TCP | 27017 | conn-mongo |
Step 1. Terraform 설치하기
실습을 진행하기 위해서는 사용자 로컬 환경에 Terraform 설치가 필요합니다.
- Mac
- Linux(Ubuntu)
-
Homebrew 패키지 매니저를 이용하거나, Terraform 공식 가이드에서 다운로드하여 설치합니다.
Terraform 설치brew install terraform
-
설치가 정상적으로 되었는지 아래 명령어를 통해 확인합니다.
Terraform 설치 확인terraform -version
# Terraform v1.3.3 ## ... -> 정상 설치 시 버전 정보를 확인할 수 있습니다.
-
아래 명령을 실행하거나, Terraform 공식 가이드를 참고하시기 바랍니다.
Terraform 설치apt-get update
apt-get install terraform -
설치가 정상적으로 되었는지 아래 명령어를 통해 확인합니다.
Terraform 설치 확인terraform -version
# Terraform v1.3.3 ## ... -> 정상 설치 시 버전 정보를 확인할 수 있습니다.
Terraform 설치와 관련한 자세한 내용은 Terraform 공식 가이드 문서를 참고하시기 바랍니다.
Step 2. 예제 설치 및 작성하기
-
사용자 로컬 터미널에서 예제로 제공하는 프로젝트를 다운로드합니다.
프로젝트 다운로드git clone -b terraform-mongodb https://github.com/kakaoenterprise/kakaocloud-tutorials.git
- 예제 프로젝트의 참고 및 수정이 필요한 경우 아래 예제 프로젝트 폴더 구성을 확인합니다.
예제 프로젝트 폴더 구성 확인kc-handson-config
ㄴ data.tf # 클라우드 제공자에게 가져올 정보 및 사전에 필요한 클라우드 리소스(subnet, keypair ...) 정보를 정의
ㄴ instance-mongodb.tf # MongoDB 인스턴스를 생성하는데 필요한 리소스(compute, network, volume, security-group) 정의
ㄴ README.md # README 파일
ㄴ require.tf # 클라우드 프로바이더 및 테라폼 환경 정보 정의
ㄴ scripts.tf # 애플리케이션 프로비저닝에 사용될 템플릿, 파일 등의 스크립트 정의
ㄴ sg-rules.tf # 생성할 Security Group에 대한 정책을 정의
ㄴ variables.tf # 프로비저닝에 사용할 변수 정보 정의 (사용자 환경에 맞게 수정 필요)
ㄴ files
ㄴ attach-volume.sh. # 가상 머신에 연결한 볼륨을 마운트하는 스크립트
ㄴ templates
ㄴ hosts # 레플리카셋을 구성하는 호스트에 대한 도메인 이름 정의
ㄴ init-replicaset.sh # 생성된 MongoDB 인스턴스를 레플리카셋으로 구성하는 스크립트 (하나의 노드에서 실행)
ㄴ install-mongodb.sh # 가상머신에 MongoDB를 설치하고 실행하는 스크립트
ㄴ mongod.conf # MongoDB에 적용할 설정값 정의 (수정 시 주의) -
예제 프로젝트가 설치된 경로로 이동합니다.
프로젝트 설치 경로로 이동cd ./kakaocloud-tutorials
-
카카오클라우드에 자원 생성을 요청하기 위해서는 자원을 생성할 리전 및 인증키 등의 추가적인 정보가 필요합니다. 아래 예제를 참고하여
terraform.tfvars
파일에 값을 추가합니다.{Subnet CIDR}
은 IP CIDR 블록이며, 카카오클라우드 콘솔 > VPC > Subnet에서 사용할 수 있는 Subnet을 확인할 수 있습니다.cat << EOF > ./terraform.tfvars
kc_region = "kr-central-2"
kc_availability_zone = "${AVAILABILITY_ZONE}"
kc_auth_url = "https://iam.kakaocloud.com/identity/v3"
kc_application_credential_id = "${ACCESS_KEY}"
kc_application_credential_secret = "${SECRET_ACCESS_KEY}"
# 아래 vm_network_cidr은 인스턴스를 생성할 Subnet의 CIDR 값을 입력합니다.
public_network_cidr = "${SUBNET_CIDR}"
replicaset_name = "${REPLICASET_NAME}"
default_image = "${INSTANCE_IMAGE}"
mongodb_flavor = "${INSTANCE_TYPE}"
sshkey = "${INSTANCE_KEYPAIR}"
EOF환경변수 설명 AVAILABILITY_ZONE🖌︎ 가용영역 이름 #예시: kr-central-2-a ACCESS_KEY🖌︎ 사용자 액세스 키 SECRET_ACCESS_KEY🖌︎ 사용자 보안 키 SUBNET_CIDR🖌︎ 클라우드 자원을 생성할 Subnet의 CIDR을 입력 #예시: 10.0.0.0/20 REPLICASET_NAME🖌︎ MongoDB Replicaset 이름을 입력 #예시: hands-on-mongodb-replicaset INSTANCE_IMAGE🖌︎ 사용할 인스턴스 이미지 #예시: Ubuntu 20.04 - 5.4.0-173 INSTANCE_TYPE🖌︎ 사용할 인스턴스 타입 #예시: m2a.large INSTANCE_KEYPAIR🖌︎ 인스턴스에 사용할 키페어 이름 #예시: kc-keypair
Step 3. 클라우드 리소스 생성하기
예제 프로젝트를 설치한 후, 테라폼(Terraform)을 이용하여 프로젝트에서 정의한 리소스를 생성하고 결과를 확인합니다.
-
현재 작업 디렉터리를 초기 설정합니다.
디렉터리 초기 설정terraform init
-
실행 계획을 만듭니다. 인프라에 적용할 변경 사항 을 미리 확인할 수 있습니다.
실행 계획 생성terraform plan
-
실행 계획을 클라우드에 적용합니다.
클라우드에 적용terraform apply
Step 4. 결과 확인하기
클라우드 리소스 생성 후 카카오클라우드 콘솔에서 생성한 리소스 정보를 확인합니다.
- Virtual Machine > Instance 탭에서 생성된 인스턴스를 확인합니다.
- Virtual Machine > Volume 탭에서 생성된 볼륨을 확인합니다.
-
MongoDB 인스턴스에 SSH 접속을 하기 위해 Bastion 인스턴스를 생성합니다.
- Bastion 인스턴스 생성과 관련한 자세한 내용은 VM 기반의 웹 서비스 구성 문서를 참고하시기 바랍니다.
-
Bastion 호스트 생성 후, Bastion 호스트 10000번 포트에 대한 접근을 Replicaset의 Primary 노드인 handson-mongodb-1 인스턴스 사설 IP의 22번 포트로 포워딩합니다.
-
Bastion 인스턴스를 통한 MongoDB 인스턴스 ssh 접속을 시도합니다.
접속ssh -i ${PRIVATE_KEY_FILE} ubuntu@${BASTION_PUBLIC_IP} -p 10000
-
MongoDB 인스턴스에 접속한 후, 아래 명령을 실행하여 Replicaset이 구성되었는지 확인합니다.
구성 확인mongosh --eval 'rs.config()'
# ...
# {
# _id: 'hands-on-mongodb-replicaset',
# version: 1,
# term: 1,
# members: [
# ... -
결과를 확인한 후 아래 명령을 실행하여 생성된 리소스를 제거합니다.
생성된 리소스 제거terraform destroy