마짱짱의 지식창고

[Terraform] Associate 준비 & 문제풀이 & 개념정리 본문

Automation/Terraform

[Terraform] Associate 준비 & 문제풀이 & 개념정리

마짱짱 2021. 6. 16. 14:43
반응형

https://learn.hashicorp.com/tutorials/terraform/associate-review?in=terraform/certification#review-guide 

해당 주소를 참고로 준비했습니다.

21. 06 16 기준으로 작성되었습니다.


AWS 를 사용중이고 AWS리전에 두개의 단일 EC2 인스턴스를 생성하려고 할때

단일구성으로 둘이상의 지역에서 리소스를 생성할 수 있는 방법

-> 동일한 provider에 alias를 붙여 구성한다.

provider "aws" {
  region = "us-east-1"
}

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

 

Version Constraints 는 Terraform Registry 또는 Terraform Cloud의 개인 Registry와 같은 모듈 레지스트리에서 설치된 모듈에 대해서만 지원됩니다.

-> https://www.terraform.io/docs/language/modules/syntax.html 

 

Terraform Open Source 는 Local laptop 이나 Workstaiton에 Statefile 저장되는것이 기본값 입니다.

-> https://www.terraform.io/docs/language/state/index.html 

 

Sentinel 은 Hashicorp Ent. 제품에 통합된 Code frameWork 정책입니다.

정책외 인프라의 프로비저닝을 방지하는 Proactive 서비스 입니다.

-> https://www.hashicorp.com/blog/using-terraform-to-improve-infrastructure-security

 

Terraform List

-> 0으로 시작하는 연속 정수로 식별되는 일련의 값

-> 목록의 모든 요소는 항상 동일한 유형이어야 한다.

-> ["a",15,true] 는 가능한 표현이다.

 

TF_LOGS 환경변수는 자세한 Terraform Log가 stderr에  표시될 수 있습니다.

->https://www.terraform.io/docs/internals/debugging.html

 

Terraform의 Backend는 상태가 로드되는 방법과같은 작업 apply 실행되는 방법을 결정합니다.

->https://www.terraform.io/docs/language/settings/backends/index.html

 

변수 유형중 여러 구별 유형의 여러 값을 단일값으로 그룹화 할 수 있는 것은?

-> tuple, object

 

Provider은 상속을 통해 암시적으로 Provider 블록내의 인수를 통해 명시적으로 2가지방법으로 하위 모듈에 전달할 수 있습니다.

 

IaC 사용했을때의 이점

-> 인프라 구축하는 것을 자동화합니다.

-> 재해 복구 전력이 될 수 있습니다.

-> 인프라 구성의 버전제어를 제동하여 단일 소스를 제공합니다.

-> 여러번 사용가능

-> 롤백하는 기능 제공

->https://learn.hashicorp.com/tutorials/terraform/infrastructure-as-code

 

Terraform Cloud

-> 상태를 요청하는 사용자의 신원을 알고 상태변경내역을 유지합니다. / 엑세스를 제어하고 활동을 추적하는 사용

-> 항상 미사용 상태를 암호화하고 TLS를 이용하여 전송중인 데이터를 보호합니다.

 

구성이 더이상 존재하지 않을떄 Terraform 구성파일에서 하나이 상의 리소스를 삭제할때 삭제해야하는 리소스와 순서를 결정하는 법

-> 상태 내에서 가장 최근 종속성 집합의 복사본을 유지합니다.

구성에서 하나이상의 항목을 삭제하더라도 삭제할 항목과 상태에서 올바른 폐기 순서를 결정할 수 있습니다.

 

유료 클라우드 관리도구를 사용하여 AWS의 리소스를 관리하고 있을때 이 관리도구를 중단하고 Terraform 을 활용하여 IaC로 이동하여 비용을 절감하고자 하려합니다. 기존 리소스를 다시 만들지않고 코드를 짜는 방법은?

-> Terraform import 명령을 사용하여 Terraform의 상태파일에 기존 인프라를 추가하여 Terraform이 해당 인프라를 인식하고 관리 할 수 있습니다.

 

