Terraform을 사용하다 보면 리소스를 terraform으로 관리하다가 분리해야 하는 경우가 생긴다. 기본적으로 Terraform은 모든 리소스는 하나의 Terraform으로 관리하기보다는 여러 terraform 프로젝트로 나누어서 관리하는 것을 더 권장한다. 실제로 많은 리소스를 하나에 담아버리면 관리도 쉽지 않고 plan 등을 하는데도 너무 많은 시간이 걸린다.
하지만 처음부터 모든 상황을 예상하기는 어려우므로 처음에는 A 프로젝트에서 관리하고 있었는데 작업을 하다 보니 B 프로젝트에서 관리하는 게 낫다고 싶을 때도 있다. 이때 terraform 설정은 옮겨가기가 쉽지만 terraform.tfstate
에서도 빼주지 않으면 설정을 제거하고 apply
하면 실제 리소스도 제거하므로 문제가 생기게 된다. terraform.tfstate
는 기본적으로 사람이 직접 관리하는 용도는 아니므로(어쩔 수 없는 경우가 아니라면...) terraform.tfstate
를 직접 관리하는 건 쉽지 않다.
설명을 위해서 상황을 가정해 보자. AWS의 IAM role을 다음과 같이 관리하고 있다고 해보자.
resource "aws_iam_role" "ecsInstanceRole" {
name = "ecsInstanceRole"
path = "/"
assume_role_policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
POLICY
}
resource "aws_iam_role" "nodejs-ko-twitter_lambda_function" {
name = "nodejs-ko-twitter_lambda_function"
path = "/"
assume_role_policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
POLICY
}
resource "aws_iam_role" "sideeffect_lambda_function" {
name = "sideeffect_lambda_function"
path = "/"
assume_role_policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
POLICY
}
여기 3개의 role이 있고 이는 이미 terraform apply
를 했으므로 Terraform이 관리하는 리소스이다. 이렇게 관리하고 있다가 sideeffect_lambda_function
role은 다른 프로젝트에서 관리하는 게 더 나을 것 같아서 여기서는 제거하고 빼고 싶다고 해보자.
이 경우 위 .tf
파일에서 설정도 제거하고 terraform.tfstate
에서도 제거해야 terraform plan
을 했을 때 아무런 영향이 없게 된다.
terraform state rm
이런 경우를 위해서 제공되는 명령어가 state rm이다. 이 명령어를 이용하면 상태 파일(terraform.tfstate
)에서 리소스를 제거할 수 있다. 제거할 때는 리소스의 이름을 사용하는데 여기서는 aws_iam_role.sideeffect_lambda_function
가 된다. 어떤 이름을 써야 하는지 헷갈린다면 먼저 .tf
파일에서 설정을 제거하고 terraform plan
을 때리면 제거할 리소스가 나오게 되는데 이 이름을 그대로 사용하면 된다.
$ terraform plan
- aws_iam_role.sideeffect_lambda_function
Plan: 0 to add, 0 to change, 1 to destroy.
위에서 나온 이름을 사용하면 된다.
$ terraform state rm aws_iam_role.sideeffect_lambda_function
Item removal successful.
정상적으로 삭제된 것을 확인할 수 있고 이제 plan
을 실행해도 No changes. Infrastructure is up-to-date.
가 나왔으므로 제대로 제거됐다. 이동할 다른 프로젝트에서는 AWS에 기존에 있는 리소스를 가져오는 것이므로 기존에 사용 중인 인프라를 Terraform으로 가져오기를 참고하면 된다.
Comments