🌿

Go言語でCloud Functionsの関数を作成する

2023/10/06に公開

はじめに

今回は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 の関数をデプロイする

まとめ

Cloud Functionsでは、関数をpackage mainに含めることができないので、package名等を変更する必要がありました。

レスキューナウテックブログ

Discussion