Terraform에서 기능 전환 사용 방법

바퀴를 재발명하여 더욱 좋아지게 하다


나는 이 주제에 관한 몇 편의 문장을 보았는데, Hashicorp doc 을 포함한다. 그러나 한 편도 없기 때문에, 나는 전형적인 "나는 이 모든 일을 다시 써야 한다. 왜냐하면 그것은 엉망이기 때문이다."라는 소프트웨어 엔지니어 방법을 채택했다😄.

기능 전환이란 무엇입니까?


기능 전환을 통해 부울 값(진짜/가짜)을 통해 소프트웨어 기능을 활성화하거나 비활성화할 수 있습니다.

기능 전환을 사용하는 이유


내가 보기에 가장 큰 두 가지 이유는 다음과 같다.
  • 안전
  • 옵션
  • 새 기능을 전환하면 기존 소프트웨어에 영향을 주지 않고 새 기능을 시작할 수 있습니다.나는 대형 SaaS 회사에서 일하는데, 우리는 이런 방법을 광범위하게 보급한다.선택적으로 열기/닫기 기능을 통해 우리는 테스트 버전 고객에게 다른 누구에게도 영향을 주지 않고 같은 코드 라이브러리를 사용할 수 있는 실험적인 기능을 내놓을 수 있다.또 다른 요소는 원가 최적화인데 특히Terraform 등 인프라 시설 소프트웨어에 있다.아마도 나는 비용을 지불하는 고객을 위해 부하 균형이나 집단을 실현하고 싶다. 그러면 나는 층별 서비스를 제공하고 고객의 수요에 따라 맞춤형 배치를 할 수 있을 것이다.

    잠입


    This remainder of the article assumes you have prior knowledge of or experience with Terraform


    Here's the example repo we'll be following along with
    가령 우리가digitalocean에nginxweb 서버를 설정할 수 있는 모듈이 있다면, 특정 환경의 비용을 제어하기 위해 스위치를 사용해서 부하 균형을 사용하거나 사용하지 않는 것이 가장 좋다.그게 어떻게 될까요?
    이상적인 경우, 나는 부하 균형기를 만들 수 있는 모듈이 하나 있기를 희망한다. 또는 그렇지 않다.
    module "web_servers" {
      source                 = "./modules/web_servers"
      instance_count         = var.instance_count
      load_balancing_enabled = var.load_balancing_enabled
    }
    
    load_balancing_enabled의 표지는 소비자에게 선택을 제공하는 데 매우 유용하다.

    전환 생성 방법


    부하 균형에는 몇 개의 관건적인 구성 요소가 있는데, 우리는 여러 대의 서버가 필요하고, 모든 설정된 서버를 이해하기 위해 부하 균형기가 필요하다.digitalocean_droplet 자원을 만듭니다. 이 자원은 얼마나 많은 실례를 만듭니까? 그리고 부하 균형기가 있습니다. 그 뒤에 모든 실례가 있습니다.
    resource "digitalocean_droplet" "web" {
      count     = var.instance_count
      name      = "web-${count.index}"
      size      = var.instance_size
      image     = var.image
      region    = var.region
      user_data = var.user_data == "" ? file("${path.module}/files/cloud-init.yaml") : var.user_data
    }
    
    resource "digitalocean_loadbalancer" "public" {
      count  = var.load_balancing_enabled ? 1 : 0
      name   = "web-servers-loadbalancer"
      region = var.region
    
      forwarding_rule {
        entry_port     = 80
        entry_protocol = "http"
    
        target_port     = 80
        target_protocol = "http"
      }
    
      healthcheck {
        port     = 22
        protocol = "tcp"
      }
    
      droplet_ids = digitalocean_droplet.web.*.id
    }
    

    세다


    terraform 모듈에 우리가 여러 가지 실례를 알려줄 때, 그 모듈을 어떻게 명명합니까?Terraform은 멋진 메타 매개변수count를 지원합니다.메타 매개 변수는 공급자(DO, AWS, GCP, Azure 등)와 독립된 테라form 리소스에 적용할 수 있는 언어 기능일 뿐이다.count 모듈 매개 변수는 count를 교체기로 하는 그룹에서 for 순환을 실행하는 것처럼 자원을 만들 것입니다.
    resource "digitalocean_droplet" "web" {
      count = var.instance_count
      name  = "web-${count.index}"
    
    따라서 instance_count2인 경우 두 개의 리소스(서버)가 생성되고 다음과 같이 이름이 지정됩니다.
  • web-0
  • web-1
  • Terraform은 count 메타 매개 변수를 제공할 때마다 이 리소스를 Terraform state 의 배열로 저장합니다. 이름은 다음과 같습니다.
  • digitalocean_droplet.web[0] 또는 digitalocean_droplet.web.0
  • digitalocean_droplet.web[1] 또는 digitalocean_droplet.web.1
  • 이것은 중요한 개념이다. 만약 우리가 선택적으로 물건을 닫고 열려고 한다면, 우리는 그것을 count 또는 1로 설정할 수 있도록 모든 것에 0 원 파라미터를 사용해야 한다. 예를 들어 물건을 만들거나 만들지 않을 수 있기 때문이다.
    다음 사용법count을 살펴보겠습니다.
    resource "digitalocean_loadbalancer" "public" {
      count  = var.load_balancing_enabled ? 1 : 0
    
    여기서 우리는 삼원 연산자를 aconditional expression in Terraform로 사용한다.위 코드는 다음과 같습니다.
    if (load_balancing_enabled) {
        create()
    } else {
        do_nothing()
    }
    

    자원을 창조하다


    Terraform이 어떻게 응답하는지 알아보기 위해 이 매개 변수를 가지고 놀자.
    계속하려면digitalocean 계정create an API token이 필요합니다.
    # Set digitalocean token for authentication
    export DIGITALOCEAN_TOKEN=XXXXX
    # Clone the repo
    git clone https://github.com/circa10a/terraform-feature-toggle-example.git/
    # Change directory into the repo
    cd terraform-feature-toggle-example/
    # Install web_servers module and digitalocean provider
    terraform init
    
    만약 당신이 환매 협의 중의 문서를 보신다면, 우리는 default.auto.tfvars 파일을 가지고 있어서 설정을 쉽게 변경할 수 있습니다.
    기본 설정은 다음과 같습니다.
    instance_count = 1
    load_balancing_enabled = false
    
    이것은 액체 방울과 무부하 밸런스를 만들 것입니다.다음은 terraform apply의 출력입니다.
    ❯ terraform apply -auto-approve
    
    module.web_servers.digitalocean_droplet.web[0]: Creating...
    module.web_servers.digitalocean_droplet.web[0]: Still creating... [10s elapsed]
    module.web_servers.digitalocean_droplet.web[0]: Still creating... [20s elapsed]
    module.web_servers.digitalocean_droplet.web[0]: Still creating... [30s elapsed]
    module.web_servers.digitalocean_droplet.web[0]: Creation complete after 34s [id=227920620]
    
    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
    
    Outputs:
    
    droplet_ips = [
      "167.172.28.220",
    ]
    load_balancer_ip = ""
    

    출력


    이제 Terraform이 생겼습니다. 전환 변수를 사용해서 무엇을 만들지 결정할 수 있습니다.모듈web_servers 생성1 인스턴스 및 로드 밸런싱 없음에 대해 알려드렸습니다. 이를 변경하고 수정default.auto.tfvars 파일을 통해 로드 밸런싱을 활성화하고 보유load_balancing_enabled = true:
    instance_count = 1
    load_balancing_enabled = true
    
    지금 다시 실행terraform apply:
    ❯ terraform apply -auto-approve
    
    module.web_servers.digitalocean_droplet.web[0]: Refreshing state... [id=227920620]
    module.web_servers.digitalocean_loadbalancer.public[0]: Creating...
    module.web_servers.digitalocean_loadbalancer.public[0]: Still creating... [10s elapsed]
    module.web_servers.digitalocean_loadbalancer.public[0]: Still creating... [20s elapsed]
    module.web_servers.digitalocean_loadbalancer.public[0]: Still creating... [30s elapsed]
    module.web_servers.digitalocean_loadbalancer.public[0]: Still creating... [40s elapsed]
    module.web_servers.digitalocean_loadbalancer.public[0]: Still creating... [50s elapsed]
    module.web_servers.digitalocean_loadbalancer.public[0]: Still creating... [1m0s elapsed]
    module.web_servers.digitalocean_loadbalancer.public[0]: Still creating... [1m10s elapsed]
    module.web_servers.digitalocean_loadbalancer.public[0]: Creation complete after 1m19s [id=fc36d0bf-12e5-4d7c-a9c2-06f3859588c5]
    
    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
    
    Outputs:
    
    droplet_ips = [
      "167.172.28.220",
    ]
    load_balancer_ip = "144.126.248.10"
    

    경탄할 만한!🎉 🎉 🎉


    부하 밸런스를 만들고 있습니다. load_balancing_enabledtrue 로 설정하지만, 대기 outputs 는 다르기 때문입니다.
    load_balancing_enabled일 경우false:
    Outputs:
    
    droplet_ips = [
      "167.172.28.220",
    ]
    load_balancer_ip = ""
    
    load_balancing_enabled:
    Changes to Outputs:
    Outputs:
    
    droplet_ips = [
      "167.172.28.220",
    ]
    load_balancer_ip = "144.126.248.10"
    
    우리는 지금 true 출력이 하나 있다.이것은 두 가지 원인 때문이다.
    1.우리가 보면load_balancer_ip
    output "droplet_ips" {
      value = digitalocean_droplet.web.*.ipv4_address
    }
    
    output "load_balancer_ip" {
      value = var.load_balancing_enabled ? digitalocean_loadbalancer.public.0.ip : ""
    }
    
    우리의 모듈은 modules/web_server/outputs.tf 변수를 바탕으로 부하 평형기의 ip를 조건부로 출력합니다.var.load_balancing_enabled라면 true 또는 digitalocean_loadbalancer.public.0.ip의 값을 제시한다.

    본론으로 돌아가다


    그렇다면 왜 산출 자원 가치가 이 수준""에 이르렀을까?0 원 매개 변수에 대한 설명을 기억하신다면 count가 설정된 모든 자원은 수조 형식으로 그 자원을 출력할 것입니다. 따라서 이 예에서 우리는 count 인용0 자원의 첫 번째 (유일한) ip 속성을 사용할 수 밖에 없습니다.
    2. 우리의 주요digitalocean_loadbalancer.public는 프로젝트 루트 디렉터리에 위치하고 모듈에서 상술한 값을 출력한다. 아래와 같다.
    output "droplet_ips" {
      value = module.web_servers.droplet_ips
    }
    
    output "load_balancer_ip" {
      value = module.web_servers.load_balancer_ip
    }
    

    요점을 요약하고 다시 말하다.


    Terraform의 outputs.tf 와 삼원 연산자 덕분에 Terraform의 모듈 설정을 매우 직관적으로 할 수 있습니다.
    Terraform에서 기능을 전환하면 다음과 같은 추가 이점이 있습니다.
  • 배포와 배포를 분리
  • 운영자와 소비자를 위한 맞춤형 구성
  • 필요하거나 필요하지 않은 리소스 비용 절감
  • 실행 count 을 잊지 말고 우리가 만든 자원을 삭제하십시오!그렇지 않으면 너는 계산서에서 비용을 볼 수 있을 것이다.

    도구책

  • GitHub Repo
  • 추가 자원


    Spacelift 더 많은 지형 언어의 특성과 용법에 관한 우수한 문장이 있다.우주 엘리베이터Terraform Functions, Expressions, and Loops를 타고 체크아웃하세요!

    좋은 웹페이지 즐겨찾기