본문으로 건너뛰기

Terraform으로 웹서비스 인프라 자동화

카카오클라우드 인프라 컴포넌트를 이용하여 Web, App, Bastion 등의 프로비저닝을 자동화하는 Terraform 예제를 제공합니다.

안내

사전 준비

예제에서 확인할 수 있는 자동화된 구성 요소와 사용자가 예제를 사용하기 위해 준비해야 하는 구성 요소는 다음과 같습니다.

자동화된 구성 요소
항목설명
자동화된 구성 요소- Load Balancer
- Virtual Machine
- Security Group
- Floating IP
사전 준비가 필요한 구성 요소

사전 준비 구성 요소는 콘솔을 통해 해당 내용이 준비되었는지 확인합니다.

항목설명
키 페어(Key Pair)Virtual Machine > 키 페어 메뉴에서 공개키 확인
Public SubnetVPC > Subnet 탭에서 확인
액세스 키사용자 설정 > 액세스 키 탭에서 확인

구성도 및 리소스 계획

이 가이드에서 생성할 클라우드 인프라 자원 및 구성은 다음과 같습니다.

Virtual Machine
구분이름인스턴스 타입Public IPImage
Bastionhandson-bastionm2a.largeYUbuntu 20.04
WEB1handson-web-1m2a.largeNUbuntu 20.04
WEB2handson-web-2m2a.largeNUbuntu 20.04
WAS1handson-app-1m2a.largeNUbuntu 20.04
WAS2handson-app-2m2a.largeNUbuntu 20.04
안내

이 문서에서는 웹 서버와 애플리케이션 서버의 예제 코드를 제공합니다. 이 코드는 예제 웹서비스인 KEP-Library를 기반으로 합니다. 웹 서버는 React 앱을 구성하여 Nginx를 통해 배포하며, 애플리케이션 서버는 Spring 앱을 설정하여 실행합니다.

Load Balancer
구분이름Public IP설명
EXT-LBhandson-web-lbY웹 서버에 대한 부하 분산
INT-LBhandson-app-lbN애플리케이션 서버에 대한 부하 분산

Step 1. Terraform 설치하기

실습을 진행하기 위해서는 사용자 로컬 환경에 Terraform 설치가 필요합니다. Homebrew 패키지 매니저를 이용하거나, Terraform 공식 가이드를 참고하시기 바랍니다.

  1. Homebrew 패키지 매니저를 이용하여 로컬 환경에 Terraform을 설치합니다.

    brew tap hashicorp/tap
    brew install hashicorp/tap/terraform
  2. 설치가 정상적으로 되었는지 아래 명령어를 통해 확인합니다.

    terraform -version
    # Terraform v1.3.3 ## ... -> 정상 설치 시 이와같은 버전 정보를 확인할 수 있습니다.
  3. (선택)만약 애플의 ARM 프로세서 환경에서 'arm64 Darwin 커널에 대한 바이너리가 없기 때문에 실패' 현상이 발생한다면 다음 명령어를 통해 환경 설치를 진행합니다.

    git clone https://github.com/hashicorp/terraform-provider-template
    cd terraform-provider-template

    # go 없을 경우 설치
    brew install go

    go build
    mkdir -p ~/.terraform.d/plugins/registry.terraform.io/hashicorp/template/2.2.0/darwin_arm64
    mv terraform-provider-template ~/.terraform.d/plugins/registry.terraform.io/hashicorp/template/2.2.0/darwin_arm64/terraform-provider-template_v2.2.0_x5

    chmod +x ~/.terraform.d/plugins/registry.terraform.io/hashicorp/template/2.2.0/darwin_arm64/terraform-provider-template_v2.2.0_x5
안내

Terraform 설치와 관련한 자세한 내용은 Terraform 공식 가이드 문서를 참고하시기 바랍니다.

Step 2. 설정 파일 작성하기

