golang
gcp
cloudfunctions

Cloud FunctionsにGoがサポートされたので使ってみた

GCPのCloud Functionsでgolangがサポートされました。

Cloud Functions: Go 1.11 is now a supported language | Google Cloud Blog

さっそく使ってみたいと思います。


導入

gcloudが必要なのでインストールしておきます。

また現在Golangのサポートはベータなので、gcloudでベータ機能を使えるようにしておきます。

$ gcloud components update

$ gcloud components install beta

今回作るサンプルのプロジェクトを作成します。

$ mkdir sample-cloudfunctions-go && cd sample-cloudfunctions-go

Cloud Functionsでgolangを使う場合、Go Modulesが必要です。

golang1.11では環境変数で宣言が必要です。

$ export GO111MODULE=on

$ # 以下コマンドでgo.modファイルが作成される
$ go mod init

サンプルの関数を作ります。


function.go

package sample

import "net/http"

func Hello(w http.ResponseWriter, r *http.Request) {
msg := "Hello World"
w.Write([]byte((msg)))
}


デプロイします。

$ gcloud functions deploy Hello --runtime go111 --trigger-http

# 以下一部抜粋
Deploying function (may take a while - up to 2 minutes)...done.
availableMemoryMb: 256
entryPoint: Hello
httpsTrigger:
url: https://us-central1-xxxxxxxxx.cloudfunctions.net/Hello
labels:
deployment-tool: cli-gcloud
name: projects/xxxxxxxxx/locations/us-central1/functions/Hello
runtime: go111
status: ACTIVE
timeout: 60s
updateTime: '2019-01-17T00:28:43Z'
versionId: '1'

トリガーするURLが出力されるので叩いてみると・・・

$ curl https://us-central1-xxxxxxxxx.cloudfunctions.net/Hello

Hello World

実行できました!


所感

net/http を使ってるのでとてもシンプルです。

どこかでmain関数を定義すればローカルでも実行できるため開発しやすいです。


cmd/main.go

package main

import (
sample "github.com/morix1500/sample-cloudfunctions-go"
"net/http"
)

func main() {
http.HandleFunc("/hello", sample.Hello)
http.ListenAndServe(":8082", nil)
}


$ echo "module github.com/morix1500/sample-cloudfunctions-go" > go.mod

$ go run cmd/main.go
$ curl localhost:8082/hello
Hello World


参考資料

The Go Runtime