인프런 커뮤니티 질문&답변

이우신님의 프로필 이미지

작성한 질문수

중급, 활용편 #1 DevOps : Infrastructure as Code with AWS and 테라폼

backend로 설정한 s3 bucket의 destroy

해결된 질문

24.05.07 16:22 작성

·

172

0

안녕하세요. 하루만에 또 질문이 생겼네요..

 

backend로 s3 bucket을 지정해 .tfstate 파일을 s3에서 관리하다가 destroy 명령어로 리소스를 제거하려고 할 때 다른 리소스는 모두 제거되지만 s3 bucket은 제거되지 않고 에러가 발생했습니다. 아래 이유들로 당연하다면 당연하지만 그래도 의견을 들어보고자 질문을 하게 되었습니다.

( 이번에도 마찬가지로 구글과 chatgpt를 이용해 찾아봤으나 chatgpt는 lifecycle 블록의 prevent_destory 속성을 이용하면 bucket내부의 파일도 삭제하고 bucket도 삭제해주는 것처럼 알려줘놓고 해보니 안되더라구요ㅜ 결제를 해야하나.. )

 

  1. s3 bucket의 경우 bucket 내에 파일이 존재하면 삭제할 수 없다

  2. 삭제해야하는 파일은 .tfstate 파일인데 terraform을 이용해 생성한 리소스의 정보가 담겨있는 파일이라 해당 파일을 삭제하면 terraform이 인지하지 못해 결국 terraform 명령어를 이용해 s3 bucket을 삭제하지 못하게 된다.

     

     

즉, 위 2가지 이유로 인해 backend로 설정한 s3 bucket은 terraform destroy 명령어를 이용해 삭제하는 방법은 없고, 그외 다른 리소스만 destroy 명령어로 삭제하고, s3 bucket까지 삭제하려면 aws console에서 수동으로 .tfstate 파일은 삭제한 뒤 s3 bucket을 삭제해야한다는 결론을 내렸습니다.

해당 결론에 대한 선생님의 의견을 들어보고싶습니다.

답변 부탁드립니다. 감사합니다.

답변 1

1

송주영님의 프로필 이미지
송주영
지식공유자

2024. 05. 07. 21:54

안녕하세요.

송주영입니다.

 

일단 대전제는 "s3 bucket의 경우 bucket 내에 파일이 존재하면 삭제할 수 없다" 는 맞습니다.

 

일단 지우고 싶으신게 새로 만드신 s3 bucket 이실까요? 최초로 init 안에 만든 bucket 일까요?

init 때 만든 그러니까 우리가 backend 로 사용하고 있는 s3 bucket은 테라폼으로 만들었지만,

s3가 없으니 파일형태로 .tfstate 로 남게 됩니다.

 

그리고 제가 github를 pull 하셨으면 .gitignore 에 .tfstate 파일은 무시하라고 되어있기 때문에,

올리지 않습니다. ( .tfstate는 공개되면 안되는 정보들이 있을 수 있습니다 )

 

그래서 모든 리소스를 지우고 마지막으로 s3 backend 로 사용했던 tfstate 이렇게 이름붙혔던것은

console 에서 삭제하시면 됩니다~

 

그리고 파일을 삭제했는데도 bucket 이 삭제가 안된다고 느껴지시면, version 된 파일을 보는

옵션이 있습니다. 그걸 키고 versioning 된 파일까지 모두 삭제하고, 삭제하시면 됩니다.

 

감사합니다~

 

 

 

 

 

 

 

 

 

 

 

이우신님의 프로필 이미지
이우신
질문자

2024. 05. 07. 23:00

backend 설정은 아래와 같이 진행했습니다.

아래 양식에 맞게 backend.tf 파일을 작성해 중급강의자료인 init.tf 파일의 s3 bucket을 backend로 지정했습니다.

terraform {

backend "s3" {

bucket = "init.tf 파일에서 생성한 s3 bucket"

key = "aws-provisioning/terraform/init/testd/terraform.tfstate"

region =

encrypt =

dynamodb_table =

}

}

후 terraform init 명령어를 실행하면 s3 bucket에 key에 작성한 경로에 .tfstate 파일이 생성이 되는데 이 상황에서 terraform destroy 명령어를 실행하면 나머지 리소스는 제거되지만 backend 인 s3 bucket에는 .tfstate 파일이 존재해 s3 bucket을 삭제할 수 없다는 에러가 출력되고 삭제되지 않았습니다.

 


추가질문

그래서 모든 리소스를 지우고 마지막으로 s3 backend 로 사용했던 tfstate 이렇게 이름붙혔던것은

console 에서 삭제하시면 됩니다~ << 즉, init.tf에서 생성한 s3 bucket을 backend로 설정해 .tfstate 파일이 bucket 내에 존재하면 terraform destroy 명령어로는 삭제할 수 없고 나머지 리소스만 삭제한 뒤 s3 bucket까지 삭제하려면 aws console에서 직접 삭제해야한다 라고 생각하면 될까요? 선생님께서도 만약 같은 상황이라면 똑같이 처리하셨을까요?

마지막 질문은 뭔가 작성하고 보니 의심하는 듯한 말투인거같아 오해하실 수도 있지만 저는 아직 테라폼에 대해 배우고 있는 입장이라 잘 다루시는 선생님께서는 좀 더 좋은 방식으로 처리할 수 있는 방법을 알고 계시지 않을까해서 질문을 드려봤습니다.

답변 부탁드리겠습니다. 감사합니다.

송주영님의 프로필 이미지
송주영
지식공유자

2024. 05. 08. 00:08

네, 그러니까 보통 사용하는 s3를 지우시려면,

파일을 확인해서 모두 지우고, terraform plan 이나 destroy 로 지우면 되고,

모든 리소스를 지우고 최초에 설정한 init.tf 파일의 state 파일은 최초의 설정된 값이니

console 로 지우면 됩니다. 아니면 .tfstate 파일이 로컬에 생기는데, 그 파일을 깃허브에 올려놓고, 유지를 시키고 terraform destroy 를 통해 지우면 됩니다.

즉, 마지막에 state를 저장하는 버킷을 지운다는 뜻은 나의 AWS 계정에서 필요한 모든 리소스를 지운 이후라는 뜻이 되기 때문에, 그냥 콘솔로 지워도 된다는 말씀을 드린 것입니다~

이우신님의 프로필 이미지
이우신
질문자

2024. 05. 08. 00:14

넵 완전히 이해됬습니다. 늦은시간까지 답변해주셔서 감사합니다!!