arrow_back

Google Cloud サーバーレス プラットフォームへの Go アプリのデプロイ

ログイン 参加
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

Google Cloud サーバーレス プラットフォームへの Go アプリのデプロイ

Lab 1時間 10分 universal_currency_alt クレジット: 1 show_chart 入門
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

GSP702

Google Cloud セルフペース ラボ

概要

Go は、Google によるオープンソースのプログラミング言語で、Go を使うと信頼性効率性に優れた、高速かつスケール可能なソフトウェアを簡単に構築できます。このラボでは、シンプルな Go のアプリを Cloud RunCloud FunctionsApp Engine にデプロイして、Go の基礎を学びます。次に、Go アプリを使用して、BigQueryFirestore のデータにアクセスします。

演習内容

このラボでは、次のタスクを行います。

  • Firestore データベースを設定して、データをインポートする
  • Cloud Build の機能の概要を確認する
  • BigQuery と Firestore のデータにアクセスする
  • App Engine、Cloud Run、Cloud Functions に Go アプリをデプロイする
  • Go アプリのコードを調べる
  • 各プラットフォームでアプリをテストする

設定と要件

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

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

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

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

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

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

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

    • [Google コンソールを開く] ボタン
    • 残り時間
    • このラボで使用する必要がある一時的な認証情報
    • このラボを行うために必要なその他の情報(ある場合)
  2. [Google コンソールを開く] をクリックします。 ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。

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

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

  4. [ラボの詳細] パネルから [パスワード] をコピーして [ようこそ] ダイアログに貼り付けます。[次へ] をクリックします。

    重要: 認証情報は左側のパネルに表示されたものを使用してください。Google Cloud Skills Boost の認証情報は使用しないでください。 注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
  5. その後次のように進みます。

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

その後このタブで Cloud Console が開きます。

注: 左上にある [ナビゲーション メニュー] をクリックすると、Google Cloud のプロダクトやサービスのリストが含まれるメニューが表示されます。 ナビゲーション メニュー アイコン

Cloud Shell をアクティブにする

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

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

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

Your Cloud Platform project in this session is set to YOUR_PROJECT_ID

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

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

  2. 出力は次のようになります。

出力:

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

出力:

[core] project = <project_ID>

出力例:

[core] project = qwiklabs-gcp-44776a13dea667a6 注: Google Cloud における gcloud ドキュメントの全文については、gcloud CLI の概要ガイドをご覧ください。

Go とは

Go(golang)は、システムのプログラミング用に設計された汎用言語です。堅牢なこの言語は、ガベージ コレクション機能を備えており、並行プログラミングをサポートしています。プログラムはパッケージで構築され、それらのプロパティにより依存関係を効率的に管理できます。

Python や JavaScript と違って、Go はスクリプト言語ではなく、コンパイル言語です。Go のソースコードは、実行前にマシンコードにコンパイルされます。そのため、Go は一般的にスクリプト言語より高速かつ効率的で、プログラムを実行するために Node、Python、JDK のようなランタイムをインストールする必要ありません。

サーバーレス プラットフォーム

サーバーレス コンピューティングを利用することで、デベロッパーはインフラストラクチャを意識することなく、コードの記述に集中できます。従来のコンピューティングに比べ、サーバー管理不要、事前プロビジョニング不要、自動スケーリング、使用したリソースのみに対する支払いなどの利点があります。こうした利点を活かして、ステートレスな HTTP アプリケーション、ウェブ、モバイル、IoT バックエンド、バッチとストリーミングのデータ処理、チャットボットなどの幅広い用途に利用できます。

Go は、効率性とポータビリティに優れていて、使い方を簡単に学べるので、クラウド アプリケーションに最適です。このラボでは、Cloud Build を使って、Google のサーバーレス プラットフォームである Cloud Run、Cloud Functions、App Engine に Go アプリをデプロイする方法を学びます。

  • Cloud Run
  • Cloud Functions
  • App Engine
注: 個々のニーズに最適なサーバーレス プラットフォームについては、サーバーレス オプションをご覧ください。

Cloud Build

Cloud Build は、Google Cloud インフラストラクチャでビルドを行うサービスです。Cloud Build では、Cloud Storage、Cloud Source Repositories、GitHub、Bitbucket からソースコードをインポートし、仕様に合わせてビルドを実行して、Docker コンテナなどのアーティファクトを生成します。

Cloud Build は、一連のビルドステップとしてビルドを実行します。各ビルドステップは、Docker コンテナで実行されます。ビルドステップでは、環境に関係なく、コンテナで実行可能なすべての処理を実行できます。詳細については、Cloud Build のドキュメントをご覧ください。

Cloud Run

Cloud Run は、ステートレス コンテナを自動的にスケールするフルマネージド型のコンピューティング プラットフォームです。Cloud Run はサーバーレスです。インフラストラクチャ管理が一切不要なため、最も重要な作業であるアプリケーションの構築に集中できます。

