본문 바로가기
교육

[94일 차] 21.12.06 : Terraform 3

by ballena 2021. 12. 6.

Terraform - 데이터 소스 참조, 모듈


1교시

 

 

저번 시간 복습

  • 상태 파일 격리

-> 전체를 날려버리는 위험을 고려해 분리된 환경으로 상태 저장 파일을 격리한다.

  • 원격 백엔드 기능 사용

-> 수동 오류/잠금/시크릿 문제를 해결하기 위해 원격 백엔드 기능 사용 : S3 버킷과 DynamoDB 사용

  • 테라폼에서의 모듈

-> ex) VPC 모듈을 하나 만들면 이름만 다르게 해서 모듈을 끌어다 쓰면 손쉽게 인프라 복제 가능

  • 파일 레이아웃을 이용한 격리

-> 구성 요소 배포의 확인이 쉬워지고 장애 발생 시 손상 최소화

단점은 

1. 한 번의 명령으로 전체 인프라를 만들 수 없다 : 각 폴더의 main.tf마다 apply를 해줘야 한다.

2. 리소스 종속성을 사용하기 어렵다 : 다른 폴더의 속성에 직접 액세스 불가

 

2번 단점의 해결을 위해 terraform_remote_state 데이터 소스 솔루션 사용

 

상태 저장 파일에는 배포된 인프라에 대한 정보가 있다

-> IP 주소, 포트 번호 등 모든 정보가 있다

이 정보를 뽑아서 모아놓으면 다른 폴더에서 구성된 인프라의 정보에 액세스할 수 있다.

terraform_remote_state

DB 상태 저장 파일의 내용을 웹 서버의 var.tf에서 읽기 전용으로 읽어들인다

-> 웹 측에서 DB를 수정할 수는 없다. DB의 IP, 포트 정보 등만 볼 수 있게 한다

 

리소스의 내용을 다른 리소스에서 자동으로 참조하는 방식은 2가지

1. 속성 참조

동일한 테라폼 구성 파일에 있는 리소스에 대한 속성 참조

-> 대충 같은 폴더에 있어야 한다는 의미

 

2. 데이터 소스를 통한 속성 참조

같은 폴더의 구성 파일 내에 존재하지 않는 리소스에 대한 속성 참조.

-> 다른 폴더의 상태 저장 파일에서 내용을 읽어와야 하므로 참조하려는 속성이 AWS에 미리 배포가 되어 있는 상태여야 한다.


2교시

 

 

우선 global/s3에서 원격 백엔드를 위한 버킷과 테이블 생성(init, plan, apply)

그 후에 stage/data-stores/mysql에서 DB 생성 : 포트 번호와 주소 출력된다

 

이제 웹 서버의 main.tf 파일에서 DB의 정보가 필요한데...

DB 안의 엔드포인트와 포트 번호를 하드 코딩하지 말고 데이터 소스로 참조하자.

S3에 저장된 상태 정보 파일을 읽기 전용으로 가져오면 된다.


3~4교시

 

 

terraform_remote_state 데이터 소스는 DB가 상태를 저장하는 동일한 S3 버킷 및 폴더에서 상태 파일을 읽도록 코드를 구성한다.

웹 폴더의 main.tf에 작성

DB의 상태 정보 파일이 있는 S3 버킷과 그 안에서의 파일 경로를 변수로 가져온다

웹 폴더의 variables.tf

 

  • 사용자 데이터 입력을 파일로 빼놓기

template_file이라는 데이터 소스의 user_data라는 파일을 렌더링해서 user_data로 사용

aws_launch_configuration

이렇게 가져오기 전에

user-data.sh

이렇게 작성한 파일을

파일 가져오기

이렇게 가져온다

 

 

코드형 인프라는 다수의 리소스가 연결되어 있어 하나의 장애가 다른 리소스가 번질 수 있다.

-> 파일 레이아웃을 이용한 격리로 해결

 

지울 경우는 역순.

생성할 때 S3 버킷 > mysql > webserver 순으로 생성했으니 반대 순으로 삭제

 

 

여러 리전에 같은 인프라를 배포할 때는 어떻게 하지?

-> 폴더 분리로 같은 파일을 리전만 다르게 해서 사용? 

-> 이럴 때 사용하는 것이 모듈 개념.


5교시

 

 

목적에 따라 똑같은 인프라를 여러 개 배포할 필요가 있을 때는?

-> 반복적으로 수동으로 하는 것은 비효율적이다

그래서 사용하는 것이 모듈

-> 구성된 모듈을 어떻게 효율적으로 호출하는가?

 

 

모듈에는 provider 내용이 없다.

-> 루트 모듈에만 있고, 일반 모듈에는 없다

-> 리소스 내용만 있음

 

단일 모듈로는 배포하지 않는다.

 

코드에서 경로를 작성 시 보통 상대 경로로 작성


6교시

 

 

모듈은 하나인데 여러 곳에서 사용할 때 하드코딩된 이름 주의

-> 처음 모듈을 끌어다 사용할 때에는 문제가 없지만, 다른 곳에서 또 끌어 쓸 때 이름 중복 문제 발생

-> 입력 매개변수로 사용

 

모듈 폴더의 variables.tf에서 default 값을 작성하지 않는다

 

 

모듈 폴더의 variables.tf에서 작성된 변수명을 main.tf에서 끌어다 모듈 코드를 작성

 

이제 모듈을 끌어다 쓰는 main.tf에서 코드를 작성할 때에는

변수를 구분해야 한다.

테라폼에서 제공하는 변수는 source뿐이다.

아래 변수는 모듈에서 요구하는 입력 변수

 

-> 보통 resource 블록에서 사용하는 Argument들은 테라폼에서 지정한 것만 사용 가능하다.

-> module 블록에서 사용하는 Argument는 그런 것이 아니라는 의미다.

= 사용자 정의 입력 매개변수

루트 모듈 = 모듈을 사용하는 곳

일반적으로 모듈에서의 var 파일은 기본값을 지정하지 않다.


7~8교시

 

 

모듈 파일에서 sh 파일 등을 참조했다면, 모듈을 끌어 쓰는 파일의 폴더에도 같은 sh 파일을 두거나 path로 sh 파일의 경로를 명시해줘야 한다.

 

모듈 코드에서 하드 코딩된 내용은 그냥 싹 수정해야 한다.


1교시(09:50 ~ 10:10) 상태 파일 격리 설명 다시 듣기

4교시(12:40~12:50) 사용자 데이터 파일 설명 다시 듣기

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

[96일 차] 21.12.09 : Terraform 5  (0) 2021.12.08
[95일 차] 21.12.07 : Terraform 4  (0) 2021.12.07
[93일 차] 21.12.03 : Terraform 2  (0) 2021.12.03
[92일 차] 21.12.02 : Terraform 1  (0) 2021.12.02
[91일 차] 21.12.01 : Python 6  (0) 2021.12.01

댓글