ホスティングサービスをNetlifyからVercelに乗り換えたついでにServerless Functionsが気になったので試してみました。
Vercel
Next.jsの運営元であるVercel(元Zeit)のWebアプリケーションホスティングサービスです。ちょうどNetlifyとかと同じポジションですね。
前準備
アカウント作成
Vercelのトップページの右上にあるSignUpボタンからGithub, GitLab, BitBucketのアカウントを使用してアカウント作成をします。
Vercel CLI
npmパッケージとして提供されているVercel CLIをインストールします。
これは主にローカルからデプロイを行う際に使用します。
npm i -g vercel
yarn global add vercel
インストール後
vercel login
を実行し、上で登録したemailアドレスの入力と確認を済ませます。
サーバーレス関数の作成
プロジェクトフォルダの直下にindex.go
を作成します。
このindex.go
はhttp.ResponseWriter
と*http.Request
を引数として持つ関数が存在する必要があります。
まずはVercel Serverless Functions Go Example
というテキストを返すだけの関数を実装します。
package main
import (
"fmt"
"net/http"
)
func Handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Vercel Serverless Functions Go Example")
}
vercel.jsonの作成
{
"version": 2,
"name": "go",
"builds": [
{ "src": "*.go", "use": "@vercel/go" }
]
}
ルーティング
日時を返すエンドポイントを作成していきます。
今回はわかりやすく下記のようにエンドポイントごとにフォルダを分けて作成します。
root
├ /date
│ └ index.go
└ index.go
型の作成
type ResDate struct {
Date string `json:"date"`
}
リクエストハンドラの実装
w.Header().Set("Content-Type", "application/json")
でContent-Type
の指定を行います。
func Handler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
d := ResDate{ time.Now().Format(time.RFC850) }
bytes, _ := json.Marshal(d)
fmt.Fprintf(w, string(bytes))
}
date/index.go
package date
import (
"fmt"
"net/http"
"time"
"encoding/json"
)
type ResDate struct {
Date string `json:"date"`
}
func Handler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
d := ResDate{ time.Now().Format(time.RFC850) }
bytes, _ := json.Marshal(d)
fmt.Fprintf(w, string(bytes))
}
vercel.jsonでルーティングの設定
ルーティングの設定を行うためにvercel.json
にroutes
の要素を追加します。
"routes": [
{ "src": "/date", "dest": "/date" }
]
加えて、ビルド対象フォルダに先程作成したdate
フォルダ内のgo
ファイルを追加します。
"builds": [
{ "src": "*.go", "use": "@vercel/go" },
{ "src": "/date/*.go", "use": "@vercel/go" }
]
{
"version": 2,
"name": "go-vercel-functions-demo",
"builds": [
{ "src": "*.go", "use": "@vercel/go" },
{ "src": "/date/*.go", "use": "@vercel/go" }
],
"routes": [
{ "src": "/date", "dest": "/date" }
]
}
デプロイ
vercel
これだけです。
本番デプロイをするのであれば--prod
オプションをつけるだけです。
vercel --prod
2020/10/05 タイポがあったため修正しました。prob -> prod
@kimihito_ さん ご指摘ありがとうございます。
デプロイ後の以下のURLにアクセスすると
https://go-vercel-function-example.mugi111.vercel.app
一番最初に作成した関数通りVercel Serverless Functions Go Example
と表示されているのが確認できました。
dateエンドポイントも正常に動作していることが確認できました。
https://go-vercel-function-example.mugi111.vercel.app/date