SlideShare a Scribd company logo
DevOps Eng. at HAECHI-LABS
김주형
he/him
Terraform 도입과 파이
프라인 구축 및 운영
발표 내용
▪ Terraform 도입 배경과 도입 초기 시행착오들
▪ Terraform 환경에서 팀원과 효과적인 협업과 안정적인 배포를 위해 했었던 일
들
Terraform 도입 배경과
도입 초기 시행착오들
새로운 프로젝트?
▪ 비트코인 수탁 등 법인, 기관 투자자를 위한 디지털 자산 수탁 서비스
▪ KB, Hashed, HAECHI-LABS 합작 법인 KODA 서비스
▪ 장기적으로 지속될 가능성이 높은 프로젝트였다.
▪ 우선은 혼자 인프라 구축을 시작하지만 가까운 시일내에 팀원이 합류할 계획이
었다.
고민했던 것들
▪ 어떻게 하면 여러 환경(dev, qa, prod)에 대해 비슷한 형태의 인프라를
효율적으로 만들고 관리할 수 있을까?
▪ 인프라를 구성하면서 문서화는 최소한으로 할 수 있고 쉽게 현재 인프
라 구성을 공유할 수 있는 방법은 어떤 것이 있을까?
Terraform을 이용하면 해결할 수 있지 않을까
?
▪ 여러가지 환경에 유사한 인프라 구축 과정에서 반복되는 작업을 없애고 휴먼 에
러를 줄일 수 있지 않을까 기대
▪ 코드를 통해 인프라 구성이 표현되므로 문서화를 최소화할 수 있고 온보딩 기간
을 단축할 수 있지 않을까 기대
초기 Terraform 패키지 구조
▪ Google Cloud security foundations guide 을 주
로 참고
▪ 전체 클라우드 리소스를 큰 티어로 구분
(org, networks, workloads ...)
▪ 리소스의 성격, 업데이트 빈도, 리소스의 중
요도
▪ 각 티어 패키지 안에는 각 환경별, 서비스별 리
소스가 포함되어 있는 구조
▪ 사용하다보니 장단점이 느껴짐
초기 Terraform 패키지 구조
▪ Google Cloud security foundations guide 을 주
로 참고
▪ 전체 클라우드 리소스를 큰 티어로 구분
(org, networks, workloads ...)
▪ 리소스의 성격, 업데이트 빈도, 리소스의 중
요도
▪ 각 티어 패키지 안에는 각 환경별, 서비스별 리
소스가 포함되어 있는 구조
▪ 사용하다보니 장단점이 느껴짐
초기 Terraform 패키지 구조
▪ Google Cloud security foundations guide 을 주
로 참고
▪ 전체 클라우드 리소스를 큰 티어로 구분
(org, networks, workloads ...)
▪ 리소스의 성격, 업데이트 빈도, 리소스의 중
요도
▪ 각 티어 패키지 안에는 각 환경별, 서비스별 리
소스가 포함되어 있는 구조
▪ 사용하다보니 장단점이 느껴짐
Terraform으로 관리하기 어려운 클라우드 리
소스들이 존재했다.
▪ 처음엔 모든 클라우드 리소스에 대해서 Terraform으로 관리하고자 했었다.
▪ GCP Provider가 지원하지 않는 리소스도 존재한다.
▪ 관리하기위해 너무 많은 권한이 필요한 리소스도 존재했고 이를 고려하지 못했
다.
▪ Folder, Project, IAM …
Terraform으로 관리하기 어려운 부분들은 과
감하게 버리자
▪ 주로 관리하기 위해 높은 권한이 필요한 리소
스에 대해서 삭제
▪ 삭제된 리소스에 대해서는 어떻게 관리할지
에 대해 문서화
▪ org, environments 와 같이 많은 권한이 필요
한 모듈들은 삭제, networks, workloads 등
관리할 수 있는 모듈들을 집중해서 관리
모듈이 늘어나면서 버전 관리가 어려워졌다. 그
리고 반복되는 코드들이 너무 많이 보인다.
▪ 각 모듈마다 Terraform required_version과 Provider required_version이 다름
▪ 엔지니어마다 다른 버전의 Terraform을 사용
▪ Terraform, Provider 버전을 모듈 내 versions.tf 라는 파일에 작성하는데 모듈
을 만들 때마다 versions.tf 이라는 파일을 만들고 같은 코드를 계속 작성
해줘야 함
▪ 모든 환경에 대해 동일한 변수들도 존재
▪ region 과 같은 값들은 모든 환경에서 동일한 값이 사용됨
Terragrunt comes to the rescue!
▪ Terragrunt 활용
▪ 반복되는 Terraform 코드를 줄여줄 수 있는
도구
▪ Terraform wrapper로 구현됨
▪ terragrunt plan, terragrunt plan
Terragrunt comes to the rescue!
▪ tfenv, tgenv
▪ nvm, pyenv와 동일한 역할을 해주는 도구
▪ .terraform-version, .terragrunt-version
파일을 통해 엔지니어들은 정해진 버전의
Terraform, Terragrunt를 사용할 수 있도록 강제
Terragrunt comes to the rescue!
▪ Terraform, Provider 버전을 명시하는 설정
(versions.tf) 은 글로벌하게 한 곳에서 관리
▪ terragrunt.global.hcl
/terragrunt.global.hcl
/networks/service-x/qa/terragrunt.hcl
Terragrunt comes to the rescue!
▪ .terraform.global.tfvars 파일과 각 모듈의
terragrunt.hcl 파일을 통해 전역 변수 관리
/terragrunt.global.hcl
Terraform 환경에서 팀원과 효과적인
협업과 안정적인 배포를 위해 했었던
일들
새로운 팀원과 현재 인프라 상태를 실시간으
로 공유할 수 없다
▪ 이전에는 현재 인프라 상태를 나타내는 tfstate 파일을 git에서 관리
▪ 그렇기 때문에 특정 구성원의 작업물이 remote에 merge 되기 전에는 최신 상태
를 알기 어려운 문제가 존재
팀원과 상태를 실시간으로 공유할 수 있도록
백엔드 스토리지를 사용하자
▪ Google Cloud Storage (GCS)에 state
를 관리함으로써 실시간으로 인프라
상태를 알 수 있다.
▪ 공식 문서에 설명이 자세히 나와있고
마이그레이션 과정도 쉬웠다.
다음 스테이지로 배포하기 위해서 너무 많은
변경이 필요하다
▪ 점점 인프라 복잡도가 증가
▪ staging에서 충분히 테스트한 설정들을 최대한 변경 없이 production에 배포할
수 있어야 한다.
▪ 당시에는 많은 설정들을 다음 스테이지에 배포하기 위해 가져와야 했고 휴먼 에
러 가능성이 높았다.
다음 스테이지로 배포하기 위해서 너무 많은
변경이 필요하다
▪ 다음 스테이지로 넘어가기 위해 많은 설정들을 빠진 것 없는지 체크하며 가져와
야 함
다음 스테이지로 배포하기 위해서 너무 많은
변경이 필요하다
▪ 다음 스테이지로 넘어가기 위해 많은 설정들을 빠진 것 없는지 체크하며 가져와
야 함
networks/dev/main.tf networks/qa/main.tf
변경을 줄이기 위해 하위 모듈을 묶어 추상화
된 모듈을 만듦
▪ 인프라 구성의 큰 부분을 다시 묶어 추상화
변경을 줄이기 위해 하위 모듈을 묶어 추상화
된 모듈을 만듦
▪ 인프라 구성의 큰 부분을 다시 묶어 추상화
networks/base/main.tf networks/{dev|qa|prod}/main.tf
팀원과 원활하게 협업할 수 있는 환경이 필요
하다
▪ 새로운 팀원도 Terraform에 대해서 숙련되지 않은 상황
▪ 실수 없이 퀄리티를 유지하며 태스크를 진행하기 위해서는 서로의 작업을 먼저
리뷰하고 배포할 수 있는 환경이 절실히 필요했음
GitOps 방식의 Terraform CI/CD 파이프라인
을 만들자
▪ 설정이 코드로 관리되기 때문에 PR을 이용하여 코드를 리뷰하고 merge 되었을
때 해당 작업물이 실제로 클라우드에 반영되는 방식을 생각
▪ 당시 2주라는 여유가 존재했고, 이 기간동안 다른 일은 모두 멈추고
Terraform CI/CD 파이프라인 구축하는데 집중
GitOps 방식의 Terraform CI/CD 파이프라인
을 만들자 - Dev, QA
GitOps 방식의 Terraform CI/CD 파이프라인
을 만들자 - Prod
왜 Jenkins를 사용했나?
▪ Self-hosting 가능한 구조
▪ Credential 관리가 가능
▪ RBAC를 통해 권한 분리 가능
▪ 빌드 로그에서 Credential에 대한 정
보는 마스킹되어 출력
▪ 승인 과정 구현 가능
getoutsidedoor.com
github.com/zeroFruit
@FruitZero
Thank You
● https://services.google.com/fh/files/misc/google-cloud-security-
foundations-guide.pdf
● https://github.com/terraform-google-modules/terraform-example-
foundation
● https://www.terraform.io/docs/language/settings/backends/gcs.ht
ml
● https://terragrunt.gruntwork.io/
Reference
HashiTalk 2021 - Terraform 도입과 파이프라인 구축 및 운영

