Terraform과 같은 유명한 IaC는 전부터 한 번 해보려고 했으나 미루기만 했다.
CI/CD에 관심이 많은 이 참에 한 번 해보겠다. aws를 사용할 것이다,
Terraform이란?
Terraform은 인프라스트럭처를 코드(Infrastructure as Code, IaC)로 관리할 수 있게 해주는 오픈 소스 도구이다.
클라우드 리소스 및 물리적 인프라를 선언적으로 정의하고 관리할 수 있도록 돕는 역할을 한다.
간단하게 기능과 장점에 대해 알아보자.
1. 선언적 구성
- 사용자가 원하는 인프라의 상태를 코드로 정의하고 테라폼이 실제 환경에서 구현.
- 인프라를 코드로 관리함으로써 반복 가능하고 자동화된 인프라 배포를 가능하게 한다.
2. 다양한 공급자 지원
- aws, azure,gcp 등 여러 클라우드 서비스 제공자와의 통합을 지원하고 Docker,Kubernetes,VMware 등 다양한 플랫폼 통합도 가능.
- 다양한 환경에서 통합된 방식으로 인프라를 관리할 수 있는 것이다.
3. 상태 관리
- 'state'라는 파일을 사용하여 현재 인프라의 상태를 기록한다.
- 이 파일은 테라폼이 실제 인프라와 코드 간의 차이를 추적하고 계획, 적용하는데 사용된다.
4. 모듈화
- 코드의 재사용성과 관리의 편의성을 위해 모듈을 지원한다.
- 인프라를 구성하는 데 필요한 코드 블록을 재사용 가능한 단위로 나눌 수 있다.
5. 계획 및 적용
- terraform plan이란 명령어를 통해 인프라 변경 사항을 사전에 시뮬레이션할 수 있다.
- 실제 적용 전에 변경 사항을 검토할 수 있도록 도와주고 terraform apply 명령어로 변경 사항을 실제로 적용한다.
6. 버전 관리
- 테라폼 코드는 버전 관리 시스템에 저장될 수 있다.
- 인프라 변경 이력을 추적하고, 롤백하거나 변경 사항을 검토하는 데 유용하다.
7. 드리프트 감지
- 테라폼은 실제 인프라 상태와 코드에서 정의한 상태 간의 차이를 감지할 수 있다.
- 인프라가 코드와 일치하도록 유지할 수 있게 한다.
8. 자동화 및 CI/CD 통합
- 테라폼은 CI/CD 파이프라인에 통합되어 자동으로 인프라를 배포하고 관리할 수 있다.
- 인프라 변경을 효율적으로 관리하고, 일관성을 유지할 수 있다.
등이 있다.
실무에서 테라폼이 어떻게 적용될까?
인프라 프로비저닝
> 새로운 서버, 네트워크, 데이터베이스 등의 인프라 자원을 자동으로 프로비저닝할 수 있다.
인프라 변경 관리
> 변경된 인프라 설정을 코드로 관리하고 변경 사항을 버전 컨트롤 시스템으로 추적하고 검토한다.
멀티클라우드 관리
> 여러 클라우드 제공 업체나 가상화 플랫폼에서 호스팅되는 인프라를 통합하여 관리,배포를 한다.
자동 스케일링
> 트래픽이나 작업 부하에 따라 자동으로 인프라를 확장하거나 축소하여 자원을 효율적으로 사용한다.
전에 만들어둔 Cloud9이 있어서 여기에서 그냥 실습을 하겠다. 그냥 개인 IDE에서 해도 된다.
Cloud9은 7월 29일 이후로 신규 사용자는 생성이 불가능하다. 곧 사라진다니 시원섭섭하다.
실습
aws Cloud9 실습 환경이 준비되었으니 들어가서 시작해보겠다.
sudo yum -y install terraform
이 명령어로 terraform을 다운받는다.
설치 후 terraform --version으로 테라폼의 버전을 확인할 수 있다.
echo 'export PATH="$HOME/.tfenv/bin:$PATH"' >> ~/.bash_profile
테라폼을 설치한 후에 사용할 수 있도록 시스템 환경 변수인 path에 특정 디렉토리를 추가한다.
완료 후
source ~/.bash_profile
를 통해서 .bash_profile 파일을 다시 읽어 환경 변수 변경 사항을 적용한다.
sudo ln -s ~/.tfenv/bin/* /usr/local/bin/
를 통해서 사용자의 홈 디렉토리에 있는 tfenv의 실행 파일을 /usr/local/bin/ 디렉토리로 심볼릭 링크를 생성한다.
tfenv github에서는 Soft 링크로 설정하여 사용하도록 가이드하고 있다.
tfenv list-remote를 통해서 테라폼의 버전을 확인할 수 있는데 완전한 버전을 적용시키는 것이 안전하고 좋다.
이 담으로
git clone https://github.com/tfutils/tfenv.git ~/.tfenv을 해서
tfenv 설치, tfenv 저장소 복제, ~/.tfenv 디렉토리에 저장하는 작업을 한다.
tfenv는 테라폼의 여러 버전을 관리할 수 있는 도구이다.
Ruby의 버전 관리 시스템인 rbenv에서 영감을 받아 만들어졌다.
이 도구를 사용하면 프로젝트마다 필요한 테라폼 버전을 쉽게 전환하고 관리할 수 있다
Keypair 설정
ssh-keygen -t rsa -b 2048 -C "" -f "$HOME/.ssh/smin" -N "" && sudo cp /home/ec2-user/.ssh/smin /home/ec2-user/.ssh/smin.pem
이 멍령어로 key pair을 생성하고 어떤 경로에 넣을지 결정한다.
일단 키 페어 생성 파일인 key.tf가 필요한데
key.tf라는 파일을 cloud9 환경에서 생성하고 그 안에 내 public key를 넣어주면 된다.
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_key_pair" "deployer" {
key_name = "smin"
public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ.........f"
}
이런 식으로 해주면 된다.
cd ~/.ssh 를 통해서 이 폴더에서 작업 수행
cd /home/
cd ec2-user/
cd environment/
ls
cd key.tf
mkdir 0.key
0.key/
0.key라는 디렉토리 안에서 테라폼 작업을 이제 수행할 것이다.
다시 나가서 ls를 통해서 내 디렉토리의 어떤 파일이 있는지 확인하고
mv key.tf 0.key/ (key.tf를 0.key 안에 넣는다)
cd 0.key/
ls(0.key 안에 뭐가 있는지 다시 확인한다)
Terraform 시작
먼저 terraform init을 해야 한다.
terraform init 명령어는 테라폼 프로젝트를 초기화하는 과정을 수행한다.
이 단계는 테라폼을 사용하여 인프라를 관리하기 위한 필수적인 단계이며 테라폼을 사용하기 전에 반드시 수행해야 한다.
그러니까 아무 작업 안하더라도 일단
terraform init
은 필수이다.
이제 테라폼 프로젝트를 초기화할 때 프로바이더 설정을 보고 필요한 플러그인을 설치한다.
이런 식으로 끝난다. 성공한 것.
두 번째로 terraform plan을 해준다.
terraform plan
이 명령어는 테라폼이 실제로 인프라에 적용될 변경 사항을 계획하고 미리 시뮬레이션해서 보여주는 명령어이다.
변경 사항이 실제로 적용될 때 어떤 영향이 있는지 미리 확인하는 용도이다.
세 번째로 terraform apply를 해준다.
terraform apply
이 명령어는 테라폼 구성 파일에 정의된 인프라를 생성,변경,삭제하는 작업을 수행한다.
terraform plan 명령어로 생성된 변경 사항에 대한 승인을 받은 후에 실행된다.
코드로 작성한 테라폼 설정을 적용하여 aws 리소스 등을 생성.
이렇게 하면 테라폼이 돌아가게 되는데, 삭제할 땐 terraform destroy를 해준다.
이렇게 하면 삭제가 된다.
다시 ssh 위치로 나가서 aws cli를 사용하여 ec2에 ssh 키 페어를 가져오는 명령어를 입력해야 한다.
ec2에서 ssh 접근을 위해 사용되는 키페어를 관리한다.
aws ec2 import-key-pair --key-name "smin" --public-key-material fileb://~/.ssh/smin.pub
smin이 키페어의 이름이고 뒤의 -public부터 공개 키의 파일 경로를 지정한다.
이렇게 실행하면 지정된 공개 키가 AWS EC2에 등록되어 해당 키페어를 사용하여 EC2 인스턴스에 SSH로 액세스할 수 있게 된다.
단, 해당 키페어는 이미 생성되어 있어야 하고 공개 키 파일이 로컬 시스템에 존재해야 한다.
이렇게 내 키페어에 대한 정보를 확인할 수 있다.
ssac_aws28:~/.ssh $ cd /home/ec2-user/environment/
ssac_aws28:~/environment $ ls
이 명령어로 디렉토리 이동을 해서 ls 를 통해 0.key를 확인했다.
cd 0.key로 디렉토리 이동을 하여 이곳에서 다시 terraform을 실행한다.
다음으로 수행하는 단계는 ec2를 테라폼을 통해서 생성하는 것.
먼저 ec2.tf 파일을 새로 만들어서 aws ec2 생성 화면에서 볼 수 있는 아마존 리눅스2 ami를 복사한 것을 입력해준다.
이 정보를 안에 넣어준다.
저장하고 다시 0.key/ 환경에서 terraform 시작을 해주면 된다.
꼭 이 폴더 안에서 실행을 해야 하는데 그렇지 않으면 terraform이 읽지를 못하기 때문이다.
밑에 terraform.tfstate와 tfstate.backup은 terraform을 init plan apply하는 과정에서 생긴다.
이렇게 새로운 EC2가 생성된 것을 알 수 있었다.
여기까지 간단한 실습을 해보았다.
확실히 테라폼을 잘 사용하게 된다면 인프라 관리와 자동화에 훨씬 유리할 것이라고 생각이 든다.
'Git, CICD > CICD' 카테고리의 다른 글
Github Actions에서 RDS 접근 불가 문제 해결 (2) | 2025.08.06 |
---|---|
[CI/CD] Github Actions를 활용한 파이프라인 구축과 자동 배포 (62) | 2024.08.19 |
CI/CD란? (5) | 2024.04.23 |