클라우드/DevOps

[IaC] Terraform

dayeonsheep 2024. 3. 19. 18:46

Main reference

테두리 적용된 사진 출처는 ↑


 

; 기초 개념 : IaC

 

코드형 인프라는 아키텍처를 정의하는 개념

  • IaC 의 장점 :  고객 경험 향상, 속도 향상, 문서화 개선, 코드 재사용, 협업, 에러 감소 

 

 
테라폼이란? 
 
  • 테라폼 기초 개념: 변수, outputs, 모듈, 원격 백엔드 등
  • 테라폼은 IAC 에 기반하며, AWS Management Console에 대한 지식이 필요함
  • 다양한 클라우드와 호환되는 테라폼은 AWS, Azure, GCP 등의 다양한 cloud Provider를 사용할 수 있음
  • 테라폼은 다양한 클라우드 지원으로 CloudFormation, Azure보다 유연하게 Multi-cloud 환경에서 활용 가능
  • Terraform은 인프라를 생성하고, Linux 기반인 클라우드를 위해 테라폼 설치가 필요한데, HCL을 사용해 구성 파일을 작성하게 됨

 

 
 
Configuration Management as Code? 
 
  • 구성 관리는 설정 파일과 저장소를 관리하는 것으로, 클라우드에 설치하거나 구성할 때 사용
  • 프로비저닝 후 구성을 하며, EC2 인스턴스 생성부터 WordPress나 Apache 웹 서버 구성 시 Ansible 또는 Terraform을 사용할 수 있음

 

 

; AWS Instance와 Provider 정의 방법

 
 
HCL(HashiCorp Configuration Language)를 사용
 
  • AWS의 예시로, 웹 서버 역할을 하는 인스턴스를 HCL 구문을 사용하여 정의
  • Json이나 yaml이랑 비슷하긴 함
  • Provider를 제일 먼저 정의해야 함
  • 리소스 형태로 원하는 것을 생성할 수 있으며, 다양한 리소스를 만들 수 있어요 (예: 보안 그룹, VPC 서브넷, Elastic IP 등).<block> <parameters> {}
  • 등의 형식으로 리소스 블록 내에서 키-값 쌍으로 정보를 정의
  •      키 = 밸류 값
  •  
 
 
; CLI로 AWS 인프라 구축하는 방법
 
CLI 명령어를 사용하여 'learn terraform' 디렉토리 생성 후, AWS 설정하고 인프라 구축 시작
 
 
 

 

AWS IAM 명령어를 통해 계정 확인 후 provider.tf 파일을 생성하여 AWS provider 정의하기

 

#Configuration option에 지역 등 정보 추가 가능

(지정 지역(예: us-east1)을 사용하여 인프라 생성하고, 다른 지역도 콘솔에서 확인 가능)

 

 

 
  • 새 파일(main.tf, server.tf 등)을 생성하여 EC2 인스턴스와 같은 인프라를 만들 수 있음
  • AMI 값을 설정하고 'HelloWorld'으로 인스턴스 이름을 지정하여 AWS 인스턴스를 만들기(AMI ID는 계정과 지역에 따라 다름)

 

AMI ID는 EC2 인스턴스 생성 접속한 뒤 확인 가능함

 

 

; Terraform을 사용해 AWS API 액세스 설정하기

 

  • Terraform을 사용하면 Define provider로 AWS API 액세스를 설치할 수 있고, validate로 구문을 확인할 수 있음
  • terramform init을 가장 먼저 수행하면 필요한 파일을 설치되고, provider 정보를 갖춤
  • 파일 수정은 *.tf로, Terraform init시 자동 생성되는 파일을 건들면 안됨
 
 
 
 

plan 명령어로 생성될 내용을 확인하고, apply로 실제 실행할 수 있음

 
 
> AWS 계정에서 인프라스트럭처를 생성하고, 'terraform apply' 명령어로 완료되면 해당 리소스가 추가된 것을 확인가능
> InfraStructure 변경을 원할 시 'terraform plan'으로 변경 사항을 확인하고, 'terraform apply'로 적용할 수 있음
 

 

 

; Terraform 명령어들 

이런 것 등등이 있고...
  • 테라폼은 해시코드 형식을 따라야 하며, 포맷 명령어로 서로 다른 코드 형식을 통일시킬 수 있음
  • Terraform force-unlock 명령어는 상태 잠금을 해제하여 작업을 계속할 수 있게 함
  • Terraform 메타인자에는 변수를 활용해 코드에서 재사용 가능한 값을 설정할 수 있음

 

 