More Related Content

PDF
네이버클라우드플랫폼 온라인 교육 시리즈 - Terraform을 이용한 네이버클라우드플랫폼 인프라 만들기(윤성훈 클라우드 솔루션 아키텍트)
PDF
Terraform을 이용한 Infrastructure as Code 실전 구성하기
PDF
Terraform을 이용한 Infrastructure as Code 실전 구성하기 :: 변정훈::AWS Summit Seoul 2018
PDF
Packer, Terraform, Vault를 이용해 만드는 
재현 가능한 게임 인프라
PDF
Terraform을 기반한 AWS 기반 대규모 마이크로서비스 인프라 운영 노하우 - 이용욱, 삼성전자 :: AWS Summit Seoul ...
PDF
[열린기술공방] Container기반의 DevOps - 클라우드 네이티브
PDF
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
PDF
1st-BE-sideproject-GDGonCampus_KyungHee_Univ.pdf
네이버클라우드플랫폼 온라인 교육 시리즈 - Terraform을 이용한 네이버클라우드플랫폼 인프라 만들기(윤성훈 클라우드 솔루션 아키텍트)
Terraform을 이용한 Infrastructure as Code 실전 구성하기
Terraform을 이용한 Infrastructure as Code 실전 구성하기 :: 변정훈::AWS Summit Seoul 2018
Packer, Terraform, Vault를 이용해 만드는 
재현 가능한 게임 인프라
Terraform을 기반한 AWS 기반 대규모 마이크로서비스 인프라 운영 노하우 - 이용욱, 삼성전자 :: AWS Summit Seoul ...
[열린기술공방] Container기반의 DevOps - 클라우드 네이티브
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
1st-BE-sideproject-GDGonCampus_KyungHee_Univ.pdf

