처음 시작하는 Infrastructure as Code: AWS & 테라폼을 수강하며 정리한 내용입니다.
- Resource: 실제로 생성할 인프라 자원
- Provider: Terraform 코드로 만들 infrastructure
- Output: Terraform 결과물을 variable로 state 파일에 저장하는 것
- Backend: state 파일을 저장하는 공간
- Bodule: 일종의 함수, 여러 Terraform 코드를 한 곳으로 모아서 정의한 것
- Remote state: state가 다른 코드에서 variable를 가져오기 위해 참조
- Terraform에는 3가지의 형상이 존재
- Local 코드: 로컬에서 작성한 코드
- AWS 실제 인프라: 코드를 통해 만들어져서 실제로 AWS에 배포되어 있는 인프라
- Backend에 저장된 상태: 가장 최근에 배포한 Terraform 코드 형상, Backend에 저장되는
.tfstate
파일
- 가장 중요한 것은 AWS 실제 인프라와 Backend에 저장된 상태가 100% 일치하도록 만드는 것
- 인프라 정의는 Local 코드에서 시작, 개발자는 로컬에서 Terraform 코드를 정의한 후에 해당 코드를 실제 인프라로 프로비전하는데 이때 Backend를 구성하여 최신 코드를 저장
- Terraform working 디렉토리 초기화
- 지정한 Backend에 상태 저장을 위한
.tfstate
파일을 생성하여 여기에는 가장 마지막에 적용한 Terraform 내역이 저장됨
- init 작업을 완료하면 local에는
.tfstate
에 정의된 내용을 담은 .terraform
파일이 생성됨
- 기존에 다른 개발자가 이미
.tfstate
에 인프라를 정의해 놓은 것이 있다면, 다른 개발자는 init 작업을 통해서 local에 sync를 맞출 수 있음
- AWS의 API 호출을 위한 라이브러리도 다운로드
- 정의한 코드가 어떤 인프라를 만들게 되는지 미리 예측 결과를 보여줌
- plan을 한 내용에 에러가 없다고 하더라도, 실제 적용되었을 때는 에러가 발생할 수 있음
- plan 명령어는 어떠한 형상에도 변화를 주지 않음
- 실제로 인프라를 빌드하거나 변경하여 배포하는 명령어
- apply를 완료하면, AWS에 인프라가 생성되고 작업 결과가 Backend의
.tfstate
파일에 저장됨
- 해당 결과는 local의
.terraform
파일에도 저장됨
- AWS 인프라에 배포된 리소스를 Terraform state로 옮기는 작업
- 로컬의
.terraform
에 해당 리소스의 상태 정보를 저장하는 역할
- 기존 인프라를 AWS에 배포한 상태에서 Terraform에 적용하고 싶으면 모든 리소스를 terraform import로 옮겨야 함
- apply 전까지는 Backend에 저장되지 않음
- import 이후에 plan을 하면 로컬에 해당 코드가 없기 때문에 리소스가 삭제 또는 변경된다는 결과를 보여줌
- import가 코드를 만들어주지는 않고 이 결과를 바탕으로 코드를 직접 작성할 수 있음
실습
Provider 생성
- 아무 코드가 없는 상태에서
terraform init
을 하면 어떠한 변화도 없음

vim provider.tf
- provider.tf 파일에서 리전을 서울로 지정
provider "aws" {
region = "ap-northeast-2"
}
- 아래 명령어로 초기화를 진행하여 Provider를 다운로드
terraform init


Resource 생성
vim s3.tf
- AWS의 S3 버킷을 생성할 것이며 Resource의 이름은
test
bucket
인자는 필수이며 S3 버킷의 이름을 지정
- AWS S3 버킷 이름은 글로벌하게 고유해야 함
resource "aws_s3_bucket" "test" {
bucket = "terraform-practice-chori"
}
- 다음 명령어로 어떤 인프라가 만들어질지 알 수 있음
terraform plan

인프라 배포
terraform apply
Enter a value
에 yes
를 입력해야 실행됨


tfstate
파일도 생성됨
- Backend를 지정하지 않아서 로컬이 Backend가 됨



import로 리소스 가져오기
- AWS 콘솔에서 생성한 리소스를
terraform import
명령어로 가져올 수 있음
s3.tf
파일 삭제
rm -f s3.tf
- state 파일에는 남아있지만 코드가 삭제됐기 때문에
terraform plan
명령어를 입력하면 리소스가 삭제된다고 나옴

- state 파일인
terraform.tfstate
과 .terraform
디렉토리까지 삭제하면 init도 안 된 상태로 돌아감
rm -f s3.tf
rm -rf .terraform

- 그리고
terraform plan
- 실제로는 아직 AWS에 S3가 있지만 S3에 대한 코드를 분실(삭제)했기 때문에 Terraform 입장에서는 아무것도 만들어지지 않은 상태

- import를 사용하기 위한 명령어는 다음과 같음
- 이전에 S3 리소스를 만들 때 사용한 리소스 이름(
test
)과 버킷 이름(terraform-practice-chori
) 사용
terraform import aws_s3_bucket.test terraform-practice-chori
- 코드가 없어서 import할 수 없다는 에러 발생

resource "aws_s3_bucket" "test" {
bucket = "terraform-practice-chori"
}
- 파일 작성 후
terraform plan
명령어 사용하면 새로운 리소스를 만든다는 결과가 표시됨
terraform plan
은 실제 리소스가 있는지 없는지 검사하지 않음

terraform plan
명령어를 사용하면 이미 있는 리소스여서 에러 발생

- 이럴 때 다시 import를 하면 성공적으로 리소스를 가져옴
terraform import aws_s3_bucket.test terraform-practice-chori

terraform plan
명령어를 입력하여 변경 사항이 있는지 확인
- 바뀐 부분이 있으면
terraform apply
하여 실제 인프라와 Backend에 저장된 상태를 일치시키는 것이 중요
- 아래 명령어로는 실제 생성된 인프라를 볼 수 있음
terraform state list
