
TL;DR
- 테라폼으로 생성한 RDS 클러스터를 삭제할 때 skip_final_snapshot 값을 false로 설정했다면 final_snapshot_identifier를 반드시 설정해야한다.
- 테라폼으로 RDS 클러스터를 삭제하면 자동 백업도 함께 삭제된다. 삭제 후 RDS 클러스터를 복원해야할 수 있다면 skip_final_snapshot=false로 설정해서 스냅샷을 생성해두도록 하자.
1. 배경 상황
기존에 운영 중인 시스템 중에서 걷어내야 하는 시스템이 있어서 해당 시스템에서 사용하는 RDS 클러스터를 삭제해야 했다. 운영 중인 RDS 클러스터들은 테라폼으로 운영 중이라 테라폼 코드 몇 줄만 간단하게 삭제하면 될 줄 알았고 terraform plan 까지 돌렸을 때도 아무 이상이 없었는데…
실제 terraform destroy 명령어를 실행하니 DB 인스턴스까지는 잘 지워지다가 다음 에러가 발생했다.
Error: final_snapshot_identifier is required when skip_final_snapshot is false
2. 해결 방법
에러 메시지를 읽어보면 skip_final_snapshot를 false로 설정할 경우 final_snapshot_identifier를 필수로 지정해야한다고 한다(공식 문서에서도 동일하게 나와있는데 왜 놓쳤는지 모르겠다…)
skip_final_snapshot은 RDS 클러스터를 삭제할 경우에 스냅샷을 생성할 것인지 여부를 설정하는 값인데, 디폴트 값은 false라서 해당 값을 true로 설정하는 구문을 추가하지 않는다면 위와 같은 에러가 발생하게 된다.
스냅샷을 생성하지 않는다면 skip_final_snapshot=true로 설정하면 되겠지만, 나처럼 스냅샷을 생성하고 싶다면 final_snapshot_identifier를 설정해주어야한다.
참고로 final_snapshot_identifier에서 _(underscore)는 사용할 수 없고 -(hyphen)과 알파벳만 사용할 수 있다.
내가 작업하던 테라폼 코드에서는 for_each문을 사용해서 반복적으로 RDS 클러스터를 생성하고 있어서 아래와 같이 skip_final_snapshot 값이 false일 경우에만 final_snapshot_identifier값을 설정하도록 구성해줬다.
final_snapshot_identifier = each.value.skip_final_snapshot == false ? format("%s-%s-final-snapshot", local.namespace, replace(each.key, "_", "-")) : null
하지만 해당 값을 적용하려면 destroy가 아니라 apply로 설정값을 업데이트 해야하는데, 모듈로 코드를 작성한 경우 apply를 할 때 도중까지 삭제되었던 DB 인스턴스들이 재생성이 되는 상황이 발생한다.
단순히 인스턴스를 재생성하고 삭제해도 되기는 하지만 굳이 삭제한 리소스를 재생성하고 싶지 않다면 아래와 같이 target 옵션을 사용해서 RDS 클러스터에만 변경값을 apply한 후 전체 모듈을 삭제하면 정상적으로 삭제할 수 있다.
terraform apply -target='module.<rds모듈명>.aws_rds_cluster.this[0]'
terraform destroy
3. 기타 주의 사항
위 내용 외에 스냅샷/백업 관련 설정으로는 delete_automated_backups 설정이 있는데, 자동백업을 설정한 경우 해당 백업들을 유지할지 여부에 대한 설정값이다. 하지만 delete_automated_backups 값을 false로 놓는다 하더라도 해당 값을 DB 인스턴스 삭제 시 자동백업을 유지할 지 여부를 구성하는 것이기 때문에 RDS 클러스터가 완전히 삭제되면 해당 백업들도 같이 삭제된다. 복원 구성을 하려면 반드시 위의 skip_final_snapshot=false 설정을 적용해야한다.
또 하나 사소한 주의 사항은 deletion_protection 설정으로, 해당 값이 true로 설정되어있다면 삭제할 수 없으니 먼저 해당 값을 false로 설정한 후 apply한 후 destory 해주면 된다.