Similar to HashiTalk 2021 - Terraform 도입과 파이프라인 구축 및 운영 (20)

PDF
[애플리케이션 현대화 및 개발] 파트너 세션 | 모던 인프라스트럭쳐 아키텍쳐 - 서호석 이사, 영우디지탈
PDF
Configuring global infrastructure in terraform
PDF
Atlassian 트러블슈팅 및 가상화기반 Confluence Data Center 구축 - 오픈소스...
PDF
[오픈소스컨설팅]Atlassian 트러블 슈팅 가상화 기반의 Atlassian Data Center 구축 최지웅 컨설팅코치
PDF
[오픈소스컨설팅] VMware 대안 검토를 위한 프라이빗 클라우드 솔루션 제언
PPTX
Infra as Code with Packer, Ansible and Terraform
PPTX
System Infra와 Recovery 그리고 DevOps
PPTX
MSA와 infra
PDF
[제3회 스포카콘] Kubernetes in Spoqa
PDF
클라우드 이야기1 2 20160823-신인철_slideshare
PDF
[Games on AWS 2019] AWS 사용자를 위한 만랩 달성 트랙 | 코드 기반으로 인프라 운영하기 - 박성훈 NEOWIZ 팀장,...
PDF
[오픈소스컨설팅] Hybrid Cloud 전환점_VM과 컨테이너를 통합하는 클라우드 네이티브 기반 Private Cloud 전략.pdf
PDF
(Red hat]private cloud-osp-introduction(samuel)2017-0530(printed)
PDF
20180602 BIT computer - AWS를 활용한 클라우드 기반 웹 개발 1주차
PDF
20181108 HBSmith에서는 이렇게 AWS IaC로 배포한다
PDF
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
PDF
클라우드 네이티브 전환 요소 및 성공적인 쿠버네티스 도입 전략
PDF
비트교육센터-AWS활용 1주차: EC2, S3, Elastic Beanstalks 사용
PDF
『오픈스택 인 액션』 - 맛보기
PDF
인프라 자동 배포를 위한 AWS CloudFormation 고급 활용법 - AWS Summit Seoul 2017
[애플리케이션 현대화 및 개발] 파트너 세션 | 모던 인프라스트럭쳐 아키텍쳐 - 서호석 이사, 영우디지탈
Configuring global infrastructure in terraform
Atlassian 트러블슈팅 및 가상화기반 Confluence Data Center 구축 - 오픈소스...
[오픈소스컨설팅]Atlassian 트러블 슈팅 가상화 기반의 Atlassian Data Center 구축 최지웅 컨설팅코치
[오픈소스컨설팅] VMware 대안 검토를 위한 프라이빗 클라우드 솔루션 제언
Infra as Code with Packer, Ansible and Terraform
System Infra와 Recovery 그리고 DevOps
MSA와 infra
[제3회 스포카콘] Kubernetes in Spoqa
클라우드 이야기1 2 20160823-신인철_slideshare
[Games on AWS 2019] AWS 사용자를 위한 만랩 달성 트랙 | 코드 기반으로 인프라 운영하기 - 박성훈 NEOWIZ 팀장,...
[오픈소스컨설팅] Hybrid Cloud 전환점_VM과 컨테이너를 통합하는 클라우드 네이티브 기반 Private Cloud 전략.pdf
(Red hat]private cloud-osp-introduction(samuel)2017-0530(printed)
20180602 BIT computer - AWS를 활용한 클라우드 기반 웹 개발 1주차
20181108 HBSmith에서는 이렇게 AWS IaC로 배포한다
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
클라우드 네이티브 전환 요소 및 성공적인 쿠버네티스 도입 전략
비트교육센터-AWS활용 1주차: EC2, S3, Elastic Beanstalks 사용
『오픈스택 인 액션』 - 맛보기
인프라 자동 배포를 위한 AWS CloudFormation 고급 활용법 - AWS Summit Seoul 2017
Ad

