700 以上のラボとコースにアクセス

Go を使った Google Cloud Run の HTTP 関数

ラボ 45分 universal_currency_alt クレジット: 1 show_chart 入門
info このラボでは、学習をサポートする AI ツールが組み込まれている場合があります。
700 以上のラボとコースにアクセス

GSP602

Google Cloud セルフペース ラボのロゴ

概要

Go は、シンプルで信頼性、効率性に優れたソフトウェアを簡単に構築できるオープンソースのプログラミング言語です。Cloud Shell を使用するとき、Go はすでにインストールされています。

Cloud Run functions は、クラウド サービスの構築と接続に使用できるサーバーレスの実行環境です。Cloud Run functions を使用すると、クラウド インフラストラクチャやサービスで生じたイベントに関連付けられた、単一目的の関数を作成できます。対象のイベントが発生すると、関数がトリガーされます。コードは Cloud Run のフルマネージド環境で実行されます。インフラストラクチャをプロビジョニングする必要はなく、サーバーの管理に悩まされることもありません。

Cloud Run 関数は、サポート対象のプログラミング言語を使用して作成できます。サポートされているいずれかの言語の標準的なランタイム環境で関数を実行できるため、移植性の確保やローカルテストの実施が簡単です。

このラボでは、Go を使用して独自の Cloud Run 関数を作成します。この関数は、HTTP 経由で呼び出すと、Renee French 氏がデザインした Go Gopher の画像を表示します。

学習内容

  • Go を使った Cloud Run の HTTP 関数を記述する方法。
  • Go を使った Cloud Run の HTTP 関数をテストする方法。
  • 関数を試すためにローカルの Go HTTP サーバーを実行する方法。

Go のマスコット Gopher

前提条件

このラボは、Go に精通していることを前提としています。Go コードについての説明はありますが、Go をまったく初めて使用するユーザーには十分ではない可能性があります。

設定と要件

[ラボを開始] ボタンをクリックする前に

こちらの説明をお読みください。ラボには時間制限があり、一時停止することはできません。タイマーは、Google Cloud のリソースを利用できる時間を示しており、[ラボを開始] をクリックするとスタートします。

このハンズオンラボでは、シミュレーションやデモ環境ではなく実際のクラウド環境を使って、ラボのアクティビティを行います。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。

このラボを完了するためには、下記が必要です。

  • 標準的なインターネット ブラウザ(Chrome を推奨)
注: このラボの実行には、シークレット モード(推奨)またはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウント間の競合を防ぎ、個人アカウントに追加料金が発生しないようにすることができます。
  • ラボを完了するための時間(開始後は一時停止できません)
注: このラボでは、受講者アカウントのみを使用してください。別の Google Cloud アカウントを使用すると、そのアカウントに料金が発生する可能性があります。

ラボを開始して Google Cloud コンソールにログインする方法

  1. [ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるダイアログでお支払い方法を選択してください。 左側の [ラボの詳細] ペインには、以下が表示されます。

    • [Google Cloud コンソールを開く] ボタン
    • 残り時間
    • このラボで使用する必要がある一時的な認証情報
    • このラボを行うために必要なその他の情報(ある場合)
  2. [Google Cloud コンソールを開く] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウで開く] を選択します)。

    ラボでリソースがスピンアップし、別のタブで [ログイン] ページが表示されます。

    ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。

    注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
  3. 必要に応じて、下のユーザー名をコピーして、[ログイン] ダイアログに貼り付けます。

    {{{user_0.username | "Username"}}}

    [ラボの詳細] ペインでもユーザー名を確認できます。

  4. [次へ] をクリックします。

  5. 以下のパスワードをコピーして、[ようこそ] ダイアログに貼り付けます。

    {{{user_0.password | "Password"}}}

    [ラボの詳細] ペインでもパスワードを確認できます。

  6. [次へ] をクリックします。

    重要: ラボで提供された認証情報を使用する必要があります。Google Cloud アカウントの認証情報は使用しないでください。 注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
  7. その後次のように進みます。

    • 利用規約に同意してください。
    • 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
    • 無料トライアルには登録しないでください。

その後、このタブで Google Cloud コンソールが開きます。

注: Google Cloud のプロダクトやサービスにアクセスするには、ナビゲーション メニューをクリックするか、[検索] フィールドにサービス名またはプロダクト名を入力します。 ナビゲーション メニュー アイコンと検索フィールド

