Cloud Functions for Go の alpha 版を試してみた

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

以前、外部サイトの JSON を返すサーバをどこに立てるかを検討しているときに、GCP の Cloud Functions が候補に挙がってました。

しかし、Cloud Functionsで golang を使うにはまだ alpha 版なので申請が必要ですぐに使えませんでした。その時に一応申請していたところ、やっと申請が通ったので簡単に試してみることにしました。

申請方法

下記フォームから申請を行います。

そんなに難しいことは書いてませんが、プライベート用なのでName of your organizationのところはIndividualにしておきました。

1週間くらいするとGo 1.11 on Cloud Functions is ready for alpha testingというタイトルのメールが届いて申請完了です。

まだちゃんと見てないですが、Google Group にも招待されているのでバグを見つければここで報告すればよさそう。

GitHub にあるプライベートなリポジトリにも招待してくれました。ここには色々なサンプルが置いてありました。

Hello, World!

まず定番のやつをやっておきます。

package hello

import (
 "fmt"
  "net/http"
)

func HelloWorld(w http.ResponseWriter, r *http.Request) {
   fmt.Fprintf(w, "Hello, World!")
}

これをデプロイします。

  • 名前は hello
  • エントリポイントは上記の HelloWorld関数
  • ランタイムは go 1.11
  • トリガは http

という設定でデプロイするには以下のコマンドを打ちます。

$ gcloud alpha functions deploy hello --entry-point HelloWorld --runtime go111 --trigger-http

数分するとデプロイが完了して、https://[region]-[project name].cloudfunctions.net/helloという URL でアクセスできるようになります。

こんな感じでコンソールからも見ることができます。

僕が初めて上記のコマンドを打った時はalphaコンポーネントが足りなかったみたいで、下のような表示がされたのでYを打ってインストールしました。

You do not currently have this command group installed.  Using it requires the installation of components: [alpha]


Your current Cloud SDK version is: 211.0.0
Installing components from version: 211.0.0

+----------------------------------------------+
|     These components will be installed.      |
+-----------------------+------------+---------+
|          Name         |  Version   |   Size  |
+-----------------------+------------+---------+
| gcloud Alpha Commands | 2018.08.03 | < 1 MiB |
+-----------------------+------------+---------+

For the latest full release notes, please visit:
  https://cloud.google.com/sdk/release_notes
  
  Do you want to continue (Y/n)?  Y

もう少し凝ったやつを

Contribute to takuyaohashi/heroku-go-json-server-for-hugo development by creating an account on GitHub.

以前Herokuにデプロイしたサーバを移植してみます。内容の詳細はこちらを参照してください。

コアになる部分はHerokuにデプロイしたコードと一緒で、main関数を消してパッケージ名を変えただけです。

package ogp

import (
	"encoding/json"
	"errors"
	"net/http"
				
	ogp "github.com/otiai10/opengraph"
)

func OgpHandler(w http.ResponseWriter, r *http.Request) {
	url := r.FormValue("url")
	if len(url) == 0 {
		http.Error(w, errors.New("url query must be set").Error(), http.StatusInternalServerError)
		return
	}
	og, err := ogp.Fetch(url)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	og = og.ToAbsURL()
	js, err := json.MarshalIndent(og, "", "\t")

	if err != nil {
	http.Error(w, err.Error(), http.StatusInternalServerError)
	return
	}
	w.Header().Set("Content-Type", "application/json")
	w.Write(js)
}

go version 1.11から標準になったモジュール管理機能を使います。

$ export GO111MODULE=on
$ go mod init
$ go mod vendor
$ gcloud alpha functions deploy ogp --entry-point OgpHandler --runtime go111 --trigger-http

これでhttps://[region]-[project name].cloudfunctions.net/ogpという URL でアクセスできるようになります。非常に簡単ですね。GitHub に置いておくので試すことができます。

Contribute to takuyaohashi/gcp-go-json-server-for-hugo development by creating an account on GitHub.

まとめ

alpha 版の Google Cloud Function for Go を試してみました。Herokuにあったサーバを簡単に移植することもできました。

今回はhttpのトリガを使いましたが、正直これだけだと別にHerokuでも変わりません。GCPで使う以上、他のGCPのサービスと連携させたいところです。 ただ今は手元に連携できそうなものはないので、それはまた後日にします。

Google Cloud Platform Advent Calender 2018向けのネタもこのあたりから探します。

参考サイト

同じカテゴリの記事