; Terraform으로 변수 및 인스턴스 설정하는 방법

 

  • 파일 'variables.tf'를 생성하여 인스턴스 유형을 위한 변수를 정의하고, 해당 변수 블록을 만들어 값을 할당
  • VS Code를 사용하는 경우, 자동완성을 위한 확장 프로그램을 설치하여 변수를 쉽게 생성가능
  • 변수를 정의하고 코드에서 활용하려면 'VAR.변수명'을 사용하여 값을 지정할 수 있으며, 여러 인스턴스에 동일한 값을 적용하거나 값을 한 곳에서 변경할 수 있음

 

; AWS 인스턴스 구성 과정 설명

  • 콘솔에 접근하지 않고도 터미널에서 공개 IP 주소를 출력가능
  • 아웃풋을 활용하여 CLI 접근 시에도 IP 주소를 얻을 수 있음
 
 
 

; AWS 아키텍처에서 EC2와 S3의 의존성

 
AWS 아키텍처 예시 :  EC2 인스턴스와 S3 버킷
  • 사용자가 이미지를 업로드하는 웹페이지를 생성하고, EC2 인스턴스가 사용자로부터 이미지를 가져와 S3 버킷에 저장
  • EC2 인스턴스가 S3에 의존해야 할 경우, 'depends on' 인자를 추가하여 의존성을 정의할 수 있음
  • S3 버킷이 먼저 생성되어야 하며, 인스턴스가 생성되기 전에 S3에 의존한다고 정의
  • S3 버킷이 아래에 있더라도, Terraform을 통해 먼저 버킷을 생성하고, 그 후에 EC2 인스턴스를 생성

 

 

; Terraform을 이용한 인스턴스 생성 방법 - count.index 및 count meta argument

  • meta-argument를 사용하여 리소스 간 의존성을 정의하거나, 리소스를 반복 생성하거나, 리소스 생성 순서를 제어할 수 있음
  • 예를 들어, 동일한 구성으로 5개의 인스턴스를 생성하고 싶을 때 count meta-argument를 사용
  • Terraform 코드를 실행하면 count meta-argument를 사용하여 동일한 값을 가진 4개의 유사한 인스턴스가 생성됨

 

 

 
 

 

  • 하나의 출력이 아닌 여러 인스턴스가 있는 상황에서는 count.index로 특정 인스턴스에 대한 개인 IP를 정의할 수 있음
  • 인덱스는 0부터 시작하여 각 인스턴스에 대한 값을 지정하며, count를 통해 원하는 인스턴스에 대한 값을 할당할 수 있음
  • count.index를 활용하여 이름을 변경하고, count에 1을 더하여 0이 아닌 1부터 시작하도록 변경 가능
  • 여러 값을 가질 때는 for each meta argument를 사용하여 각 값에 대한 설정을 할 수 있음

 

 

; 테라폼의 Provisioner

Terraform을 사용하여 서버를 구성하거나, 초기화 또는 설정 관리를 수행하는 데 사용

 

Terraform의 provisioner(프로비저너)란?

Provisioner 테라폼 프로비저너(provisioner)는 테라폼을 실행할 때 부트스트랩, 구성 관리 또는 정리 작업을 수행하기 위해 로컬 시스템이나 원격 시스템에서 스크립트를 실행하는데 사용된다. 프로

lee-automation-lab.tistory.com

 

 

  • 테라폼에는 remote-exec, local-exec 및 file 유형 등의 프로비저너가 있고, 각 Provisioner에는 연결 블록이 필요
  •  
  • 프로비저닝은 동작을 수행할 때의 마지막 수단이며, 로컬 또는 원격 머신에서 특정 작업을 준비할 때 사용됨
  • 프로비저닝은 작업 모델링 및 행동을 준비할 때 사용되며, EC2 인스턴스에 무언가를 설치하거나 구성 관리 도구를 실행할 수 있음
    • 따라서 연결 블록을 정의할 때 SSH 접속, 사용자 정보, IP 주소 등을 정의해야 함
  • 대부분의 경우 프로비저닝은 프로비저너와 연결 블록이 필요하고, SSH나 Winrm을 통해 원격 자원에 접근해야 함
  • Provisioners는 쿠버네티스와 같이 로컬 머신에서 명령을 실행할 때 유용함

 

 

 
이를 이용한 Terraform에서 파일 전송 및 실행 방법은?
 
  • File provisioner로 파일을 복사할 수 있고, 서버로 전송할 수 있음
  • 로컬 머신에서 파일을 복사해 서버에 전송하고, AWS EC2, Azure compute service, Google compute service 등으로 파일이나 디렉토리를 전달
  • Local exec provisioner를 사용하여 로컬 머신에서 실행

 

 
 
