Outsider's Dev Story

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

기술 뉴스 #135 : 19-10-01

웹개발 관련

  • Performance metrics for blazingly fast web apps : 웹앱의 성능 측정을 어떻게 하는 게 좋은지를 설명한 글이다. 시간을 측정할 때 event.timeStamp르 측정하고 끝나는 시간은 requestAnimationFrame()에서 performance.now()를 사용해서 Paint 등까지 정확히 측정되고 전체 이벤트의 특정 퍼센트만 측정하라고 설명하고 있다.(영어)
  • HTTP/3: 과거, 현재 그리고 미래 : Cloudflare에서 HTTP/3 지원을 추가했다. 이 글에서는 HTTP/1부터 HTTP/3까지 어떻게 발전해 왔는지 정리되어 있고 Chrome과 curl에서 HTTP/3를 어떻게 테스트할 수 있는지까지 설명되어 있다.(한국어)
  • [React] 0. 들어가면서 : React를 더 잘 사용하기 위해서 개발 환경 구성부터 React 아키텍처에서 겪은 문제와 해결책을 정리하는 시리즈 글이다. 현재 3편까지 올라와 있다.(한국어)
  • Are backticks (``) slower than other strings in JavaScript? : JavaScript에서 문자열을 다룰 때 백틱(`)을 사용한 것과 일반 문자열 사이에 속도 차이를 jsperf로 테스트한 글이다. 그냥 문자열을 생성하는 것과 변수를 합쳐서 사용할 때를 비교했다.(영어)

그 밖의 개발 관련

  • 개발자 머피의 법칙 : 개발하면서 "괜찮겠지..." 하고 넘어갔다가 문제가 생긴 경험을 사례별로 정리해 놓은 글이다. 서버에서 무조건 입력을 검증해야 한다거나 인증과 권한 검사를 추가로 해야 하거나 접근 제어 등 무심코 넘어갔다가 장애가 발생하거나 문제가 될 수 있는 부분이 다양하게 정리되어 있다.(한국어)
  • 설계의 중요성을 설명하기가 왜 어려웠을까? : 회사에서 소위 기술부채를 해결해야 하는 일이 긴박한 비즈니스에 밀려나는 상황을 어떻게 풀어야 할지에 대한 고민이 담긴 글이다. 클린 아키텍처의 내용을 바탕으로 현실에서 이 부분의 해결이 어려웠던 이유는 설계가 비즈니스에 기여하는 바를 실증하기가 어렵기 때문이라고 하며 결과적으로 이 부분을 해결하려면 많은 시간과 에너지를 쓰는 수밖에 없다고 얘기하고 있다.(한국어)
  • Tmux Tutorial : 터미널을 더 강력하게 사용할 수 있는 Tmux의 설치부터 사용 방법을 정리해 놓은 튜토리얼이다.(영어)

인프라 관련

  • tfenv로 테라폼 버전 관리하기 : Terraform을 사용할 때 Terraform의 버전이 올라가면서 이전 버전에서 만들 리소스와 새 리소스의 관리가 복잡해지는 경우가 있는데 tfenv를 이용해서 여러 버전 Terraform CLI를 쉽게 설치해서 사용하는 방법을 설명하고 있다.(한국어)
  • CNCF Kubernetes Project Journey Report : Kubernetes 프로젝트에 어떤 회사가 기여를 많이 하고 기여자와 Pull Reqeust가 시간에 따라 어떻게 증가했는지를 정리해 놓은 글이다.(영어)
  • Presto now hosted under the Linux Foundation : 페이스북이 오픈소스로 공개한 분산 SQL 엔진인 Presto가 이제 Linux 재단 밑 Presto 재단에서 관리되기로 했다고 발표했다.(영어)

볼만한 링크

  • May the Force be with you – TF가 함께하길 : 우아한 형제들에서 TF 팀장으로 서비스를 개선하면서 TF의 분위기를 만들고 여러 팀이 섞여 있어서 업무를 공유하면서 프로젝트를 진행하던 중의 고민했던 내용을 정리한 글이다. 내부 사정은 잘 모르지만, 고민과 결정이 같이 나와 있어서 재미있게 읽을 수 있는 글이다.(한국어)
  • CookieRun Typeface : Devsisters에서 쿠키런 폰트를 공개했다.(한국어)
  • My Siri Shortcuts Library : iOS의 150가지 Siri Shortcut을 공개한 글이다.(영어)

IT 업계 뉴스

프로젝트

  • Terraformer : Google Cloud Platform의 리소스를 Terraform 코드나 상태로 내려주는 CLI 도구.
  • ColorBox : Lyft에서 공개한 컬러 세트 생성 사이트.
  • Windows Terminal : Microsoft Windows의 새 터미널.

버전 업데이트

2019/10/01 23:21 2019/10/01 23:21

Terraform 0.12로 테라폼 코드 업그레이드하기

지난 5월 Terraform 0.12가 공개됐다. Terraform 0.12는 HCL 문법이 개선되고 많은 부분이 개선되어서 나오기 전부터 많이 기다리고 있던 버전이다. 가장 크게는 값에 변수를 사용할 때 "${var.example}"처럼 String Interpolation 쓰듯이 써줘야 하는 부분이 그냥 var.example로 쓸 수 있게 되었다. "${var.example}"으로 쓰던게 익숙해 져서 지금은 괜찮은데 처음 Terraform 쓸 때는 왜 문법이 이런가 생각했던 기억이 난다. 0.12의 새 기능은 테라폼 0.12 베타 1 출시 및 개선된 HCL 문법 살펴보기에 잘 정리되어 있다.

리소스가 많진 않지만, 개인적으로 사용하는 AWS 인프라도 Terraform으로 관리하고 있는데 0.11을 계속 쓰고 있었다가 이번에 0.12로 업그레이드 하는 작업을 진행했다. 리소스가 많지 않아서 회사 프로젝트에 비할 바는 아니지만, 코드와 상태 간에 어긋난 부분이 없다면 업그레이드는 어렵지 않게 할 수 있을 것으로 보인다.

Terraform 0.12 업그레이드 사전 점검

Upgrading to Terraform v0.12 문서에 업그레이드 방법이 잘 나와 있다. 업그레이드가 가능한지 점검해 보고 업그레이드를 진행하려면 Terraform 0.11.14+와 Terraform 0.12.x가 모두 필요하다. 나 같은 경우는 Terraform CLI를 최신 버전인 0.12.x로 올리고 terraform 명령어로 사용할 수 있게 해두고 0.11.14+ 버전은 terraform11 명령어로 사용할 수 있게 설치해 두었다.(이 글에서도 terraform11라고 된 부분은 0.11.14+ 버전을 의미한다.)

Terraform 0.11.14부터 terraform 0.12checklist라는 명령어가 추가되었다. 이 명령어를 사용하면 현재 프로젝트를 Terraform의 업그레이드 명령어로 업그레이드 할 수 있는지가 나온다.

$ terraform11 0.12checklist
Looks good! We did not detect any problems that ought to be
addressed before upgrading to Terraform v0.12.

This tool is not perfect though, so please check the v0.12 upgrade
guide for additional guidance, and for next steps:
    https://www.terraform.io/upgrade-guides/0-12.html

업그레이드 전에 작업이 필요한 경우에는 아래와 같이 안내가 나온다.

$ terraform11 0.12checklist
After analyzing this configuration and working directory, we have identified some necessary steps that we recommend you take before upgrading to Terraform v0.12:

- [ ] Upgrade provider "aws" to version 2.27.0 or newer.

  No currently-installed version is compatible with Terraform 0.12. To upgrade, set the version constraint for this provider as follows and then run `terraform init`:

      version = "~> 2.27.0"

Taking these steps before upgrading to Terraform v0.12 will simplify the upgrade process by avoiding syntax errors and other compatibility problems.

이는 사용 중인 AWS 프로바이더가 버전이 맞지 않으니 0.12를 지원하는 버전을 지정한 다음 terraform init을 실행하라는 의미이다. 안내대로 진행한 다음에 다시 실행하면 업그레이드가 가능하다고 나온다.

Terraform 0.12 업그레이드

Terraform 0.12에는 0.12upgrade라는 명령어가 있어서 이를 사용하면 코드를 0.12에 맞게 바꾸어준다. 한꺼번에 변환해주기 때문에 버전을 올릴 때 노가다 작업을 줄이고 쉽게 올릴 수 있다.

$ terraform 0.12upgrade

This command will rewrite the configuration files in the given directory so
that they use the new syntax features from Terraform v0.12, and will identify
any constructs that may need to be adjusted for correct operation with
Terraform v0.12.

We recommend using this command in a clean version control work tree, so that
you can easily see the proposed changes as a diff against the latest commit.
If you have uncommited changes already present, we recommend aborting this
command and dealing with them before running this command again.

Would you like to upgrade the module in the current directory?
  Only 'yes' will be accepted to confirm.

  Enter a value: yes

-----------------------------------------------------------------------------

Upgrade complete!

The configuration files were upgraded successfully. Use your version control
system to review the proposed changes, make any necessary adjustments, and
then commit.

yes를 입력하면 코드 변경이 진행된다. Git 등으로 형상 관리를 하고 있다면 여기서는 코드만 변경한 것이므로 변경이 잘못되었다고 생각하면 코드를 되돌리면 될 일이다. 이상이 없으면 terraform plan을 실행해서 문제가 없는지 확인하면 되고 AWS 프로바이더의 버전이 올라가면서 일부 속성의 기본값이 바뀌거나 하는 부분만 확인해보고 필요하다면 terraform apply하면 된다. 업그레이드를 진행하면 versions.tf 파일이 자동으로 생기며 terraform 블록에서 필수 버전을 0.12 이상으로 지정된다. 어차피 0.11에서는 아예 0.12의 tf 파일을 제대로 읽지 못하므로 버전 강제를 추가하는 것으로 보인다. 나 같은 경우는 필요 없게 느껴져서(혼자 사용하니까) 형상 관리에 추가하진 않았다.

업그레이드는 대부분 이상 없이 되었는데 모듈 쪽에서는 문제를 약간 겪었다. Terraform 모듈이 정의된 디렉터리에서는 실제 인프라와 연결되지 않기 때문에 프로바이더 정보 같은 것이 없고 실제 인프라와의 연결은 해당 모듈을 가져다 사용하는 쪽이다. 처음에는 이를 모르고 모듈 쪽 디렉터리에서 업그레이드를 시도했더니 다음과 같은 오류가 났다.

$ terraform 0.12upgrade

...

Would you like to upgrade the module in the current directory?
  Only 'yes' will be accepted to confirm.

  Enter a value: yes

-----------------------------------------------------------------------------

Error: error resolving providers:

- provider.aws: no suitable version installed
  version requirements: "(any version)"
  versions installed: none

이는 모듈을 가져다 쓰는 곳에서, 즉 프로바이더가 정의된 곳에서 해당 모듈의 경로를 지정해서 업그레이드를 진행하면 된다.

$ terraform 0.12upgrade ../modules/vpc

...

Would you like to upgrade the module in ../modules/vpc?
  Only 'yes' will be accepted to confirm.

  Enter a value: yes

-----------------------------------------------------------------------------

Upgrade complete!

The configuration files were upgraded successfully. Use your version control
system to review the proposed changes, make any necessary adjustments, and
then commit.


변경된 코드

개인 인프라의 소소한 리소스에서 0.12로 업그레이드 하면서 고친 부분을 정리했다.

  • 퍼스트 클래스 표현식이 도입되어 표현식에서 "${}"부분이 제거되었다.

    • "${var.priority}" -> var.priority
  • 원격 상태 참조에서 출력값에 outputs 속성이 추가되어 값을 가져올 때 outputs 부분을 추가했다.
  • "${data.terraform_remote_state.global.logs}" -> data.terraform_remote_state.global.outputs.logs
  • 이전 버전까지는 맵 속성(map attribute) 즉, 리소스에서 key = {}로 정의하는 형태와 중첩 블록 즉, 리소스 내에서 다른 리소스를 정의하는 key {}형태를 상호 교환해서 쓸 수도 있어서 구분이 모호했지만 0.12에서는 둘의 구분이 명확해졌다. 본문에서 키를 사용자가 임의로 쓸 수 있으면 =를 써야 하는 맵 속성이고 키가 미리 정해져 있으면 =없이 써야하는 중첩 블록이다. 이 부분을 규칙에 맞게 고쳐준다.

    • config { } -> config = { }
    • tags { } -> tags = { }
  • 리스트 변수도 []로 감싸줘야 하던 부분이 개선되어 문법에 맞게 리스트를 고쳐야 한다.(아마 이 부분은 0.12upgrade 명령어가 자동으로 고쳐주지 못하고(안의 값이 뭔지 모르므로...) 오류가 나서 직접 고쳤던 것 같다.)
    ["${module.side_effect_vpc.availability_zones}"] -> module.side_effect_vpc.availability_zones
2019/09/18 03:53 2019/09/18 03:53