Terraform으로 관리하던 리소스를 다른 Terraform으로 이동하기
Terraform을 사용하다 보면 리소스를 terraform으로 관리하다가 분리해야 하는 경우가 생긴다. 기본적으로 Terraform은 모든 리소스는 하나의 Terraform으로 관리하기보다는 여러 terraform 프로젝트로 나누어서 관리하는 것을 더 권장한다. 실제로 많은 리소스를 하나에 담아버리면 관리도 쉽지 않고 plan 등을 하는데도 너무 많은 시간이 걸린다.
하지만 처음부터 모든 상황을 예상하기는 어려우므로 처음에는 A 프로젝트에서 관리하고 있었는데 작업을 하다 보니 B 프로젝트에서 관리하는 게 낫다고 싶을 때도 있다. 이때 terraform 설정은 옮겨가기가 쉽지만 terraform.tfstate에서도 빼주지 않으면 설정을 제거하고 apply 하면 실제 리소스도 제거하므로 문제가 생기게 된다. terraform.tfstate는 기본적으로 사람이 직접 관리하는 용도는 아니므로(어쩔 수 없는 경우가 아니라면...) terraform.tfstate를 직접 관리하는 건 쉽지 않다.
설명을 위해서 상황을 가정해 보자. AWS의 IAM role을 다음과 같이 관리하고 있다고 해보자.
1resource "aws_iam_role" "ecsInstanceRole" {
2 name = "ecsInstanceRole"
3 path = "/"
4 assume_role_policy = <<POLICY
5{
6 "Version": "2012-10-17",
7 "Statement": [
8 {
9 "Sid": "",
10 "Effect": "Allow",
11 "Principal": {
12 "Service": "ec2.amazonaws.com"
13 },
14 "Action": "sts:AssumeRole"
15 }
16 ]
17}
18POLICY
19}
20
21resource "aws_iam_role" "nodejs-ko-twitter_lambda_function" {
22 name = "nodejs-ko-twitter_lambda_function"
23 path = "/"
24 assume_role_policy = <<POLICY
25{
26 "Version": "2012-10-17",
27 "Statement": [
28 {
29 "Effect": "Allow",
30 "Principal": {
31 "Service": "lambda.amazonaws.com"
32 },
33 "Action": "sts:AssumeRole"
34 }
35 ]
36}
37POLICY
38}
39
40resource "aws_iam_role" "sideeffect_lambda_function" {
41 name = "sideeffect_lambda_function"
42 path = "/"
43 assume_role_policy = <<POLICY
44{
45 "Version": "2012-10-17",
46 "Statement": [
47 {
48 "Effect": "Allow",
49 "Principal": {
50 "Service": "lambda.amazonaws.com"
51 },
52 "Action": "sts:AssumeRole"
53 }
54 ]
55}
56POLICY
57}
여기 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을 때리면 제거할 리소스가 나오게 되는데 이 이름을 그대로 사용하면 된다.
1$ terraform plan
2
3- aws_iam_role.sideeffect_lambda_function
4
5
6Plan: 0 to add, 0 to change, 1 to destroy.
위에서 나온 이름을 사용하면 된다.
1$ terraform state rm aws_iam_role.sideeffect_lambda_function
2Item removal successful.
정상적으로 삭제된 것을 확인할 수 있고 이제 plan을 실행해도 No changes. Infrastructure is up-to-date.가 나왔으므로 제대로 제거됐다. 이동할 다른 프로젝트에서는 AWS에 기존에 있는 리소스를 가져오는 것이므로 기존에 사용 중인 인프라를 Terraform으로 가져오기를 참고하면 된다.
Comments