호출 Module은 자식 Module 리소스 속성에 직접 엑세스 할 수 있습니다.

 

Module 의 source

-> hostname / namespace / name / provider

 

Terrform 의 기본 유형 제약

-> Bool, String

 

로컷 값의 표현이 다른 로컬을 참조할 수 있습니다. 하지만 일반적인 참조주기는 허용되지 않습니다.

즉, 자신이나 자신을 참조하는 변수를 참조할 수 없습니다.

 

Terraform을 사용하여 DB와 같은 리소스를 관리할때 사용자 이름 및 비밀번호와 같은 민감한 데이터를 보화기 위해 취해야 하는 보안 조치방법

-> 민감한 데이터의 state를 sensitive state 설정하고 암호화하며 전송중인 데이터를 TLS로 보호

-> 백엔드에 엑세스 할 수있는 사용자를 엄격하게 제어

-> state를 원격으로 저장

-> https://www.terraform.io/docs/language/state/sensitive-data.html

 

Terraform Module을 생성하고 회사의 private repository 에 push 했을때, 이 모듈에 버그가 있음을 확인하여 hotfix 지점에서 새 지점을 확인하고 Master로 수정했습니다. 새 모듈 코드를 병합하기 전에 mastser를 어떻게 수정하는가

Module "vpc" {

  source = git::URL/vpc.git?ref=hotfix

}

 

State 또는 Plan 파일에서 사람이 읽을 수있는 출력을 얻기위 해 사용하는 명령어는?

-> terraform show

-> https://www.terraform.io/docs/language/state/sensitive-data.html

 

"export TF_LOG =" 해당하는 명령어는 무엇을 의미하는가

-> 상세 LOG를 disable 합니다

-> https://www.terraform.io/docs/cli/config/environment-variables.html#tf_log

 

사람이 보기쉽게 .tf 정리해주는 명령어는?

-> terraform fmt

 

terraform import는 한번에 하나의 리소스만 가져 올 수 있습니다.

-> 추후 업데이트하여 기능개선한다고 합니다.

https://www.terraform.io/docs/cli/import/usage.html

 

DEV디렉토리 아래에 새 작업 공간을 만들고 로컬 백엔드로 명령을 /home/quiz_experts/iac/실행 terraform init하여 terraform을 초기화했습니다 \. 를 실행하면 Terraform은 상태 데이터를 어디에 작성합니까

-> ...~~/terraform.tfstate.d/DEV/terraform.tfstate

 

Terraform 레지스트리는 공용 레지스트리입니다. 이러한 탐색 가능한 모듈 마켓 플레이스를 비공개로 사용하려면 Terraform Cloud 또는 Enterprise 버전에서 사용 가능한 비공개 레지스트리를 사용해야합니다.

 

module "name" {

 source = "./consul"

}

 

Terraform 구성에는 하나 이상의 모듈이 있습니다.

 

로컬 값을 사용하는 경우

로컬 값은 구성에서 동일한 값이나 표현식을 여러 번 반복하는 것을 방지하는 데 도움이 될 수 있지만, 과도하게 사용되면 사용 된 실제 값을 숨겨 향후 유지 관리자가 구성을 읽기 어렵게 만들 수도 있습니다.

단일 값이나 결과가 많은 장소에서 사용되는 상황에서, 단지 적당히 지역의 값을 사용 하고 값이 미래에 변경 될 가능성이 있음. 중앙에서 가치를 쉽게 변경할 수있는 능력은 지역 가치의 주요 장점입니다.

 

변수선언할때 할수없는 변수명

-> source, version, providers, count, for_each, lifecycle, depends_on, locals

 

다른 프로세스가 로컬상태 파일을 잠금해제할 수 없습니다.

 

원격 상태를 통해 팀은 추가 구성 저장소에 의존하지 않고 읽기 전용 방식으로 인프라 리소스를 공유 할 수 있습니다.

-> https://www.terraform.io/docs/language/state/remote.html#delegation-and-teamwork

 

Terraform CLI를 실행하는 머신에서 명령을 호출하는 데 사용할 수있는 프로비저닝 도구

