Outsider's Dev Story

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

기술 뉴스 #109 : 18-09-01

웹개발 관련

  • Liftoff: a new baseline compiler for WebAssembly in V8 : V8의 새 엔진인 Turbofan에서 WebAssembly의 코드 제너레이션에서 시간이 오래 걸리는데 이 문제를 해결하기 위해서 Turbofan보다 WebAssembly에 최적화된 Liftoff를 도입했다. 벤치마크 결과 코드 제너레이션에서 10배 가까이 빠른 속도를 보여주고 있고, 실행해서는 아직 Turbofan보다 약간 느린 결과를 보여주고 있다.(영어)
  • GIF 사용을 멈춰주세요! : 보통 짤방에 많이 사용하는 Animated GIF를 사용하지 말아야 한다고 설명하는 글이다. 실제 같은 동영상을 gif와 mp4로 만들어서 gif의 용량이 얼마나 크고 브라우저에서 보여주는데 속도 저하가 심한지를 비교해서 이 글을 보면 정말 gif를 쓰면 안 되겠다고 쉽게 이해할 수 있다. 마지막으로 gif를 어떻게 mp4로 변환할 수 있는지도 설명해 준다.(한국어)
  • [chrome] CSS Scroll Snap #1 : Chrome 69에 추가된 Scroll Snap의 사용방법을 설명한 글이다. 스크롤에 맞게 콘텐츠의 위치를 제어하려면 JavaScript를 이용해야 했고 이는 성능 이슈도 있는데 Scroll Snap을 이용하면 CSS만으로 쉽게 제어할 수 있다. 각 속성의 사용방법을 설명하고 예제도 함께 제공해서 동작 여부를 테스트해 볼 수 있다.(한국어)
  • CodeMirror version 6 : 웹 에디터로 유명한 CodeMirror가 새 버전 6을 새로 작성하고 있다고 한다. 새 아키텍처에서는 접근성이 강화되었고 모바일 지원도 강화되었으면 TypeScript로 작성되고 있다. 그리고 프로젝트 펀딩도 받고 있다.(영어)

그 밖의 프로그래밍 관련

  • JDBC로 실행되는 SQL에 자동으로 프로젝트 정보 주석 남기기 : 모노리틱 아키텍처에서 마이크로서비스 아키텍처로 넘어가는 과정에서 데이터베이스를 공통으로 사용하다 보니 쿼리에 문제가 있을 때 어디서 온 쿼리인지 알기 어려운 문제를 해결하기 위해 쿼리 앞에 프로젝트 정보를 주석으로 넘는 접근 방법을 설명한 글이다. 데이터베이스를 사용하는 곳에서 Proxy를 구현하는 방법도 가능하지만, Tomcat JDBC 커넥션풀을 이용해서 쿼리에 주석을 넣도록 설정하는 방법을 설명하고 구현한 코드를 공개해서 가져다가 사용할 수도 있다.(한국어)
  • Introduction to Go Modules : Go 1.11에서 추가된 Go Modules의 사용방법을 설명하는 글이다. GOPATH 밖에서 모듈을 만들고 Git 저장소에 푸시한 뒤에 버전 업데이트에 따라 프로젝트에서 가져다 사용하는 방법을 설명하고 있다.(영어)
  • Go 2 Draft Designs : Go 버전 2의 디자인 드래프트가 공개되었다.(영어)
  • The Swift Language Guide (한국어) : Swift 언어 문서의 한국어 번역본이다.(한국어)

블록체인 관련

  • 비탈릭의 캐스퍼 폭풍 트위터 파헤치기 : 얼마 전 이더리움을 만든 비탈릭 부테린이 Casper에 관해 70여 개의 트윗을 스레드로 남겼는데 이 내용을 번역하고 관련 내용을 정리한 글이다. 현재 이더리움에서 PoS와 Casper의 진행 과정과 배경을 이해할 수 있는 글이다. 현재 중편까지 발행되었다.(한국어)
  • Casper PoS:비탈릭의 디자인 철학 : 이더리움이 PoW에서 PoS로 넘어가기 위해 Casper에 담긴 철학을 설명한 글이다. 사이퍼펑크(Cyperpunk) 정신을 강조하면서 PoW로 사이퍼펑크에서 시작했지만, 현재 공격 비용과 방어비용이 1:1이라서 완전히 정신을 계승하지 못했고 이를 PoS에서 투표로 어떻게 해결하고 공격자에게 페널티를 주려고 하는지 설명하고 있다.(한국어)
  • 세계에서 가장 성공한 리버스ICO로부터 배워야 할 것 : 마약 산업에서 비트코인이 왜 그렇게 잘 쓰이게 되었는지를 보고 불법이 아니더라도 지금의 중앙화된 시스템보다 잘하기보다는 중앙화된 시스템이 못하는 부분에 집중해야 한다는 내용의 글이다. 어느 정도 내가 생각하는 것과 비슷해서 공감하는 글이다.(한국어)

