Heroku にサイトの OGP 情報を JSON で返すエンドポイントを Golang で書いた

どうも、たくチャレ(@takuchalle)です。

前回のリベンジです。そもそも何故こんなエンドポイントが必要なのかはこちらを参照してください。

他にもいくつか選択肢があったのですが、最終的にはHerokuにエンドポイントを立てました。

他に上がった選択肢としては

  • GCP Cloud Functions
  • AWS Lambda + AWS Gateway
  • AWS EC2

あたりがありますが、どれもすぐにできなそうだったので諦めました。

Cloud FunctionsというかNodeJSでやろうと思ったときに、パーサーのフォーマットがHugoに合わなかったのは前回書いた通り。 Golangでやろうと思ってもまだ正式リリースじゃなくて、アーリーアクセス権を申請したけどまだ返信がないから諦めました。

AWS Lambda + AWS GatewayGolangが使えそうだったけど、セキュリティ面をしっかりしないと怖いな1って思っていて、本格的に使う予定のないAWSを調べるのはコストが高そうだったので諦めました。 AWS EC2も同じ理由です。わざわざ VPS を立てるのはオーバースペックですし。

そこでHerokuGolangを使えることを思いだして調べてみたら簡単にできそうだったのでやってみました。結果すごい簡単でした。

Heroku で Golang の HTTP サーバを動かす方法

詳細は公式ドキュメントに書いてありますが、ざっくり書くと

  • heroku CLI をインストール
  • “net/http” パッケージを使ってハンドラを書く
  • govendor で依存関係を記述する
  • Procfile を用意する
  • デプロイする

依存関係に関して少しハマったので、あとで詳しく書きます。

今回作ったエンドポイントはGitHubにあるので、興味ある人は確認してください。多分これを見れば何となく分かると思います。 Golangで HTTP サーバは初めて書いたのでもっと良い・正しい方法があるのかもしれません。プルリク待ってます。

takuyaohashi/heroku-go-json-server-for-hugo

govendor で依存関係の記述

今回僕はgovendorを使いましたが、公式ドキュメントによるとgodepGBでも良いです。go get -u github.com/kardianos/govendorでインストールできます。

まず初期化します。このときに$GOPATH配下じゃないとエラーになるので、$GOPATH/src/github.com/[username]/配下に作りました。

$ govendor init

初期化するとvendor/vendor.jsonが生成されます。このファイルに次のようにHerokuのビルド向けの情報を追記します。バージョンとインストール方法ですね。2

"heroku": {
	"goVersion": "go1.11.1",
	"install": [
		"./..."
	]
}

あとは依存するパッケージをgovendor fetchで追加していきます。今回は Open Graph Parser のパッケージを追加しました。

$ govendor fetch github.com/otiai10/opengraph

ここで依存のあるパッケージがvendor/配下のgithub.com/golang.org/以下にインストールされます。 しかし、これらはgit addする必要はなくvendor/vendor.jsonだけバージョン管理しておけば、デプロイ時にHerokuが依存関係を見てインストールしてくれます。

まとめ

Herokuを使えば簡単にGolangで書いたプログラムをデプロイすることができました。これでようやくHugoで Twitter Card みたいな表示をする準備ができました。

実際使ってみて、デザインを整えたのがこんな感じです。

Hugo の Data-Driven Content 用に OGP 情報を JSON で返すエンドポイントを Golang で書いて Heroku に設置した。

無料でできるのはいいですね。Herokuの無料枠はしばらくアクセスがないとインスタンスが止まってしまうので最初のアクセスが遅いけど、そこまで問題じゃないですね。

参考サイト


  1. 悪意のある攻撃されて請求額が大変なことになるとか
  2. JSON ってコンマの有無に厳密なんですね。少しハマりました。

同じカテゴリの記事