Terraform(테라폼)을 활용한 Heroku(헤로쿠) app 프로비저닝 하기
소스코드가 들어있지 않은 인프라만 구성된 헤로쿠 app 을 만든다고 했을 때 간단하게 두 가지 방법을 떠올릴 수 있다.
방법 1 : heroku 웹사이트에 들어가 버튼 클릭으로 앱을 만든다.
방법 2 : heroku cli를 설치하여 터미널에서 명령으로 앱을 만든다.
위 두 방법 말고도 다른 방법이 있다.
테라폼을 활용하는 것이다.
+a) 헤로쿠에 앱 하나 만드는 일은 간단한 작업이라 테라폼을 사용해야 하는가 의구심이 들었지만 연습차원에서 즐거운 경험이었다.
이전글 2022.07.11 - [👾 Server/Terraform] - Terraform(테라폼)이란? 간단 사용기 에서 알아본 테라폼을 적용해보고 있다.
Terraform(테라폼)은 헤로쿠를 지원하고 있다. (공식 문서 : Heroku Provider)
Heroku Privider 설정
# provider.tf
## terraform init 하기 위한 heroku providers 설치
terraform {
required_providers {
heroku = {
source = "heroku/heroku"
version = "5.1.1"
}
}
}
## heroku provider 설정, email, api_key 값을 상수값이 아닌 var.heroku_** 변수로 사용하고 있다.
provider "heroku" {
email = var.heroku_email
api_key = var.heroku_api_key
}
provider.tf 파일을 작성하고 terrform init 명령을 실행하면 GitHub repo : terraform-provider-heroku 저장소에서 provider에 필요한 파일들을 설정한다. .terraform 폴더와 .terraform.lock.hcl 파일이 생성된다.
헤로쿠 api_key는 헤로쿠 회원가입 후 Accout settings - API key에서 확인할 수 있다. (노출 유의)
varibales 사용
provider.tf 파일의 "heroku" provider 에 필요한 email, api_key 값을 var.heroku_*** 의 변수 값으로 지정했다. 해당 변수는 외부 tf 파일에서 가져오거나 사용자가 terafrom plan 또는 apply 명령을 실행할 때 커맨드라인에서 입력하여 사용할 수 있다.
# varibales.tf
variable "heroku_email" {
description = "Heroku email"
}
variable "heroku_api_key" {
description = "Heroku private api key"
}
variable "heroku_app_name" {
description = "Heroku app name"
}
헤로쿠 app 리소스 설정과 프로비저닝 결과 출력 (output)
테라폼 문법 resource{} 를 통해 프로비저닝 할 리소스들을 (헤로쿠 앱) 설정할 수 있고 리소스의 옵션 (이름과 리전, buildpakcs 등)을 커스텀 할 수 있다. +a) buildpacks를 변경하려면 Heroku 공식문서 : Buildpacks를 참고하여 수정하자
# infra.tf
# 헤로쿠 app 리소스 프로비저닝
## https://registry.terraform.io/providers/heroku/heroku/latest/docs/resources/app
resource "heroku_app" "kukim_app" {
name = "${var.heroku_app_name}"
region = "us"
buildpacks = [
"heroku/gradle" # spring project 예로 buildpacks를 gradle로 설정
]
}
# heroku app 만들어진 url 결과
output "Heroku_app_url" {
value = "http://${heroku_app.kukim_app.name}.herokuapp.com"
}
헤로쿠 app 프로비저닝 된 결과는 app url이다. 테라폼 문법 output {} 을 통해 프로비저닝된 app url을 출력할 수 있다.
사용 예