본문 바로가기
교육

[96일 차] 21.12.09 : Terraform 5

by ballena 2021. 12. 8.

Terraform

- 반복문 처리 : for_each

- 조건문 처리 : Boolean type의 매개 변수를 사용한 방식, count 매개 변수를 사용한 방식, 3항 연산자를 사용한 방식


1교시

 

 

count 매개 변수를 입력 매개변수로 받을 때, 리스트만 가능

 

for_each 표현식을 사용한 반복문 처리

-> 집합, 맵을 사용하여 전체 리소스의 여러 복사본 또는 리소스 내 인라인 블록의 여러 복사본 생성 가능

 

for_each = <COLLECTION>

COLLECTION은 루프를 처리할 집합 또는 맵

for_each의 값으로는 리스트를 사용할 수 없다.

-> toset(리스트)로 리스트를 딕셔너리 형태의 값(키:값)으로 변환해서 사용

-> 무작위 키 값: 리스트 요소 값

for_each 예시


2교시

 

 

출력값을 뽑아낼 때에도 딕셔너리 형식에 맞게 뽑아야 한다.

리스트에서 했던 대로 리스트 인덱스 방식으로는 값을 뽑아낼 수 없다

 

리스트에서 첫 번째 요소 "neo"를 뽑아내려면 "리소스_유형.리소스명[0].반환값"의 형식을 사용했다.

딕셔너리에서 iam 사용자의 arn을 뽑아내려면?

이 중에서 하나를 뽑아보자

위 결과에서 사용자 neo의 arn 값을 뽑아보자.

count와 비슷해 보이지만 다르다.

값을 바로 받아오려면 리스트와 비슷해 보이긴 하는데, 딕셔너리처럼 받아와 보자.

키의 값으로 찾아서 받아오기

애초에 for_each를 사용한 리소스의 반환 형식이 딕셔너리니까 values()를 사용할 필요가 없다.

 

그럼 count에서 생겼던 문제는 여기서 어떤지 보자.

-> count에서는 중간에 있는 요소(여기서는 neo)를 삭제하면 뒤의 요소가 앞으로 당겨져서 의도치 않은 결과가 나왔다.

원래 의도 : neo 삭제

실제 결과 : neo가 trinity로 바뀌고, trinity가 삭제된다

 

앞에 있는 값 중 하나를 삭제해 보자. 딕셔너리 구조에서는 어떻게 될까?

모피어스 사용자를 삭제해 봤다.

네오와 트리니티는 변하지 않고 모피어스만 삭제되었다.

 

 

 

이번에는 인라인 블록을 만져보자.

 

실습 예시 : 모듈을 끌어다 클러스터를 만드는데, 오토 스케일링 그룹의 태그에 for_each 적용

modules/services/webserver-cluster/variables.tf

변수를 추가해 준 후

 

modules/services/webserver-cluster/main.tf

tag 인라인 블록을 동적으로 만드는 구문

이걸 루트 모듈에 적용하면

stage/services/webserver-cluster/main.tf

입력 매개변수가 추가되었다.


3교시

 

 

예전에 하던 대로 실습 클러스터 구축

: 백엔드를 위한 S3 apply > 클러스터에서 사용할 RDS apply > 클러스터 apply

 

결과 : ASG에 태그가 3개 생성됨.

-> Name, Owner, DeployedBy

 

 

if문 사용하기 살짝


4교시

 

 

출력을 리스트로 하려면 [ ]로 묶고, 딕셔너리로 하려면 { }로 묶고

 

for 문자열 지시자 기본 구분

%{for <item> in <collection>}

  <body>

%{end for}


5교시

 

 

조건문

-> 어떤 리소스에는 배포하지 않고, 특정 리소스에만 배포하고 싶을 경우 유용

 

테라폼은 if 조건문을 지원하지 않는다.

-> count 매개 변수를 사용한다 : 1이면 사본 하나, 0이면 사본 없음

 

count = <조건> ? <참일 경우의 값> : <거짓일 경우의 값>

조건문 예시


6교시

 

 

앞의 방식은 사용자가 명시적인 Boolean 값을 모듈에 전달해야 작동한다.

Boolean 값이 문자열 등의 더 복잡한 비교일 경우에는 어떻게 해야 하는가?

 

 

실습

1. 300초 동안 CPU 사용률이 평균 90% 이상일 때 경보 발생 : 모든 환경에 적용

2. CPU Credit이 부족할 때 경보 발생 : 적용되는 인스턴스 유형


7~8교시

 

 

위 내용은 count 매개변수를 활용한 단일 if 조건문 구현

 

이번에는 if-else 구문

-> 사용자에게 Cloudwatch에 대한 접근 권한 부여

일단 정책을 만들고

정책 생성 후

if-else나 다름없다

매개 변수가 true면 아래 리소스를, false면 위 리소스를 실행

 

이 코드에는 문제가 있다. prod와 stage에서 main들을 실행하는데, 하나를 실행하면 두 번째 배포에서 에러가 발생.

-> 이미 생성된 정책/사용자를 또 생성하려고 하니 에러 발생

 

-> 모듈에서 사용자/정책을 배포하지 말고 분리시켜야 한다.

 

저 정책/사용자 생성 부분에서 골치가 아팠다.

-> 사용자/정책 생성 부분을 분리시키던가, 머리를 더 굴려보던가


3교시(11:50 ~ 12:15) 다시 듣기

4교시 훑기

 

 

'교육' 카테고리의 다른 글

[98일 차] 21.12.10 : Docker  (0) 2021.12.10
[97일 차] 21.12.09 : Terraform 6  (0) 2021.12.09
[95일 차] 21.12.07 : Terraform 4  (0) 2021.12.07
[94일 차] 21.12.06 : Terraform 3  (0) 2021.12.06
[93일 차] 21.12.03 : Terraform 2  (0) 2021.12.03

댓글