-> local-exec

-> https://www.terraform.io/docs/language/resources/provisioners/local-exec.html

 

 

Terraform 0.12의 경우 terraform init명령이 수행하는 작업

-> Module 블록을 검색하고 참조된 모듈의 소스 코드는 소스 인수에 지정된 위치에서 검색

-> 구성에서 공급자에 대한 직접 및 간접 참조를 검색하고 HashiCorp에서 배포한 플로그인을 로드

-> 백엔드 구성을 위한 루트 구성 디렉터리를 확인하고 선택한 백엔드를 초기화

 

terraform state

-> 항목을 이동

-> 상태 수정 및 업데이트

-> 고급상태 관리

 

 

비공개 git repo에서 모듈을 소싱하는 경우 접근방식을 어떻게 해야하는가

-> 별도의 태그를 만들고 production에 안정적인 tag를 사용하고 스테이징에 새 태그를 사용

->https://www.terraform.io/docs/language/modules/sources.html#selecting-a-revision

 

terraform state를 lock 했을때  terraform apply 명령을 실행하여 인프라를 변경할 수 없습니다.

이문제를 해결하려면 어떻게 해야하는가

-> force-unlock 명령어를 사용하요 상태를 수동으로 잠금해제

 

terraform은 공급자 종속성을 어떻게 새엉하고 특정 공급자가 필요한 이유는?

-> 구성의 리소스 또는 데이터 블록에서 특정 provider 에 속하는 모든 리소스 사용

-> 선택적으로 버전 제약조건을 포함하여 국성에서 provider 블록을 명시적으로 사용

-> 특정 공급자에 속하는 리소스가 구성에서 제거되었지만 현재 state에 있습니다.

 

Terraform 변수설정시 동일한 변수에 여러값이 할당된 경우 마지막 변수가 적용된다.

변수순위

       * 환경 변수

       * terraform.tfvars파일 (있는 경우).

       * terraform.tfvars.json파일 (있는 경우).

       * 파일 이름의 어휘 순서로 처리 된 모든 *.auto.tfvars또는 *.auto.tfvars.json파일.

       * 제공된 순서대로 명령 줄의 모든 -var및 -var-file옵션.

          (여기에는 Terraform Cloud 작업 공간에서 설정 한 변수가 포함됩니다.)

 

Cloud 에서 새 VM을 시작하기위해 Terraform Module을 만들었습니다.

몇 개의 vm이  terraform plan 과 apply 명령이 있는 개발환경에서 테스트하는동안 정상적으로 실행되었을때 프로덕션에서 이 모듈을 사용하고 수백개의 VM을 시작했으며 시간의 지남에 따라 plan 과 apply의 속도 저하가 관찰되었습니다.

속도저하의 원인은?

-> 많은 클라우드 provider은 한번에 여러 리소스를 쿼리하는 API를 제공하지않는다.

->클라우드 provider들은 APi 속도 제한이 있따.

-> 대규모 인프라의 경우 현재상태의 리소스를 파악하기에 시간이 오래걸린다.

 

Terraform 유료기능

-> Role/Team Management

-> Cost Estimation

-> Sentinel Policy as Code Management

 

Terraform을 사용하면 단일 구성을 사용하여 여러 공급자의 리소스를 관리하고 클라우드 간 종속성을 처리 할 수 있습니다.

 

단일 백엔드 내에서 단일 구성의 여러 인스턴스를 편하게 전환하는 방법

-> Name Workspace

-> https://www.terraform.io/docs/language/state/workspaces.html

 

사용자가 실수로 terraform 구성에서 원격백엔드를 삭제하면 기존 리소스 및 상태 파일에 어떤 영향이 있을까?

-> terraform apply 명령을 하여도 오류가 바생하니다.

terraform을 다시 초기화 해야하며 원격 상태에서 관리하는 리소스를 계속 관리 할수 있도록 기존 원격상태를 로컬 백엔드로 마이그레이션 하라는 메세지가 표시 된다.

 

Production 사용을위해 terraform 구성에서 허용되는 공급자 버전을 제한해야 하는 이유

