본문으로 건너뛰기
버전: docs v25.02

Appendix: Terraform을 활용한 인프라 설치


목차

  1. 설치 환경 셋업하기
  2. AWS 사용자 계정 등록 및 AWS CLI 설치하기
  3. AWS Infra 설정하기
  4. Route53 DNS 설정하기
  5. Certificate Manager 설정하기
  6. Terraform 설치하기
  7. Route53 Hosted zones 추가 설정하기
  8. Terraform을 이용한 변수 등록하기
  9. DB USER 생성 및 권한 생성하기


자세한 단계

{변수}의 자세한 설명은 Terminology 페이지를 참고하세요


1. 설치 환경 셋업하기

  • Docker 환경 설치하기

    • 설치 환경이 독립적으로 구성될 수 있도록 Docker Container(Ubuntu)를 이용하는 것을 권장합니다.

      export DOCKER_NAME=
      # docker 다운로드
      docker pull ubuntu:24.04

      # docker 실행
      docker container run -id -w /home/mellerikat --name ${DOCKER_NAME} ubuntu:24.04

      # bash 실행
      docker exec -it ${DOCKER_NAME} /bin/bash

      # 필요 tool 설치
      sudo apt update
      sudo apt install git curl unzip tar make sudo vim wget mysql-server jq lsb-release gpg -y

  • kubectl 설치하기 - kubectl 은 Kubernetes 를 컨트롤하기 위해 필요한 명령어 입니다.

    • 버전은 클러스터의 Kubernetes 버전과 동일하거나 최대 하나 이전 또는 이후의 마이너 버전일 수 있습니다.

      • (클러스터 버전이 1.30인 경우 kubectl 버전 1.29, 1.30 또는 1.31)
    • kubectl 을 설치하거나 업그레이드하려면 kubectl 설치 또는 업데이트 부분을 참조하세요. - 설치환경에서 클러스터와 통신할 수 있도록 구성합니다.

      export INFRA_NAME=
      export DEPLOY_ENV=
      export AWS_CLUSTER_VERSION=
      export AWS_CLUSTER_VERSION_STR=`echo ${AWS_CLUSTER_VERSION} | tr '.' '-'`
      export AWS_DEFAULT_REGION_ALIAS=
      export AWS_CLUSTER_NAME=eks-${AWS_DEFAULT_REGION_ALIAS}-${INFRA_NAME}-${DEPLOY_ENV}-${AWS_CLUSTER_VERSION_STR}-eks-master

      aws eks update-kubeconfig \
      --region ${AWS_DEFAULT_REGION} --name ${AWS_CLUSTER_NAME} --alias ${INFRA_NAME}


2. AWS 사용자 계정 등록 및 AWS CLI 설치하기

  • 관리자 권한을 가진 AWS 계정이 있다면 이 단계를 건너뜁니다.
  • 계정이 없다면 AWS 가입 페이지의 지시에 따라 계정을 생성하세요.
  • AWS 계정 정보 확인하기
    • 계정 식별자 확인 페이지를 참고해서 계정 식별자(12자리 숫자)를 확인합니다.
      export AWS_ACCOUNT_ID=
    • AWS 계정의 ACCESS KEY와 SECRET ACCESS KEY를 발급받아야 합니다. 발급을 위한 절차는 IAM 사용자의 액세스 키 관리를 참조 바랍니다.
    • 발급한 ACCESS KEY와 SECRET ACCESS KEY, 계정의 region 정보를 변수로 등록합니다.
      export AWS_ACCESS_KEY_ID=
      export AWS_SECRET_ACCESS_KEY=
      export AWS_DEFAULT_REGION=ap-northeast-2
      export AWS_OUTPUT_FORMAT=json
  • AWS CLI 설치하기
    • 설치 환경에 AWS CLI를 구성합니다. 자세한 설치 과정은 AWS CLI 설치의 지시를 참고하세요


3. AWS Infra 설정하기

  • 설정된 이름은 인프라를 비롯한 모든 자원에 활용됩니다. 하나의 인프라에는 다수의 프로젝트가 포함될 수 있으며, 인프라 이름({INFRA_NAME})과 프로젝트 이름({PROJECT_NAME})은 중복되지 않는것을 권장합니다.

    export INFRA_NAME=
    # DEPLOY_ENV 는 dev 또는 prod 중 선택
    export DEPLOY_ENV=
    export DOMAIN_NAME=
    export DB_APP_USERNAME=$(echo ${INFRA_NAME}_APP | tr '[:lower:]' '[:upper:]')
    export DB_APP_PASSWORD=
    export MY_NAT_IP=$(curl ifconfig.me)
  • 설정된 INFRA_NAME 으로 AWS PROFILE을 설정합니다.

    {
    echo "${AWS_ACCESS_KEY_ID}"
    echo "${AWS_SECRET_ACCESS_KEY}"
    echo "${AWS_DEFAULT_REGION}"
    echo "${AWS_OUTPUT_FORMAT}"
    } | aws configure --profile=${INFRA_NAME}

    export AWS_PROFILE=${INFRA_NAME}


