GCP

GCP + Terraform으로 클라우드 인프라 관리하기(2)

Seungwoo Lee 2020. 8. 10. 22:16

 

저번 글에 이어서 계속

 

 

Terraform으로 리소스 변경

 

Terraformer를 통해 GCP의 인프라를 코드로 가져왔다.

 

이제 IaaC(Infrastructure as a Code)의 존재 이유인 코드로 인프라 관리가 어떻게 이루어지는지 알아보자.

 

 

1. 코드로 리소스 관리

 

 

코드로 리소스를 추가하기 전에 전 글에서 Terraform은 .tf파일(Configuration)과 .tfstate파일(State)의 비교를 통해 인프라 관리를 구현한다고 했던 것을 기억하자.

 

리소스를 코드로 추가하는 방법 또한 이 방법을 이용하면 간단하게 이용할 수 있다.

 

리소스의 Configuration을 담당하는 .tf파일을 수정하면 그 내용이 곧 인프라에 반영될 내용이기 때문에,

 

추가 작업은 .tf파일에 원하는 리소스를 코드로 추가하는 것으로 시행할 수 있다.

 

기존 1개의 GCS(Google Cloud Storage)에 한 개의 GCS를 더 추가해보자.

 

 

 

위와 같이 이전에 Terraformer로 Import를 시행해서 생성된 storage_bucket.tf 파일에 원하는 GCS의 명세를 추가한다.

 

리소스 추가에 필요한 명세의 리스트는 Terraform 공식 홈페이지에서 확인할 수 있다.

 

 

 

 

 

 

Configuration 파일을 수정한 후 terraform apply 커맨드를 실행하면 위와 같이 추가할 리소스를 보여 준다.

 

Terraform이 .tf파일과 .tfstate파일을 비교했더니 State파일에는 없는 리소스가 추가되었기 때문에,

 

이를 감지하고 해당 리소스를 추가할 것임을 사용자에게 알리는 것이다.

 

"yes"를 입력해 리소스 변경에 동의하면 아래와 같이 Terraform이 실제로 GCS bucket을 생성한다.

 

 

 

Terraform을 통해 GCS 리소스를 정상적으로 추가한 모습

 

 

 

 

리소스 변경(Update)도 .tf파일을 수정하는 동일한 과정으로 이루어진다. 

 

코드로 변경작업을 수행하고 terraform apply 커맨드를 실행하면 아래와 같이 

 

변경 내역을 확인할 수 있다.

 

실제로 Managed Instance Group의 Autoscaling policy를 변경해보자.

 

Terraform을 통해 Autoscaling policy의 max_replicas를 3에서 5로 변경하는 모습

 

 

terraform apply를 실행하자 실제로 해당 설정이 5으로 변경되었다.

 

 

이처럼 리소스의 추가와 변경은 동일한 과정으로 쉽게 이루어진다.

 

유의해야 할 점은,

 

리소스를 추가하고자 할때 해당 리소스의 API가 Enable 상태여야 한다는 것이다.

 

GCE(Google Cloud Engine) 처럼 프로젝트 시작 시 default로 API가 꺼져 있는 리소스가 있기 떄문에

 

Terraform으로 리소스 추가를 수행하기 전에 미리 원하는 리소스의 API를 켜두자.

 

 

 

 

 

 

 

2. 코드로 리소스 삭제

 

 

 

Terraform같은 IaaC 툴을 이용할 때 주의해야 할 점 중 하나는

 

인프라의 변경이 간단해 리소스의 삭제 또한 아주 쉽게 가능하다는 것이다.

 

그래서 Terraform으로 리소스를 삭제하고자 할 때 더욱 주의를 기울여야 한다.

 

Terraform에서 리소스를 삭제하는 방법에는 두 가지가 있다.

 

그 중 하나는 지금까지 해왔던 것처럼 .tf파일에서 코드를 삭제하는 것이다.

 

이 방법으로 앞에서 추가했던 GCS bucket을 다시 삭제해보자.

 

 

이전에 추가했던 GCS를 코드에서 삭제했다.

 

 

위와 같이 코드에서 추가한 부분을 다시 삭제하고 terraform apply 커맨드를 실행하면 

 

 

 

 

 

해당 리소스가 destroyed 된다고 알려준다.

 

Terraform으로 리소스를 삭제하는 두 번째 방법은 destroy 커맨드를 이용하는 것이다.

 

 

destroy 커맨드를 이용해 모든 리소스를 제거함을 확인하는 화면

 

terraform destroy 커맨드를 사용하면 해당 프로젝트에 존재하는 모든 리소스를 제거한다.

 

대부분의 실무에서 이 커맨드를 이용해야 할 경우는 없을 것이다.

 

-target 플래그로 원하는 리소스만 삭제하는 등 다양한 플래그가 존재하므로 자세한 내용은 여기를 참고하자.

 

여기서 'yes'를 입력하면 실제 GCP상에서도 리소스가 삭제되고, 그 안의 데이터과 설정 또한 완전히 복구 불가능해진다.

 

웹 콘솔 상에서 GCS같은 중요한 리소스를 삭제하려면 해당 bucket 이름을 다시 타이핑해야 하는 등 

 

의도치않은 삭제를 방지해주는 차단막이 존재하는 반면에

 

Terraform을 이용한 리소스 삭제는 그저 코드를 변경하고 커맨드를 입력하는 것이 전부다.

 

예시에서는 GCS를 제거하는 하나의 작업만 변경했기에 삭제를 알아차리기 쉽지만 작업 내용이 여러개면 이마저도 알아차리기 힘든 경우가 존재한다.

 

이 점이 코드로 인프라를 관리할 때 주의해야 할 점이다.

 

 

 

 

 

Terraform 마무리

 

지금까지 Terraform을 통해 IaaC로 인프라를 관리하는 법을 알아보았다.

 

많은 이들이 이 툴을 통해 클라우드 인프라를 관리하고 있고,

 

Terraform의 등장에 앞으로 IaaC가 더 강력해질 것은 의심의 여지가 없는 듯하다.

 

나도 Terraform을 직접 써보면서 처음에는 손쉬운 사용성에 감탄했지만,

 

반대로 리소스의 변경과 삭제가 너무나도 쉬운 것이 위험으로 다가올 수도 있겠다는 생각 또한 들었다.

 

분명 API나 웹 콘솔 상에서 일일이 리소스를 변경하는 것보다 진보된 방식이고 편리한 툴은 맞다.

 

하지만 강력한 툴이니만큼 이 것을 사용하는 것에 따른 책임도 뒤따른다는 것을 알아야 할 것이다.

 

Terraform으로 다른 클라우드 서비스를 관리하고자 하거나 더 많은 정보를 얻고 싶다면 Terraform 공식 홈페이지를 가보자.

 

depends on 커맨드로 의존성을 강제하는 기능이나 graph 커맨드를 통해 의존성 그래프를 그려주는 등 이 글에서 다루지 않았지만 유용하고 강력한 기능들이 많다.

 

GCP나 AWS, Azure같은 메이저 클라우드 말고도 몇 십개의 클라우드 서비스를 지원한다.

 

심지어 NCP(Naver Cloud Platform) 까지도..

 

Terraform + GCP 글은 여기서 마친다. 

 

이 글을 통해 많은 이들이 정보를 얻어갔으면 한다.