GCP学習記　Cloud Functions編（１）

# はじめに  
本格的なWEBアプリを作って、他の人たちに使ってもらうとなると、やはりクラウドにバックエンドを構築して利用できるようにした方がいいと思い、GCPの学習を始めた。  
そこで、複数回に分けて、GCPの学習記録を投稿していきたいと思う。  

第1回目は、バックエンドの関数をクラウドにデプロイできる、Cloud Functionsについて。
（今回はちょっとだけ。）

# 対象者  
* GCP初心者
* すでにGCPのアカウントは持っている。
* 開発環境はMacとVSCode
* 開発言語はGo

# まずは環境構築  
## 1. Goをインストール
こちらについては、ネット上にいろんな記事があるので今回は割愛する m(_ _)m。  
## 2. サンプルのプロジェクト（モジュール）を作成する。  
ターミナルを使って、モジュール用にディレクトリを作成する。  
```.ターミナル  
mkdir demoapi
```
作成できたら、`cd`コマンドで作ったディレクトリに移動する。  
```.ターミナル  
cd demoapi
```
## 3. goをモジュールとしてinitする。
今回は、`demo.com/demoapi`という名前でinitする。  
```.ターミナル  
go mod init demo.com/demoapi
```
これを実行すると、`demoapi`ディレクトリ内に、`go.mod`というファイル名が作成される。  
これでgoのモジュールとして準備ができた。  

## 4. Go 用 Cloud クライアント ライブラリをインストール  
これをモジュール内にインストールすることで、GCPのさまざまなサービスを利用して開発ができるようになる。  
ターミナルで以下のコマンドを実行する。  
```.ターミナル  
go get github.com/GoogleCloudPlatform/functions-framework-go
```
これで、Github上に上がっているライブラリがモジュールに組み込まれる。  

ここで、`demoapi/go.mod`を見ると、  

```mod:go.mod  
module demo.com/demoapi

go 1.20

//追加された部分
require github.com/GoogleCloudPlatform/functions-framework-go v1.7.4 // indirect

```
このようにライブラリが組み込まれていることがわかる。  

これで環境構築は整った。

# 最初の関数を書いてみる  
今回は、リクエストに対して、「こんにちは！」と返すだけの関数を書いてみる。  
以下の様にコーディングする。  

```go:demo_api.go 
package demoapi

import (
	"fmt"
	"net/http"

	"github.com/GoogleCloudPlatform/functions-framework-go/functions"
)

func init() {
	functions.HTTP("AisatuGet", aisatuGet)
}

// こんにちは！と返すだけの関数
func aisatuGet(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, "こんにちは！")
}

```
簡単に何をしているのか説明すると、「`AisatuGet`という名前でhttpのリクエストがあったときに、aisatuGetという関数を実行し、こんにちは！という文字列を返す。」といった簡単な内容である。  

# いよいよデプロイ  
## 1. デプロイに必要なコマンドを確認  
GCPへのデプロイには、次の様なコマンドを打つ必要がある。  

```.ターミナル  
gcloud functions deploy **名前** \
--gen2 \
--runtime=go120 \
--region= **リージョン（場所）** \
--source=. \
--entry-point= **デプロイする関数のエントリポイント** \
--trigger-http \
--allow-unauthenticated
```
まず、書き換えるのは、１行目の名前のところ。  
公式のドキュメントの例では、go-http-functionとなっているが、これがデプロイした後にコンソールで表示される名前になる。つまり管理名と考えて良いかも。
次に、4行目の、region。これは、関数をデプロイする場所を指定する。GCPのインフラは世界中にあるので、どこにアップロードするのかを指定する必要がある。これを見ているのは日本人で日本で開発する人が多いと思うので、`asia-northeast1`（東京）にしておけば良い。  
最後に、６行目は、作成した関数を呼び出すHTTPエントリポイント（APIのアクセス先）を書く。  
  
## 2. デプロイする

先ほど、作った`demo_api.go`のaisatuGet関数を今回はデプロイしたいので、以下の様にコマンドを打てば良い。  

```.ターミナル  
gcloud functions deploy aisatu-function \
--gen2 \
--runtime=go120 \
--region=asia-northeast1 \
--source=. \
--entry-point=AisatuGet \
--trigger-http \
--allow-unauthenticated
```
これをターミナルに打ち込んで実行してみると、  

```.ターミナル  
Preparing function...done.                                                                                  
⠹ Deploying function...                                                                                     
  ⠹ [Build] Creating build... Logs are available at [https://console.cloud.google.com/cloud-build/builds;reg
  ion=asia-northeast1/ここに長々と文字列が続く...]                            
  . [Service]                                                                                               
  . [ArtifactRegistry]                                                                                      
  . [Healthcheck]                                                                                           
  . [Triggercheck]  
```
デプロイが始まる。  
しばらく時間がかかるので、待っていると、

```.ターミナル  
//さっきの続き
Done.                                                                                                       

**ここに長々とデプロイ内容などが表示される**

state: ACTIVE
updateTime: '2023-07-09T07:35:36.315434600Z'
url: https://asia-northeast1-**プロジェクト名**.cloudfunctions.net/aisatu-function
```
この様な内容が表示されればデプロイ完了。  

一番最後のurlが、この関数へのエントリポイント（アクセス先）になるので、必ずメモしておこう。

## 3. デプロイできたか確認  
以下の様にcurlコマンドを打って実行すると、狙い通り「こんにちは」と返ってくる。  

```.ターミナル  
curl -m 70 -X POST **ここにurlを貼る** \
    -H "Authorization: bearer $(gcloud auth print-identity-token)" \
    -H "Content-Type: application/json" \
    -d '{}'
```

```.ターミナル  
こんにちは！
```
できた！！  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724591/e65c6e63-2761-7b48-8972-99b091425220.png)
Cloud Functionsのコンソールにも、デプロイしたものが表示されている。


# 最後に 
本日の記事はここまで。  
次回は、リクエストパラメータの受け取りなどをやりたいと思う。  

見ていただきありがとうございました！


# 参考文献  
https://cloud.google.com/go/docs/setup?hl=ja
https://cloud.google.com/functions/docs/create-deploy-gcloud?hl=ja