31. 인프라를 코드로 만들면 뭐가 좋아요?
•저장소에 있는 코드 == 현재 인프라의 상태
•커밋 메시지로 작업자의 의도 파악 가능
•코드 개발에서 사용하던 모든 선진문화를 가져올 수 있다.
•Git / Text-based Search / Code Review
32. AWS뿐만 아니라
•수많은 다른 Provider들
•Azure, GCP, DigitalOcean, Naver Cloud, Datadog
•실제로 Datadog 대시보드를 Terraform으로 관리 중
•서로 다른 Provider의 정보를 참조하는 코드를 짤 수 있다.
48. Vault EC2 Auth
•EC2의 PKCS#7 서명을 이용
•모든 EC2 인스턴스에 존재
•AWS만 서명할 수 있고
공개된 Public Key를 이용해 검증
49. Vault EC2 Auth
1. EC2 Metadata API를 호출해
PKCS#7 서명을 받아옴
2. Vault에 해당 서명을 전송
3. Vault는 공개된 Public Key를
이용해 서명이 유효한지 검증
4. 유효하다면 해당 EC2의 정보를 읽고
권한을 가진 토큰 부여
55. 다른 환경에 동일한 인프라 추가하기
•AWS 계정, Region과 VPC를
정의하는 core 모듈을 추가
•게임 모듈에서는
추가된 core를 불러서 쓰도록 구현
56. Core Module
•작업의 기초가 되는 AWS Account, AWS Region, VPC를 정의
•나머지 모듈은 Core의 Output에 의존
57. 적극적인 인프라 개선작업
•처음 세팅해야하는 Variable 전부 제거
•커밋 로그를 보고 이전 컨텍스트를 아는 사람 찾기가 수월해짐
•거대한 테라폼 모듈은 관리 가능한 단위 모듈로 분해
•어렵고 복잡한 작업 (IAM Policy 등)은 잘 해둔 사람이 짜놓은 모듈 쓰기
58. 오픈 소스 프로젝트
•슬프게도 아직 코드를 열어봐야 하는 경우가 종종 있다.
•https://github.com/hashicorp/terraform
•https://github.com/hashicorp/vault
•https://github.com/hashicorp/packer
59. 아직 남아있는 숙제
•기존 인프라 Terraform으로 완전히 옮겨오기
•전사 공용으로 사용할 수 있는 리소스 이름 규칙
•Vault로 받아온 Secret을 좀 더 접근하기 어렵게
60. 아직 남아있는 숙제
•기존 인프라 Terraform으로 완전히 옮겨오기
•전사 공용으로 사용할 수 있는 리소스 이름 규칙
•Vault로 받아온 Secret을 좀 더 접근하기 어렵게
61. Q&A
Q: Terraform state file 관리는 어찌하나요?
A: 현재는 Remote State로 S3를 사용하고 있습니다. 속도의 경우 Consul
이 확실히 빠른데, State에 Sensitive Data가 들어가는 일이 없잖이 있고,
Versioning 기능도 굉장히 유용해서 S3으로 결정했습니다.
62. Q&A
Q: 플랜을 해봐야 테라폼의 코드가 최신화되지않은 것을 알수있는데,
인프라 적용시점과 코드가 그에따라 커밋되고 푸쉬되는 시점은 언제인가요?
A: 작업자는 Apply까지 마친 후에 푸쉬합니다. 저장소에 있는 코드 상태가
인프라의 현재 상태를 나타내는걸 목적으로 하고 있습니다.
63. Q&A
Q: 기존에 존재하는 테라폼으로 구현되지않은 일부 인프라가 있고 약간의
연결만 있어도 콘솔과 사용을 병행하게되면 실제 환경과 테라폼 코드가 맞
지 않는 환경이 발생할 수 있는데 예방대책이 있나요?
A: 기본적으로 테라폼은 Apply 전에 현재 인프라 상태를 다시 한번 확인해
상태를 갱신하긴 합니다. 하지만 말씀하신 문제가 있어서 테라폼으로 관리
하는 리소스는 코드로만 수정하도록 하는게 이상적입니다. Strict하게 한다
면 AWS 콘솔에 접속하는 계정을 Readonly로만 설정하는 방법도 있겠지
만, 현재 적용하고 있지는 않습니다.
64. Q&A
Q: 테라폼 모듈화는 어떤 단위로 하셨나요?
A: 인프라 상에서 큰 의미를 갖는 단위 (게임 서버, 데이터베이스, 캐시 서
버) 를 한 모듈로 만듭니다. 다만 모듈과 모듈 사이의 관계 (Security Group
Rule) 등은 한 모듈에 들어있으면 의존성이 복잡하게 얽히기 쉬워서, 루트
모듈에 작성했습니다.