アーキテクチャ

Go アプリのサンプルである Google Cloud Data Drive を Cloud Run にデプロイすると、データフローのアーキテクチャは以下のようになります。

Cloud Run 上の Go ウェブアプリのアーキテクチャ図

Cloud Functions

Cloud Functions は、Google Cloud のイベント ドリブンのサーバーレス コンピューティング プラットフォームです。Go はマシンコード バイナリにコンパイルされ、起動の際にフレームワークに依存せず、インタプリタを必要としないので、Go のコールド スタート時間は 80~1400 ms です。このように起動時間が短く、その間はアプリケーションとサービスを利用しないため、費用がかかりません。また、スタートアップとコールド スタートのトラフィックの処理は 1400 ms 以内です。起動後に、Cloud Functions の関数はトラフィックを瞬時に処理します。これだけでも、Go が Cloud Functions にデプロイする最適な言語であることがわかります。

アーキテクチャ

Go アプリのサンプルである Google Cloud Data Drive を Cloud Functions にデプロイすると、データフローのアーキテクチャは以下のようになります。

Cloud Run 上の Go ウェブアプリのアーキテクチャ図

App Engine

App Engine スタンダード環境は、Google のインフラストラクチャで実行されるコンテナ インスタンスに基づいています。コンテナは、複数の利用可能なランタイムの 1 つで事前構成されています。

アーキテクチャ

Go アプリのサンプルである Google Cloud Data Drive を App Engine にデプロイすると、データフローのアーキテクチャは以下のようになります。

Go Serverless のアーキテクチャ図

Google Cloud Data Drive のソースコード

このラボでは、Google Cloud Data Drive という名前のシンプルなアプリをデプロイします。Google は、Google Cloud からデータをすぐに抽出できるように、このアプリを開発し、ソースコードを公開しました。Google Cloud Data Drive アプリは、Cloud API とサービスを使う際に効果的な利用パターンを示す一連のツールの 1 つです。

Google Cloud Data Drive Go アプリは、シンプルで構成可能な URL パスを公開し、サポートされる Google Cloud データ プラットフォームから JSON 形式でデータを取得します。現在このアプリは BigQuery と Firestore をサポートしていますが、モジュール化された設計であり、多数のデータソースをサポートすることが可能です。

Google Cloud Data Drive を実行している Google Cloud からデータを取得する際に使用される HTTP URL パターンを以下に示します。

  • Firestore : [SERVICE_URL]/fs/[PROJECT_ID]/[COLLECTION]/[DOCUMENT]

  • BigQuery: [SERVICE_URL]/bq/[PROJECT_ID]/[DATASET]/[TABLE]

ここで

パラメータ

説明

[SERVICE URL]

App Engine、Cloud Run、または Cloud Functions からのアプリケーションのベース URL です。App Engine のベース URL は、https://[PROJECT ID].appspot.com/ のようになります。

[PROJECT ID]

アクセスする Firestore コレクションまたは BigQuery データセットのプロジェクト ID。プロジェクト ID はラボの左側のパネルで確認できます。

[COLLECTION]

Firestore コレクション ID(symbols/product)です。

[DOCUMENT]

返信する Firestore ドキュメント(symbol)です。

[DATASET]

BigQuery データセット名(publicviews)です。

[TABLE]

BigQuery テーブル名(ca_zip_codes)です。

注: このラボではアプリをテストするために curl を使用しますが、URL を自分で作成して、ブラウザで機能テストを別に実施することもできます。

タスク 1. 環境の設定

  1. このラボの後半で使用するために、Cloud Shell で 以下のコマンドを入力して、プロジェクト ID を保存する環境変数を作成します。
gcloud config set compute/region {{{ project_0.default_region | "filled in at lab startup." }}} export REGION=$(gcloud config get compute/region) export PROJECT_ID=$(gcloud info --format="value(config.project)")
  1. このラボのサンプルコードを Google Cloud Storage(GCS)からコピーします。
mkdir DIY-Tools gsutil cp -R gs://spls/gsp702/DIY-Tools/* DIY-Tools/

データベースの準備

このラボでは、BigQuery と Firestore のサンプルデータを使って Go アプリをテストします。

BigQuery データベース

BigQuery は、ML、データ パーティショニング、セグメンテーション向けの多数の機能を備えた、サーバーレスのデータ ウェアハウスで、長期の使用が可能です。BigQuery では、ANSI SQL を使用してギガバイトからペタバイト規模のデータを極めて高速に分析でき、運用のオーバーヘッドは発生しません。

BigQuery データセットは、カリフォルニア州の郵便番号を示したもので、ラボ開始時に作成されました。

Firestore データベース

