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 アプリのコードを調べる

  • 各プラットフォームでアプリをテストする

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 にデプロイすると、データフローのアーキテクチャは以下のようになります。

9dd43a1b95d95ae3.png

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 にデプロイすると、データフローのアーキテクチャは以下のようになります。

266205f591e04324.png

App Engine

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

アーキテクチャ

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

fd42d221ad13c088.png

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 のソースコードは、GitHub の Google Cloud DIY ツール リポジトリに公開されています。他のデータ プラットフォームをご覧になるには、GitHub の問題を投稿してください

以下の HTTP URL パターンは、Google Cloud Data Drive を実行する Google Cloud からデータを取得するために使用されます。

  • 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)です。

設定と要件

Qwiklabs の設定

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

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

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

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

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

Cloud Console

ラボを開始して 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 の概要ガイドをご覧ください。

環境の設定

  1. このラボの後半で使用するために、Cloud Shell で 以下のコマンドを入力して、プロジェクト ID を保存する環境変数を作成します。

export PROJECT_ID=$(gcloud info --format="value(config.project)")
  1. サンプル リポジトリのクローンを作成して、このラボのサンプルコードを取得します。

git clone https://github.com/GoogleCloudPlatform/DIY-Tools.git

データベースの準備

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

BigQuery データベース

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

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

Firestore データベース

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

ネイティブ モードの Firestore データベース インスタンスを新しく作成します。

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

3b657f6cf3326847.png

  1. [ネイティブ モードを選択] をクリックして、Firestore のモードをネイティブに設定します。
  2. [ロケーションを選択] で下にスクロールし、[us-east1 (South Carolina)] を選択してデータの保存場所を選択します。
  3. [データベースを作成] をクリックします。

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. Console で、ナビゲーション メニュー > [Cloud Build] > [設定] の順にクリックします。
  2. [Cloud Functions] の [ステータス] を [有効] に設定します。

19faf6d28f95e171.png

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

Cloud Run へのデプロイ

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

Dockerfile の確認

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

コンテナを構築する 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.13 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"]

こちらをクリックすると、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 から us-central1 リージョンの 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','us-central1',
         '--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"

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

  1. Cloud Run サービス URL を環境変数に保存します。

export CLOUD_RUN_SERVICE_URL=$(gcloud run services --platform managed describe gcp-data-drive --region us-central1 --format="value(status.url)")
  1. curl を使用してアプリケーションを呼び出し、プロジェクトの Firestore の symbols コレクションからデータをクエリします。

curl $CLOUD_RUN_SERVICE_URL/fs/$PROJECT_ID/symbols/product/symbol
もし認証エラーが発生した場合は、1 分待ってから、前の curl コマンドを再試行してください。

これに対して以下のような、プロジェクトの symbols コレクションからの値を含めた JSON ファイルのコンテンツが返されます。 443061c6423391f3.png

  1. curl を使用してアプリケーションを呼び出し、ラボ プロジェクトの BigQuery の publicviews.ca_zip_codes テーブルからデータをクエリします。

curl $CLOUD_RUN_SERVICE_URL/bq/$PROJECT_ID/publicviews/ca_zip_codes

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

7d2cc3dce8351b81.png

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

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

コンテナの詳細の確認

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

307f81d542207cce.png

  1. [変更内容] タブをクリックします。

248bbf62aa4a6a57.png

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

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

[ダイジェストの詳細] ウィンドウで、Container Registry が新しいブラウザタブで開きます。

31da416588e975d1.png

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

Cloud Functions へのデプロイ

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

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

main 関数の確認

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")
...

こちらをクリックすると、GitHub での main.gomain 関数が表示されます

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

これについては、Cloud Build で cloudbuild_gcf.yaml を使用して、Google Cloud Data Drive アプリケーションを Cloud Functions にデプロイする方法を調べることで確認できます。

a4961f3ba3ab2bb9.png こちらをクリックすると、GitHub での cloudbuild_gcf.yaml が表示されます

Cloud Build のステップは、アプリケーションを Cloud Run にデプロイするステップとも似ていますが、この場合、gcloud functions deploy コマンドを使ってアプリケーションを Cloud Functions にデプロイします。GetJSONData 関数を指定するには、Go のメイン パッケージが App Engine または Cloud Run にデプロイされるときに使用される Go のメイン パッケージの main 関数ではなく、Cloud Functions の --entrypoint パラメータが使用されます。

Google Cloud Data Drive アプリのデプロイ

  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"
  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

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

  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 ファイルのコンテンツが返されます。

Cloud Functions アプリケーション デプロイメントを確認する

その他の Cloud Functions トリガー

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

以下の Go ソースコードは、こちらの例から抜粋したものです。

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 では以下のイベント トリガーをサポートしています。

5512666380344a54.png

上記はシンプルな例ですが、幅広い可能性があります。Go Cloud Functions によって、以前はオペレーティング システム管理の負担だったタスクが簡単に実行されます。たとえば、お客様がモバイルアプリから Cloud Firestore に書き込むと、このような関数を使ってデータ損失防止(DLP)を実行し、データをサニタイズできます。Cloud Functions では Pub/Sub イベントに基づいて、Firestore へのウェブ容量の概要レポートを書き換えることもできます。イベントベースの小さな処理は、数に関係なく Go Cloud Functions に適しています。また、サーバーがないのでパッチも必要ありません。

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

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

steps:
- name: 'gcr.io/cloud-builders/git'
  args: ['clone','--single-branch','--branch',
        '${_GIT_SOURCE_BRANCH}','${_GIT_SOURCE_URL}']
- 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

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

  1. curl を使用して App Engine で実行されるアプリを呼び出し、BigQuery からデータをクエリします。

curl $TARGET_URL/bq/$PROJECT_ID/publicviews/ca_zip_codes

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

負荷の増加

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

  1. nano エディタを使ってシンプルなシェル スクリプトを作成し、アプリケーションに負荷をかけます。

nano loadgen.sh
  1. エディタに以下のスクリプトを入力するか、貼り付けます。

#!/bin/bash
for ((i=1;i<=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. Console で、ナビゲーション メニュー > [App Engine] > [インスタンス] の順にクリックします。

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

1c3ba2dc0bbbd96c.png

概要グラフのデータが表示されるまで 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 環境でも使用できる、オープンソースのデータ抽出ライブラリです。

Go_badge.png

クエストを完了する

このセルフペース ラボは、Qwiklabs の「Getting Started with Go on Google Cloud」クエストの一部です。クエストとは学習パスを構成する一連のラボのことで、完了すると成果が認められて上のようなバッジが贈られます。バッジは公開して、オンライン レジュメやソーシャル メディア アカウントにリンクできます。このラボの修了後、こちらのクエストに登録すれば、すぐにクレジットを受け取ることができます。受講可能なその他の Qwiklabs のクエストもご確認ください。

次のラボを受講する

Go Code to Work with Google Cloud Data Sources

次のステップと詳細情報

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

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

マニュアルの最終更新日: 2022 年 2 月 8 日
ラボの最終テスト日: 2022 年 2 月 8 日

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