Terraform study week6(feat.t101)

murphybread·2023년 8월 12일

해당 교제를 기반으로 진행한 스터디한 내용을 정리한 것입니다
테라폼으로 시작하는 IaC https://www.yes24.com/Product/Goods/119179333

소스는 다음의 링크에서 확인 가능합니다
https://github.com/murphybread/t101

이번 주 도전 과제 내용은 다음과 같습니다

  1. TFC의 다양한 기능들을 테스트 해보세요
  2. TFC의 No-Code Provisioning - 링크
  3. TFC의 Private Registry - 링크
  4. TFC의 Project 레이어 - 링크

제목

사용사례

코드

설명

(optional) Improvement or Bugfix


1. TFC의 다양한 기능들을 테스트 해보세요

사용사례

중앙에서 변수 설정이 가능하게 됩니다. 변수라는 것이 로컬에서 쓰이는것, 모두가 같이 통일하는것등 다양한 유형이 존재할 텐데요 그 중에서 중앙에서 일괄적으로 관리해야하는 변수가 있을 수 있습니다. 일반적인 tag나 특정 EC2의 타입일 수 있겠지요? 그런 변수들을 테라폼클라우드의 변수를 통해 관리하면 충돌문제를 없앨 수 있고 또 다른 환경에서도 쉽게 적용할 수 있습니다. 이외에도 테라폼의 경우 인프라를 배포하는 만금 비용 관리가 어려울 수 있으니 공용계정을 사용할 수 있는데요. 이 공용 계정에 권한이나 스위칭등 개인 로컬에서 사용하는 경우 관리가 어려울 수 있습니다. 이 때 테라폼 클라우드를 통해 해당 계정을 변수처리하여 유저로 사용한다면 쉽게 관리가 가능합니다

코드

provider "aws" {
  region = "us-west-2"
}

resource "aws_instance" "my_instance" {
  ami           = "ami-0c55b159cbfafe1f0" # Amazon Linux 2 LTS AMI ID
  instance_type = "t2.micro"

  tags = {
    Name = "MyInstance"
  }
}

설명

코드 자체는 간단한 EC2를 생성하는 코드입니다. 하지만 이를 tfcloud에서 구현한다면 다음과 같은 오류가 나옵니다

보시는 바와같이 credential즉 권한이 없기 때문인데요. 다음 링크를 통해 이미 정해진 변수인 AWS-ACCOUNT를 설정해줍니다.
AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY입니다
https://developer.hashicorp.com/terraform/tutorials/cloud-get-started/cloud-create-variable-set

해당 변수를 설정해주면 다음과같이 AWS 유저가 설정이 돼서 배포가 이루어집니다

즉 이번 경우는 팀 모두가 공용 계정을 통해 AWS를 배포라는 사례에 적용할 수 있습니다

(optional) Improvement or Bugfix

개선점으로는 변수를 set로 설정하여 모든 프로젝트에 사용하는 방법입니다. 이번 변수 사용은 특정 레포에 한정 됐는데 그러다보니 다른 프로젝트에서는 해당 변수를 다시 설정해줘야하는 번거로움 및 휴먼에러의 가능성이 있기에 모든 프로젝트에서 사용가능한 변수 set를 활용하는 것이 더욱 탄력적인 사용방법이라고 할 수 있습니다


2. TFC의 No-Code Provisioning - 링크

사용사례

간단히 말해 Terraform Cloud GUI에서 Cloudformation 매개 변수와 같이 값을 전달하여 리소스를 만들 수 있습니다
예를 들어 모듈에서 DB를 생성할 때 인스턴스 타입을 배포할 때마다 원하는 대로 선택해서 배포가 가능할 수 있습니다

코드

resource "random_pet" "random" {
  length = 2
}

resource "aws_db_instance" "education" {
  identifier             = "${var.db_name}-${random_pet.random.id}"
  instance_class         = var.db_instance_class
  allocated_storage      = 5
  engine                 = "postgres"
  engine_version         = "14.1"
  username               = var.db_username
  password               = var.db_password
  skip_final_snapshot    = true
}

variable "db_name" {
  description = "Unique name to assign to RDS instance"
  default     = "t101"
}

variable "db_instance_class" {
  type        = string
  description = "The type of database instance to create"
  default     = "db.t2.micro"
}

variable "db_username" {
  description = "Username for the database instance"
  default     = "admin"
}

variable "db_password" {
  description = "Password for the database instance"
  default     = "yourpassword"
}

설명

앞서 설명드리면 해당 기능은 유료 플랜인 plus부터 가능하다고 나오기에 제대로 구현하지는 못했습니다 자세한 내용은 해당 링크 확인
https://dev.classmethod.jp/articles/terraform-cloud-no-code-provisioning/

처음 레포양식 이름에 맞게 등록하여 모듈을 레지스트리에 등록합니다
tag 부착후 해당 모듈을 사용하기위한 설정을 진행합니다
하지만 사용하고 있는 플랜이 free라서 할 수 있는것은 여기까지...

(optional) Improvement or Bugfix

사실 이 기능은 제대로 테스트는 못해봤습니다. 특정 유료플랜이상이라고 표기 되기에...


TFC의 Private Registry

사용사례

테라폼의 모듈을 사용할 때 퍼블릭하게 사용하는 것이 아닌 회사 내부의 프라이빗한 공간에 업로드하여 사용하고 싶을 때 사용이 가능합니다. 다음의 두가지 동작이 가능합니다

  • 프라이빗한 레포에 등록하여 모든 모듈을 프라이빗하게 관리
  • 퍼블릭한 레포에 등록 후 특정 모듈은 퍼블릭하게 공개

자세한 내용은 해당 링크 참고
https://dev.classmethod.jp/articles/terraform-cloud-private-registry-module-publish/

코드

이번 프라이빗은 제대로 수행하지 못함

설명

프라이빗한 환경에서의 권한 문제 때문에 연동이 제대로 이루어지지 않음

(optional) Improvement or Bugfix


TFC의 Project 레이어


다음과 같이 쉽게 그룹, 조직 관리가 가능함

Variable sets의 범위에 Project를 선택할 수 있습니다. (2023/4/28 업데이트)

사용사례

테라폼을 배포하는데 있어서 세세하게 plan만 가능하게 하고 apply를 제한할 수 있을 것이다. 예를 들어 merge를 아무나 하는것이 아닌 특정 사용자만 가능하게 하는 것과 비슷하다고 볼 수 있다.

Workspace를 작성하려면 Owner 권한이 필요합니다. Owner 권한을 모든 사람에게 부여할 위험이 있습니다.

따라서 팀에서 Terraform 운용하고 있지만, Workspace 작성만 Owner에 의뢰하는 운용을 하고 있는 경우가 있을까 생각합니다.

Project별로 Admin 권한을 부여하면 해당 Project 내에서만 Workspace를 만들 수 있습니다. 팀에 Workspace 작성 권한을 부여함으로써 셀프 서비스도 드릴 것 같습니다.

코드

설명

해당 기능은 standard 유료 플랜부터 가능

해당 내용으로 진행되는 내용은 다음의 링크에서 잘 설명 돼있다.
https://dev.classmethod.jp/articles/update-terraform-cloud-add-project/

(optional) Improvement or Bugfix

profile
어제를 후회하지 않고, 오늘을 살며, 내일을 걱정하지 않는 삶이 되도록 노력중

1개의 댓글

comment-user-thumbnail
2023년 8월 12일

이렇게 유용한 정보를 공유해주셔서 감사합니다.

답글 달기