Cloud Shell をアクティブにする

Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。

  1. Google Cloud コンソールの上部にある「Cloud Shell をアクティブにする」アイコン 「Cloud Shell をアクティブにする」アイコン をクリックします。

  2. ウィンドウで次の操作を行います。

    • Cloud Shell 情報ウィンドウで操作を進めます。
    • Cloud Shell が認証情報を使用して Google Cloud API を呼び出すことを承認します。

接続した時点で認証が完了しており、プロジェクトに各自の Project_ID が設定されます。出力には、このセッションの PROJECT_ID を宣言する次の行が含まれています。

Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}

gcloud は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。

  1. (省略可)次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list
  1. [承認] をクリックします。

出力:

ACTIVE: * ACCOUNT: {{{user_0.username | "ACCOUNT"}}} To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (省略可)次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project

出力:

[core] project = {{{project_0.project_id | "PROJECT_ID"}}} 注: Google Cloud における gcloud ドキュメントの全文については、gcloud CLI の概要ガイドをご覧ください。

リージョンとゾーンを設定する

一部の Compute Engine リソースは、リージョン内やゾーン内に存在します。リージョンとは、リソースを実行できる特定の地理的なロケーションです。1 つのリージョンには 1 つ以上のゾーンがあります。

Cloud Shell で次の gcloud コマンドを実行して、ラボのデフォルトのリージョンとゾーンを設定します。

gcloud config set compute/zone "{{{project_0.default_zone|ZONE}}}" export ZONE=$(gcloud config get compute/zone) gcloud config set compute/region "{{{project_0.default_region|REGION}}}" export REGION=$(gcloud config get compute/region)

Cloud Run functions API が有効になっていることを確認する

  • Cloud Shell で次のコマンドを実行して、Cloud Run functions API を有効にします。これにより、ラボの後半で Cloud Run functions をデプロイできるようになります。
gcloud services enable cloudfunctions.googleapis.com

コードをダウンロードして設定する

  1. Cloud Shell ターミナルで、curl を使用して、このラボのコードを含む zip ファイルをダウンロードします。
curl -LO https://github.com/GoogleCloudPlatform/golang-samples/archive/main.zip
  1. unzip を使用してコードを解凍します。これにより、cloud.google.com 用のサンプル Go コードを含むディレクトリ(golang-samples-main)が展開されます。
unzip main.zip
  1. このラボのコードが含まれるディレクトリに移動します。
cd golang-samples-main/functions/codelabs/gopher

gopher ディレクトリは、次のディレクトリとファイルで構成されます。

$ tree . ├── cmd │ └── main.go # 関数をローカルで実行するためのバイナリ。 ├── go.mod # Go モジュールの定義。 ├── gophercolor.png # Gopher ├── gopher.go # 関数を含む Go ファイル。 └── gopher_test.go # Go のテストファイル。

タスク 1. Go を使った Cloud Run の HTTP 関数を紹介する

Go を使った Cloud Run の HTTP 関数は、http.HandlerFunc 関数として記述します。これは Go の標準ライブラリで定義されているインターフェースです。関数は、次の条件を満たす必要があります。

  • エクスポートされている、つまり別のパッケージから使用できること。名前が大文字で始まっていれば、この状態になっています。
  • http.HandlerFunc 型と一致すること、つまり関数が func(http.ResponseWriter, *http.Request) の形式になっていること(Go で完全なウェブ アプリケーションを作成するための詳細なガイドについては、ウェブ アプリケーションの作成に関するチュートリアルをご覧ください)。

例として、「Hello, world」と出力する関数を以下に示します。

package gopher import ( "fmt" "net/http" ) // HelloWorld が「Hello, world」と出力 func HelloWorld(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, world.") } 注: このファイルは、Cloud Shell エディタで開くことができます(**エディタを開く** をクリック)。次に、左側のファイルツリーを使用して golang-samples-main/functions/codelabs/gopher/hello.go ファイルを開きます。

この関数を Cloud Run の HTTP 関数としてデプロイする

  1. functions/codelabs/gopher ディレクトリから、gcloud functions deploy を使用して関数名をデプロイできます。
