Go の環境構築をしてそのまま Cloud Functions を使う with VSCode


初 Go & CloudFunctions にあたって、せっかくなので作業記録

前提

環境

  • macOS Catalina

インストール済み

  • Homebrew

Docker で環境構築

Docker で環境を用意する場合はこの手順(Go + Google Cloud SDK の環境を Docker で準備する)で。

VSCode に関連する Go のインストール部分は飛ばせないかもしれないが、 Google Cloud SDK まわりの環境は コンテナ内に閉じ込められる。

Go の使用準備

VSCode の設定を追加

ここでは workspace の設定に追加
(Go のインストールと vscode の環境構築ここで vscode 用のツールをインストールする際に、この設定が必要かもしれない。一応。)

go.gopath の値は go env で確認できる。

$ go env
...
GOPATH={PATH}
{
    "files.autoSave": "afterDelay",
    "go.gocodeAutoBuild": true,
    "go.gopath": "{PATH}"
}

Go のインストールと vscode の環境構築

https://qiita.com/oruharo/items/545378eae5c707f717ed
この記事の手順で、VSCode で Go を使う環境を整える。

Firebase Tools のインストール

go を使用する場合は必要ないかもしれない

$ npm i -g firebase-tools

Google Cloud SDK のインストール

Homebrew を使用してインストールする。

$ brew cask install google-cloud-sdk

下記のように表示できればインストールに成功している。

$ gcloud -v
Google Cloud SDK 291.0.0
bq 2.0.57
core 2020.05.01
gsutil 4.50

参考: https://qiita.com/G-awa/items/e6904b040caa0096fba0

Go 用 Cloud クライアント ライブラリのインストール

storage 系のサービスを使用しないのであれば必要ないかもしれない。

$ go get cloud.google.com/go/storage

参考: https://cloud.google.com/go/docs/setup#install_the_cloud_client_libraries_for_go

サンプルファイルの作成

# hello_world.go
// Package helloworld provides a set of Cloud Functions samples.
package helloworld

import (
    "encoding/json"
    "fmt"
    "html"
    "net/http"
)

// HelloHTTP is an HTTP Cloud Function with a request parameter.
func HelloHTTP(w http.ResponseWriter, r *http.Request) {
    var d struct {
            Name string `json:"name"`
    }
    if err := json.NewDecoder(r.Body).Decode(&d); err != nil {
            fmt.Fprint(w, "Hello, World!")
            return
    }
    if d.Name == "" {
            fmt.Fprint(w, "Hello, World!")
            return
    }
    fmt.Fprintf(w, "Hello, %s!", html.EscapeString(d.Name))
}

デプロイ

サンプルファイルの作成 と同じディレクトリで実行することでデプロイできる。はず。

$ gcloud functions deploy HelloHTTP --runtime go113 --trigger-http --allow-unauthenticated --region asia-northeast1

参考: https://cloud.google.com/functions/docs/first-go#deploying_the_function

API の呼び出し

$ gcloud functions describe HelloHTTP
...
httpsTrigger:
  url: https://{Region}-{ProjectID}.cloudfunctions.net/HelloHTTP

httpsTrigger の値が呼び出し先の url になっているので、ここにアクセスすると function が呼びだされ、response が返ってくる。

この url は、Firebase のダッシュボードからも確認可能。

最後に

初 Go & CloudFunctions だったので、ところどころ変なことを書いているかもしれないです。
軽く触ってみた感じ、AWS Lambda よりお手軽な感じがしました。
Cloud Endpoints まわりとの関係性はまだよくわからない…
次は FireStore との連携に手を出す予定。
追加情報があれば更新します。

参考

https://qiita.com/oruharo/items/545378eae5c707f717ed
https://qiita.com/G-awa/items/e6904b040caa0096fba0
https://cloud.google.com/go/docs/setup#install_the_cloud_client_libraries_for_go
https://cloud.google.com/functions/docs/first-go#deploying_the_function