Outsider's Dev Story

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

Terraform의 원격 상태 위치 변경

Terraform을 사용하다 보면 하나의 Terrafom state 파일(.tfstate)로 모든 리소스를 관리하는 것을 권장하지 않으므로 자연히 여러 state 파일로 나누게 된다. 처음에도 많은 고민을 하고 구조를 나누어서 관리하게 되지만 리소스가 계획대로 늘어가는 것도 아니고 작업을 하다가 불편한 부분을 느끼고 개선을 하다 보면 이미 관리하는 상태 파일을 다른 위치로 이동하고 싶은 경우가 생기게 된다.

초기에 아주 잘 설계하면 당연히 좋겠지만 그런 일은 발생하지 않고 필요할 때 원하는 구조로 바꿀 수 있는 게 제일 좋은 구조가 된다. 로컬에서 .tfstate를 관리하고 있다면 A 폴더에서 관리하다가 B/A로 바꾸더라도 폴더 이동만 하면 되지만 원격으로 .tfstate를 관리하고 있다면 얘기가 달라진다.

terraform {
  backend "s3" {
    bucket     = "my-terraform-state"
    key        = "ec2/terraform.tfstate"
    region     = "ap-northeast-1"
    encrypt    = true
  }
}

위는 Terraform 원격 상태 파일을 AWS S3에 저장하도록 한 설정이고 여기서 키인 ec2/terraform.tfstate는 내 프로젝트의 폴더구조를 그대로 가져온 것이다. 상태마다 S3 버킷을 파는 것은 불편하므로 하나의 버킷에서 상태 파일을 관리하기 위해 폴더구조를 그대로 키값으로 사용한 것이다.

여기서 리전을 구분하기 위해서 ec2/terraform.tfstate로 관리하던 상태 파일을 ap-northeast-1/ec2/terraform.tfstate로 이동하고 싶다면 Terraform 설정 파일은 로컬에서 폴더구조를 바꿔주면 되지만 S3의 키값은 바뀌지 않으므로 위 설정을 바꾸어 주어야 한다.

처음에는 로컬에서 폴더구조를 바꾼 다음에 수동으로 S3에서 변경해야 한다고 생각했지만, 막상 이 작업을 해보니 Terraform에서 이 부분까지 지원하고 있었다.

먼저 원하는 경로에 맞춰서 키값을 아래처럼 변경한다.

terraform {
  backend "s3" {
    bucket     = "my-terraform-state"
    key        = "ap-northeast-1/ec2/terraform.tfstate"
    region     = "ap-northeast-1"
    encrypt    = true
  }
}

원격 상태 파일의 위치를 변경한 후에 다시 terraform init을 실행한다.

$ terraform init
Initializing modules...
- module.my_module

Initializing the backend...
Backend configuration changed!

Terraform has detected that the configuration specified for the backend
has changed. Terraform will now reconfigure for this backend. If you didn't
intend to reconfigure your backend please undo any changes to the "backend"
section in your Terraform configuration.


Do you want to copy the state from "s3"?
  Would you like to copy the state from your prior backend "s3" to the
  newly configured "s3" backend? If you're reconfiguring the same backend,
  answering "yes" or "no" shouldn't make a difference. Please answer exactly
  "yes" or "no".

  Enter a value: yes

Terraform has detected that the configuration specified for the backend has changed.라고 나온 것처럼 이전과 상태 파일의 위치가 달라진 것을 자동으로 감지하고 상태 파일을 S3에서 복사할 것인지를 붇는다. 의도가 아니라면 여기서 no를 입력하면 되지만 지금은 상태 파일을 바꾸는 것이 의도이므로 yes를 입력한다.

Do you want to copy state from "s3" to "s3"?
  Pre-existing state was found in "s3" while migrating to "s3". No existing
  state was found in "s3". Do you want to copy the state from "s3" to
  "s3"? Enter "yes" to copy and "no" to start with an empty state.

  Enter a value: yes

Releasing state lock. This may take a few moments...

Successfully configured the backend "s3"! Terraform will automatically
use this backend unless the backend configuration changes.

S3에서 이전에 있던 상태 파일을 새로운 위치로 복사할 것인지를 묻는다. 여기서는 단순히 이동하는 것이므로 yes를 입력하면 S3의 새 위치에 상태 파일을 복사해준다. 물론 복사이므로 이전 상태 파일을 알아서 지워주지는 않고 S3에 들어가서 직접 지워야 한다.

이 작업을 실제로 해보기 전에는 로컬에서 위치를 변경한 뒤에 S3에서 수동으로 위치를 변경하고 다시 plan, apply로 동기화해야 한다고 생각했는데 Terraform에서 이 부분까지 지원하고 있어서 쉽게 할 수 있었다.

2017/11/18 03:25 2017/11/18 03:25

기술 뉴스 #90 : 17-11-15

