Cloudest - 블로그 이사했습니다
노션으로 블로그를 옮겼습니다.
흥미로운 포스팅이 올라옵니다!
cloudest.oopy.io
🛠
준비물 : WSL2, AWS IAM 사용자의 Credential, MobaXterm(SSH 터미널)
시작 전
- 이 실습은 44bits.io 블로그의 Daegwon Nacyot Kim님이 작성하신 '테라폼 (Terraform) 기초 튜토리얼' 포스팅을 따라하며 진행한 실습 겸 정리 포스팅이다. Terraform과 관련된 실습 전부 위 블로그를 보며 진행했다.(코딩으로 치면 클론코딩)
- 여기를 눌러 WSL : 윈도우에서 제공하는 리눅스 환경 참고하기
테라폼이란
- Hashicorp에서 개발한 인프라 관리 도구
- HCL(Hashicorp Configuration Language)를 통해 AWS뿐 아니라 Azure, GCP, NCP 등의 다양한 클라우드를 관리할 수 있다.
- 작업 공간의 모든
.tf
파일을 읽고 인프라를 구성한다. (즉 앞으로 나올provider.tf
,web_infra.tf
파일은 필수가 아니며 여러 파일을 읽어서 인프라를 구성할 수 있다.)
Terraform 환경 만들기
AWS 프로바이더 정의
- WSL2 Ubuntu 20.04 LTS에서 진행
$ mkdir /web_infra $ cd /web_infra $ touch provider.tf web_infra.tf
provider.tf
에서 AWS 계정정보 입력provider "aws" { access_key = "[AWS 액세스 키]" secret_key = "[AWS 비밀 키]" region = "ap-northeast-2" }
- WSL2 Ubuntu 20.04 LTS에서 진행
HCL 언어로 리소스 정의
- EC2용 SSH 키 페어 정의
Key Pair 리소스 정의
- AWS Key로 사용할 SSH Key를 미리 생성
ssh-keygen -t rsa -b 4096 -C "<EMAIL_ADDRESS>" -f "$HOME/.ssh/web_admin" -N ""
- web_infra.tf 파일에 내용 추가
resource "aws_key_pair" "web_admin" { key_name = "web_admin" # "" 내부의 값을 문자열로 반환 public_key = file("~/.ssh/web_admin.pub") # file() 내부의 "" 내부 값 또한 문자열로 받아서 해당 파일의 내용을 문자열로 반환 }
- 여기서 지정하는 이름은 AWS에서 사용하는 이름이 아니다. 테라폼 코드의 다른 부분이 이 리소스를 참조하기 위해 사용하는 이름이므로, AWS에서 정의되는 리소스의 이름과 혼동해서는 안 된다. AWS 리소스의 이름은 주로 속성값을 통해 지정한다.
- AWS Key로 사용할 SSH Key를 미리 생성
계획(Plan) 확인
terraform plan
명령으로web_infra.tf
파일을 통해 실제로 리소스 생성이 가능한지 확인한다.- 테라폼은 tf 파일을 컴파일 후 사용자가 정의한대로 '이상적 상태'를 가정한 후 '현재 상태'와 비교하여 이상적 상태와 같이 인프라를 만드는 워크플로우를 가지고 이를 apply라고 한다.
- Plan은 Apply 이전에 두 상태를 비교하여 작업할 일, 작업가능한지 등을 따진다.
resource "aws_key_pair" "web_admin"
앞의 + 는 리소스를 생성하겠다는 의미이다. + 를 통해 '이상적 상태'가 되기 위해 필요한 리소스를 추가할 것이라고 미리 보여주는 것이다.
{ }
내부의 + 정보들은 apply를 통해 추가될 '리소스 속성'이다. 단, (known after apply)라고 표시된 값은 실제로 리소스를 생성해야 부여되는 값이다. 즉, 아직 알 수 없다.
Plan: 1 to add, 0 to change, 0 to destroy.
1개의 리소스가 생성되고, 0개를 변경하고, 0개를 삭제한다는 의미다.
적용(Apply)
- 적용 후 다시
terraform plan
을 실행하면 AWS 계정 상태가web_infra.tf
파일의 내용과 동일한 '이상적 상태'기 때문에 더이상 아까와 같이 add 되지 않는다.
- 즉 Terraform은 생성을 명령하는 것이 아닌 '이상적 상태'를 제공하는 것입니다.
terraform apply
명령을 통해 제공한 '이상적 상태'와 동일한 환경을 만들 뿐terraform apply
를 재실행한다고 추가 생성되거나, 중복되거나 하지 않는다.
terraform apply
명령을 실행하면terraform.tfstate
파일이 생성되며, 이 파일에 실제 상태를 임시로 저장하는 동시에 테라폼에서 관리되는 리소스 목록을 관리한다.
- 적용 후 다시
- SSH 접속 허용을 위한 SG 정의
- EC2 인스턴스 정의
AWS의 리소스 불러오기
- web_infra.tf 파일 내부에 아래 내용 추가 (AWS에서 name=default 라는 SG를 default로 읽어온다.)
data "aws_security_group" "default" { name = "default" } #이 코드를 통해 테라폼 내에서 default라는 기존에 존재하는 SG를 사용할 수 있다.
- web_infra.tf 파일 내부에 아래 내용 추가 (AWS에서 name=default 라는 SG를 default로 읽어온다.)
EC2 리소스 정의
web_infra.tf
파일 내부에 아래 내용 추가resource "aws_instance" "web" { ami = "ami-0a93a08544874b3b7" # amzn2-ami-hvm-2.0.20200207.1-x86_64-gp2 instance_type = "t2.micro" key_name = aws_key_pair.web_admin.key_name vpc_security_group_ids = [ aws_security_group.ssh.id, data.aws_security_group.default.id ] }
- RDS 인스턴스 정의
RDS 리소스 정의
- web_infra.tf 파일 내부에 아래 내용 추가
resource "aws_db_instance" "web_db" { allocated_storage = 8 engine = "mysql" engine_version = "5.6.35" instance_class = "db.t2.micro" username = "admin" password = "qwer!234" skip_final_snapshot = true #기본값은 flase지만 테라폼에서 삭제가 어려워 true 설정 }
- web_infra.tf 파일 내부에 아래 내용 추가
리소스 제거 및 복원
다시 리소스 프로비저닝 해보기
- 그저 terraform apply만 해주면 지금까지 만들었던 [HCL 언어로 리소스 정의]의 모든 리소스를 한번에 다시 생성할 수 있습니다.
삭제 후 다시 생성된 EC2 인스턴스
- 그저 terraform apply만 해주면 지금까지 만들었던 [HCL 언어로 리소스 정의]의 모든 리소스를 한번에 다시 생성할 수 있습니다.
결론
테라폼 사용 이유 (44bits를 운영하는 Daegwon Nacyot Kim님의 요약을 그대로 인용)
💡여기까지 테라폼으로 AWS 리소스들을 정의하고 프로비저닝하는 방법에 대해서 알아보았습니다. 웹 콘솔을 사용해 리소스를 관리하는 것과는 많이 다릅니다. 여기서는 정말 간단한 사례를 구현해 보았지만, 그럼에도 불구하고 생각보다 간단하지는 않습니다. 프로젝트에서 테라폼을 사용해보면 매번 리소스 레퍼런스를 확인하고, 웹 콘솔과 비교해보는 과정을 계속해서 반복해야합니다. 어떤 면에서는 웹 콘솔보다 오히려 어렵고 귀찮습니다. 그럼에도 테라폼을 사용하면 좋은 점들이 있습니다. 먼저 웹 콘솔을 사용해 리소스들을 관리하면서 점차 리소스가 많아지기 시작하면 더 이상 전체 리소스를 파악할 수 없는 시점이 옵니다. 업무용으로 사용하는 경우 명시적인 리소스와 비명시적인 리소스를 포함해 수백 수천개의 리소스를 다루는 일이 일반적입니다. 언제 왜 만들었는지 알 수 없는 리소스들이 점점 쌓여나가고, 레거시로 남습니다. 테라폼을 사용하면 프로비저닝하고자 하는 상태를 코드로 명확히 기록해두기 때문에 웹 콘솔만 사용할 때보다 파악이 쉬워지고 세심한 관리가 가능해집니다. 또한 테라폼은 코드로서의 인프라스터럭처Infrastructure as Code를 지향하는 도구로서, 코드를 작성할 때 누리던 생태계의 이점을 그대로 이용할 수 있습니다. 저장소에서 이력 추적을 할 수도 있고, 깃허브Github에서 팀원들과 코드 리뷰를 진행할 수도 있습니다. 이 과정에서 누가 어떤 리소스를 왜 추가했는지, 투명성은 자동적으로 얻어집니다. 좀 더 잘 활용한다면 CI를 사용해 코드 리뷰가 된 사항을 자동적으로 플랜 및 적용하는 것도 가능합니다.
- Terraform에 대한 기초적인 개념을 이해하고 실습을 통해 사용법을 익혔다.
terraform destroy
명령을 한번 더 실행하여 리소스 삭제를 다시 확인한다.
- 쉽게 Terraform에 입문할 수 있는 양질의 포스팅을 올려주신 Daegwon Nacyot Kim님 감사합니다.