카카오클라우드에서 자원을 생성하기 위해서 리전 및 인증키 등의 추가적인 정보가 필요합니다. 아래 예제를 참고하여 기존 경로에 추가 정보를 입력하거나 해당 파일에 추가합니다.

Step 3. 예제 설치 및 작성하기

  1. 예제로 제공하는 프로젝트를 다운로드합니다. 아래 명령어를 복사한 후, 사용자 로컬 터미널 환경에서 실행합니다.

    프로젝트 다운로드
    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애플리케이션 빌드 후 실행 정의
  2. 예제 프로젝트가 설치된 경로로 이동합니다.

    설치 경로로 이동
    cd ./kakaocloud-tutorials
  3. 카카오클라우드에 자원 생성을 요청하기 위해서는 자원을 생성할 리전 및 인증키 등의 추가적인 정보가 필요합니다. 아래 예제를 참고하여 terraform.tfvars 파일에 값을 추가합니다. {Subnet CIDR}은 IP CIDR 블록이며, 카카오클라우드 콘솔 > VPC > Subnet에서 사용할 수 있는 Subnet을 확인할 수 있습니다.

    cat << EOF > ./terraform.tfvars
    kc_region = "kr-central-2"
    kc_auth_url = "https://iam.kakaocloud.com/identity/v3"
    kc_application_credential_id = "${ACCESS_KEY}"
    kc_application_credential_secret = "${SECRET_ACCESS_KEY}"

    public_subnet_id = "${SUBNET_ID}"
    sshkey = "${INSTANCE_KEYPAIR}"
    EOF
    환경변수설명
    ACCESS_KEY🖌액세스 키
    SECRET_ACCESS_KEY🖌사용자 보안 키
    SUBNET_ID🖌클라우드 자원을 생성할 서브넷 ID를 입력 #예시: 2d4229...
    INSTANCE_KEYPAIR🖌 인스턴스에 사용할 키페어 이름 #예시: kc-keypair

Step 4. 클라우드 리소스 생성하기

예제 프로젝트를 설치한 후에는 Terraform을 이용하여 프로젝트에서 정의한 리소스를 생성할 수 있습니다. 작업 경로를 예제 프로젝트가 설치된 경로로 이동한 다음에 리소스를 생성하고 결과를 확인합니다.

  1. 현재 작업 디렉터리를 초기 설정합니다.

    디렉터리 초기 설정
    terraform init
  2. 아래 명령어를 통해 실행 계획을 만듭니다. 인프라에 적용할 변경 사항을 미리 확인할 수 있습니다.

    계획
    terraform plan
  3. 실행 계획을 클라우드에 적용합니다.

    클라우드에 적용
    terraform apply

Step 5. 결과 확인하기

자원 생성이 완료되면 콘솔에서 생성된 자원 정보를 확인합니다.

  1. 콘솔에 접속하여 Load Balancer 메뉴에서 새로 생성된 로드밸런서를 확인합니다.

    예제 설치 및 작성

  2. Virtual Machine에서 새로 생성된 인스턴스를 확인합니다.

    생성된 VM 인스턴스

  3. 웹 서비스가 생성되었는지 브라우저를 통해 로드밸런서 handson-web-lb 공인 IP에 접속하여 확인합니다.

    웹 서비스 접속

  4. 브라우저에서 http://${BASTION_HOST_PUBLIC_IP}:81주소를 입력하여 NGINX PROXY MANAGER 관리페이지에 접속할 수 있습니다. 접속을 위한 초기 계정 정보는 다음과 같습니다.

    bastion 호스트의 nginx-proxy-manager 관리 페이지 접속

  5. 관리 페이지에 접속한 후, Steams 탭에 접속하여 포워딩 정보가 추가되었는지 확인합니다.

    bastion 호스트 Streams 탭

  6. 결과를 확인한 후 아래 명령어를 사용하여 생성된 리소스를 제거합니다.

    생성된 리소스 제거
    terraform destroy
주의

실습을 모두 완료한 후 생성된 리소스를 반드시 제거해야 합니다.