테라폼으로 AWS 정보 가져오기의 장점은 명확하다...
 
  • 테라폼에서 데이터 블록을 사용하여 콘솔에서 획득한 정보를 나타낼 수 있음
  • 코드 내에서 필요한 데이터를 설정하여 콘솔로 이동하지 않고도 효과적으로 정보를 관리할 수 있음
  • AWS 콘솔로 가지 않고도 코드 내에서 정보를 정의하고 활용할 수 있는 편리함!
 
 
 

; Data Sources

 
  • AWS Terraform에서는 백엔드 설정 시 S3 버킷과 DynamoDB 테이블이 필요하고, 상태 고정을 위해 DynamoDB를 사용
  • 여러 사용자가 같은 코드 작업 시, Terraform 상태 파일이 손상될 수 있어 상태 잠금(locks) 설정이 필요
  • 백엔드를 초기화하고 S3 버킷을 사용하여 데이터 보호 및 상태 파일 버전 관리가 가능하며, 모듈은 전략적으로 사용되어 이미 각 요소에 대한 모듈이 생성되어 있어 직접 정의 대신 활용 가능

 

; Terraform 레지스트리의 활용 방법

 
  • 모듈을 사용할 때 값 정의가 필요하며, 모듈을 호출하기 위해 main.tf 파일을 사용
  • 중요한 것은 main.tf에서 모듈을 호출하는 것
  • 카산드라 모듈을 사용하면서 VCS 서브넷 VPC ID에 관한 변수를 생성하고, 모듈 내부에서의 값을 호출할 수 있음
  • 메인 파일에서는 변수를 정의하고 해당 값은 모듈과 출력 이름에서 가져와야 한다고 지정하며, eks에서도 동일하게 진행
  • 변수를 통해 VPC cidr 값을 가져오기 위해 변수들을 정의하고, 모듈 외부에서 사용되는 cidr 값을 설정

 

; Terraform 모듈에서 값 전달 방법은?

 
  • 해당 모듈에서는 VPC, 서브넷 3개, 인터넷 게이트웨이, Round Table Round Table Association 등을 구축
  • 변수를 통해 cidr block 값을 정의하고 변수를 활용하여 모듈 내에서 값 전달함
  • 모듈 내부에서 VPC_cidr 변수를 생성하고 주석 처리된 값을 통해 변수 값을 정하고 외부 모듈에서 해당 변수를 사용
  • 변수를 이용하여 모듈 간 값을 전달하고, 변수를 직접 정의하는 방법 또한 사용하며, 모듈을 호출할 때 값이 정의되어 있지 않을 시, 외부에서 값이 정의되어야 함

 


 

+ 카산드라?

https://registry.terraform.io/providers/bartoszj/cassandra/latest/docs

 

Terraform Registry

 

registry.terraform.io

 

더보기

주어진 항목은 카산드라에서 수행되는 작업을 나타내는 것으로 보입니다. 


1. **Keyspace(s) 관리**: Keyspace는 카산드라에서 데이터를 저장하는 논리적인 컨테이너입니다. 

Keyspace를 관리하는 것은 새로운 Keyspace를 생성하거나 기존 Keyspace를 수정, 삭제하는 것을 의미합니다. Keyspace를 관리함으로써 데이터의 구조와 접근 권한을 설정할 수 있습니다.

2. **Role(s) 관리**: Role은 카산드라에서 접근 권한을 관리하는 데 사용됩니다. 사용자 또는 애플리케이션에 대한 접근 권한을 할당하고 제어하기 위해 Role을 관리합니다. 이는 데이터에 접근할 수 있는 사용자 또는 애플리케이션을 식별하고, 그들의 권한을 설정하고 관리하는 것을 의미합니다.

3. **Grants 관리**: Grants는 카산드라에서 특정 Role에 대한 특정 작업의 권한을 부여하는 것을 의미합니다. 이는 Role이 특정 Keyspace에 대한 읽기 또는 쓰기 권한을 갖도록 하는 것과 같은 작업을 포함합니다. Grants를 관리함으로써 데이터에 대한 접근 권한을 정교하게 제어할 수 있습니다.

따라서 카산드라에서 Keyspace, Role, Grants를 관리하는 것은 데이터의 구조와 접근 권한을 설정하고 관리하는 데 중요한 부분을 담당합니다. 이를 통해 데이터베이스 시스템을 보안하고 운영할 수 있으며, 데이터에 대한 접근을 효율적으로 제어할 수 있습니다.

 

 

짤막한 후기...

: 뭔가... iac의 편리함을 느낄 수 있는 톺아보기 정도

코드로 인프라를 구축한다는 게 말로만 알았지 이런 식의 파일 설정으로도 인프라를 구축할 수 있구나~ 를 알 수 있었다