Appendix: Terraform을 활용한 인프라 설치
목차
- 설치 환경 셋업하기
- AWS 사용자 계정 등록 및 AWS CLI 설치하기
- AWS Infra 설정하기
- Route53 DNS 설정하기
- Certificate Manager 설정하기
- Terraform 설치하기
- Route53 Hosted zones 추가 설정하기
- Terraform을 이용한 변수 등록하기
- 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
- 계정 식별자 확인 페이지를 참고해서 계정 식별자(12자리 숫자)를 확인합니다.
- 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} 선택
- Choose endpoint : Alias to Application and Classic Load Balancer 선택
- 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