Print
카테고리: [ Cloud Computing & MSA ]
조회수: 83982

1. Terraform 소개

HashiCorp에서 개발한 오픈소스 소프트웨어로, HCL(High-Level Configuration Language)을 사용하여 인프라 구조를 코드 형태로 적용하고 관리하는 IaC(Infrastructure as code) 툴이다. 개발 및 운영 환경에서의 동일한 수준의 구성관리 및 자동화를 위한 오케스트레이션 기능이나, AWS, Azure, GCP, IBM Cloud, Oracle Cloud Infrastructure, VMware vSphere, OpenStack 등의 플랫폼을 지원함으로서 각 플랫폼마다 제공되는 IaC 툴들(ex. AWS CloudFormation, Azure Resource Manager, GCP Cloud Deployment Manager)에 대한 종속성을 제거하고 동일한 규격의 인터페이스로 통합하는 멀티 클라우드 관리 역할을 한다는 점에서 DevOps 측면에서의 전개가 가능한 특징이 있다.
Terraform은 사용자가 작성한 .tf 파일들을 서치하여 읽어들인 후 실행하게 되는데, 실행에 앞서 먼저 .tf 파일에 플랫폼을 명시하는 provider(aws, azure, gcp 등)가 함께 선언되어 있어야 하며, 명시된 provider의 계정에 접근을 위해 terraform이 확인 가능한 경로에 유효한 credential을 필요로 한다. 이후 적용된 내용은 .tfstate라는 파일을 통해서 자체적으로 구성관리가 이루어지는데, 해당 파일이 로컬이 아닌 클라우드(aws s3 등) 단에서 관리할 수 있도록 .tf 파일 내에 backend를 별도로 지정하여 관리되도록 할 수도 있다.


2. 주요 명령어

terraform init
Terraform에서는 지원하는 플랫폼이 다양하기 때문에 경량화를 위해 모든 플랫폼에 대한 플러그인을 제공하는 대신 특정 플랫폼의 플러그인을 제공하고 있다. init은 초기에 그 플러그인을 설치하는 준비 단계의 명령어로, 수행 시 현재 경로를 기준으로 모든 .tf 파일을 참조하여 provider를 확인하고 명시된 플랫폼 및 버전에 따라 플러그인이 설치된다. backend(s3 버킷 등)에 대한 설정이 있을 경우에는 함께 연동 작업이 이루어지며, 이 때 backend에 대한 리소스 정보 확인을 위해 credentials를 통한 접근이 이루어진다. backend를 별도로 구성하지 않을 경우에는 terraform 구성 관리 기록 파일인 .tfstate가 로컬 영역(./terraform/terraform.tfstate)에서 첫 apply 이후부터 생성된다.

 

terraform plan
tf 및 tfstate를 대조하여 apply시 생성(+)/변경(~)/삭제(-)될 인프라 적용 계획 내용을 보여준다. init, apply와 달리 인프라 구성에 앞서 반드시 수행해야 할 필요는 없다.

 

terraform apply
apply는 terraform을 적용하는 마지막 단계로, 적용에 앞서 plan이 실행된 후 사용자의 승인이 발생하면 인프라 적용이 완료되고 .tfstate에 변경 내역이 기록된다.

 

terraform destroy
destroy시에는 필요한 플러그인 설치 이후 s3 등의 backend 또는 local로부터 읽어들일 수 있는 tfstate 파일만 있으면 된다. destroy도 다른 명령어와 같이 tf파일이 존재할 경우 사전에 해당 파일들에 대한 문법 검사가 진행되는데(init과 마찬가지로 backend가 존재하는지 검사하기 위한 일련의 과정으로서 발생하는 것으로 보임), 오류가 발생한다면 backend.tf파일만 별도로 분리 후에 진행할 수 있다.


3. 주의사항

.tfstate 파일을 분실하는 순간 기존에 terraform을 통해 인프라에 구성되어있던 자원에 대한 구성관리가 더 이상 불가능하게 되므로 별도의 백업 처리 구성을 하는 것이 좋다. backend(s3)를 통해 .tfstate 파일을 관리하는 경우에도 꼭 해당 버킷에 대한 버전 관리 설정을 하여 백업 관리가 이루어지도록 한다.


4. Terraform 초기 설정 시 트러블 슈팅

Error: Error loading state: AccessDenied: Access Denied status code: 403, request id: xxxx, host id: xxxx
-> init시 backend에 설정된 버킷에 접근시 발생하는 에러로, credentials에 대한 키 값이 잘못되었거나, 찾을 수 없는 경우에 발생한다. 먼저 키 값이 제대로 설정되어 있는지 확인한 다음 credentials 위치 설정이 제대로 되어있는지도 확인한다. Terraform은 aws의 경우 .credentials 파일을 사용하도록 설정해놨다면, tf파일에 별도의 경로를 지정하지 않았을 경우 해당 파일을 찾는 경로가 리눅스 버전의 경우 ~/.aws/.credentials, 윈도우 버전의 경우 C:/Users/사용자명/.aws/.credentials 와 같이 고정적으로 설정되어 있다. 따라서, aws cli가 다른 경로에 설치되어 있다면 .credentials파일 또한 terraform이 바라보는 경로와 다를 수 있으므로 주의한다.
 
Error: error using credentials to get account ID: error calling sts:GetCallerIdentity: InvalidClientTokenId: The security token included in the request is invalid. status code: 403, request id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
-> plan 또는 apply 수행 시 설정된 accessKey를 찾을 수 없을 경우 발생한다.
 
Error: error using credentials to get account ID: error calling sts:GetCallerIdentity: SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details. status code: 403, request id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
-> plan 또는 apply 수행 시 설정된 secretAccessKey를 찾을 수 없을 경우 발생한다.