gcloud functions deploy HelloWorld --gen2 --runtime go123 --trigger-http --region {{{project_0.default_region | REGION}}}
  1. 新しい関数の未認証呼び出しを許可するかどうかを確認するメッセージが表示されたら、「Y」と入力します。

処理には 1~2 分かかります。

出力:

Deploying function (may take a while - up to 2 minutes)...done. availableMemoryMb: 256 entryPoint: HelloWorld httpsTrigger: url: https://region-my-project.cloudfunctions.net/HelloWorld ...

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 Cloud Run の HTTP 関数 HelloWorld を作成する

注: デプロイ中にエラーが発生した場合は、以下を確認します。

  • Cloud Run functions API が有効になっていることを確認します。有効になっていない場合は、有効にするためのリンクを含むエラーが表示されます。あるいは、gcloud services enable cloudfunctions.googleapis.com コマンドで有効にすることもできます。
  • 作業ディレクトリ(gcloud を実行しているディレクトリ)が .go ファイルを含むディレクトリであることを確認します。cd golang-samples/functions/codelabs/gopher でディレクトリを移動できます。
  • 関数名が正しいことを確認します。これは、デプロイしようとしている Go 関数の名前、HelloWorld である必要があります。
  • それでもアクセス拒否エラーが発生する場合は、数分待ってからもう一度試してください。
  • デプロイ後に、デプロイした URL にアクセスすると **403 Forbidden** エラーが発生する場合は、次のコマンドを実行して関数への一般公開アクセスを許可します。 gcloud functions add-iam-policy-binding HelloWorld \ --member="allUsers" \ --role="roles/cloudfunctions.invoker" \ --region= この IAM ポリシー バインディングが適用されたら、前のデプロイ コマンドを使用して関数を再デプロイします。
  1. 出力に表示される httpsTrigger URL をコピーします。次のようになります。
https://<REGION>-$GOOGLE_CLOUD_PROJECT.cloudfunctions.net/HelloWorld
  1. HelloWorld 関数をテストするには、最後の出力の URL に curl でアクセスします。
curl https://<REGION>-$GOOGLE_CLOUD_PROJECT.cloudfunctions.net/HelloWorld

出力:

Hello, world.

Cloud Run の HTTP 関数を作成してデプロイしました。

タスク 2. Cloud Run の HTTP 関数 Gopher を作成する

次に、「Hello, world」関数を少し面白くするために、リクエストごとに Gopher の画像を出力します。

Go のマスコット Gopher

次のブロックは、これを実現するコードを示しています。このコードは、Cloud Shell の golang-samples-master/functions/codelabs/gopher/gopher.go で確認できます。

// パッケージ gopher には、Gopher を表示する HTTP 関数が含まれる。 package gopher import ( "fmt" "io" "net/http" "os" ) // Gopher が Gopher を出力。 func Gopher(w http.ResponseWriter, r *http.Request) { // Gopher の画像ファイルを読み取り。 f, err := os.Open("gophercolor.png") if err != nil { http.Error(w, fmt.Sprintf("Error reading file: %v", err), http.StatusInternalServerError) return } defer f.Close() // Write the gopher image to the response writer. if _, err := io.Copy(w, f); err != nil { http.Error(w, fmt.Sprintf("Error writing response: %v", err), http.StatusInternalServerError) } w.Header().Add("Content-Type", "image/png") }
  • このファイルは、パッケージ宣言とコメントで始まります。すべての Go コードはパッケージ内に記述され、先頭に次のような宣言があります。

  • import ブロックには、このファイルが依存する他のパッケージのリストが含まれています。これらのパッケージは、ファイルの残りの部分内で名前を使用して参照されます。たとえば、http パッケージの ResponseWriter 型を使用するには、http.ResponseWriter と記述します。

  • 次は Gopher 関数の宣言です。

  • この関数は、os.Open 関数を使用して gophercolor.png ファイル(サンプルコードを参照)を読み取ることから始まります。

  • 次に、ファイルの読み取り中にエラーが発生したかどうかを確認します。これは、ファイルが破損している場合や、誤ってアップロードから除外された場合に発生する可能性があります。

  • io.Copy を使用して、gopher イメージを whttp.ResponseWriter 引数)にコピーします。w に書き込まれたすべてのものが HTTP レスポンスで送信されます。

  • レスポンスの書き込み時にエラーがなければ、関数は正常に返されます。

  1. gcloud functions deploy と関数名 Gopher を使用して、先ほどの「Hello, world」関数と同じようにこの関数をデプロイします。