HashiTalk 2021 - Terraform 도입과 파이프라인 구축 및 운영

  • 1. DevOps Eng. at HAECHI-LABS 김주형 he/him Terraform 도입과 파이 프라인 구축 및 운영
  • 2. 발표 내용 ▪ Terraform 도입 배경과 도입 초기 시행착오들 ▪ Terraform 환경에서 팀원과 효과적인 협업과 안정적인 배포를 위해 했었던 일 들
  • 3. Terraform 도입 배경과 도입 초기 시행착오들
  • 4. 새로운 프로젝트? ▪ 비트코인 수탁 등 법인, 기관 투자자를 위한 디지털 자산 수탁 서비스 ▪ KB, Hashed, HAECHI-LABS 합작 법인 KODA 서비스 ▪ 장기적으로 지속될 가능성이 높은 프로젝트였다. ▪ 우선은 혼자 인프라 구축을 시작하지만 가까운 시일내에 팀원이 합류할 계획이 었다.
  • 5. 고민했던 것들 ▪ 어떻게 하면 여러 환경(dev, qa, prod)에 대해 비슷한 형태의 인프라를 효율적으로 만들고 관리할 수 있을까? ▪ 인프라를 구성하면서 문서화는 최소한으로 할 수 있고 쉽게 현재 인프 라 구성을 공유할 수 있는 방법은 어떤 것이 있을까?
  • 6. Terraform을 이용하면 해결할 수 있지 않을까 ? ▪ 여러가지 환경에 유사한 인프라 구축 과정에서 반복되는 작업을 없애고 휴먼 에 러를 줄일 수 있지 않을까 기대 ▪ 코드를 통해 인프라 구성이 표현되므로 문서화를 최소화할 수 있고 온보딩 기간 을 단축할 수 있지 않을까 기대
  • 7. 초기 Terraform 패키지 구조 ▪ Google Cloud security foundations guide 을 주 로 참고 ▪ 전체 클라우드 리소스를 큰 티어로 구분 (org, networks, workloads ...) ▪ 리소스의 성격, 업데이트 빈도, 리소스의 중 요도 ▪ 각 티어 패키지 안에는 각 환경별, 서비스별 리 소스가 포함되어 있는 구조 ▪ 사용하다보니 장단점이 느껴짐
  • 8. 초기 Terraform 패키지 구조 ▪ Google Cloud security foundations guide 을 주 로 참고 ▪ 전체 클라우드 리소스를 큰 티어로 구분 (org, networks, workloads ...) ▪ 리소스의 성격, 업데이트 빈도, 리소스의 중 요도 ▪ 각 티어 패키지 안에는 각 환경별, 서비스별 리 소스가 포함되어 있는 구조 ▪ 사용하다보니 장단점이 느껴짐
  • 9. 초기 Terraform 패키지 구조 ▪ Google Cloud security foundations guide 을 주 로 참고 ▪ 전체 클라우드 리소스를 큰 티어로 구분 (org, networks, workloads ...) ▪ 리소스의 성격, 업데이트 빈도, 리소스의 중 요도 ▪ 각 티어 패키지 안에는 각 환경별, 서비스별 리 소스가 포함되어 있는 구조 ▪ 사용하다보니 장단점이 느껴짐
  • 10. Terraform으로 관리하기 어려운 클라우드 리 소스들이 존재했다. ▪ 처음엔 모든 클라우드 리소스에 대해서 Terraform으로 관리하고자 했었다. ▪ GCP Provider가 지원하지 않는 리소스도 존재한다. ▪ 관리하기위해 너무 많은 권한이 필요한 리소스도 존재했고 이를 고려하지 못했 다. ▪ Folder, Project, IAM …
  • 11. Terraform으로 관리하기 어려운 부분들은 과 감하게 버리자 ▪ 주로 관리하기 위해 높은 권한이 필요한 리소 스에 대해서 삭제 ▪ 삭제된 리소스에 대해서는 어떻게 관리할지 에 대해 문서화 ▪ org, environments 와 같이 많은 권한이 필요 한 모듈들은 삭제, networks, workloads 등 관리할 수 있는 모듈들을 집중해서 관리
  • 12. 모듈이 늘어나면서 버전 관리가 어려워졌다. 그 리고 반복되는 코드들이 너무 많이 보인다. ▪ 각 모듈마다 Terraform required_version과 Provider required_version이 다름 ▪ 엔지니어마다 다른 버전의 Terraform을 사용 ▪ Terraform, Provider 버전을 모듈 내 versions.tf 라는 파일에 작성하는데 모듈 을 만들 때마다 versions.tf 이라는 파일을 만들고 같은 코드를 계속 작성 해줘야 함 ▪ 모든 환경에 대해 동일한 변수들도 존재 ▪ region 과 같은 값들은 모든 환경에서 동일한 값이 사용됨
  • 13. Terragrunt comes to the rescue! ▪ Terragrunt 활용 ▪ 반복되는 Terraform 코드를 줄여줄 수 있는 도구 ▪ Terraform wrapper로 구현됨 ▪ terragrunt plan, terragrunt plan
  • 14. Terragrunt comes to the rescue! ▪ tfenv, tgenv ▪ nvm, pyenv와 동일한 역할을 해주는 도구 ▪ .terraform-version, .terragrunt-version 파일을 통해 엔지니어들은 정해진 버전의 Terraform, Terragrunt를 사용할 수 있도록 강제
  • 15. Terragrunt comes to the rescue! ▪ Terraform, Provider 버전을 명시하는 설정 (versions.tf) 은 글로벌하게 한 곳에서 관리 ▪ terragrunt.global.hcl /terragrunt.global.hcl /networks/service-x/qa/terragrunt.hcl
  • 16. Terragrunt comes to the rescue! ▪ .terraform.global.tfvars 파일과 각 모듈의 terragrunt.hcl 파일을 통해 전역 변수 관리 /terragrunt.global.hcl
  • 17. Terraform 환경에서 팀원과 효과적인 협업과 안정적인 배포를 위해 했었던 일들
  • 18. 새로운 팀원과 현재 인프라 상태를 실시간으 로 공유할 수 없다 ▪ 이전에는 현재 인프라 상태를 나타내는 tfstate 파일을 git에서 관리 ▪ 그렇기 때문에 특정 구성원의 작업물이 remote에 merge 되기 전에는 최신 상태 를 알기 어려운 문제가 존재
  • 19. 팀원과 상태를 실시간으로 공유할 수 있도록 백엔드 스토리지를 사용하자 ▪ Google Cloud Storage (GCS)에 state 를 관리함으로써 실시간으로 인프라 상태를 알 수 있다. ▪ 공식 문서에 설명이 자세히 나와있고 마이그레이션 과정도 쉬웠다.
  • 20. 다음 스테이지로 배포하기 위해서 너무 많은 변경이 필요하다 ▪ 점점 인프라 복잡도가 증가 ▪ staging에서 충분히 테스트한 설정들을 최대한 변경 없이 production에 배포할 수 있어야 한다. ▪ 당시에는 많은 설정들을 다음 스테이지에 배포하기 위해 가져와야 했고 휴먼 에 러 가능성이 높았다.
  • 21. 다음 스테이지로 배포하기 위해서 너무 많은 변경이 필요하다 ▪ 다음 스테이지로 넘어가기 위해 많은 설정들을 빠진 것 없는지 체크하며 가져와 야 함
  • 22. 다음 스테이지로 배포하기 위해서 너무 많은 변경이 필요하다 ▪ 다음 스테이지로 넘어가기 위해 많은 설정들을 빠진 것 없는지 체크하며 가져와 야 함 networks/dev/main.tf networks/qa/main.tf
  • 23. 변경을 줄이기 위해 하위 모듈을 묶어 추상화 된 모듈을 만듦 ▪ 인프라 구성의 큰 부분을 다시 묶어 추상화
  • 24. 변경을 줄이기 위해 하위 모듈을 묶어 추상화 된 모듈을 만듦 ▪ 인프라 구성의 큰 부분을 다시 묶어 추상화 networks/base/main.tf networks/{dev|qa|prod}/main.tf
  • 25. 팀원과 원활하게 협업할 수 있는 환경이 필요 하다 ▪ 새로운 팀원도 Terraform에 대해서 숙련되지 않은 상황 ▪ 실수 없이 퀄리티를 유지하며 태스크를 진행하기 위해서는 서로의 작업을 먼저 리뷰하고 배포할 수 있는 환경이 절실히 필요했음
  • 26. GitOps 방식의 Terraform CI/CD 파이프라인 을 만들자 ▪ 설정이 코드로 관리되기 때문에 PR을 이용하여 코드를 리뷰하고 merge 되었을 때 해당 작업물이 실제로 클라우드에 반영되는 방식을 생각 ▪ 당시 2주라는 여유가 존재했고, 이 기간동안 다른 일은 모두 멈추고 Terraform CI/CD 파이프라인 구축하는데 집중
  • 27. GitOps 방식의 Terraform CI/CD 파이프라인 을 만들자 - Dev, QA
  • 28. GitOps 방식의 Terraform CI/CD 파이프라인 을 만들자 - Prod
  • 29. 왜 Jenkins를 사용했나? ▪ Self-hosting 가능한 구조 ▪ Credential 관리가 가능 ▪ RBAC를 통해 권한 분리 가능 ▪ 빌드 로그에서 Credential에 대한 정 보는 마스킹되어 출력 ▪ 승인 과정 구현 가능
  • 31. ● https://services.google.com/fh/files/misc/google-cloud-security- foundations-guide.pdf ● https://github.com/terraform-google-modules/terraform-example- foundation ● https://www.terraform.io/docs/language/settings/backends/gcs.ht ml ● https://terragrunt.gruntwork.io/ Reference