4. Route53 DNS 설정하기

도메인을 등록하면, Hosted Zone 은 자동 등록 됩니다. 이미 가지고 있는 Hosted Zone이 있으면 5. Certificate Manager 설정하기 으로 이동합니다.


  • 도메인 등록

    • AWS Route53 Console 으로 이동합니다.

    • 왼쪽 메뉴에서 Domains 하위의 Registered domains 클릭

    • Register domains 클릭

    • Search for domain 섹션에서 이용할 {DOMAIN_NAME}(example.com) 입력 후 Search 클릭

    • Search Result 에서 입력한 도메인이 이용 가능한 경우 Select 클릭

    • Proceed to checkout 클릭

    • Duration 및 Auto-renew 선택 후 Next 클릭

    • Contact information의 정보 입력 후 Next 클릭

      • Contact Information 에서 입력한 e-mail 로 도메인 이메일 검증 메일이 발송됩니다.

        [Expand Verify Domain e-mail]
    • I have read and agree to the Amazon Route 53 Domain Name Registration End User Agreement. 체크

    • Submit 클릭

    • 도메인 등록은 대략 10분 (최대 1일) 소요될 수 있습니다.

    • 도메인 등록 완료 시, Contact Information 에서 입력한 e-mail 이 발송됩니다.

      [Expand Registration Domain e-mail]


5. Certificate Manager 설정하기

{변수} 는 직접 입력하여 주세요

  • Certificate Manager를 통해서 TLS 통신을 위한 인증서를 생성합니다.
  • 이미 가지고 있는 Certificate Manager가 있는 경우 6. Terraform 설치하기로 이동합니다.
  • AWS Certificate Manager Console 으로 이동합니다.
  • 왼쪽 메뉴에서 Request certificate 버튼을 클릭합니다.
  • Request a public certificate 선택 후 Next 버튼을 눌러 진행합니다.
  • Step 1: Domain names
    • Fully qualified domain name: 위 {DOMAIN_NAME} 을 입력합니다.
    • Add another name to this certificate 클릭
      • *.{DOMAIN_NAME}
  • Step 2: Validation method
    • DNS validation 선택
  • Step 3: Key algorithm
    • RSA 2048 선택
  • Request 클릭
  • 생성된 Certificate ID 항목을 클릭
  • Create records in Route 53 클릭
  • Create records 클릭하여 Route53에 record를 생성합니다.
  • Certificates 목록에서 생성된 항목을 확인한 후, Status가 Issued로 변경되는지 확인합니다. 이 과정은 시간이 소요될 수 있습니다.


6. Terraform 설치하기

  • Terraform을 이용하여 인프라를 생성하기 위해 Terraform CLI를 설치합니다.

    # path : ${TOP}

    wget -O- https://apt.releases.hashicorp.com/gpg | \
    sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg

    echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] \
    https://apt.releases.hashicorp.com $(lsb_release -cs) main" | \
    sudo tee /etc/apt/sources.list.d/hashicorp.list

    sudo apt update && sudo apt install terraform
  • Mellerikat Terraform Repository를 clone 합니다.

    # path : ${TOP}

    git clone https://github.com/mellerikat/infra.git
    cd infra
  • Terraform Init을 통해 구성 파일이 포함된 디렉토리를 초기화합니다.

    # path : ${TOP}/infra

    terraform init
  • terraform.tfvars 수정을 통해 infra 생성 준비를 합니다.
    ( workspace_vars의 경우 개수를 줄이거나 늘릴수 있습니다. )


    # path : ${TOP}/infra/terraform.tfvars

    _region = {
    full = "ap-northeast-2" # 사용하는 리전 {AWS_DEFAULT_REGION}
    acronym = "an2" # 사용하는 리전 약어
    }
    _project = "infra" # 인프라 이름 {INFRA_NAME}
    _phase = "dev" # dev 또는 prod 중 선택 {DEPLOY_ENV}
    _revision = "tf" # revision 지정

    workspace_vars = {
    poc-ws-low = {
    PROJECT_NAME = "poc", # Workspace 생성을 위한 구분자
    PROJECT_NODEGROUP_SPEC = "low", # Workspace spec(low, standard, high)
    PROJECT_NODEGROUP_EC2_NAME = "r6i.large", # Instance type
    PROJECT_NODEGROUP_EC2_AMI = "AL2_x86_64", # AMI
    PROJECT_NODEGROUP_MAX = 10 # Max Node Size
    }
    poc-ws-standard = {
    PROJECT_NAME = "poc", # Workspace 생성을 위한 구분자
    PROJECT_NODEGROUP_SPEC = "standard", # Workspace spec(low, standard, high)
    PROJECT_NODEGROUP_EC2_NAME = "r6i.xlarge", # Instance type
    PROJECT_NODEGROUP_EC2_AMI = "AL2_x86_64", # AMI
    PROJECT_NODEGROUP_MAX = 10 # Max Node Size
    }
    }

  • Terraform Plan을 통해 생성될 인프라 리소스를 확인합니다.

    # path : ${TOP}/infra

    terraform plan \
    -var 'db_password=${DB_APP_PASSWORD}' -var 'db_user=${DB_APP_USERNAME}' \
    -var 'my_ip='${MY_NAT_IP}'' -var 'domain='${DOMAIN_NAME}''
  • Terraform apply를 통해 인프라 리소스를 생성합니다.

    # path : ${TOP}/infra

    terraform apply \
    -var 'db_password=${DB_APP_PASSWORD}' -var 'db_user=${DB_APP_USERNAME}' \
    -var 'my_ip='${MY_NAT_IP}'' -var 'domain='${DOMAIN_NAME}''
  • Terraform destroy를 통해 인프라 리소스를 삭제합니다.

    # path : ${TOP}/infra

    terraform destroy \
    -var 'db_password=${DB_APP_PASSWORD}' -var 'db_user=${DB_APP_USERNAME}' \
    -var 'my_ip='${MY_NAT_IP}'' -var 'domain='${DOMAIN_NAME}''