볼만한 링크

  • Git Origin Story in Korean : Git이 어떻게 만들어지게 되었는지를 정리한 Git Origin Story의 번역 글이다. Linus Torvalds가 버전 관리를 쓰지 않고 리눅스 커널을 관리하다가 상용프로그램인 BitKeeper를 선택하게 된 과정과 그 뒤에 어떻게 Git을 시작했는지가 정리되어 있는데 BitKeeper의 상용화로 Git을 만들었다고 간단히만 알고 있다가 자세한 얘기를 알게 되어 재미있게 읽었다.(한국어)
  • [번역] 더 나은 폼 디자인하기 : Design Better Forms의 번역 글로 많이 사용하는 폼을 어떻게 하면 더 좋은 폼으로 구성할 수 있는지 비교해주면서 보여주고 있다. 가볍게 쭉 읽으면서 자신의 서비스에 적용해 볼 만한 내용을 참고해 보기 좋다.(한국어)
  • [발번역] Add text to MIT License banning ICE collaborators : Lerna 프로젝트에서 이민세관단속청(ICE)이 이민자들에게 행하는 행위에 분노하여 ICE와 일하는 회사는 Lerna를 사용하지 못하도록 라이센스를 변경하는 PR의 내용을 번역한 글이다. 하지만 이 PR은 커뮤니티의 Code of Conduct를 어겼다는 거센 반발과 MIT 하에 과거에 기여했던 기여자들이 이건 MIT가 아니므로 자신이 기여한 코드를 제거해 달라는 요청에 다시 MIT로 되돌렸다.(한국어)
  • 조직의 동의를 얻는 법 : 회사에서 일을 하다 보면 어떤 일이든 조직 내에 동의를 받아야 일의 진행이 원활한데 같은 내용이더라도 어떻게 하면 동의를 더 잘 얻을 수 있는지를 경험에 바탕을 둬서 설명하고 있다. 개인적으로는 "기본 (default) 상황을 yes로 설정하고 이해관계자들에게 반박하도록 포지셔닝 하기"에 크게 동의한다.(한국어)

IT 업계 뉴스

프로젝트

  • Observable : jupyter처럼 JavaScript와 d3.js를 이용한 노트북 서비스.
  • graphqurl : curl처럼 터미널에서 GraphQL 요청을 보낼 수 있는 프로그램.
  • size-plugin : Webpack과 연동해서 이번 빌드와 비교해서 사이즈가 얼마나 달라졌는지 보여주는 플러그인.
  • Puppeteer Recorder : 동작을 녹화해서 Puppeteer 코드로 만들어주는 크롬 익스텐션.
  • Home Assistant : Python 3으로 작성한 홈 오토메이션 플랫폼.
  • back your stack : GitHub 계정명을 입력하면 프로젝트에서 많이 의존하는 오픈소스 프로젝트를 알려주어 기부할 수 있도록 유도하는 웹사이트.
  • vid2vid : NVIDIA에서 공개한 고해상도 비디오 to 비디오 변환 구현체이다. 놀랍게도 입력 레이블로 실제와 같은 영상을 만들어낸다.
  • Dopamine : 구글에서 공개한 리서치 프레임워크로 강화학습 알고리즘을 빠르게 프로토타이핑 할 수 있다.
  • 비공식 AWS 공인 솔루션스 아키텍트 – 어소시에이트 시험 가이드 : AWS 솔루션스 아키텍트 - 어소시에이트 시험 관련 정보를 모아놓은 저장소.

버전 업데이트

2018/09/01 04:57 2018/09/01 04:57

Terraform에 다중 Provider 사용하기

AWS, GCP 등 클라우드를 사용할 때 보통 주로 사용하는 리전이 정해져 있다. 일부 Route53이나 CloudFront처럼 리전이 정해져 있지 않은 서비스도 있지만, 대다수 서비스는 리전을 선택해서 사용해야 하고 국내에서는 보통 서울(ap-northeast-2)이나 도쿄(ap-northeast-1) 리전을 사용한다.

