테라폼/T101[3기]

T101 - 5주차 / 01

시스템 엔지니어 2023. 10. 6. 23:19

목표

  • 협업 방법에 대해 알아본다
  • TFC에 대해 알아다

 

협업

  • 인프라 규모가 커지고 관리 팀원이 늘어날 수록 구성 코드 관리가 필요 → 서로 작성 코드 점검 및 협업 환경 구성

 

협업 방법 - VCS(Github), 중앙 저장소 도입

  • 테라폼 코드 형상관리를 위한 중앙 저장소 (git)
    • *.tf file
  • State 백엔드
    • state file
  • 이원화 관리 권장

이원화 관리 권장

 

 

실습 p219 ~ 233

깃허브 포크

  • 깃허브는 포크 fork 기능을 제공해 기존 리모트 저장소본인 소유의 저장소로 복사할 수 있다

 

포크를 한다

 

 

 

 

 

 

git 공유 제외 대상

 

  • 코드 파일 공유 시 깃 관리 대상 제외 → .gitignore 정의
    • .terraform 디렉터리 : init 실행 시 작성되므로 제외
    • .tfstate 파일 : 프로비저닝 결과 데이터 소스 정보, 민감 데이터가 포함
      • 백엔드 사용 필요
    • tfvars 파일 : 프로비저닝 시 적용할 변수 값을 보관하는 파일로, 작업자 마다 별도 변수 사용
    • 시크릿 파일 : 인프라 구성에 필요한 시크릿 정보 파일
    • terraformrc 파일 : 작업자의 CLI 설정 파일