-> Provider은 terraform과는 별도의 리듬으로 출시 된 플러그인이므로 provider은 자체 번호를 가지고 있으며 버전 제약으로 terraform init 인해 향후 변경사항이있는 새버전이 자동으로 설치되지 않습니다.

 

terraform 최신버전 업그레이드

-> terraform init -upgrade

 

terraform 구성에서 dynamic block 에 대한 단점

-> 과도하게 사용시 구성을 읽고 유지하기가 어려울 수 있습니다.

-> https://www.terraform.io/docs/language/expressions/dynamic-blocks.html

 

Module은 상위 모듈의 모든 변수를 엑세스할 수 없습니다.

 

DevOps가 EC2 생성할때 암호화되지않는 볼륨을 확인하고 이를 암호화 했을때

동일한 구성에서 다시 실행하면 어떻게 될 것인가

-> 암호화는 여전히 구성에 정의된 원하는 상태가 아니기 댸문에 terraform apply 를 실행하면  state파일을 업데이트하고 실행중인 EC2를 건드리지 않습니다.

 

Terraform 은 AWS와 같은 물리적 공급자에만 국한되지 않습니다.

공유 terraform 구성을 사용하여 이를 블랙박스 도구로 사용하여 서비스를 관리 할 수 있습니다.

 

계획된 작업이 예상되는지 확인하기위해 사용하는 명령어

-> terraform show

 

Sentinel은 Hashicorp Ent. 제품에 통합된 코드 프레임 워크로서의 정책입니다.

terraform의 어느 단계에서 인프라에 대해 Sentinel이 시행하는 사용자 정의정책이 일어나는지

-> Terraform apply의 plan과 run 사이

 

terraform 상태에서 리소스를 제거하면 리서ㅗ스가 실제 인프라에서 물리적으로 destory되지 않습니다.

 

terraform state mv 명령으로 자원을 완전히 새로운 상태로 이동할 수 있습니다.

 

bool 은 false, "false" 둘다 사용 가능하다.

 

terrform 언어는 사용자 정의 함수를 지원하지 않습니다.

 

terraform 프로비저닝 블록은 리소스 구성 블록내에서만 작동합니다.

 

Monolithic 구성에서 모듈사용에 대한 올바른 설명

-> 모듈은 구성의 일관서을 제공하고 이해하기 쉽게 도와준다.

-> 검증되고 테스트되고 문서화 된 인프라를 재사용 할 수있다.

-> 모듈을 사용하여 구성버전을 지정할 수 있습니다.

-> 작성한 구성을 팀 또는 일반 대중과 공유하여 노력의 이점을 얻을 수 있다.

 

기본적으로 실패한 프로비저닝 도구는 terraform apply자체적으로도 실패합니다. 프로비저닝 도구 실패시 Terraform이 실패하지 않도록

-> on_failure = continue

 

terraform state의 목적

-> 리소스 종속성과 같은 메타데이터를 추적

-> 구성을 실제 리소스애 매핑

-> 성능 향상을 위해 모든 리소스에 대한 속성 값, 캐시를 state에 저장

 

Terraform Cloud의 각 작업공간은 이전 상태 파일의 백업을 유지

 

terraform init 으로는 이미 설치된 모듈을 업그레이드 하지 않습니다

그러므로 terraform init -upgrade 를 입력해야합니다.

 

Terraform 은 Go Lang 으로 이루어져 있습니다.

 

구성에 정의된 단일 모듈 블록에서 모듈의 여러 인스턴스를 만들 수 있는 방법

-> for_each 또는 count 인수를 사용하여 여러 인스턴스를 만들 수 있씁니다.

-> Terraform 0.13 버전에 추가되었습니다.

 

terraform 에서 데이터소스를 읽는 단계

-> terraform plan

 

terraformd의 state내 모든 리소스를 나열하는 명령어

->terraform state list

 

단일 리소스의 속성을 표시하는 명령어

-> terraform state show

 

min 명령어

-> min(1,2,3)

-> min([1,2,3,]...

 

 

 

 

 

 

 

 

 

 

 

 

반응형