Terraform에서도 다음처럼 provider에서 리전을 지정해서 해당 폴더에 작성한 리소스가 사용할 기본 리전을 지정할 수 있다.

provider "aws" {
  version = "~> 1.33"
  region  = "ap-northeast-1"
}

여러 리전을 사용하는 경우 폴더별로 리전을 나누어 사용할 수도 있겠지만 폴더 관리를 그렇게 하지 않거나 특정 상황에서는 같은 폴더에서 여러 리전에 리소스를 생성해야 하는 경우가 생긴다. 매년 수없이 나오는 AWS의 신규 서비스는 특정 리전에 먼저 공개되므로 이를 사용하기 위해서 다른 리전을 사용할 수도 있고 ACM에서 발급한 인증서를 CloudFront에 연결하는 경우에는 Terraform으로 ACM 인증서 생성하기에서 설명했듯이 인증서를 버지니아 북부(us-east-1)에 만들어야 하므로 어쩔 수 없지 다른 리전을 지정해야 한다. 이전 글에서도 사용해 봤지만 좀 더 살펴보자.

이런 경우 provider를 여러 개 선언할 수 있다.

provider "aws" {
  version = "~> 1.33"
  region  = "ap-northeast-1"
}

provider "aws" {
  alias   = "virginia"
  region  = "us-east-1"
}

이때 추가로 지정하는 provider에는 반드시 alias를 지정해야 한다. 그렇지 않으면 다음과 같이 오류가 난다.

$ terraform plan

Error: provider.aws: multiple configurations present; only one configuration is allowed per provider

그리고 기본 provider에는 alias가 없어야 한다. 모든 프로바이더에 alias가 없으면 따로 지정하지 않는 한 어떤 프로바이더가 기본인지 알 수 없으므로 다음과 같이 리전을 물어보게 된다.

$ terraform  plan
provider.aws.region
  The region where AWS operations will take place. Examples
  are us-east-1, us-west-2, etc.

  Default: us-east-1
  Enter a value:

ACM 인증서를 us-east-1 리전에 생성하려면 리소스 선언에 provider = "aws.virginia"를 추가하면 된다. 이러면 해당 리소스는 지정한 리전에 생성된다.

resource "aws_acm_certificate" "demo_sideeffect_kr" {
  provider          = "aws.virginia"

  domain_name       = "demo.sideeffect.kr"
  validation_method = "EMAIL"
}

provider는 모든 선언에서 사용할 수 있는데 클라우드에서 리소스 정보를 가져오는 data에서도 다음과 같이 지정해서 사용할 수 있다.

data "aws_availability_zones" "virginia" {
  provider = "aws.virginia"
}

provider의 사용법은 모듈을 사용할 때만 약간 다르다. 기본적으로 모듈에서 프로바이더는 루트 모듈에서만 지정할 수 있고 모듈 내부의 리소스는 이를 상속받는다.

module "demo" {
  source   = "./demo"

  provider = "aws.virginia"
}

이 경우 실행을 하면 다음과 같이 오류가 발생한다.

$ terraform  plan

Error: module "demo": "provider" is not a valid argument

모듈에서는 providers를 이용해서 맵으로 지정해야 한다.

module "demo" {
  source   = "./demo"

  providers = {
    aws = "aws.virginia" 
  }
}

처음에 이 구조를 봤을 때는 프로바이더를 여러 번 지정해서 한 번에 여러 리전에 만들 수 있는 건가 싶었지만 그렇지는 않다. 내부 구조는 모르지만, 동작은 모듈 내의 provider.aws를 지정한 값으로 지정하는 역할을 한다. 그래서 Terraform 문서에 나온 대로 모듈에서 여러 프로바이더를 사용하는 경우 모듈 내에 프로바이더를 다음과 같이 지정하고 있다고 해보자.

provider "aws" {
  alias = "src"
}

provider "aws" {
  alias = "dst"
}

이때는 모듈의 alias를 이용해서 아래와 같이 지정하면 각 프로바이더에 원하는 리전을 지정할 수 있다.

module "demo" {
  providers = {
    aws.src = "aws.tokyo"
    aws.dst = "aws.virginia"
  }
}
2018/08/30 23:40 2018/08/30 23:40