Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.

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

기술 뉴스 #80 : 17-06-15

웹개발 관련

  • Redux vs MobX: Which Is Best for Your Project? : 상태 관리 도구인 Redux와 MobX를 비교한 글이다. Redux를 MobX로 전환한 경험을 바탕으로 MobX가 배우기 쉽고, 더 적은 코드를 작성하고 OOP를 지원하며 중첩된 데이터를 다루기 쉽다는 부분이 장점이지만 자유도가 너무 많고 내부에서 자동으로 처리해 주는 부분이 많아서 디버깅이 어렵다는 점을 단점으로 들었다. 초기화나 주입 등의 상황에서 Redux와 MobX의 코드 비교도 있어서 MobX를 고려하고 있다면 차이점을 이해하기 좋은 글이다.(영어)
  • Tabnabbing 피싱 공격의 동작 원리와 대응책 : HTML 문서에서 새로운 탭(또는 창)으로 열린 페이지에서 이전 페이지의 위치를 조작한 뒤 피싱 사이트로 유도하는 공격인 Tabnabbing에 대해서 설명하고 이를 어떻게 막을 수 있는지 설명한 글이다. 공격은 점점 다양해지므로 중요한 데이터를 다루는 사이트를 만든다면 이런 공격은 알고 있어야 할 필요가 있다.(한국어)
  • The Future of MDN: A Focus on Web Docs : MDN이 Mozilla Developer Network로 시작했지만, 지금은 이 이름을 아는 사람이 없고 그냥 MDN으로 기억하고 있고 웹 관련 문서의 가치가 커졌으므로 MDN이라는 이름으로 웹 문서를 제공하겠다고 한다.(영어)

그 밖의 프로그래밍 관련

  • Upcoming Provider Changes in Terraform 0.10 : Terraform이 제공하는 프로바이더가 초기에는 10개도 안 됐지만 지금은 70개가 넘는 상황에서 사용자들은 항상 Terraform의 릴리스를 기다려야 하고 이 복잡도가 버그를 만들 수도 있으므로 0.10부터는 Terraform 코어에서 프로바이더를 분리해서 별도로 제공한다. 프로바이더는 GitHub의 terraform-providers 조직아래에서 제공할 예정이며 테라폼을 받아서 프로바이더를 init으로 받아오는 방식이 될 예정이다. 이 적용을 위해 0.9에서는 더이상 릴리스가 없고 0.10 베타를 릴리스해서 사용자 피드백을 받을 예정이다.(영어)
  • Yarn determinism : npm 5에서 package-lock 기능이 추가되면서 yarn.lock과 어떻게 다른지를 설명한 글이다. yarn.lock은 누구나 똑같은 버전의 모듈을 설치할 수 있도록 자체 포맷을 사용하면서 계층은 package.json의 정보를 이용해서 만들므로 같은 버전의 yarn에서 같은 node_modules를 보장하는 반면 npm 5는 확인용으로만 package-lcok을 만들고 트리는 기존대로 사용하므로 npm 5 버전 내에서 호환성을 유지할 수 있다.(영어)
  • 내가 Docker를 시작했던 방법 : Docker 도입을 한 과정을 설명한 글이다. Docker 자체는 그다지 어렵지 않은데 나도 과거 도입을 하려다가 여러 고민만 하고 결국 못했다가 지금은 기존에 사용하고 있어서 바로 쓰다 보니 생각보다 너무 간단해서 이걸 왜 여태 안 썼지? 같은 생각을 한 적이 있는데 이 글도 똑같은 얘기를 하고 있어서 왠지 반가웠다.(한국어)
  • 배민 API GATEWAY - spring cloud zuul 적용기 : 배달의 민족에서 기존의 API 서비스를 MSA로 갈아타기 위해서 Netflix에서 만든 게이트웨이인 zuul을 도입해서 새로운 API Gateway를 도입하는 과정을 설명한 글이다. zuul의 동작을 설명하고 이를 Spring Cloud와 연동해서 API Gateway를 도입하는 과정이 나와 있다.(한국어)

볼만한 링크

  • Open Source Survey : GitHub에서 6,000명의 사용자에게 설문조사를 진행할 결과를 정리한 사이트이다. 문서화가 실제로 얼마나 가치가 있고 어떤 문제가 있는지, 오픈소스 프로젝트에서 부정적인 대우를 받은 경우는 어떤 일이었는지, 사용자와 기여자 간의 인식 차이가 어느 정도인지, 업무에서 오픈소스 사용과 기여를 얼마나 하는지가 잘 정리되어 있다. 로우 데이터도 CSV로 제공하고 있다.(영어)
  • 회사를 떠나는 것이 아니다. 상사를 떠나는 것이다. : 사람들이 이직하는 이유가 회사보다는 상사의 영향이 가장 크다는 글로 구글이 이를 위해 좋은 상사를 만들기 위해서 어떻게 교육하고 좋은 상사로 커가는 과정을 추적하고 있다고 한다. 좋은 상사들이 가진 특징이 잘 정리되어 있다.(한국어)

IT 업계 뉴스

프로젝트

  • Bonsai : Pinterest에서 공개한 JavaScript 의존성 분석 도구.
  • sultan : Python으로 커맨드라인 명령을 다룰 수 있는 패키지.

버전 업데이트

2017/06/15 22:59 2017/06/15 22:59