Firestore は、ドキュメントを超高速で検索する機能とリアルタイムのイベントを処理する機能を備えた、サーバーレスのドキュメント データベースです。また、99.999% の SLA を保証します。アプリのテストに Firestore のデータを使用するには、Firestore をネイティブ モードに初期化して、サンプルデータをインポートする必要があります。

Firestore ネイティブ モードのデータベース インスタンスがあらかじめ作成されています。

  1. Cloud コンソールで、ナビゲーション メニュー > [Firestore] > [データ] の順にクリックして、コンソールで Firestore を開きます。

Firestore データベース インスタンスが初期化されるまで待ちます。この処理によって同じリージョンの App Engine も初期化されるので、最初に App Engine インスタンスを作成することなく、アプリケーションを App Engine にデプロイできます。

  1. Cloud Shell で Firestore インポート ジョブを起動します。これにより、ラボ用の Firestore サンプルデータが準備されます。
gcloud firestore import gs://$PROJECT_ID-firestore/prd-back

このインポート ジョブにより、symbols というコレクションの Cloud Firestore バックアップが $PROJECT_ID-firestore ストレージ バケットに読み込まれます。

インポート ジョブが完了するには最長で 5 分ほどかかることがあります。その間に次のセクションに進みます。

Firestore データベースのデプロイメントを確認する

Cloud Build の権限の構成

Cloud Build は、Google Cloud インフラストラクチャでビルドを行うサービスです。デフォルトの Cloud Build には、以下にアプリケーションをデプロイするための十分な権限がありません。

  • App Engine
  • Cloud Run
  • Cloud Functions

Cloud Build を使って Google Cloud Data Drive アプリをデプロイする前に、これらのサービスを有効にする必要があります。

  1. コンソールで、ナビゲーション メニュー > [Cloud Build] > [設定] の順にクリックします。
  2. [Cloud Functions] の [ステータス] を [有効] に設定します。

UI の Cloud Functions の横にある [ステータス] プルダウン メニューで [有効] オプションがハイライト表示されている

  1. プロンプトが表示されたら、[すべてのサービス アカウントにアクセス権を付与] をクリックします。
  2. [Cloud Run] の [ステータス] を [有効] に設定します。
  3. [App Engine] の [ステータス] を [有効] に設定します。

タスク 2. Cloud Run にデプロイする

Google Cloud Run は App Engine スタンダード環境ととても似ていますが、カスタム コンテナを使用(BYOC)できるところが異なります。Docker コンテナを作成する Dockerfile を Google Cloud Data Drive アプリ用に準備して、このコンテナを Cloud Run にデプロイします。

注: Google Kubernetes Engine や Docker コンテナをホストする他のプラットフォーム、さらにはオンプレミスのコンピューティング プラットフォームでも、このコンテナをホストすることができます。

Dockerfile の確認

Go は、コンテナ プラットフォームでのデプロイ用にアプリを作成するには優れた言語です。コンテナには、Go でコンパイルされたバイナリだけが含まれます。以下の例では distroless/static というベースコンテナを使用していることがわかります。このベースコンテナはゼロから構築されていて、公開証明書のルートとタイムゾーン ファイルの情報だけが含まれます。Go バイナリが、起動コマンドとして挿入されて登録されます(以下の Dockerfile の最後のコマンドラインをご覧ください)。他のフレームワークを含めたりする必要はありません。このようなコンテナを構築することで、最小のコンテナとセキュリティ フットプリントが作成されるので、GKE、Anthos、オンプレミスのホスティング ソリューションにコンテナを簡単に移植できます。

  1. コンテナを構築する Dockerfile コードは以下のとおりです。
# Use the official Golang image to create a build artifact. # This is based on Debian and sets the GOPATH to /go. # https://hub.docker.com/_/golang FROM golang:1.21 as builder # Create and change to the app directory. WORKDIR /app # Retrieve application dependencies. # This allows the container build to reuse cached dependencies. COPY go.* ./ RUN go mod download # Copy local code to the container image. COPY . ./ WORKDIR /app/cmd/webserver # Build the binary. RUN GO111MODULE=on CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -mod=readonly -v -o gcp-data-drive # Use the Google Distroless image for a minimal container. FROM gcr.io/distroless/static # Copy the binary to the production image from the builder stage. COPY --from=builder /app/cmd/webserver/gcp-data-drive /gcp-data-drive # Run the web service on container startup. CMD ["/gcp-data-drive"]
  1. GitHub の Dockerfile を確認してください。

Cloud Build YAML 構成ファイルの確認

以下に示した Cloud Build YAML ファイル DIY-Tools/gcp-data-drive/cloudbuild_run.yaml には、ご使用のアプリケーションを Cloud Run にデプロイするための Cloud Build ステップ定義が含まれます。このファイルを使って、アプリケーションを Cloud Run にデプロイします。

  • 最初のステップでは、git コマンドを実行して、アプリケーションを含めたソース リポジトリのクローンを作成します。このステップは、アプリケーションのブランチ間で簡単にスイッチできるようにパラメータ化されます。

  • 2 つ目のステップでは、Cloud Build を使用するために gcloud builds submit コマンドを実行して、Dockerfile に含まれたステップを使用し、コンパイルされたアプリケーションを含めたコンテナを作成します。このコンテナは gcr.io に保存されます。

  • 3 つ目のステップでは、アプリケーションのコンテナ イメージを gcr.io から リージョンの Cloud Run にデプロイします。