gcloud functions deploy Gopher --gen2 --runtime go123 --trigger-http --region {{{project_0.default_region | REGION}}}
  1. 新しい関数の未認証呼び出しを許可するかどうかを確認するメッセージが表示されたら、「Y」と入力します。

  2. 関数をテストするには、最後のコマンドの出力にある関数の URL にアクセスします。成功すると、ブラウザに Gopher が表示されます。

次のステップでは、関数が継続的に動作することを確認するためのテストを追加します。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 Cloud Run の HTTP 関数 Gopher を作成する

タスク 3. テストを作成する

Go を使った Cloud Run の HTTP 関数は、標準ライブラリの testing パッケージと httptest パッケージを使用してテストします。関数をテストするためにエミュレータやその他のシミュレーションを実行する必要はなく、通常の Go コードで十分です。

Gopher 関数のテストは次のようになります。

package gopher import ( "net/http" "net/http/httptest" "testing" ) func TestGopher(t *testing.T) { rr := httptest.NewRecorder() req := httptest.NewRequest("GET", "/", nil) Gopher(rr, req) if rr.Result().StatusCode != http.StatusOK { t.Errorf("Gopher StatusCode = %v, want %v", rr.Result().StatusCode, http.StatusOK) } }
  • Go テストは、他の Go ファイルと同じように記述されます。パッケージ宣言とインポート セットから始めます。
  • テストの宣言は func MyTest(t *testing.T) の形式です。エクスポートする必要があり、*testing.T 型の引数を 1 つ取ります。
  • このテストでは、httptest パッケージを使用してテスト レスポンスとリクエストの値を作成します。
  • Gopher 関数を呼び出します。
  • Gopher 関数を呼び出した後、テストは HTTP レスポンス コードをチェックして、エラーがないことを確認します。
  1. これらのテストをローカルで実行するには、テストするファイルがあるディレクトリに cd で移動します。
cd ~/golang-samples-main/functions/codelabs/gopher
  1. golang-samples-main/functions/codelabs/gopher ディレクトリで、go test コマンドを使用します。
go test -v

出力:

=== RUN TestGopher --- PASS: TestGopher (0.03s) PASS ok github.com/GoogleCloudPlatform/golang-samples/functions/codelabs/gopher 0.037s 注: テストに合格しなかった場合

  • 役立つ情報がないかエラー メッセージを確認します。
  • gopher.go ファイルおよび gopher_test.go ファイルと同じディレクトリ(golang-samples-main/functions/codelabs/gopher)にいることを確認します。

次に、関数をローカルで実行し、ブラウザで試せるように、バイナリ(Go の package main)を作成します。

タスク 4. 関数をローカルで実行する

HTTP 関数をローカルで実行するには、HTTP サーバーを作成し、関数をハンドラとして登録します(Go で完全なウェブ アプリケーションを作成するための詳細なガイドについては、ウェブ アプリケーションの作成に関するチュートリアルをご覧ください)。

関数のサブディレクトリに関数の HTTP サーバーを記述できます。

Go の規則に沿って、そのディレクトリに cmd という名前を付け、その中に main.go ファイルを作成します。

// cmd コマンドは HTTP サーバーを起動します。 package main import ( "fmt" "log" "net/http" "github.com/GoogleCloudPlatform/golang-samples/functions/codelabs/gopher" ) func main() { http.HandleFunc("/", gopher.Gopher) fmt.Println("Listening on localhost:8080") log.Fatal(http.ListenAndServe(":8080", nil)) }
  • このファイルは、パッケージとして package main を使用します。main パッケージは、実行可能なバイナリとしてビルドされます。
  • このファイルは、関数のファイルの隣にある go.modmodule 行に基づいて、github.com/GoogleCloudPlatform/golang-samples/functions/codelabs/gopher をインポートします。独自の関数を記述する際は、モジュールに任意の名前を付けることができます。
  • func main() はバイナリのエントリ ポイントです。gopher.Gopher 関数を HTTP ハンドラとして登録し、http.ListenAndServe を使用してサーバーを起動します。
  1. このバイナリをローカルでビルドして実行するには、次のコマンドを実行します。
