チェックポイント
Check Firestore Database Deployment
/ 25
Check Cloud Run application Deployment
/ 25
Check Cloud Functions application Deployment
/ 25
Check App Engine application Deployment
/ 25
Google Cloud サーバーレス プラットフォームへの Go アプリのデプロイ
GSP702
概要
Go は、Google によるオープンソースのプログラミング言語で、Go を使うと信頼性と効率性に優れた、高速かつスケール可能なソフトウェアを簡単に構築できます。このラボでは、シンプルな Go のアプリを Cloud Run、Cloud Functions、App Engine にデプロイして、Go の基礎を学びます。次に、Go アプリを使用して、BigQuery と Firestore のデータにアクセスします。
演習内容
このラボでは、次のタスクを行います。
-
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 にデプロイすると、データフローのアーキテクチャは以下のようになります。
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 にデプロイすると、データフローのアーキテクチャは以下のようになります。
App Engine
App Engine スタンダード環境は、Google のインフラストラクチャで実行されるコンテナ インスタンスに基づいています。コンテナは、複数の利用可能なランタイムの 1 つで事前構成されています。
アーキテクチャ
Go アプリのサンプルである Google Cloud Data Drive を App Engine にデプロイすると、データフローのアーキテクチャは以下のようになります。
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 は、 |
[PROJECT ID] |
アクセスする Firestore コレクションまたは BigQuery データセットの プロジェクト ID です。プロジェクト ID は、ラボの左側のパネルで確認できます。 |
[COLLECTION] |
Firestore コレクション ID( |
[DOCUMENT] |
返信する Firestore ドキュメント( |
[DATASET] |
BigQuery データセット名( |
[TABLE] |
BigQuery テーブル名( |
設定と要件
Qwiklabs の設定
[ラボを開始] ボタンをクリックする前に
こちらの手順をお読みください。ラボの時間は記録されており、一時停止することはできません。[ラボを開始] をクリックするとスタートするタイマーは、Google Cloud のリソースを利用できる時間を示しています。
このハンズオンラボでは、シミュレーションやデモ環境ではなく、実際のクラウド環境を使ってご自身でラボのアクティビティを行うことができます。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。
このラボを完了するためには、下記が必要です。
- 標準的なインターネット ブラウザ(Chrome を推奨)
- ラボを完了するために十分な時間を確保してください。ラボをいったん開始すると一時停止することはできません。
Cloud Console
ラボを開始して Google Cloud コンソールにログインする方法
-
[ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。 左側の [ラボの詳細] パネルには、以下が表示されます。
- [Google コンソールを開く] ボタン
- 残り時間
- このラボで使用する必要がある一時的な認証情報
- このラボを行うために必要なその他の情報(ある場合)
-
[Google コンソールを開く] をクリックします。 ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。
ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。 -
必要に応じて、[ラボの詳細] パネルから [ユーザー名] をコピーして [ログイン] ダイアログに貼り付けます。[次へ] をクリックします。
-
[ラボの詳細] パネルから [パスワード] をコピーして [ようこそ] ダイアログに貼り付けます。[次へ] をクリックします。
重要: 認証情報は左側のパネルに表示されたものを使用してください。Google Cloud Skills Boost の認証情報は使用しないでください。 注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。 -
その後次のように進みます。
- 利用規約に同意してください。
- 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
- 無料トライアルには登録しないでください。
その後このタブで Cloud Console が開きます。
Cloud Shell をアクティブにする
Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。
- Google Cloud コンソールの上部にある「Cloud Shell をアクティブにする」アイコン をクリックします。
接続した時点で認証が完了しており、プロジェクトに各自の PROJECT_ID が設定されます。出力には、このセッションの PROJECT_ID を宣言する次の行が含まれています。
gcloud
は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。
- (省略可)次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
-
[承認] をクリックします。
-
出力は次のようになります。
出力:
- (省略可)次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
出力:
出力例:
gcloud
ドキュメントの全文については、gcloud CLI の概要ガイドをご覧ください。
環境の設定
-
このラボの後半で使用するために、Cloud Shell で 以下のコマンドを入力して、プロジェクト ID を保存する環境変数を作成します。
export PROJECT_ID=$(gcloud info --format="value(config.project)")
-
サンプル リポジトリのクローンを作成して、このラボのサンプルコードを取得します。
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 データベース インスタンスを新しく作成します。
- Cloud Console で、ナビゲーション メニュー > [Firestore] > [データ] の順にクリックして、Console の Firestore を開きます。
- [ネイティブ モードを選択] をクリックして、Firestore のモードをネイティブに設定します。
- [ロケーションを選択] で下にスクロールし、[us-east1 (South Carolina)] を選択してデータの保存場所を選択します。
- [データベースを作成] をクリックします。
Firestore データベース インスタンスが初期化されるまで待ちます。この処理によって同じリージョンの App Engine も初期化されるので、最初に App Engine インスタンスを作成することなく、アプリケーションを App Engine にデプロイできます。
-
データベースの準備が完了したら Cloud Shell に戻り、ラボ用の Firestore サンプルデータにアクセスするため Firestore インポート ジョブを起動します。
gcloud firestore import gs://$PROJECT_ID-firestore/prd-back
このインポート ジョブにより、symbols
というコレクションの Cloud Firestore バックアップが $PROJECT_ID-firestore
ストレージ バケットに読み込まれます。
インポート ジョブが完了するには最長で 5 分ほどかかることがあります。その間に次のセクションに進みます。
Cloud Build の権限設定
Cloud Build は、Google Cloud インフラストラクチャでビルドを行うサービスです。デフォルトでは、Cloud Build には App Engine、Cloud Run、Cloud Functions のサービスにアプリケーションをデプロイする十分な権限がありません。Cloud Build を使って Google Cloud Data Drive アプリをデプロイする前に、これらのサービスを有効にする必要があります。
- Console で、ナビゲーション メニュー > [Cloud Build] > [設定] の順にクリックします。
- [Cloud Functions] の [ステータス] を [有効] に設定します。
- プロンプトが表示されたら、[すべてのサービス アカウントにアクセス権を付与] をクリックします。
- Cloud Functions に加えて、Cloud Run と App Engine の [ステータス] を [有効] に設定します。
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 アプリのデプロイ
-
Cloud Shell で、GitHub からクローンを作成したアプリケーションのディレクトリに変更します。
cd ~/DIY-Tools/gcp-data-drive
-
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"
デプロイには数分かかります。コンソールに赤いテキストが表示されることがありますが、エラーログではありません。
-
Cloud Run サービス URL を環境変数に保存します。
export CLOUD_RUN_SERVICE_URL=$(gcloud run services --platform managed describe gcp-data-drive --region us-central1 --format="value(status.url)")
-
curl
を使用してアプリケーションを呼び出し、プロジェクトの Firestore のsymbols
コレクションからデータをクエリします。
curl $CLOUD_RUN_SERVICE_URL/fs/$PROJECT_ID/symbols/product/symbol
これに対して以下のような、プロジェクトの symbols
コレクションからの値を含めた JSON ファイルのコンテンツが返されます。
-
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 ファイルのコンテンツが返されます。
Go は、主にポータビリティとコンパイル サイズに優れているので、Cloud Run での使用に最適な言語です。Go は静的に型付けされたコンパイル言語ですが、モジュール化する方法で、異なるデータ プラットフォームにも効果的にアクセスできます。この Go アプリのアプリケーション コンテナの詳細を確認してください。
コンテナの詳細の確認
- Cloud Consoleで ナビゲーション メニュー > [Cloud Run] をクリックします。
- サービスのリストの gcp-data-drive をクリックします。
- [変更内容] タブをクリックします。
- 右側のパネルの [コンテナ] タブで、[コンテナ イメージの URL] をクリックします。
[コンテナ] ペインには、Container Registry のイメージを調べるために、コンテナ イメージの URL が含まれています。
[ダイジェストの詳細] ウィンドウで、Container Registry が新しいブラウザタブで開きます。
仮想サイズからもわかるように、コンテナには 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.go
の main
関数を起動する際に、gcpdatadrive.GetJSONData
Go 関数へすべての HTTP リクエストを送信するようにウェブサーバーに指示します。
func main() {
// Register the initial HTTP handler.
http.HandleFunc("/", gcpdatadrive.GetJSONData)
port := os.Getenv("PORT")
...
こちらをクリックすると、GitHub での main.go
の main
関数が表示されます。
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 にデプロイする方法を調べることで確認できます。
こちらをクリックすると、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 アプリのデプロイ
-
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"
-
以下のコマンドを入力して、Google Cloud Data Drive Cloud Functions への不正なアクセスを許可します。
gcloud alpha functions add-iam-policy-binding gcp-data-drive --member=allUsers --role=roles/cloudfunctions.invoker
-
Cloud Functions の HTTP トリガー URL を環境変数に保存します。
export CF_TRIGGER_URL=$(gcloud functions describe gcp-data-drive --format="value(httpsTrigger.url)")
-
curl
を使用してアプリケーションを呼び出し、プロジェクトの Firestore のsymbols
コレクションからデータをクエリします。
curl $CF_TRIGGER_URL/fs/$PROJECT_ID/symbols/product/symbol
これに対して、プロジェクトの symbols
コレクションからの値を含めた JSON ファイルのコンテンツが返されます。
-
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 はイベント ドリブンのアーキテクチャです。デプロイしたアプリでは 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 では以下のイベント トリガーをサポートしています。
上記はシンプルな例ですが、幅広い可能性があります。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 アプリのデプロイ
-
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"
デプロイが完了するまで数分かかります。
- App Engine URL を環境変数に保存し、アプリを呼び出すコマンドで使用します。
target url
です。
export TARGET_URL=https://$(gcloud app describe --format="value(defaultHostname)")
-
curl
を使用して App Engine で実行されるアプリケーションを呼び出し、Firestore からデータをクエリします。
curl $TARGET_URL/fs/$PROJECT_ID/symbols/product/symbol
これに対して、プロジェクトの symbols
コレクションからの 3 つの値を含めた JSON ファイルのコンテンツが返されます。
-
curl
を使用して App Engine で実行されるアプリを呼び出し、BigQuery からデータをクエリします。
curl $TARGET_URL/bq/$PROJECT_ID/publicviews/ca_zip_codes
これに対して、BigQuery SQL ステートメント SELECT * FROM publicviews.ca_zip_codes;
の結果を含めた JSON ファイルのコンテンツが返されます。
負荷の増加
負荷を増加するとどうなるかを確認します。
-
nano エディタを使ってシンプルなシェル スクリプトを作成し、アプリケーションに負荷をかけます。
nano loadgen.sh
-
エディタに以下のスクリプトを入力するか、貼り付けます。
#!/bin/bash
for ((i=1;i<=1000;i++));
do
curl $TARGET_URL/bq/$PROJECT_ID/publicviews/ca_zip_codes > /dev/null &
done
-
Ctrl+X キー、Y キー、Enter キーの順に押して新しいファイルを保存します。
-
スクリプトを実行可能にします。
chmod +x loadgen.sh
-
負荷テストを実行します。
./loadgen.sh
- Console で、ナビゲーション メニュー > [App Engine] > [インスタンス] の順にクリックします。
インスタンス ウィンドウが開き、負荷テストを Cloud Shell で実行したときの 1 秒あたりのリクエスト処理数の概要と生成されたインスタンスのリストが表示されます。App Engine によって、どのように他のアプリ インスタンスが自動的に作成され、HTTP 受信トラフィックが分散されるかを確認してください。
- 負荷テストがまだ実行されていたら、Cloud Shell で Ctrl+C キーを押して終了します。
お疲れさまでした
このセルフペース ラボでは、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 環境でも使用できる、オープンソースのデータ抽出ライブラリです。
クエストを完了する
このセルフペース ラボは、Qwiklabs の「Getting Started with Go on Google Cloud」クエストの一部です。クエストとは学習パスを構成する一連のラボのことで、完了すると成果が認められて上のようなバッジが贈られます。バッジは公開して、オンライン レジュメやソーシャル メディア アカウントにリンクできます。このラボの修了後、こちらのクエストに登録すれば、すぐにクレジットを受け取ることができます。受講可能なその他の Qwiklabs のクエストもご確認ください。。
次のラボを受講する
Go Code to Work with Google Cloud Data Sources
次のステップと詳細情報
- Go の詳細については、Go プログラミング言語をご覧ください。
- GitHub での Go をご覧ください。
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 の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。