728x90
IaC란
- Infrastructure as a Code로 코드를 작성하여 인프라를 구성하는것을 의미
- ex: 퍼블릭 클라우드의 경우, 직접 콘솔에 접속하여 VPC 생성 / Subnet 생성 / SG생성 / Instance 생성을 진행하지만 IaC를 사용하면 코드를 이용하여 콘솔에 접속하지 않고 간단하게 인프라 구성 및 클라우드 자원을 생성 할 수 있음
Terraform이란
- 하시코프사에서 공개한 IaC(Infrastructure as a Code) 도구로, 현재 IaC 도구로 가장 널리 사용되고 있는 플랫폼
- 다양한 Provider를 제공하여 테라폼 문법 하나로 다양한 클라우드 인프라 및 리소스를 생성
- Provider를 통해 각 Target에 API를 호출하여 리소스를 생성하기 때문에 속도가 매우 빠름
실습 환경 준비 / Terraform 설치
- 윈도우 Desktop를 사용하는 경우 WSL2 리눅스 환경 세팅 / VSCODE 연동
- terraform 설치
- awscli 설치
- eksctl 설치
- helm 설치
- 기타 실습에 편리한 툴
- tree
- jq
WSL2 설치 및 구성
# Windows wsl2 설치
# 자신의 windows 업데이트 버전을 확인하여 wsl설치가 가능한지 확인 필요
1. wsl2 설치 #CMD창을 관리자 권한으로 실행
wsl --install #wsl 설치
wsl --set-default-version 2 # wsl 버전 기본값을 2로 변경
2. 마이크로소프트 스토에서에서 설치하고 싶은 리눅스 배포반 검색 및 설치
3. ubuntu 22.04 설치
설치 클릭하면 자동으로 앱이 실행되면서 터미털이 열리고 설치 진행
만약 터미널이 자동으로 열리지 않는다면 PC 재부팅 후 진행
4. 초기 사용자 계정 / 패스워드 설정
5. 설치 확인 # cmd에서 확인
wsl -l -v
C:\Users\Burst>wsl -l -v
NAME STATE VERSION
* Ubuntu Running 2
Ubuntu-22.04 Stopped 2
Terraform 및 기타 Tool 설치
# 1. Terraform 설치
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
# 테라폼 버전 정보 확인
terraform version
# 2. awscli2 설치
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
# 자격증명 진행
aws configure
# 3. eksctl 설치
curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin
eksctl version
# 4. helm 설치
curl -s https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
# 5. kubectl 설치
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
# 버전 확인
kubectl version --client
# 6. 실습에 편리한 툴 설치
apt install -y tree jq
vscode 설정 및 추가 확장 팩 설치
- HashiCorp HCL : HCL 파일에 대한 문법 하이라이팅 기능 제공
- HashiCorp Terraform : 테라폼에 대한 문법 하이라이팅 기능 제공
- vscode에서 wsl 연동 / vscode 터미널에서 리눅스 명령어 작업 및 해당 디렉토리 내 파일 편집
HCL(HashiCorp Configuration Language)
- HCL은 하시코프사에서 IaC와 구성 정보를 명시하기 위해 개발된 오픈소스 도구
- 테라폼의 경우 확장자가 *.tf 파일을 사용하며, HCL언어로 작성
- 인프라가 코드로 표현되고 이 코드는 곧 인프라이기 때문에 선언적 특성을 갖게 되고 튜링 완전한 Turing-complete 언어적 특성을 갖음
- HCL에서 변수와 문자열 값을 함께 사용하는 인터폴레이션 interpolation 표현 방식을 사용
- 내부 구조는 Block으로 구성
주요 명령어 & 순서
- 테라폼 코드 작성 후 실행 순서는 init - plan - apply 순으로 실행
- init
- 테라폼 초기화 명령어
- terraform init 입력 시 .terraform디렉토리가 생성되며 해당 디렉토리 내 provider 관련 프러그인 다운
- plan
- 작성한 테라폼 코드가 어떻게 구성되는지 미리 보여주는 명령어
- apply
- 테라폼 코드를 실행하는 명령어
- -auto-approve 시 yes를 별도로 입력하지 않아도 됨
- destory
- 테라폼 코드를 실행하여 생성된 자원 삭제 명령어
- -auto-approve 시 yes를 별도로 입력하지 않아도 됨
- state
- 테라폼으로 실행 후, 워크스페이스에 상태를 확인
- 서브 명령어로 list, show, mv, pull, push, rm, replace-provider가 있음
Terraform 주요 구성 요소
- provider
- Terraform으로 정의할 Infrastructure Provider를 의미
- 테라폼 0.13 버전 이전에는 provider 블록에 함께 버전을 명시했지만 해당 버전 이후 프로바이더 버전은 terraform 블록에서 required_providers에 정의
- resource
- 실제로 생성할 인프라 자원을 의미
- 프로바이더이름_제공리소스유형), 동일한 유형에 대한 식별자 역할로 고유한 이름, 구성 인수들이 이름 뒤에 중괄호 내에 선언됨
- ex: resource "aws_instance" "example"
- data
- terraform에서 정의되지 않은 외부 리소스 또는 저장된 정보를 terraform 내에서 참조할 때 사용
# AWS 가용역역을 data로 저장
data "aws_availability_zones" "available" {
state = "available"
}
#state list로 확인 시 data로 시작되는 객체 확인
terraform state list
data.aws_availability_zones.available
#해당 data에 어떤 내용이 저장되어 있는지 확인하고 싶으면 terraform console에서
#해당 data를 입력하면 확인 가능
terraform console
> data.aws_availability_zones.available
{
"all_availability_zones" = tobool(null)
"exclude_names" = toset(null) /* of string */
"exclude_zone_ids" = toset(null) /* of string */
"filter" = toset(null) /* of object */
"group_names" = toset([
"ap-northeast-2",
])
"id" = "ap-northeast-2"
"names" = tolist([
"ap-northeast-2a",
"ap-northeast-2b",
"ap-northeast-2c",
"ap-northeast-2d",
])
"state" = "available"
"timeouts" = null /* object */
"zone_ids" = tolist([
"apne2-az1",
"apne2-az2",
"apne2-az3",
"apne2-az4",
])
}
- variable
- 입력 변수는 인프라를 구성하는 데 필요한 속성 값을 정의해 코드의 변경 없이 여러 인프라를 생성하는 데 목적
- 변수 값을 전달하는 여러 가지 방법을 지정하지 않으면 기본값이 전달되고, 기본값이 없으면 대화식으로 사용자에게 변수에 대한 정보를 물어봄
- state
- 테라폼 명령어를 실행한 결과값을(상태)를 출력
- terraform.tfstate 파일에 정의
- output
- 출력 값은 주로 테라폼 코드의 프로비저닝 수행 후의 결과 속성 값을 확인하는 용도로 사용
- terraform output 명령어를 사용해서 확인
- module
- resource를 기반으로 작성된 변수들을 상속 받아, 필요한 부분을 override해서 사용
728x90
'AEWS Study' 카테고리의 다른 글
8주차 - EKS IaC(Terraform) 실습 (0) | 2024.04.23 |
---|---|
7주차 - EKS CI/CD - Jenkins(PIPELINE) (0) | 2024.04.21 |
7주차 - EKS CI/CD - Jenkins(기본) (0) | 2024.04.20 |
7주차 - EKS CI/CD - ArgoCD / ArgoRollouts (1) | 2024.04.18 |
6주차 - EKS Security - Kyverno & 보안 위협 시나리오 (0) | 2024.04.14 |