반응형
tfenv 설치 : 테라폼 버전 관리 툴
# 설치
brew install tfenv
# 설치 가능 버전 확인
tfenv list-remote | head
# 현재 설치된 버전 확인
tfenv list
# 특정 버전 설치
#(옵션) export TFENV_ARCH=arm64 # mac Apple silicon M1/M2
tfenv install 1.2.3
# 특정 버전 사용
tfenv use 1.2.3
# 테라폼 버전 확인
terraform versionEC2, ALB, RDS Monitoring
## EC2
while true; do aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --filters Name=instance-state-name,Values=running --output text ; echo "------------------------------" ; sleep 1; done
## ALB
ALBDNS=$(terraform output -raw alb_dns_name)
while true; do curl --connect-timeout 1 http://$ALBDNS/ ; echo; echo "------------------------------"; date; sleep 1; done
## RDS
while true; do aws rds describe-db-instances --query "*[].[Endpoint.Address,Endpoint.Port,MasterUsername]" --output text ; echo "------------------------------" ; sleep 1; done프로덕션 수준의 인프라란 ?
- 서버, 데이터 저장소, 로드 밸런서, 보안 기능, 모니터링 및 경고 도구, 파이프라인 구축 및 비즈니스 운영에 필요한 기타 모든 기술을 의미 + 이중화 및 장애 대응 가능
오랜 시간이 걸리는 이유
- 데브옵스 산업이 성숙되지 않음
- 아직 산업의 초기 단계이며, ‘Cloud Computing, IaC, DevOps, Docker, k8s’ 등 도구의 출현과 기술이 빠르게 변하고 있으면 충분히 성숙되지 않았음
- 어떤 목적을 달성하기 위해 원래 목적과 전혀 상관없는 일들을 계속해야 하며 그중 마지막 작업에 해당함
- 수행해야 하는 작업의 체크 리스트가 너무 많다
- 문제는 대다수 개발자가 체크 리스트에 있는 대부분의 항목을 알지 못하기 때문에 프로젝트를 평가할 때 중요하고 시간이 많이 걸리는 세부 사항을 잊어버린다
프로덕션 수준 인프라 체크 리스트

프로덕션 수준 인프라 모듈
- 소형 모듈 Small modules
- 합성 가능한 모듈 Composable modules
- 테스트 가능한 모듈 Testable modules
- 릴리스 가능한 모듈 Versioned modules
- 테라폼 모듈 외의 것들 Beyond Terraform modules
소형 모듈
대형 모듈 단점 : 상태 파일 격리에서 알아본 것처럼 ‘개발-스테이징-프로덕션’ 모든 인프라 환경을 단일 파일 또는 단일 모듈로 정의하는 것을 좋지 않을뿐더러 유해한 것으로 간주함
- 속도가 느림 slow : 모든 인프라가 하나의 모듈에 정의되어 있으면 명령 실행 시 오래 걸림. terraform plan 시 20분 걸리기도 함
- 안전하지 않음 insecure : 모든 인프라가 하나의 모듈에 정의되어 있으면 어떤 것을 변경하려면 모든 액세스 권한이 필요함.
- 따라서 모든 사용자가 관리자 권한이 필요하여 최소 권한 원칙 principle of least privilege 에 위배
- 위험성이 높음 risky : 예를 들어 스테이징 환경에서 프런트엔드 앱을 변경 시 오타나 잘못된 명령으로 프로덕션 데이터베이스를 삭제할 수 있다
- 이해하기 어려움 understand : 한 곳에 코드가 많을수록 한 사람이 모든 것을 이해하기가 더 어려워짐.
- 리뷰하기 어려움 review : 수집 줄의 코드로 구성된 모듈을 리뷰하는 것으 쉽지만, 수천 줄의 코드로 구성된 모듈을 리뷰하는 것은 거의 불가능하다.
- terraform plan 실행 시 오래 거리고, plan 명령의 출력이 수천 줄이며 아무도 코드를 읽으려 하지 않는다.
- 이 경우 데이터베이스가 삭제될 것임을 나타내는 빨간색 코드를 누구도 발견하지 못할 수도 있습니다.
- 테스트하기 어려움 test : 인프라 코드 테스트는 어렵다. 다음 장에서 살펴볼 예정
방안 : 소형 모듈로 코드를 작성, 클린 코드 Clean Code 내용
- 함수의 첫 번째 규칙은 작어야 한다는 것입니다. The first rule of functions is that they should be small.
- 함수의 두 번째 규칙은 그보다 더 작아야 한다는 것입니다. The second rule of functions is that they should be smaller than that.
합성 가능한 모듈
재사용 가능하고 합성 가능한 모듈
- 외부에서 상태를 읽는 대신 입력 매개 변수를 통해 전달하고, 외부에 상태를 쓰는 대신 출력 매개 변수를 통해 계산 결과를 반환
- 모든 것을 입력 변수를 통해 전달하고 모든 것을 출력 변수를 통해 반환하며 간단한 모듈들을 결합해 더 복잡한 모듈을 만들수 있다.
- 실제 사용 시에는 더 나은 합성과 재사용을 위해 아래 실습 내용 보다 모듈을 더욱 세분화해야 할 수도 있습니다.
테스트 가능한 모듈
릴리스 가능한 모듈
Validations : 테라폼 0.13 validation blocks 은 입력 변수를 체크
- 아래는 instance_type 으로 t2.micro 와 t3.micro 만 사용할 수 있게 설정
버전 Versioned Modules : 오늘 실행하던, 3년 후에 실행하던 동일한 결과를 얻을 수 있어야 한다!
- 두 가지 유형 버전 고려 : Versioning of the module’s dependencies , Versioning of the module itself
- Versioning of the module’s dependencies : Terraform core, Providers, Modules
- Terraform core : The version of the terraform binary you depend on → 테라폼 실행 파일 버전
- Providers : The version of each provider your code depends on, such as the aws provider → 프로바이더 버전
- Modules : The version of each module you depend on that are pulled in via module blocks → 모듈 버전
- Terraform core 고정 : required_version 사용
테라폼 모듈 외의 것들
- Provisioners
- Provisioners with null_resource
- External data source
'Infrastructure as Code > Terraform' 카테고리의 다른 글
| Terraform With Windows (1) | 2024.06.02 |
|---|---|
| Terraform vs Ansible? (1) | 2024.06.02 |
| [T101 Study 6주차] 민감 정보 암호화 (0) | 2022.11.26 |
| [T101 Study 5주차] 반복문 & if문 (0) | 2022.11.26 |
| [T101 Study 4주차] 모듈 (0) | 2022.11.23 |