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

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

# 前提
## 環境
- macOS Catalina

## インストール済み
- Homebrew

# Docker で環境構築
Docker で環境を用意する場合はこの手順([Go + Google Cloud SDK の環境を Docker で準備する](https://qiita.com/tktcorporation/items/956f4afd68d491fb6894))で。

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

# Go の使用準備

## VSCode の設定を追加

ここでは workspace の設定に追加
([Go のインストールと vscode の環境構築](#go-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8-vscode-%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89)ここで vscode 用のツールをインストールする際に、この設定が必要かもしれない。一応。）

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

```
$ go env
...
GOPATH={PATH}
```

```json
{
    "files.autoSave": "afterDelay",
    "go.gocodeAutoBuild": true,
    "go.gopath": "{PATH}"
}
```

## Go のインストールと vscode の環境構築
https://qiita.com/oruharo/items/545378eae5c707f717ed
この記事の手順で、VSCode で Go を使う環境を整える。


# Firebase Tools のインストール
go を使用する場合は必要ないかもしれない

```bash
$ npm i -g firebase-tools
```

# Google Cloud SDK のインストール

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

```bash
$ 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 系のサービスを使用しないのであれば必要ないかもしれない。

```bash
$ 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))
}
```

# デプロイ

[サンプルファイルの作成](#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90) と同じディレクトリで実行することでデプロイできる。はず。

```bash
$ 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 のダッシュボードからも確認可能。

<img width="548" alt="response.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/c1361998-bf59-fbbb-4647-e21926655bef.png">

# 最後に
初 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