GO123MODULES=on # Go モジュールを有効にする go build -o start ./cmd ./start

出力:

Listening on localhost:8080
  1. 関数は現在の作業ディレクトリから gophercolor.png 画像を読み込むため、gophercolor.png ファイルと同じディレクトリからバイナリを起動する必要があります。-o start フラグは、出力バイナリの名前に start を指定しています。./cmd は、cmd ディレクトリにあるバイナリをビルドするように指示しています。

  2. 次に、Cloud Shell のウェブ プレビューを使用して、ブラウザでサーバーをテストします。

  • ウェブ プレビューのボタン ウェブ プレビューのアイコン をクリックします。
  • 表示されたメニューからポート 8080 を選択します。

プロキシ サービスのプレビュー用 URL が新しいブラウザ ウィンドウで開きます。ウェブ プレビューでは、HTTPS でのアクセスはユーザー アカウントのみに制限されます。

すべてが正常に機能している場合、Go Gopher が表示されます。

注: Gopher が表示されない場合

  • gopher.go ファイルおよび gopher_test.go ファイルと同じディレクトリ(golang-samples-main/functions/codelabs/gopher)にいることを確認します。
  • サーバーが起動していることを確認します。go build -o start ./cmd コマンドでビルドし、./start を実行して起動します。Listening on localhost:8080 と出力されるはずです。
  • ウェブ プレビューを開くときに正しいポートを選択したことを確認します。サーバーがリッスンするポート 8080 を必ず使用してください。

タスク 5. クリーンアップ

このラボを終了すると、使用したすべてのリソースが削除されます。ご自身の環境を使用する場合は、費用を節約し、クラウドのマナーを守るために、常に不要なリソースを削除するようにしましょう。

  1. Ctrl+C キーを押して URL の提供を停止します。

  2. Cloud Run 関数のテストが完了したら、gcloud を使用して削除できます。

gcloud functions delete Gopher --region {{{project_0.default_region | REGION}}} gcloud functions delete HelloWorld --region {{{project_0.default_region | REGION}}}

関数はコンソールから削除することもできます。

お疲れさまでした

これで、Go で Cloud Run 関数を使用する方法を理解できました。このラボでは、Go で Cloud Run の HTTP 関数を作成する方法、関数をテストする方法、ローカルで実行する方法を学びました。

Google Cloud トレーニングと認定資格

Google Cloud トレーニングと認定資格を通して、Google Cloud 技術を最大限に活用できるようになります。必要な技術スキルとベスト プラクティスについて取り扱うクラスでは、学習を継続的に進めることができます。トレーニングは基礎レベルから上級レベルまであり、オンデマンド、ライブ、バーチャル参加など、多忙なスケジュールにも対応できるオプションが用意されています。認定資格を取得することで、Google Cloud テクノロジーに関するスキルと知識を証明できます。

マニュアルの最終更新日: 2025 年 9 月 25 日

ラボの最終テスト日: 2025 年 9 月 25 日

Copyright 2025 Google LLC. All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。

このラボのフィードバックを提供する

始める前に

  1. ラボでは、Google Cloud プロジェクトとリソースを一定の時間利用します
  2. ラボには時間制限があり、一時停止機能はありません。ラボを終了した場合は、最初からやり直す必要があります。
  3. 画面左上の [ラボを開始] をクリックして開始します

シークレット ブラウジングを使用する

  1. ラボで使用するユーザー名パスワードをコピーします
  2. プライベート モードで [コンソールを開く] をクリックします

コンソールにログインする

    ラボの認証情報を使用して
  1. ログインします。他の認証情報を使用すると、エラーが発生したり、料金が発生したりする可能性があります。
  2. 利用規約に同意し、再設定用のリソースページをスキップします
  3. ラボを終了する場合や最初からやり直す場合を除き、[ラボを終了] はクリックしないでください。クリックすると、作業内容がクリアされ、プロジェクトが削除されます

このコンテンツは現在ご利用いただけません

利用可能になりましたら、メールでお知らせいたします

ありがとうございます。

利用可能になりましたら、メールでご連絡いたします

1 回に 1 つのラボ

既存のラボをすべて終了して、このラボを開始することを確認してください

シークレット ブラウジングを使用してラボを実行する

このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウントの競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。