마짱짱의 지식창고

[Terraform] Associate 준비(8) - 구성에 대해 생성,읽기,수정 본문

Automation/Terraform

[Terraform] Associate 준비(8) - 구성에 대해 생성,읽기,수정

마짱짱 2021. 7. 23. 15:33
반응형

Variable


Input Variable 은 Terraform 모듈의 매개변수 역할을 하여 Modul의 자체 소스 코드를 변경하지 않고 Module의 측면을 사용자 정의할 수 있도록 하고 Module을 서로 다른 구성 간에 공유 할 수 있도록 합니다.

 

다음과 같이사용합니다.

variable "region" {
  type    = list(string)
  default = ["asia-northeast-3"]
}

variable로 사용할수 없는 단어로는

예약어인 source, version, providers, count, for_each, lifecycle, depends_on, locals 가 있습니다.

 

또한 sensitive를 사용한다면 민감한 값을 plan이나 apply할때 출력하지 않습니다.

variable "user_information" {
  type = object({
    name    = string
    address = string
  })
  sensitive = true
}

resource "some_resource" "a" {
  name    = var.user_information.name
  address = var.user_information.address
}

result
Terraform will perform the following actions:

  # some_resource.a will be created
  + resource "some_resource" "a" {
      + name    = (sensitive)
      + address = (sensitive)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

 

변수를 사용할 때는 var.<NAME> 으로 사용합니다.

resource "google_compute_instance" "default" {
  name         = var.name
  ...
  }

 

변수의 우선순위로는

1. 환경변수

2. terraform.tfvars 파일

3. terraform.tfvars.json

4. 모든 *.auto.tfvars또는 *.auto.tfvars.json파일은 자신의 파일 이름의 어휘 순서대로 처리.

5. 제공된 순서대로 명령줄의 모든 -var및 -var-file옵션입니다. (여기에는 Terraform Cloud 작업 공간에서 설정한 변수가 포함됩니다.)


Output Value(출력값)은 terraform 모듈의 반환 값과 같으며 여러 용도로 사용합니다.

  • 자식 모듈은 출력을 사용하여 리소스 속성의 하위 집합을 부모 모듈에 노출할 수 있습니다.
  • 루트 모듈은 terraform apply 실행 후 출력을 사용하여 CLI 출력의 특정 값을 인쇄할 수 있습니다 
  • 원격 상태를 사용할 때 루트 모듈 출력은 terraform_remote_state데이터 소스 를 통해 다른 구성에서 액세스할 수 있습니다 .

 

아래와 같이 사용됩니다.

output "instance_ip_addr" {
  value = aws_instance.server.private_ip
}

 

또한 상위 모듈에서 하위모듈의 출력을 포현식에서 사용할수있습니다

module.<MODULE NAME>.<OUTPUT NAME> 

예를들어 하위 모듈이 web_server 일경우

module.web_server.instance_ip_addr 사용이 가능합니다.


Vault Provider

대부분의 Terraform 공급자는 자신이 래핑하는 타사 서비스와 상호 작용하기 위해 자격 증명이 필요합니다. 이 공급자는 이러한 자격 증명을 Vault에서 얻을 수 있도록 합니다. 즉, Terraform을 실행하는 운영자 또는 시스템은 다른 공급자의 자격 증명을 임시로 임대하기 위해 적절한 권한이 있는 Vault 토큰에만 액세스하면 됩니다.

 

현재 Terraform에는 데이터 소스를 통해 반환된 비밀을 수정하거나 보호하는 메커니즘이 없으므로 이 공급자를 통해 읽은 비밀은 Terraform 상태, 모든 계획 파일 및 경우에 따라 계획 및 적용 중에 생성된 콘솔 출력에 유지됩니다. 따라서 이러한 아티팩트는 모두 그에 따라 보호되어야 합니다.

 

이러한 비밀의 노출을 줄이기 위해 공급자는 TTL이 상대적으로 짧은(기본적으로 20분) Vault 토큰을 요청합니다. 즉, 가능한 경우 Vault는 그 시간 이후에 발급된 자격 증명을 취소하지만 특히 불가능합니다. Vault의 "일반" 비밀 백엔드에 저장된 것과 같은 정적 비밀을 철회합니다.

 

요청된 토큰 TTL은 max_lease_ttl_seconds 아래에 설명된 provider 인수 로 제어할 수 있습니다 . Terraform이 plan단계 중에 데이터 소스에서 읽고 결과를 계획에 쓴다는 점을 고려하는 것이 중요합니다 . 따라서 apply계획에 저장된 비밀의 취소로 인해 중간 토큰이 만료된 후에 실행하면 후속 작업 이 실패할 수 있습니다.

 

달리 명시된 경우를 제외하고 Vault에서 비밀을 읽는 리소스는 관련 리소스에 대한 읽기 기능 만 필요하도록 설계되었습니다 .


Resource

Terraform 언어에서 가장 중요한 요소입니다. 각 Resource Block은 가상 네트워크 , 인스턴스, DNS레코드와 같은 상위 수준 구성 요소와 같은 하나 이상의 인프라 개체를 설명합니다.


Data Source

DataSource를 통해 Terraform은 Terraform 외부에서 정의되거나 다른 별도의 Terraform 구성에 의해 정의 되거나 기능에 의해 수정된 정보를 사용할 수 있습니다.

 

# Find the latest available AMI that is tagged with Component = web
data "aws_ami" "web" {
  filter {
    name   = "state"
    values = ["available"]
  }

  filter {
    name   = "tag:Component"
    values = ["web"]
  }

  most_recent = true
}

이런식으로 정의 해놓고

 

resource "aws_instance" "web" {
  ami           = data.aws_ami.web.id
  instance_type = "t1.micro"
}

이런 방식으로 사용합니다

data.<TYPE>.<NAME>.<ATTRIBUTE>


Resource Address

전체 구성에서 식별이 제로 해당 문자열 이상의 자원 인스턴스입니다.

 

Count 예시

resource "aws_instance" "web" {
  # ...
  count = 4
}
aws_instance.web[3]

for_each 예시

resource "aws_instance" "web" {
  # ...
  for_each = {
    "terraform": "value1",
    "resource":  "value2",
    "indexing":  "value3",
    "example":   "value4",
  }
}
aws_instance.web["example"]

 

출처

https://www.terraform.io/docs/language/values/variables.html   

https://www.terraform.io/docs/language/values/outputs.html

https://registry.terraform.io/providers/hashicorp/vault/latest/docs

https://www.terraform.io/docs/language/data-sources/index.html

https://www.terraform.io/docs/language/expressions/references.html

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형