7. Route53 Hosted zones 추가 설정하기

{변수} 부분은 직접 선택해 주세요

  • AWS Route53 Console 으로 이동합니다.
  • 왼쪽 메뉴에서 Hosted zones 클릭
  • {DOMAIN_NAME} 클릭
  • Create record 클릭
  • Record name : *
  • Record type : A - Routes traffic to an IPv4 address and some AWS resources 선택
  • Alais 활성화
  • Route traffic to
    • Choose endpoint : Alias to Application and Classic Load Balancer 선택
      • Choose Region : {AWS_DEFAULT_REGION} 선택
      • Choose load balancer : dualstack.{AWS_ALB_DNS_NAME} 선택
  • Routing policy : Simple routing 선택
  • Create records 클릭


8. Terraform을 이용한 변수 등록하기

# path : ${TOP}/infra

export AWS_DEFAULT_REGION=$(terraform output -raw AWS_DEFAULT_REGION)
export AWS_DEFAULT_REGION_ALIAS=$(terraform output -raw AWS_DEFAULT_REGION_ALIAS)
export INFRA_NAME=$(terraform output -raw INFRA_NAME)
export DEPLOY_ENV=$(terraform output -raw DEPLOY_ENV)
export DB_ADMIN_USERNAME=$(terraform output -raw DB_ADMIN_USERNAME)
export DB_ADMIN_PASSWORD=$(terraform output -raw DB_ADMIN_PASSWORD)
export DB_HOST=$(terraform output -raw DB_HOST)
export DB_PORT=$(terraform output -raw DB_PORT)
export AWS_ACCOUNT_ID=$(terraform output -raw AWS_ACCOUNT_ID)
export AWS_CLUSTER_NAME=$(terraform output -raw AWS_CLUSTER_NAME)
export AWS_SECRETS_MANAGER_S3=$(terraform output -raw AWS_SECRETS_MANAGER_S3)
export AWS_SECRETS_MANAGER_RDS=$(terraform output -raw AWS_SECRETS_MANAGER_RDS)
export CLUSTER_REGION=${AWS_DEFAULT_REGION}
export CLUSTER_NAME=${AWS_CLUSTER_NAME}


9. DB USER 생성 및 권한부여하기

# path : ${TOP}/infra

echo ${DB_ADMIN_PASSWORD} | mysql -h ${DB_HOST} -P ${DB_PORT} -u ${DB_ADMIN_USERNAME} -p${DB_ADMIN_PASSWORD} <<EOF
create user '${DB_APP_USERNAME}'@'%' identified by '${DB_APP_PASSWORD}';
GRANT SELECT, PROCESS, SHOW DATABASES, SHOW VIEW ON *.* TO '${DB_APP_USERNAME}'@'%';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE, SHOW VIEW ON cachedb.* TO '${DB_APP_USERNAME}'@'%';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE, SHOW VIEW ON kubeflow.* TO '${DB_APP_USERNAME}'@'%';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE, SHOW VIEW ON metadb.* TO '${DB_APP_USERNAME}'@'%';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE, SHOW VIEW ON mlpipeline.* TO '${DB_APP_USERNAME}'@'%';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE, SHOW VIEW ON ai_conductor.* TO '${DB_APP_USERNAME}'@'%';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE, SHOW VIEW ON edge_conductor.* TO '${DB_APP_USERNAME}'@'%';
flush privileges;
EOF