웹개발 관련

  • How to use SVG as a Placeholder, and Other Image Loading Techniques : 이미지를 로딩하는 동안 시간이 걸리므로 해당 공간을 placeholder로 대체했다가 나중에 이미지를 로딩하는 기법에 관해서 설명하는 글이다. Placeholder로 사용하는 방식에 관해서 설명하고 이를 좀 더 좋은 방법으로 해결하기 위해 SVG를 이용해서 이미지의 폴리곤으로 그리거나 라인을 따서 보여준 뒤에 이미지로 교체하는 방법을 설명한다. 비슷하게 연구한 라이브러리나 방법들에 대해서 같이 보여주는데 그 결과는 꽤 흥미로워서 상당히 재미있는 placeholder가 된다. 제대로 이해하려면 코드를 직접 실행하면서 테스트해봐야겠지만 이런 접근을 생각하지 못하고 있어서 아주 관심이 간다.(영어)
  • Flexbox and Grids, your layout’s best friends : 웹에서 레이아웃을 잡는 용도로 사용하는 Flexbox와 Grids를 비교한 글이다. 코드에 따라 달라지는 요소의 변화를 이해하기 쉽게 애니메이션으로 보여주면서 Flexbox와 Grids의 차이점을 설명한 다음에 Grids로 레이아웃을 잡고 세부요소를 Flexbox로 잡는 방법까지 설명하고 있다. Grids는 한 번도 안 써봐서 흥미롭게 읽었다.(영어)
  • How Redux Can Make You a Better Developer : 상태관리에 사용하는 Redux가 가진 기본 개념인 불변성, 순수 함수, Higher order 함수 등을 설명하면서 이 부분이 왜 좋고 Redux에서는 어떻게 쓰고 있는지 설명하는 글이다. Redux에 대해서 전혀 모르더라고 읽는 데 문제가 없을 정도로 중요한 기념 개념을 잡아주고 있어서 다른 라이브러리를 쓴다고 하더라도 읽어볼 만하다.(영어)
  • HTTP/2 in Node.JS Core : 최근에 Node.js 코어에 추가된 HTTP/2 모듈을 이용해서 HTTP/2 서버를 구현하고 Server Push를 구현하는 방법을 설명하고 예제를 함께 제공하고 있다.(영어)
  • WebAssembly support now shipping in all major browsers : 이제 모든 주요 브라우저가 WebAssembly를 지원하게 되었다고 한다. 물론 여기서 주요 브라우저에는 IE 11은 포함 안 되고 Edge만 얘기한 거다.(영어)

그 밖의 프로그래밍 관련

  • The GraphQL stack: How everything fits together : GraphQL에 왜 좋은지를 설명하면서 GraphQL의 성능을 높이는 부분에 관해서 사람들이 궁금해하는 캐싱, 추적, 스키마 통합에 관해서 설명하고 있다. Apollo Gateway를 홍보하는 느낌이 강하긴 하지만 주로 GraphQL 서버 앞에 Gateway 서버를 두고 캐싱을 관리하고 필드별 속도를 측정하면서 여러 서버 간에 통합하는 관점에 관해서 설명하고 있다. GraphQL을 보면서도 여전히 REST API를 보는 관점에 좀 갇혀 있게 되는데 GraphQL에 어울리는 관점에 관해서 설명하는 괜찮은 글이다.(영어)
  • 나를 위한 StackOverflow 명성(Reputation) 쌓기 : StackOverflow에서 개인 목표로 삼았던 1,000 레퓨테이션을 얻은 뒤 Stackoverflow를 사용하면서 레퓨테이션을 얻는 방법을 정리한 글이다. 요즘 StackOverflow에서 레퓨테이션 점수를 얻기가 쉽지 않다고 생각했는데 적극적으로 참여하면서 레퓨테이션을 얻은 방법을 정리한 글이라 도움이 된다. 이런 방식으로 질문과 답변에 대해서 고민하는 것으로도 많은 실력을 쌓을 수 있을 것이라고 생각한다.(한국어)
  • React Native & iPhone X : 화면의 크기가 달라진 iPhone X에 대응하려고 React Native 0.50.1에서 도입된 SafeAreaView의 사용 방법에 관해 설명한 글이다. SafeAreaView는 React Native를 업데이트하지 못하는 개발자를 위해 react-native-safe-area-view라는 별도의 모듈로도 제공하고 있다.(영어)
  • What's new in Node.js 9? : Node.js 8.9.0이 새 LTS carbon이 되면서 새로운 현재 버전 9.x.x 라인이 나왔다. 이 글에서는 HTTP2, util.isDeepStrictEqual, util.callbackify 등 9.x.x에서 추가된 기능을 설명하고 있다.(영어)
  • Go cheatsheet : Go 언어에 익숙하지 않을 때 참고하기 좋은 치트시트(영어)

볼만한 링크

  • 소프트웨어 집단의 부패:Expert Beginner의 유산 : 지난 글 더 이상 배우려 하지 않는 개발자 : Expert Beginner의 등장의 속편이다. 이전 글도 재밌었는데 성장이 멈춘 채 전문가의 역할을 하는 Expert Beginner의 상황을 훨씬 신랄하게 비판하고 있고 Expert Beginner가 문화를 망치는 상황과 이런 상황에 도달하지 않게 만들기 위한 실천적인 방법까지 제시하고 있다. Expert Beginner는 그 조직 내에서는 쉽게 알기 어렵다는 게 큰 문제인데 여기서 말한 방법들은 꼭 Expert Beginner가 아니라도 조직과 개인의 성장을 위해서 참고할 부분이 많이 있다고 생각한다.(한국어)
  • 구글 애널리틱스 API를 이용한 캠페인 분석(2) : GA로 데이터를 분석할 때 단순히 웹 인터페이스를 사용하는 것이 아닌 Reporting API를 이용하는 고급 분석 방법을 설명하고 있다. 제약이 있는 웹 인터페이스에 달리 API를 이용하면 더 다양한 조합으로 데이터를 가져올 수 있지만 한 번에 가져오는 최대 개수와 초당 호출 개수의 제약이 있으므로 Best-first search를 이용해서 이전 데이터로 최소 횟수로 API를 호출해서 원하는 데이터를 찾는 과정을 설명하고 있다. 이걸 보면 GA로 다 되겠구나 싶다.(한국어)

프로젝트

  • Bottender : Slack, Line, Telegram용 봇을 만들기 쉽게 도와주는 node.js 라이브러리.
  • Server.js : Node.js 웹 프레임워크.
  • evip : Go로 작성된 이벤트 루프 네트워킹 프레임워크.

버전 업데이트

2017/11/15 22:45 2017/11/15 22:45