Terraform에서 기능 전환 사용 방법
바퀴를 재발명하여 더욱 좋아지게 하다
나는 이 주제에 관한 몇 편의 문장을 보았는데, Hashicorp doc 을 포함한다. 그러나 한 편도 없기 때문에, 나는 전형적인 "나는 이 모든 일을 다시 써야 한다. 왜냐하면 그것은 엉망이기 때문이다."라는 소프트웨어 엔지니어 방법을 채택했다😄.
기능 전환이란 무엇입니까?
기능 전환을 통해 부울 값(진짜/가짜)을 통해 소프트웨어 기능을 활성화하거나 비활성화할 수 있습니다.
기능 전환을 사용하는 이유
내가 보기에 가장 큰 두 가지 이유는 다음과 같다.
잠입
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_count
가 2
인 경우 두 개의 리소스(서버)가 생성되고 다음과 같이 이름이 지정됩니다.web-0
web-1
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_enabled
을 true
로 설정하지만, 대기 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
을 잊지 말고 우리가 만든 자원을 삭제하십시오!그렇지 않으면 너는 계산서에서 비용을 볼 수 있을 것이다.도구책
추가 자원
Spacelift 더 많은 지형 언어의 특성과 용법에 관한 우수한 문장이 있다.우주 엘리베이터Terraform Functions, Expressions, and Loops를 타고 체크아웃하세요!
Reference
이 문제에 관하여(Terraform에서 기능 전환 사용 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/circa10a/how-to-use-feature-toggles-with-terraform-28fi텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)