본문 바로가기
👾 Server/🆃 Terraform

Terraform(테라폼)을 활용한 Heroku(헤로쿠) app 프로비저닝 하기

by kukim 2022. 8. 1.

소스코드가 들어있지 않은 인프라만 구성된 헤로쿠 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"
}

테라폼 : 공식문서 Input Variables 

헤로쿠 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을 출력할 수 있다.

 

사용 예

헤로쿠 앱이 프로비저닝 되었다.
이미 프로비저닝 된 인프라는 다시 생성되지 않는다.

Reference

- 예제 전체 소스코드

- Heroku Provider

- Heroku 공식문서 : Buildpacks

- GitHub repo : terraform-provider-heroku

댓글