自分でコンテナを作成し、gcloud run deploy コマンドを使用して、アプリを手動でデプロイすることもできます。しかし、Cloud Build を使用することで、この作業を Google インフラストラクチャにオフロードできます。Google Cloud Build システムによってコミット イベントをタグフィルタでリッスンできるので、このシステムは自動 CI/CD システムのコア コンポーネントといえます。このような機能が統合されて、デベロッパーがライフサイクルのデプロイでコミットした信頼性の高い自動パイプラインが一貫して作成されます。

注: 見やすくするため、コメントは削除しています。 steps: - name: 'gcr.io/cloud-builders/git' args: ['clone','--single-branch','--branch', '${_GIT_SOURCE_BRANCH}','${_GIT_SOURCE_URL}'] - name: 'gcr.io/cloud-builders/gcloud'and I args: ['builds','submit', '--tag','gcr.io/$PROJECT_ID/gcp-data-drive'] dir: 'DIY-Tools/gcp-data-drive' - name: 'gcr.io/cloud-builders/gcloud' args: ['run','deploy','gcp-data-drive', '--image','gcr.io/$PROJECT_ID/gcp-data-drive', '--platform','managed', '--region','{{{project_0.default_region | "<filled in at lab start>"}}}', '--allow-unauthenticated'] dir: 'DIY-Tools/gcp-data-drive'

GitHub の cloudbuild_run.yaml のステップを確認してください。

インポート処理の確認

Cloud Shell で、データを Filestore に読み込むインポート処理が完了したかを確認します。完了したら次のセクションに進み、Google Cloud Data Drive アプリをデプロイします。

Google Cloud Data Drive アプリをデプロイする

  1. Cloud Shell で、GitHub からクローンを作成したアプリケーションのディレクトリに変更します。
cd ~/DIY-Tools/gcp-data-drive
  1. Cloud Build で Google Cloud Data Drive アプリを Cloud Run にデプロイします。
gcloud builds submit --config cloudbuild_run.yaml \ --project $PROJECT_ID --no-source \ --substitutions=_GIT_SOURCE_BRANCH="master",_GIT_SOURCE_URL="https://github.com/GoogleCloudPlatform/DIY-Tools",_GCP_REGION="{{{project_0.default_region | <filled in at lab startup> }}}"

デプロイには数分かかります。コンソールに赤いテキストが表示されることがありますが、エラーログではありません。

  1. Cloud Run サービス URL を環境変数に保存します。
export CLOUD_RUN_SERVICE_URL=$(gcloud run services --platform managed describe gcp-data-drive --region {{{project_0.default_region | "<filled in at lab start>"}}} --format="value(status.url)")
  1. curl を使用してアプリケーションを呼び出し、プロジェクトの Firestore の symbols コレクションにあるデータをクエリします。
curl $CLOUD_RUN_SERVICE_URL/fs/$PROJECT_ID/symbols/product/symbol | jq . 注: 認証エラーが発生した場合は、少し待ってから上記の curl コマンドを再試行してください。

これに対して、プロジェクトの symbols コレクションの値が含まれた JSON ファイルのコンテンツが返されます。ファイルの内容は大体次のようになっています。

[ { "asin": "B07DR9XYKB", "bbw": false, "brand": "", "category": "toy_display_on_website", "cpip": 1640, "docid": "887961768916", "fba": false, "fbafees": 610, "inStock": "NOW", "lastMatchLookup": "2020-03-13T13:00:47.040414Z", "lastOfferLookup": "2020-03-13T13:00:47.933649Z", "listPrice": 1599, "manufacturer": "Fisher-Price", "pkgquantity": 0, "salesrank": 54773, "sfbc": 4683, "sfbr": 0.99, "smallImage": "http://ecx.images-amazon.com/images/I/41fDombwLCL._SL75_.jpg", "title": "Fisher-Price Imaginext Toy Story Buzz Lightyear & Pizza Planet Truck", "upc": "887961768916" }, { "asin": "0744018307", "bbw": true, "brand": "", "category": "book_display_on_website", "cpip": 2000, "docid": "9780744018301", "fba": false, "fbafees": 722, "inStock": "NOW", "lastMatchLookup": "2020-03-13T14:00:10.209183Z", "lastOfferLookup": "2020-03-13T14:00:13.670858Z", "listPrice": 3999, "manufacturer": "Prima Games", "pkgquantity": 0, "salesrank": 337073, "sfbc": 0, "sfbr": 0, "smallImage": "http://ecx.images-amazon.com/images/I/51NFIAHRfTL._SL75_.jpg", "title": "Wolfenstein II: The New Colossus: Prima Collector's Edition Guide", "upc": "9780744018301" } ]
  1. curl を使用してアプリケーションを呼び出し、ラボ プロジェクトの BigQuery の publicviews.ca_zip_codes テーブルにあるデータをクエリします。
