Terraform으로 웹서비스 인프라 자동화
카카오클라우드 인프라 컴포넌트를 이용하여 Web, App, Bastion 등의 프로비저닝을 자동화하는 Terraform 예제를 제공합니다.
- 예상 소요 시간: 30분
- 권장 운영 체제: MacOS, Ubuntu
- Terraform 버전: 1.6.3
- 리전 및 가용 영역: kr-central-2-a
- 참고 문서
사전 준비
예제에서 확인할 수 있는 자동화된 구성요소와 사용자가 예제를 사용하기 위해 준비해야 하는 구성요소는 다음과 같습니다.
자동화된 구성요소
항목 | 설명 |
---|---|
자동화된 구성요소 | - Load Balancer - Virtual Machine - Security Group - Floating IP |
사전 준비가 필요한 구성요소
사전 준비 구성 요소는 콘솔을 통해 해당 내용이 준비되었는지 확인합니다.
항목 | 설명 |
---|---|
키 페어(Key Pair) | VM > Key pair 탭에서 공개키 확인 |
Public Subnet | VPC > Subnet 탭에서 확인 |
액세스 키 | 사용자 설정 > 액세스 키 탭에서 확인 |
구성도 및 리소스 계획
이 가이드에서 생성할 클라우드 인프라 자원 및 구성은 다음과 같습니다.
Virtual Machine
구분 | 이름 | 인스턴스 타입 | Public IP | Image |
---|---|---|---|---|
Bastion | handson-bastion | m2a.large | Y | Ubuntu 20.04 |
WEB1 | handson-web-1 | m2a.large | N | Ubuntu 20.04 |
WEB2 | handson-web-2 | m2a.large | N | Ubuntu 20.04 |
WAS1 | handson-app-1 | m2a.large | N | Ubuntu 20.04 |
WAS2 | handson-app-2 | m2a.large | N | Ubuntu 20.04 |
이 문서에서는 웹 서버와 애플리케이션 서버의 예제 코드를 제공합니다. 이 코드는 예제 웹서비스인 KEP-Library를 기반으로 합니다. 웹 서버는 React 앱을 구성하여 Nginx를 통해 배포하며, 애플리케이션 서버는 Spring 앱을 설정하여 실행합니다.
Load Balancer
구분 | 이름 | Public IP | 설명 |
---|---|---|---|
EXT-LB | handson-web-lb | Y | 웹 서버에 대한 부하 분산 |
INT-LB | handson-app-lb | N | 애플리케이션 서버에 대한 부하 분산 |
Step 1. Terraform 설치하기
실습을 진행하기 위해서는 사용자 로컬 환경에 Terraform 설치가 필요합니다. Homebrew 패키지 매니저를 이용하거나, Terraform 공식 가이드를 참고하시기 바랍니다.
- Mac 환경
- Linux(Ubuntu) 환경
-
Homebrew 패키지 매니저를 이용하여 로컬 환경에 Terraform을 설치합니다.
brew install terraform
-
설치가 정상적으로 되었는지 아래 명령어를 통해 확인합니다.
terraform -version
# Terraform v1.3.3 ## ... -> 정상 설치 시 이와같은 버전 정보를 확인할 수 있습니다.
-
아래 명령어를 이용하거나, Terraform 공식 가이드를 참고하시기 바랍니다.
apt-get update
apt-get install terraform -
설치가 정상적으로 되었는지 아래 명령어를 통해 확인합니다.
terraform -version
# Terraform v1.3.3 ## ... -> 정상 설치 시 이와같은 버전 정보를 확인할 수 있습니다.
Terraform 설치와 관련한 자세한 내용은 Terraform 공식 가이드 문서를 참고하시기 바랍니다.
Step 2. 설정 파일 작성하기
카카오클라우드에서 자원을 생성하기 위해서 리전 및 인증키 등의 추가적인 정보가 필요합니다. 아래 예제를 참고하여 기존 경로에 추가 정보를 입력하거나 해당 파일에 추가합니다.
mkdir -p ~/.config/openstack/
cat << EOF > ~/.config/openstack/clouds.yaml
clouds:
hands-on:
region_name: '{REGION_NAME}'
interface: 'public'
auth_type: "v3applicationcredential"
auth:
auth_url: 'https://iam.kakaocloud.com/identity/v3'
application_credential_id: "{액세스 키 ID}"
application_credential_secret: "{보안 액세스 키}"
EOF
Step 3. 예제 설치 및 작성하기
-
예제로 제공하는 프로젝트를 다운로드합니다. 아래 명령어를 복사한 후, 사용자 로컬 터미널 환경에서 실행합니다.
프로젝트 다운로드git clone -b terraform-3tier https://github.com/kakaoenterprise/kakaocloud-tutorials
- 예제 프로젝트의 참고 및 수정이 필요한 경우 아래 예제 프로젝트 폴더 구성을 확인합니다.
프로 젝트 폴더 구성 확인kc-handson-config
ㄴ instance.tf # bastion, app 서버, web 서버 가상머신
ㄴ lb.tf # app 서버 로드밸런서, web 서버 로드밸런서를 생성하는데 필요한 리소스(lb, lb-pool, lb-member, lb-monitor, lb-listener)
ㄴ network.tf # bastion 공인 IP, bastion/app/web port 정의
ㄴ security.tf # bastion/app/web security-group 정의
ㄴ data.tf # 클라우드 제공자에게 가져올 정보 및 사전에 필요한 클라우드 리소스(subnet, keypair ...) 정보를 정의
ㄴ require.tf # 클라우드 프로바이더 및 테라폼 환경 정보 정의
ㄴ variables.tf # 프로비저닝에 사용할 변수 정보 정의 (사용자 환경에 맞게 수정 필요)
ㄴ terraform.tfvars # variables 파일에 있는 변수에 넣을 값을 지정
ㄴ scripts
ㄴ app-init.sh # app서버 프로비저닝에 사용할 스크립트 정의
ㄴ bastion-init.sh # bastion호스트 프로비저닝에 사용할 스크립트 정의
ㄴ web-init.sh # 웹서버 프로비저닝에 사용할 스크립트 정의
ㄴtemplates
ㄴ app-env.sh # app서버에서 spring애플리케이션 빌드 후 실행 정의
ㄴ web-env.sh # 웹서버에서 react애플리케이션 빌드 후 실행 정의 -
예제 프로젝트가 설치된 경로로 이동합니다.
설치 경로로 이동cd ./kakaocloud-tutorials
-
Terraform을 이용하여 클라우드 리소스를 생성하기 전, 사용자 환경에 맞게 몇 가지 설정값을 수정해야 합니다.
Vim
을 이용하여 수정이 필요한 변수가 있는terraform.tfvars
파일을 수정합니다.설정값 수정vim terraform.tfvars
-
내용 중, 아래 예시의 환경변수 위치에 자원을 생성할 Subnet의 CIDR 값과 콘솔에서 사용할 사용자 키 페어 이름을 작성합니다. 아래 표의 환경 변수를 참고해 사용자 환경에 맞게 해당 값을 수정합니다.
키 페어 이름 작성# network
public_network_cidr="${PUBLIC_NETWORK_CIDR}"
# keypair
sshkey="${USER_KEY_PAIR_NAME}"
...환경 변수 유형 설명 $ {PUBLIC_NETWORK_CIDR}
String 클라우드 자원을 생성할 Subnet의 CIDR을 입력 $ {USER_KEY_PAIR_NAME}
String 가상머신에 ssh 접근을 위한 Key Pair 이름을 입력
Step 4. 클라우드 리소스 생성하기
예제 프로젝트를 설치한 후에는 Terraform을 이용하여 프로젝트에서 정의한 리소스를 생성할 수 있습니다. 작업 경로를 예제 프로젝트가 설치된 경로로 이동한 다음에 리소스를 생성하고 결과를 확인합니다.
-
Terraform 이전에 작성한 설정을 참조할 수 있도록 다음 명령어를 사용합니다.
이전 설정 참조export OS_CLOUD=hands-on
-
현재 작업 디렉터리를 초기 설정합니다.
디렉터리 초기 설정terraform init
-
아래 명령어를 통해 실행 계획을 만듭니다. 인프라에 적용할 변경 사항을 미리 확인할 수 있습니다.
계획terraform plan
-
실행 계획을 클라우드에 적용합니다.
클라우드에 적용terraform apply
Step 5. 결과 확인하기
자원 생성이 완료되면 콘솔에서 생성된 자원 정보를 확인합니다.
-
콘솔에 접속하여 Load Balancer 메뉴에서 새로 생성된 로드밸런서를 확인합니다.
-
Virtual Machine에서 새로 생성된 인스턴스를 확인합니다.
-
웹 서비스가 생성되었는지 브라우저를 통해 로드밸런서
handson-web-lb
공인 IP에 접속하여 확인합니다. -
브라우저에서
http://${BASTION_HOST_PUBLIC_IP}:81
주소를 입력하여 NGINX PROXY MANAGER 관리페이지에 접속할 수 있습니다. 접속을 위한 초기 계정 정보는 다음과 같습니다.- 기본 email: admin@example.com
- 기본 pw: changeme
-
관리 페이지에 접속한 후, Steams 탭에 접속하여 포워딩 정보가 추가되었는지 확인합니다.
-
결과를 확인한 후 아래 명령어를 사용하여 생성된 리소스를 제거합니다.
생성된 리소스 제거terraform destroy
실습을 모두 완료한 후 생성된 리소스를 반드시 제거해야 합니다.