🌿
Go言語でCloud Functionsの関数を作成する
はじめに
今回はGo言語でHTTPリクエストを送信するプログラムを作成し、Google Cloud Functionsで実行してみました。
HTTPリクエストを送信するプログラム
BASIC認証でHTTPリクエストを送信してレスポンスを出力するプログラムです。
main.go
package main
import (
"encoding/base64"
"fmt"
"io"
"net/http"
"os"
)
func main() {
// HTTPリクエストを送信するURLを環境変数から取得
url := os.Getenv("url")
// BASIC認証のユーザー名とパスワードを環境変数から取得
username := os.Getenv("username")
password := os.Getenv("password")
// BASIC認証をBase64エンコード
auth := base64.StdEncoding.EncodeToString([]byte(username + ":" + password))
// HTTPクライアントを作成
client := &http.Client{}
// HTTPリクエストを作成
req, err := http.NewRequest("GET", url, nil)
if err != nil {
fmt.Println("HTTPリクエスト作成エラー:", err)
return
}
// BASIC認証ヘッダを設定
req.Header.Add("Authorization", "Basic "+auth)
// HTTPリクエストを送信
response, err := client.Do(req)
if err != nil {
fmt.Println("HTTPリクエスト送信エラー:", err)
return
}
defer response.Body.Close()
// HTTPレスポンスを取得
body, err := io.ReadAll(response.Body)
if err != nil {
fmt.Println("HTTPレスポンス取得エラー:", err)
return
}
// レスポンスを出力
fmt.Println("HTTPステータス:", response.Status)
fmt.Println(string(body))
}
Cloud Functionsで動かすプログラム
HTTPトリガーのCloud Functionsで動かす場合は下記の様に修正します。
main.go
package httpclient
import (
"encoding/base64"
"fmt"
"io"
"net/http"
"os"
"github.com/GoogleCloudPlatform/functions-framework-go/functions"
)
func init() {
functions.HTTP("HttpClient", HttpClient)
}
func HttpClient(w http.ResponseWriter, r *http.Request) {
// HTTPリクエストを送信するURLを環境変数から取得
url := os.Getenv("url")
// BASIC認証のユーザー名とパスワードを環境変数から取得
username := os.Getenv("username")
password := os.Getenv("password")
// BASIC認証をBase64エンコード
auth := base64.StdEncoding.EncodeToString([]byte(username + ":" + password))
// HTTPクライアントを作成
client := &http.Client{}
// HTTPリクエストを作成
req, err := http.NewRequest("GET", url, nil)
if err != nil {
fmt.Println("HTTPリクエスト作成エラー:", err)
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
return
}
// BASIC認証ヘッダを設定
req.Header.Add("Authorization", "Basic "+auth)
// HTTPリクエストを送信
response, err := client.Do(req)
if err != nil {
fmt.Println("HTTPリクエスト送信エラー:", err)
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
return
}
defer response.Body.Close()
// HTTPレスポンスを取得
body, err := io.ReadAll(response.Body)
if err != nil {
fmt.Println("HTTPレスポンス取得エラー:", err)
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
return
}
// レスポンスをログに出力
fmt.Println("HTTPステータス:", response.Status)
fmt.Println(string(body))
// 結果をHTTPレスポンスとして返す
fmt.Fprint(w, "Request success.")
}
go.mod
module example.com/httpclient
require (
github.com/GoogleCloudPlatform/functions-framework-go v1.5.2
)
Cloud Functions をデプロイ
作成したプログラムをGCPにデプロイします。
gcloud functions deploy funcHttpClient \
--entry-point=HttpClient \
--region=us-central1 \
--runtime=go120 \
--trigger-http
まとめ
Cloud Functionsでは、関数をpackage mainに含めることができないので、package名等を変更する必要がありました。
Discussion