curl $CLOUD_RUN_SERVICE_URL/bq/$PROJECT_ID/publicviews/ca_zip_codes | jq .

これに対して、BigQuery SQL ステートメント SELECT * FROM publicviews.ca_zip_codes; の結果が含まれた JSON ファイルのコンテンツが返されます。ファイルの内容は大体次のようになっています。

[ { "Zipcode": "94123", "area_land_miles": 1.024, "state_code": "CA" }, { "Zipcode": "96090", "area_land_miles": 1.027, "state_code": "CA" }, { "Zipcode": "94929", "area_land_miles": 1.062, "state_code": "CA" } ]

Go は、主にポータビリティとコンパイル サイズに優れているので、Cloud Run での使用に最適な言語です。Go は静的に型付けされたコンパイル言語ですが、モジュール化する方法で、異なるデータ プラットフォームにも効果的にアクセスできます。この Go アプリのアプリケーション コンテナの詳細を確認してください。

Cloud Run アプリケーションのデプロイを確認する

コンテナの詳細の確認

  1. Cloud コンソールでナビゲーション メニューナビゲーション メニュー アイコン)> [Cloud Run] をクリックします。
  2. サービスのリストの gcp-data-drive をクリックします。

フィルタ サービス リストで gcp-data-drive がハイライト表示

  1. [リビジョン] タブをクリックします。

ハイライト表示された [リビジョン] タブ

  1. 右側のパネルにある [コンテナ] タブで、[イメージの URL] をクリックします。

[コンテナ] ペインには、Container Registry のイメージを調べるために、コンテナ イメージの URL が含まれています。 [コンテナ] ペイン

新しいブラウザタブで Container Registry が開き、[イメージの詳細] ウィンドウが表示されます。

[概要] タブで [イメージの詳細] ページが開く

仮想サイズからもわかるように、コンテナには Go バイナリしかないため非常に小さく、セキュリティ攻撃を受ける可能性が最も低くなります。また、Go コンテナはサイズが小さく、各種の CPU 間と OS 間で移植できるため、Anthos サービスにも最適です。これによって、Cloud からオンプレミスのプラットフォーム、逆にオンプレミスのプラットフォームから Cloud へとコンテナを簡単に移行できます。

タスク 3. Cloud Functions へのデプロイ

Cloud Functions は、Google Cloud のイベント ドリブンのサーバーレス コンピューティング プラットフォームです。Go と Cloud Functions とを組み合わせると、スピンアップ時間が速く、無制限にスケールできる、優れたサーバーレスのプラットフォームとなります。また、アプリケーションでのイベント ドリブンの応答時間が最短になります。

ソースコードを調べて、Cloud Functions で Google Cloud Data Drive ソースコードを再利用する方法を確認します。

main 関数の確認

  1. DIY-Tools/gcp-data-drive/cmd/webserver/main.gomain 関数を起動する際に、gcpdatadrive.GetJSONData Go 関数へすべての HTTP リクエストを送信するようにウェブサーバーに指示します。
