본문 바로가기
INFRA/Operation

terraform init, plan, apply 그리고 state file 알아보기

by BTC_뚜벅이 2022. 11. 4.

 

ABTCEFG♪  안녕하세요, 여러분!

 

BTC_뚜벅이입니다.

 

지난 주는 terraform 여러 버전을 사용하기 위한 설정에 대해 알아보았는데요.

이번 주는 terraform init - plan - apply 명령어 입력 후 생성되는 값 그리고 가장 중요한 

tf state file에 대해 알아보도록 하겠습니다.

 

 

1. 사전작업

이 글을 읽으시면 기본적으로 설치는 끝났을거라고 생각해요.

로컬 세팅을 기준으로 설명해드릴게요.

 

먼저 테라폼 환경 구성을 위해서 

리눅스는 /home/<username>/.aws/credentails

윈도우는 C:\Users\<username>\.aws\credentials

을 열어서 key 값들과 profile을 확인합니다.

여기 빨간 박스 부분이 profile값이에요.

옵션 없이 aws configure만 입력해서 구성하셨다면 [default]로 되어있을거에요.

 

테라폼의 provider “aws”블록에서 profile을 맞춰줍니다.

여기까지가 테라폼 기본 세팅이에요.

 

 

2. terraform init

tf파일이 있는 경로에서 terraform init을 입력하면 3가지 기본 설정파일이 만들어집니다.

여기서 살펴 볼 것은 .terraform\terraform.tfstate인데요.

terraform.tfstate file을 열어보면 위의 그림처럼 modulesremote라면 어느 위치에 저장하고 있는지, 참조하는 모듈이 있는지에 대한 내용이 담겨있습니다.

 

예제 코드에선 원격지에 state file을 저장하고 있어서 “remote”로 나오는 것을 알 수 있습니다.

 

여기서 알 수 있는 점은 backend type과 modules가 바뀌면 새롭게 terraform init을 해줘야 한다는 점입니다.

 

만약 여기서 backend를 원격지에서 로컬로 변경하고 싶을 때는 어떻게 해야 할까요?

‘terraform init만 하면 되지~’ 라고 생각하시고 명령어를 입력하면 아래의 에러 화면이 여러분들을 반겨줄거에요.

 

 

만약 state를 변경하고 싶다면 -migrate-state, 

state 변경 없이 state file만 로컬에 저장하고 싶다면 -reconfigrue 옵션을 사용하라고 알려줍니다.

 

여기서는 -migrate-state 옵션을 사용하여 재구성을 해줄게요.

 

remote에서 로컬로 잘 변경되었다고 결과가 출력되었습니다.

 

위의 terraform backend를 사용했을 때 설정파일과 다름을 알 수 있죠?

로컬로 전환하면 backend에 관한 내용이 사라집니다.

 

 

3. terraform plan

 

위의 Plan문구를 보면 알 수 있듯이 2개의 리소스가 생성될 것이라는 것을 알 수 있습니다.

그리고 output값이 있다면 해당 리소스에 대한 output 또한 생성될 예정이라는 것을 한 눈에 알 수 있습니다.

만약 생성하고 싶으면 terraform apply 명령어를 입력하라고 알려주네요.

 

terraform plan은 단순히 리소스 생성 뿐만 아니라 import를 하여 sync를 맞춰줄 때도 사용합니다.

엄청 유용하지만 단계별로 알아갈 예정이기 때문에 추후에 공부하도록 해볼게요.



4. terraform apply

 

terraform apply 명령어를 입력하면 plan 결과가 한 번 더 출력되고 

Enter a value : 여기에 yes를 입력하면 위의 리소스들이 생성될거라고 알려주네요.

그럼 yes를 입력해볼게요.

 

 

yes를 입력하면 aws_s3_bucket 리소스 amp-lambda와 aws_s3_bucket_policy 리소스

amp-lambda가 생성하는 중이고 성공적으로 apply가 되었다고 나오네요.

 

먼저 콘솔에서 확인해볼까요? 

 

확대 해서 봐주세요.!

 

aws_s3_bucket 리소스와 aws_s3_bucket_policy 리소스가 잘 생성된 것을 확인할 수 있어요.

 

현재 리소스가 잘 올라가 있는 상태에서 apply를 한 번 더 해볼게요.

예상하신것처럼 아무것도 수정하지 않았기 때문에 no change가 출력되었습니다.



여기서 의문점이 하나 생깁니다.

테라폼은 리소스가 있는지 없는지 어떻게 판단하여 no change를 출력하지?

답은 state file 을 보시면 됩니다.

 

 

5. terraform.tfstate

해당 경로에 새로 생성된 파일 2개가 있을거에요.

terraform.tfstate.backup은 backup 파일으로 terraform destroy 명령어를 사용하여 리소스를 다 없앨 경우

저 파일엔 backup으로 리소스 정보들이 남아있습니다.

 

여기서 terraform.tfstate를 살펴볼게요.


mode를 보시면 1개의 output, 2개의 data, 2개의 managed를 확인할 수 있어요.

 

제가 data구문 2개와 output 1개를 사용했기 때문에 state file에 출력이 되고 

2개의 managed는 위의 Plan : 2 to add, 0 to change, 0 to destroy.

여기서 리소스라는걸 짐작해볼 수 있어요.

 

이처럼 terraform plan 혹은 apply를 하게 되면 테라폼이 비교하는 대상은 tfstate file이라는 것을 알 수 있습니다.


만약 여기서 리소스를 수정하거나 삭제하면 출력 문구가 변경될거에요.

모듈구조에서는 다른 형태로 출력됩니다.

이것도 추후에 알아보도록 할게요!

 

오늘 공부해본 내용 중 가장 중요한 내용이 state file인데요.

state file에 접근할 수 있다면 얼마든지 리소스 구성한 정보를 추출할 수 있어서 보안적으로도 중요해요.

그리고 팀 단위로 작업하는 경우에는 tfstate 파일 변경 또한 민감하기 때문에 리소스별로 격리하여 원격지에 보관하여 github PR을 사용하여 업데이트 하는 형태로 사용하고 있습니다.

 

댓글