반응형
요즘에 팀내에서 IaC툴로 Pulumi에서 Terraform & Terragrunt로 이전작업을 하고있는데, Pulumi에서 바꾼이유는
- Pulumi stack을 k8s namespace마다 생성을 했는데 뭔가 ArgoCD를 사용하는게 더 나을것같은 느낌이 들었음. 추가로 Pulumi에서 동일한 코드를 사용하는 요소가 많았음
- Terragrunt는 반복적인 코드에 대해서 자동으로 생성해주는 DRY(Don't Repeat Yourselt) 를 제공함
- Pulumi stack내에서의 종속성은 걸수있지만, stack 간의 종속성은 걸기 어려움
- Terragrunt는 이러한 문제점을 해결해주었음
- 아직까진 IaC툴로서 Terraform이 많은 기업에서 활용중인 상태. 커리어적으로 Terraform도 직접 사용해보면서 팀원들에게 도움이 됐으면 했음
다행히 팀내에 사용경험이 있는분께서 주도적으로 이전작업을 도와주셔서 어느정도 이전작업이 완료되었음.
그리고 아직 사용 경험이 깊진않지만 두개를 써보면서 느낀점은
- (python) Pulumi는 특정 provider를 사용하기 위해서는 별도로 패키지를 추가로 설치해줘야함. 반면에 terraform은 별도로 설치할필요가없음. 추가로 새로운 프로젝트가 생길경우 Python의 경우엔 새로운 가상환경을 만들어줘야함
- 어떻게보면 저장공간의 활용도가 있을순있겠지만. 새로운 환경을 생성하는 것 자체가 용량을 크게 잡아먹을수있음
- Pulumi는 Project를 생성하고 그 밑에 Stack을 쌓는 방식으로 되어있는데 처음접할때 이러한 구조가 바로 와닿지가 않았음. Terraform의 경우에는 State를 바로 명시해서 작업하는 방식이라서 좀 쉽게 이해됐음
- Terraform도 좀 어려운 부분이 있었는데, Pulumi의 경우에는 특정 리소스가 다른 폴더에 존재할경우 import하기가 수월했는데, Terraform의 경우에는 Outputs을 쓰고 Inputs으로 받아 이걸 variable로 넘겨서 사용하는 방식이라 좀 불편했음
- Pulumi의 경우에는 자체적으로 변수 암호화 기능을 제공하지만, Terraform의 경우에는 거의 강제적으로 외부 솔루션을 사용하게끔 유도하는걸로 보임.
- e.g. Terraform vault, AWS Secret Manager등...
- 물론 Terraform에서 우회할수있는 방법이 있는데 자세한건 밑에 정리하려고한다.
Terraform & Terragrunt 설치
보통 Terraform, Terragrunt는 프로젝트마다 버전이 다를수도있어서 쉽게 버전 컨트롤이 가능한 툴을 제공한다. 이번작업에는 tfenv, tgenv라는 툴을 사용해서 버전 컨트롤이 쉽게끔 했다.
- 추가로 github 프로젝트에 .terraform-version, .terragrunt-version 에 버전을 명시해두면 자동으로 해당 프로젝트 버전에 맞게끔 바꿔준다
https://github.com/tfutils/tfenv
Terragrunt
https://terragrunt.gruntwork.io/
Terraform을 DRY(Don't Repeat Yourself)하게 만들어주는 툴이고, Terraform State간의 종속성을 거는것을 쉽게 만들어주는 툴
Terragrunt DRY & State간의 종속성
- DRY(Don't Repeat Yourself)
- Terragrunt는 아래와같이 파일을 선언하고 하위폴더에서 Terragrunt.hcl이라는 파일에 해당 파일을 Import해주면 자동으로 코드를 생성해준다.
- remote_state는 하나의 기능이고 이러한 기능을 하는것이 다양해서 문서를 참고하는것이 좋다.
# base.hcl
remote_state {
backend = "s3"
generate = {
path = "backend.tf"
if_exists = "overwrite_terragrunt"
}
config = {
bucket = "terraform-state-bucket-test"
region = "" # AWS Region
profile = "" # AWS Profile
key = "${get_path_from_repo_root()}/terraform.tfstate"
}
}
- 하위 디렉토리 import방법
- find_in_parent_folders 란 terragrunt에서 제공하는 함수로 상위 디렉토리를 조회하면서 base.hcl이라는 terragrunt파일이 있으면 Import해줌
include "base" {
path = find_in_parent_folders("base.hcl")
}
- 다른 디렉토리의 state 종속성 걸기
dependencies {
paths=[
"${local.root_dir}/another_terragrunt_hcl_folder"
]
}
Terraform 변수 자체 암호화 방법
특정 변수에 대해 암호화를 외부 솔루션을 사용하고 싶지 않을 때 아래와 같은 방식도 가능하다
- 먼저 RSA키를 생성한다
# private.pem 생성
openssl genrsa --out private.pem 2048
# public.pem 생성
openssl rsa --in private.pem --out public.pem --outform PEM --pubout
- 먼저 로컬머신에서 쉘스크립트로 암호화를 진행하고, Terraform코드에서 다음과 같은 방식으로 복호화를 하게 끔 코드 작업을 진행한다.
# 변수 암호화
printf "WANT_TO_ENCRYPT_STRING" | openssl pkeyutl -encrypt -inkey public.pem -pubin | base64 | tr -d '\n' | xargs -0 printf "%s\n"
# 위에서 나온 결과값을 ENCRYPTED_STRING에 넣고 private.pem파일이 존재하는 위치를 PATH_PRIVATE_PEM_FILE에 명시
rsadecrypt("ENCRYPTED_STRING", file("PATH_PRIVATE_PEM_FILE"))
반응형
'Develop > DevOps' 카테고리의 다른 글
[nginx-ingress] virtualserver, virtualserverroute (0) | 2024.12.04 |
---|---|
[github] github action Auto Assign 사용 (0) | 2024.11.24 |
[Grafana] database is locked 에러 대응 + DB migration (2) | 2024.10.17 |
[k8s] Kubernetes taint & toleration & nodeAffinity 공부 (0) | 2024.08.27 |
[Go] Golang을 공부하면서 알게된것들 (0) | 2024.08.13 |