func main() { // Register the initial HTTP handler. http.HandleFunc("/", gcpdatadrive.GetJSONData) port := os.Getenv("PORT") ...
  1. GitHub の main.gomain 関数を確認してください。

Cloud Functions では、main.go が使用されるのではなく、DIY-Tools/gcp-data-drive/gcpdatadrive.go ファイルで定義された gcpdatadrive.GetJSONData Go 関数に直接 HTTP リクエストを送信するように Cloud Functions ランタイムが構成されています。

  1. これについては、Cloud Build で cloudbuild_gcf.yaml を使用して、Google Cloud Data Drive アプリケーションを Cloud Functions にデプロイする方法を調べることで確認できます。
注: 見やすくするため、コメントは削除しています。

エントリポイント行の「GetJSONData」がハイライト表示されている

  1. GitHub の cloudbuild_gcf.yaml を確認してください。

この Cloud Build のステップは、アプリケーションを Cloud Run にデプロイするステップに似ていますが、ここでは gcloud functions deploy コマンドを使用してアプリケーションを Cloud Functions にデプロイします。

App Engine または Cloud Run にデプロイする場合は、Go のメイン パッケージの main 関数が使用されますが、ここでは Cloud Functions の --entrypoint パラメータを使用して GetJSONData 関数を指定していることに注目してください。

Google Cloud Data Drive アプリをデプロイする

  1. Cloud Functions サービス アカウントに roles/artifactregistry.reader のロールを割り当てて、Artifact Registry からの読み取りを許可します。
PROJECT_NUMBER=$(gcloud projects list --filter="PROJECT_ID=$PROJECT_ID" --format="value(PROJECT_NUMBER)") SERVICE_ACCOUNT_EMAIL="${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member "serviceAccount:${SERVICE_ACCOUNT_EMAIL}" \ --role "roles/artifactregistry.reader"
  1. DIY-Tools/gcp-data-drive で、Cloud Build を使って Cloud Functions にデプロイします。
gcloud builds submit --config cloudbuild_gcf.yaml --project $PROJECT_ID --no-source --substitutions=_GIT_SOURCE_BRANCH="master",_GIT_SOURCE_URL="https://github.com/GoogleCloudPlatform/DIY-Tools",_GCP_REGION="{{{project_0.default_region}}}" 注: 403 権限エラーが発生した場合は、少し待ってからビルドコマンドを再試行してください。通常、サービス アカウントの権限が反映されるまで数分かかります。
  1. 次のコマンドを入力して、認証されていないユーザーにも Google Cloud Data Drive の Cloud Functions 関数へのアクセスを許可します。
gcloud alpha functions add-iam-policy-binding gcp-data-drive --member=allUsers --role=roles/cloudfunctions.invoker
  1. Cloud Functions の HTTP トリガー URL を環境変数に保存します。
export CF_TRIGGER_URL=$(gcloud functions describe gcp-data-drive --format="value(httpsTrigger.url)")
  1. curl を使用してアプリケーションを呼び出し、プロジェクトの Firestore の symbols コレクションにあるデータをクエリします。
curl $CF_TRIGGER_URL/fs/$PROJECT_ID/symbols/product/symbol | jq .

これに対して、プロジェクトの symbols コレクションの値が含まれた JSON ファイルのコンテンツが返されます。

[ { "asin": "", "brand": "", "category": "", "docid": "914600502073", "fbafees": 0, "lastMatchLookup": "0001-01-01T00:00:00Z", "listPrice": 0, "manufacturer": "", "pkgquantity": 0, "salesrank": 0, "smallImage": "", "title": "", "upc": "914600502073" }, { "asin": "0744018307", "bbw": true, "brand": "", "category": "book_display_on_website", "cpip": 2000, "docid": "9780744018301", "fba": false, "fbafees": 722, "inStock": "NOW", "lastMatchLookup": "2020-03-13T14:00:10.209183Z", "lastOfferLookup": "2020-03-13T14:00:13.670858Z", "listPrice": 3999, "manufacturer": "Prima Games", "pkgquantity": 0, "salesrank": 337073, "sfbc": 0, "sfbr": 0, "smallImage": "http://ecx.images-amazon.com/images/I/51NFIAHRfTL._SL75_.jpg", "title": "Wolfenstein II: The New Colossus: Prima Collector's Edition Guide", "upc": "9780744018301" } ]
  1. curl を使用してアプリケーションを呼び出し、ラボ プロジェクトの BigQuery の publicviews.ca_zip_codes テーブルにあるデータをクエリします。
curl $CF_TRIGGER_URL/bq/$PROJECT_ID/publicviews/ca_zip_codes

これに対して、BigQuery SQL ステートメント SELECT * FROM publicviews.ca_zip_codes; の結果が含まれた JSON ファイルのコンテンツが返されます。

[ { "Zipcode": "96090", "area_land_miles": 1.027, "state_code": "CA" }, { "Zipcode": "94929", "area_land_miles": 1.062, "state_code": "CA" } ] Cloud Functions アプリケーションのデプロイを確認する

タスク 4. その他の Cloud Functions トリガー

Cloud Functions はイベント ドリブンのアーキテクチャです。デプロイしたアプリでは HTTP リクエストがイベントとして使用されます。異なるイベントタイプで起動する別の Go アプリのコードを見てみましょう。この関数は、Firestore 書き込みイベントでトリガーされます。

以下の Go ソースコードは、Go Code サンプルガイドから抜粋したものです。

package mygopackage import ( "context" "fmt" "log" "time" "cloud.google.com/go/functions/metadata" ) // FirestoreEvent is the payload of a Firestore event. type FirestoreEvent struct { OldValue FirestoreValue `json:"oldValue"` Value FirestoreValue `json:"value"` UpdateMask struct { FieldPaths []string `json:"fieldPaths"` } `json:"updateMask"` } // FirestoreValue holds Firestore fields. type FirestoreValue struct { CreateTime time.Time `json:"createTime"` Fields interface{} `json:"fields"` Name string `json:"name"` UpdateTime time.Time `json:"updateTime"` } // DoSomeThingOnWrite is triggered by // a change to a Firestore document. func DoSomeThingOnWrite(ctx context.Context, e FirestoreEvent) error { meta, err := metadata.FromContext(ctx) if err != nil { return fmt.Errorf("metadata.FromContext: %v", err) } // The variables e and meta contain // the information from the event // so now we can Go do some logic // work with the data. In this case // we are simply writing it to the log. log.Printf("Function triggered by change to: %v", meta.Resource) log.Printf("Old value: %+v", e.OldValue) log.Printf("New value: %+v", e.Value) return nil }

GitHub のソースコードの例を参照してください。

この例には、ラボのサンプル アプリケーションで使われる HTTP リクエスト トリガーではなく、Firestore イベントを処理する Cloud Functions をデプロイするために使われるコードが含まれます。DoSomeThingOnWrite を Cloud Functions のエントリポイントとして使用し、この関数を Cloud Firestore イベント トリガーに登録します。

現在、Cloud Functions では以下のイベント トリガーをサポートしています。

イベント トリガーのリスト

上記はシンプルな例ですが、幅広い可能性があります。かつてはオペレーティング システムの管理という負担が伴っていたタスクを、シンプルな Go Cloud Functions 関数を利用して実行できるようになります。たとえば、ユーザーがモバイルアプリを使用して Cloud Firestore になんらかの書き込みを行う際に、このような関数を使ってデータ損失防止(DLP)を実行し、データをサニタイズできます。

また、Cloud Functions を利用して、Pub/Sub イベントに基づいてウェブ利用の概要レポートを書き換えて Firestore に書き込むこともできます。イベントベースの小さな処理は、数に関係なく Go Cloud Functions に適しています。さらには、サーバーにパッチを適用する手間も省けます。

タスク 5. App Engine にデプロイする

App Engine は Go アプリケーションの実行に最適です。App Engine は、ワークロードの変化に応じてスケールアップやスケールダウンを行う、フルマネージドのサーバーレス コンピューティング プラットフォームです。Go アプリケーションは、デプロイ時に単一の実行可能バイナリ ファイルにコンパイルされます。アプリケーションの Go のコールド スタート時間は多くの場合 80~1400 ms です。App Engine は、実行中でも水平方向にスケールできるので、要求の厳しいグローバルなスケールのワークロードでも数秒で対応できます。

Cloud Build YAML 構成ファイルの確認

以下に示した Cloud Build YAML ファイル DIY-Tools/gcp-data-drive/cloudbuild_appengine.yaml には、ご使用のアプリケーションを App Engine にデプロイするための Cloud Build ステップ定義が含まれます。このファイルを使って、アプリケーションを App Engine にデプロイします。

最初のステップでは、git コマンドを実行して、アプリケーションを含めたソース リポジトリのクローンを作成します。このステップは、アプリケーションのブランチ間で簡単にスイッチできるようにパラメータ化されます。

2 つ目のステップでは、sed コマンドを実行して、app.yaml ファイルの runtime: go113runtime: go121 に置き換えます。これは、Go 1.13 ランタイムが非推奨となり、将来削除されるためです。なお、これはアプリの実行を継続するためのパッチにすぎません。個々のプロジェクトでは、最新の Go ランタイムを使用できるようにアプリを更新する必要があります。

3 つ目のステップでは、gcloud app deploy コマンドを実行して、アプリケーションを App Engine にデプロイします。

他の例と同じように、gcloud app deploy コマンドを使用してアプリを手動でデプロイすることもできますが、Cloud Build を使用することで、この作業を Google インフラストラクチャにオフロードできます。たとえば、サーバーレス CI/CD パイプラインを作成する場合に Cloud Build を利用すると便利です。

注: 見やすくするため、ファイルのコメントは削除しています。 steps: - name: 'gcr.io/cloud-builders/git' args: ['clone','--single-branch','--branch', '${_GIT_SOURCE_BRANCH}','${_GIT_SOURCE_URL}'] - name: 'ubuntu' # Or any base image containing 'sed' args: ['sed', '-i', 's/runtime: go113/runtime: go121/', 'app.yaml'] # Replace go113 with go121 dir: 'DIY-Tools/gcp-data-drive/cmd/webserver' - name: 'gcr.io/cloud-builders/gcloud' args: ['app','deploy','app.yaml','--project','$PROJECT_ID'] dir: 'DIY-Tools/gcp-data-drive/cmd/webserver'

GitHub の cloudbuild_appengine.yaml を確認してください。

Google Cloud Data Drive アプリをデプロイする

  1. DIY-Tools/gcp-data-drive で、Cloud Build を使って Go ウェブサーバー アプリを App Engine にデプロイします。
gcloud builds submit --config cloudbuild_appengine.yaml \ --project $PROJECT_ID --no-source \ --substitutions=_GIT_SOURCE_BRANCH="master",_GIT_SOURCE_URL="https://github.com/GoogleCloudPlatform/DIY-Tools"

デプロイが完了するまで数分かかります。

  1. App Engine URL を環境変数に保存し、アプリを呼び出すコマンドで使用します。
注: App Engine URL は出力の target url です。 export TARGET_URL=https://$(gcloud app describe --format="value(defaultHostname)")
  1. curl を使用して App Engine で実行されるアプリケーションを呼び出し、Firestore にあるデータをクエリします。
curl $TARGET_URL/fs/$PROJECT_ID/symbols/product/symbol | jq .

これに対して、プロジェクトの symbols コレクションの 3 つの値が含まれた JSON ファイルのコンテンツが返されます。

[ { "asin": "", "brand": "", "category": "", "docid": "914600502073", "fbafees": 0, "lastMatchLookup": "0001-01-01T00:00:00Z", "listPrice": 0, "manufacturer": "", "pkgquantity": 0, "salesrank": 0, "smallImage": "", "title": "", "upc": "914600502073" }, { "asin": "0744018307", "bbw": true, "brand": "", "category": "book_display_on_website", "cpip": 2000, "docid": "9780744018301", "fba": false, "fbafees": 722, "inStock": "NOW", "lastMatchLookup": "2020-03-13T14:00:10.209183Z", "lastOfferLookup": "2020-03-13T14:00:13.670858Z", "listPrice": 3999, "manufacturer": "Prima Games", "pkgquantity": 0, "salesrank": 337073, "sfbc": 0, "sfbr": 0, "smallImage": "http://ecx.images-amazon.com/images/I/51NFIAHRfTL._SL75_.jpg", "title": "Wolfenstein II: The New Colossus: Prima Collector's Edition Guide", "upc": "9780744018301" } ]
  1. curl を使用して App Engine で実行されるアプリを呼び出し、BigQuery のデータをクエリします。
curl $TARGET_URL/bq/$PROJECT_ID/publicviews/ca_zip_codes | jq .

これに対して、BigQuery SQL ステートメント SELECT * FROM publicviews.ca_zip_codes; の結果が含まれた JSON ファイルのコンテンツが返されます。

[ { "Zipcode": "96090", "area_land_miles": 1.027, "state_code": "CA" }, { "Zipcode": "94929", "area_land_miles": 1.062, "state_code": "CA" } ]

負荷の増加

負荷を増加するとどうなるかを確認します。

  1. nano エディタを使用して、アプリケーションに負荷をかけるためのシンプルなシェル スクリプトを作成します。
nano loadgen.sh
  1. エディタに以下のスクリプトを入力するか、貼り付けます。
#!/bin/bash for ((i=1;i&lt;=1000;i++)); do curl $TARGET_URL/bq/$PROJECT_ID/publicviews/ca_zip_codes > /dev/null & done
  1. Ctrl+X キー、Y キー、Enter キーの順に押して新しいファイルを保存します。
  2. スクリプトを実行可能にします。
chmod +x loadgen.sh
  1. 負荷テストを実行します。
./loadgen.sh
  1. コンソールで、ナビゲーション メニュー > [App Engine] > [インスタンス] の順にクリックします。

インスタンス ウィンドウが開き、負荷テストを Cloud Shell で実行したときの 1 秒あたりのリクエスト処理数の概要と生成されたインスタンスのリストが表示されます。App Engine によって追加のアプリ インスタンスが自動的に作成され、HTTP 受信トラフィックが分散される様子を確認してください。

インスタンスのリストが表示されているインスタンス ウィンドウ

注: 概要グラフのデータが表示されるまで 3~5 分かかることがあります。[インスタンス] ウィンドウを更新するようにしてください。
  1. 負荷テストがまだ実行されていたら、Cloud Shell で Ctrl+C キーを押して終了します。
App Engine アプリケーションのデプロイを確認する

お疲れさまでした

このセルフペース ラボでは、Go プログラミング言語を使って、すべての Google Cloud サーバーレス コンピューティング プラットフォームにデプロイする方法を学びました。まとめは以下のとおりです。

  • Go プログラミング言語には、最新のクラウド アプリケーションとオンプレミス アプリケーションに最適な、収益性と効率性に優れた特長があります。
  • 同じ Go コードベースを変更することなく、Google Cloud のサーバーレスでコンテナベースの Anthos コンピューティング プラットフォームすべてにデプロイできます。
  • Cloud Build(同様にサーバーレス)は、ご使用のアプリケーションのライフサイクルで、クラウドベースの CI/CD パイプラインを一貫して提供するうえで、重要な役割を果たします。
  • Cloud Run、Cloud Functions、App Engine は、Google 規模で起動して簡単にデプロイできるシンプルなサーバーレス プラットフォームです。
  • Google Cloud Data Drive は、既存の Google Cloud 環境でも使用できる、オープンソースのデータ抽出ライブラリです。

次のステップと詳細情報

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

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

マニュアルの最終更新日: 2024 年 3 月 14 日

ラボの最終テスト日: 2024 年 3 月 14 日

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