# .gitignore
# Local .terraform directories
**/.terraform/*

# .tfstate files
*.tfstate
*.tfstate.*

# Crash log files
crash.log
crash.*.log

# Exclude all .tfvars files, which are likely to contain sensitive data, such as
# password, private keys, and other secrets. These should not be part of version 
# control as they are data points which are potentially sensitive and subject 
# to change depending on the environment.
*.tfvars
*.tfvars.json

# no creds
*.pem

# Ignore override files as they are usually used to override resources locally and so
# are not checked in
override.tf
override.tf.json
*_override.tf
*_override.tf.json

# Include override files you do wish to add to version control using negated pattern
# !example_override.tf

# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan
# example: *tfplan*

# Ignore CLI configuration files
.terraformrc
terraform.rc

 

gitignore 참고 사이트
https://www.toptal.com/developers/gitignore

 

 

 

 

생성 됬다!
스터디 멤버가 공유해준 사이트인데
관련 툴들을 알면.. 편한 세상!

 

 

 

 

로컬 저장소에 복제

 

MyGit=<각자 자신의 깃허브 계정>
git clone https://github.com/$MyGit/terraform-aws-collaboration

# 확인
tree terraform-aws-collaboration
cd terraform-aws-collaboration
git remote get-url origin
# 예시 : https://github.com/hyungwook0221/terraform-aws-collaboration

 

정상적으로 clone 했다.

 

 

 

 

 

코드 협업을 위한 1인 2역 테스트

 

두 작업자간 서로 푸시하는 경우 발생

 

 

 

 

 

 

=== 위는 로컬 저장소, 아래는 리모트 저장소 내용

현재 변경 사항 수락: 로컬 저장소 정보로 변경
수신 변경 사항 수락: 리모트 저장소 정보로 변경
두 변경 사항 수락: 두개의 데이터가 공존하게 됨
변경 사항 비교: vimdiff 와 같이 vsc에 비교하는 창 생

 

 

 

Terraform Cloud (TFC) 백엔드

  • SaaS 환경인 TFC(Terraform Cloud)를 제공하며 State 관리 기능은 무상을 제공
    • 제공 기능 : 기본 기능 무료, State 히스토리 관리, State lock 기본 제공, State 변경에 대한 비교 기능
    • Free Plan 업데이트 :
      • 사용자 5명
      • 리소스 500개
      • 보안 기능(SSO, Sentinel/OPA로 Policy 사용)
  • 테라폼 클라우드 가격정책 - [참고: Pricing, Feature]
    • Free : 리소스 500개 까지 무료 → 커뮤니티 버전
    • Standard : Free + 워크플로우 기능 추가 + 동시실행(Concurrency 개수 3개)
    • Plus : 정책, 보안, 신뢰성, 확장성 등 기업형 고객에게 적합(대규모 사용자를 위한 비용모델)
    • Enterprise : Plus와 대부분 유사하며 설치형 모델

 

 

TFC 계정 생성
free account 생성
https://app.terraform.io/

 

 

 

토큰으로 Terraform 로그인

 

7.4 실습(5주차 과제로 전환)

목표 : 아래 깃허브 저장소를 복제해 아래 조건에 만족하는 코드를 작성

  1. Terraform Cloud를 State 백엔드로 구성
    • Workspace 이름 : terraform-edu-part1-assessment
    • 실행 모드는 local
  2. AWS 공통 Tag : Project = “workshop”
  3. aws_instance는 반복문을 사용해 3개 구성
  4. EIP를 제거하고 EC2에서 public ip를 자체 사용하도록 구성
  5. placeholder 변수는 아래 3가지가 각각의 aws_instance에 적용되도록 구성
    • placekitten.com / placebear.com / placedog.net

 

 

Terraform Cloud Sate 백엔드가 정상 동작하는지 테스트 했다.

 

 

 

terraform {
  cloud {
    organization = "thumbsup"         # 생성한 ORG 이름 지정
    hostname     = "app.terraform.io"      # default
    workspaces {
      name = "terraform-edu-part1-assessment"  # 없으면 생성됨
    }
  }
  
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}

aws_instance는 반복문을 사용해 3개 구성
을 하기 위해 무작정 count = 3 을 추가해 보았다.

 

 

resource "aws_instance" "hashicat" {
  count = 3
  ami                         = data.aws_ami.ubuntu.id
  instance_type               = var.instance_type
  key_name                    = aws_key_pair.hashicat.key_name
  associate_public_ip_address = true
  subnet_id                   = aws_subnet.hashicat.id
  vpc_security_group_ids      = [aws_security_group.hashicat.id]

  tags = {
    Name = "${var.prefix}-hashicat-instance"
  }
}

 

 

 

 

 

125번째줄 에러가 났다.
EIP를 제거하고 EC2에서 public ip를 자체 사용하도록 구성
임으로 eip를 주석 처리 했다.

 

//  resource "aws_eip" "hashicat" {
//    instance = aws_instance.hashicat.id
//    vpc      = true
//  }

 

 

여러곳에서 에러가 났다.
130, 131, 2, 6

 

 

 

 

전부 주석처리를 했더니
"null_resource"의 "configure-cat-app" 에서 에러가 발생했다.
확인해 보니, 인스턴스에 접근해서 pem 파일도 옮기고, 아파치 배포를 한다.
그런데 기존에 eip를 통해서 배포를 했었던 것을 public ip로 변경해야 하는데..
count로 된 인스턴스 public ip 값을 어떻게 가져왔나 example를 훔쳐봤다..

 

 

 

아! 이런 방법이
example을 훔쳐봤는데 간단했다.

 

 

 

변경 했더니 인스턴스 3개가 배포 됬다!

 

 

 

 

placeholder 변수는 아래 3가지가 각각의 aws_instance에 적용되도록 구성
placekitten.com / placebear.com / placedog.net
검색을 해보니 변수로 호출 하는 것을 확인 했다.

 

 

 

변수 지정된 곳을 배열로 변경후에 호출하는 방식을 변경했다. 

 

 

 

 

재배포를 했지만, 이미지가 변경 되지 않았다.
remote-exec ssh inline 값을 수정후에
재배포하여도 기존 값이 변하지는 않는다는 것을 알수 있다.
destory 후에 재배포 해보겠다.

 

 

 

 

destroy 후에 재배포 하니깐
잘된다!

 

 

 

TFC 에도 이력이 잘 남아있다.

 

 

 

 

느낀점

마지막주 답게 내용이 엄청 많은 것 같다
협업이라는 내용에 대해 배우는 것이라서 어떻게 해야 좋을지 알아봤다
업무 절차를 정할때 많은 도움이 되었고
앞으로 테라폼 뿐만아니라 다양한 업무에서도
이번에 배운 협업 방식을 활용해
좀 더 효율적인 체계를 잡을 수 있을 것 같다.