Terraform
- 반복문 처리 : for_each
- 조건문 처리 : Boolean type의 매개 변수를 사용한 방식, count 매개 변수를 사용한 방식, 3항 연산자를 사용한 방식
1교시
count 매개 변수를 입력 매개변수로 받을 때, 리스트만 가능
for_each 표현식을 사용한 반복문 처리
-> 집합, 맵을 사용하여 전체 리소스의 여러 복사본 또는 리소스 내 인라인 블록의 여러 복사본 생성 가능
for_each = <COLLECTION>
COLLECTION은 루프를 처리할 집합 또는 맵
for_each의 값으로는 리스트를 사용할 수 없다.
-> toset(리스트)로 리스트를 딕셔너리 형태의 값(키:값)으로 변환해서 사용
-> 무작위 키 값: 리스트 요소 값
2교시
출력값을 뽑아낼 때에도 딕셔너리 형식에 맞게 뽑아야 한다.
리스트에서 했던 대로 리스트 인덱스 방식으로는 값을 뽑아낼 수 없다
리스트에서 첫 번째 요소 "neo"를 뽑아내려면 "리소스_유형.리소스명[0].반환값"의 형식을 사용했다.
딕셔너리에서 iam 사용자의 arn을 뽑아내려면?
위 결과에서 사용자 neo의 arn 값을 뽑아보자.
값을 바로 받아오려면 리스트와 비슷해 보이긴 하는데, 딕셔너리처럼 받아와 보자.
애초에 for_each를 사용한 리소스의 반환 형식이 딕셔너리니까 values()를 사용할 필요가 없다.
그럼 count에서 생겼던 문제는 여기서 어떤지 보자.
-> count에서는 중간에 있는 요소(여기서는 neo)를 삭제하면 뒤의 요소가 앞으로 당겨져서 의도치 않은 결과가 나왔다.
원래 의도 : neo 삭제
실제 결과 : neo가 trinity로 바뀌고, trinity가 삭제된다
앞에 있는 값 중 하나를 삭제해 보자. 딕셔너리 구조에서는 어떻게 될까?
네오와 트리니티는 변하지 않고 모피어스만 삭제되었다.
이번에는 인라인 블록을 만져보자.
실습 예시 : 모듈을 끌어다 클러스터를 만드는데, 오토 스케일링 그룹의 태그에 for_each 적용
변수를 추가해 준 후
tag 인라인 블록을 동적으로 만드는 구문
이걸 루트 모듈에 적용하면
입력 매개변수가 추가되었다.
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에 대한 접근 권한 부여
정책 생성 후
매개 변수가 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 |
댓글