2020/07/04 - GitHub OAuth 구현하기 (1)
2020/07/07 - GitHub OAuth 구현하기 (2)
2020/07/13 - GitHub OAuth 구현하기 (3) 에서 이어집니다.
지난번까지 구현된 GitHub OAuth의 예제코드를 서버에 배포하는 것을 설명합니다. 구현된 애플리케이션을 배포하는데, 고려한 몇가지가 있습니다. 지금 만든 앱은 어디까지나, 취미로 만든 것이기 때문에 서비스는 무료로 구동될 수 있어야 한다가 기본 전제였습니다.
우선 고려한 것이, 오라클 무료 클라우드, 그리고 Azure, GCP의 1년 무료 계정, 마지막으로 heroku 같은 PaaS 서비스였습니다. AWS는 무료 계정을 이미 사용했었기 때문에 제외하였고, Azure와 GCP도 앞으로 마찮가지 상황이 발생할 것이기에 제외하였으므로 제일 처음에 생각한 것은 오라클 클라우드였습니다. 그리고 실제로 서비스를 올려두기도 했는데, 사실 이 무료 VM을 이 용도로만 쓰기에는 좀 아까웠습니다. 그래서 최종으로 결정한 것은 heroku 였습니다.
heroku 계정은 무료일 경우 월당 550시간을 사용할 수 있습니다. 이 시간은 인스턴스가 실제 구동되는 시간을 측정하는데, 30분 정도 이용이 없을 경우, 인스턴스가 꺼지기 때문에 취미로 이용하는 인스턴스의 경우, 대부분 문제가 되지 않으며, 신용카드를 등록할 경우 450 시간을 추가로 더 받을 수 있기 때문에 사실상 무료로 이용가능합니다. 그래서 heroku로 정했고 아래는 heroku에 만든 애플리케이션을 배포하는 과정을 설명합니다.
우선 heroku로 go 애플리케이션을 배포하려면, go module 설정을 하여야 합니다.
$ go mod init github-oauth
$ go install main.go
$ ls
go.mod go.sum login.html main.go main.html
go.mod와 go.sum 파일이 생성된 것을 확인하고, heroku APP을 생성합니다.
heroku dashboard( https://dashboard.heroku.com/apps ) 우측 상단에 "NEW" 버튼을 눌러서 새로운 인스턴스를 생성합니다.
그리고 APP이름을 정하고 나면, 배포를 위한 인스턴스가 생성됩니다. heroku는 이런 인스턴스를 dyno라고 합니다.
이제 리파지토리에 heroku remote 를 설정합니다. 저는 github-oauth-sample이라는 dyno를 생성했으므로 다음과 같이 추가했습니다.
$ heroku git:remote -a github-oauth-sample
그리고 heroku로 배포된 서비스가 정상적으로 구동되기 위해서 PORT를 환경 변수에서 읽어오도록 수정합니다. 그리고 현재 heroku에서 제공하는 go version이 1.12이므로, 더 상위 버전의 기능을 이용했다면 더 많은 수정이 필요할 수 있습니다.
func main() {
port := os.Getenv("PORT")
if port == "" {
log.Fatal("$PORT must be set")
}
...
log.Fatal(http.ListenAndServe(":"+port, nil))
}
기존에 8000번 포트로 구동되도록 하던것을 환경 변수에서 읽어온 값으로 구동되도록 변경했습니다.
그리고 수정된 내용을 commit 한 후 heroku로 push 해주면 배포가 시작됩니다.
$ git push heroku master
heroku에 push가 되면, 소스코드의 빌드가 시작되고, 빌드된 파일을 자동으로 시작합니다. 배포는 간단하게 끝이났고, 부여받은 도메인으로 접속해보면, 서비스가 정상 구동되었는지 확인할 수 있습니다.
로그는 "heroku logs --tail"로 확인할 수 있습니다.
Deploy 방법은 위에서 설명한 것처럼, CLI를 이용하는 방법 외에 GitHub 리파지토리를 연결하는 방법, 그리고 Docker Image를 이용하는 방법이 더 있습니다.
GitHub 리파지토리를 연결할 경우, GitHub에 Push 하는 동시에 heroku로 바로 배포할 수 있습니다. 자연스럽게 CI/CD환경이 구성되나, 앞으로 배포할 일이 그다지 많지 않을 것 같아 설정하지는 않았습니다. 나중 계속해서 변경이 필요한 애플리케이션을 배포하게 될경우, GitHub에 연결해서 사용할 것 같습니다.
사실 Docker 를 이용하는 방법이 가장 마음에들어, 제일 먼저 시도했던 방법이나, 제약사항이 몇가지 있어, 평소에 만들던 이미지로는 구동이 되지 않는 것을 인지하고, 컨테이너로 구동하려고 한다면, 다른 서비스에서 구동해야겟다라고 생각했습니다. heroku를 위해서 수정한다는 것은 heroku를 주로 사용하지 않는 상황에서는 그다지 매력적이지 않았습니다.
heroku로 서비스를 할 때의 단점이 있는데, 서비스 사용량이나 상태를 확인할 수 있는 메트릭 기능이 제공되지 않는다는 점입니다. 하지만, 무료 서비스일때만 해당됩니다. 월 $7 정도를 지불하면 이 단점은 해소됩니다. 테스트나 혹은 취미 정도에 그치지 않고 어느정도 서비스를 검증해보려는 목적이 있다면 비용을 지불하거나, 다른 클라우드 서비스를 이용하는 것등의 고려가 필요할 것입니다.
이러한 단점에도 불구하고 heroku는 간단한 배포 방법, 생각보다는 많은 무료 가용량, 다양한 언어를 지원하는 장점이 있으므로, 취미삼아 서비스를 올려보고 싶은 분들은 heroku 서비스를 이용해서 배포해보는 것도 괜찮은 선택이라고 생각합니다.