Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Terraform으로 관리하던 리소스를 다른 Terraform으로 이동하기

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으로 가져오기를 참고하면 된다.

2017/06/22 03:19 2017/06/22 03:19