🍱

Golang(echo)のAPIをrenderでデプロイする方法

2023/07/09に公開

はじめに

この記事では、golangで作ったAPIを無料で公開したい、という方に向けての記事になります。
golangの基礎文法などに関しての説明は今回の記事ではあまり触れませんので、ご了承ください。

render.comとは

Webアプリや静的サイトのホスティングから、Cron Jobs、自動バックアップ機能付きDBなど、個人のWeb開発で必要なものは一通り揃っています。
SSDディスクも提供されていますので、PostgreSQL意外ももちろん使えます。
無料でonrender.comのサブドメインも割り当ててくれますし、カスタムドメインも追加することができます。

renderの無料枠に関する制限

  • Webアプリケーションに関する制限

    • 無料プランでは、非アクティブ状態が 15 分間続くと自動的にアプリがスリープします。
      新しいリクエストが来るとスリープが解除されますが、最大30秒の応答遅延が発生する可能性があります。
    • 無料プランで使用できるのは、 1か月あたり750時間の実行時間と、100GBまでのデータ転送です。100GBを超える場合、0.10 USD/GBが課金されます。
    • 無料枠を超えると、サービスは自動的に中断され、有料プランにアップグレードされるか、無料枠がリセットされるまで、トラフィックを処理できなくなります。無料利用は毎月1日にリセットされます。
    • 通常、無料の Web サービスのビルドは、有料サービスのビルドよりも遅くなります。ビルドとデプロイの時間を短縮するには、有料プランにアップグレードする必要があります。
  • データベースに関する制限

    • Renderで推奨されるデータベースはPostgreSQLで、初期状態ではMySQLを使用できません。
    • 無料でデータベースを作成し利用することができますが、作成後90日でアクセスできなくなります。
    • アクセスの停止から14 日間の猶予期間がありますが、この期間をすぎるとデータベースはデータと共に削除されます。
    • 無料のデータベースは、一度に1つだけアクティブにすることができます。

render.comにログイン

renderにログインすると以下のような画面になるはずです。
githubのアカウント等でもログインが可能です。

golang(echo)のプロジェクトを用意しよう

go-render-apiのgit repository
https://github.com/Poul-george/go-render-api
ディレクトリ構成
go-render-api

├ controller/
    └ list.go
├ response/
     └ response.go
├ go.mod
├ go.sum
├ main.go

main.go

package main

import (
	c "github.com/自身のアカウント/go-render-ap/go-render-api/controller"
	"github.com/labstack/echo/v4"
	"github.com/labstack/echo/v4/middleware"
	"net/http"
)

func main() {
	// インスタンスを作成
	e := echo.New()

	// ミドルウェアを設定
	e.Use(middleware.Logger())
	e.Use(middleware.Recover())

	// ルートを設定
	e.GET("/list", c.List)
	e.GET("/", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello, World!")
	})
	// サーバーをポート番号1323で起動
	e.Logger.Fatal(e.Start(":1323"))
}

// ハンドラーを定義

controller/list.go

package controller

import (
	"net/http"

	"github.com/自身のアカウント/go-render-ap/go-render-api/response"
	"github.com/labstack/echo/v4"
)

func List(ctx echo.Context) error {
	return response.ListRes(ctx, http.StatusOK, "text")
}

response/response.go

package response

import (
	"github.com/labstack/echo/v4"
)

func ListRes(c echo.Context, code int, text interface{}) error {
	return c.JSON(
		code,
		struct {
			Text interface{} `json:"text"`
		}{
			Text: text,
		},
	)
}

localでmain.goを実行

main.goのあるディレクトリで以下を実行

go run main.go

http://localhost:1323/ にアクセスすると以下の結果になります

http://localhost:1323/list にアクセスすると以下の結果になります

localで動作確認ができたらgithubに新しくリポジトリを作成してpushしておいてください。

render.comにデプロイしよう

以下の画面のNewボタンをクリック

webサービスを選択

Configure accountでリポジトリを選択し、go-render-apiを検索。connetを押します。

connetをした後は、以下の設定画面に飛び、アプリケーションの名前を入力し、regionなどを設定します。
root directoryに関しては、今回は何も入力しなくて良いですが、main.goに該当するファイルがある場所を指定するようにしてください。

最後にインスタンスタイプを選択、今回は無料枠でデプロイするのでfreeを選択してください。
その後、create web serviceをクリック!


デプロイが成功すると以下のURLでローカルで確認した結果が取得できると思います。
https://go-render-api.onrender.com/
https://go-render-api.onrender.com/list

最後に

今回はgolang(echo)で作成したAPIをrenderを使ってデプロイする方法について解説しました。
ここからDBを使用して機能を拡張する事もできます。
私は、PlanetScaleというリモート環境にDBを構築できるサービスをよく使用しているので、そちらの解説も今後やってみようかなと思います。

Discussion