前半パートは,以下の流れで進行します.
- Google Skills Boostを用いたGoogle Cloud環境のセットアップ
- サンプルプログラムの実行
- より実践的なプログラムの実行
- Next to do...
まずは,Google Cloud環境を準備します.
今回はGoogle Cloud Skills Boostというオンラインラーニングシステムを利用して進行します.
-
Google Cloud Skills Boost の受講には Chrome を使用することが推奨されています.
こちら からダウンロードし,インストールしてください. -
ChromeでGoogle Cloud Skills Boost にアクセスし,右上の
ログイン
をクリックします. -
続いて
Google アカウントでログイン
をクリックすると,Google Cloud Skills Boostにログインすることができました.
Google Cloud Skills Boostの利用にあたって,いくつか注意が必要な箇所があります.
- Creditを求められる(=有料の)ラボもあります.(今回は無料のラボを使用します.)
- 初回はNo Costのラボでも,2回目以降にはCreditが必要になります.
- ラボには制限時間が設けられています.制限時間内に終了できるようにしましょう.
それでは,ラボを開始しましょう.
今回は以下のコースをベースとしつつ,いくつかの細かな変更点を加えました.
Skills Boostの画面にもガイドがありますが,そちらではなく本資料を見ながら進行してくださいね.
-
ラボを開始
をクリックします.ラボを開始すると,ラボの終了まで使用できる一時的なGoogleアカウントが発行されます.
以後ログインを求められた場合は,すべてこのGoogleアカウントでログインしてください.
個人のGoogleアカウントでログインしてしまうと,意図せず課金されてしまうことがあります. -
Open Google Cloud console
を右クリックし,シークレット ウィンドウで開く
を選択します.
Note
普段使用しているGoogleアカウントへの意図しない課金が発生することを防ぐために,
シークレットウィンドウの利用が推奨されています.
-
ログイン画面が表示されたら,先ほど発行されたUsernameをコピー&ペーストして
次へ
をクリックします. -
同様にPasswordをコピー&ペーストして
次へ
をクリックします. -
確認画面が表示されます.内容を確認して
理解しました
をクリックします. -
利用規約が表示されます.内容を確認して1つ目のチェックボックスにチェックをつけて
AGREE AND CONTINUE
をクリックします. -
Google Cloud コンソールのダッシュボードにアクセスすることができました.
Google Cloud Platformの各機能は,今見えているWeb上のコンソール画面(GUI)とCloud Shellを用いたCUIの両方で扱うことができます.
今日は,適宜コンソールでのGUI操作とCloud ShellによるCUI操作を使い分けながら進行します.
-
コンソール画面上部にある
Cloud Shell をアクティブにする
アイコンをクリックします. -
画面下部にCloud Shellが現れ,ポップアップが表示されるので
続行
をクリックします.接続が完了した時点で,プロジェクトに各自の
PROJECT_ID
が設定されます.黄色の文字列で出力されているのがPROJECT_ID
です.PROJECT_ID
は後ほど使用しますので,メモ帳などに保存しておいてください.
次のコマンドを使用すると,有効なアカウント名を一覧で表示します.
gcloud auth list
ポップアップが表示されるので承認
をクリックします.
次のコマンドを使用すると,プロジェクトIDを一覧で表示します.
gcloud config list project
gcloud
はGoogle Cloudのコマンドラインツールです.
ここからは,VM上で動作させるアプリケーションを作成します.
ベースとなるプログラムファイルを提供しますので,指示のとおりに改変していきましょう.
なお,本コースはGoogle Cloudが提供する Compute Engine での Go のスタートガイド をベースに作成しています.
-
これから扱うCompute Engine APIとCloud Build APIを有効化します.
-
こちら のリンクを右クリックし,シークレットウィンドウで開きます.
-
プロジェクト名が先ほどメモした
PROJECT_ID
と同じであることを確認して次へ
をクリックします. -
有効にする
をクリックします.
-
-
Gitリポジトリで提供されるサンプルファイルを取得します.
-
こちら のリンクを右クリックし,シークレットウィンドウで開きます.
-
確認
をクリックします.
-
-
次のコマンドをCloud Shellで実行し,新しいGoogle Cloudプロジェクトを設定します.
gcloud config set project PROJECT_ID
Important
PROJECT_ID
は,ご自身のPROJECT_IDに置き換えてください.
-
提供されているファイルには不具合があるため,これを修正します.
まずはLogging機能をバイパスするため,startup-script.sh
ファイルを編集します.-
Cloud Shell Editorの画面でEXPLORERを開きます.
-
cloudshell_open/golang-samples/getting-started/gce/startup-script.sh
にアクセスします. -
Ctrl
+A
キーを同時に押してテキストを全選択し,Delete
キーで全削除します. -
こちら にアクセスし,コードをコピーして先ほど内容を全削除した
startup-script.sh
に貼り付けます. -
変更内容は自動的に保存されます.
-
-
続いてビルド環境と実行環境のバージョンを合わせるため,
cloudbuild.yaml
ファイルを編集します.-
先ほどと同様にCloud Shell Editorの画面でEXPLORERを開きます.
-
cloudshell_open/golang-samples/getting-started/gce/cloudbuild.yaml
にアクセスします. -
Ctrl
+A
キーを同時に押してテキストを全選択し,Delete
キーで全削除します. -
こちら にアクセスし,コードをコピーして先ほど内容を全削除した
cloudbuild.yaml
に貼り付けます. -
変更内容は自動的に保存されます.
-
ここまでで,サンプルプログラムをビルドするための準備が完了しました.
アプリケーションを動作させるために,Cloud Buildを用いてビルド(≒コンパイル)を行います.
- Cloud Shellで次のコマンドを実行し,Cloud Buildの動作に必要なCloud Storageバケットを作成します.
YOUR_BUCKET_NAME
はバケット名を表します.gsutil mb gs://YOUR_BUCKET_NAME
- 次のコマンドを実行してビルドを開始します.
gcloud builds submit --substitutions=_DEPLOY_DIR=gs://YOUR_BUCKET_NAME,_DEPLOY_FILENAME=app.tar.gz
Important
YOUR_BUCKET_NAME
はご自身が定めたバケット名に置き換えてください.
ここでは,サンプルプログラムのバイナリデータ(ビルド結果)を専用のVMにインストールしてその動作を確認します.
- まずは次のコマンドを実行してVMを作成します.
zone
は目的などに応じて任意に指定することができます.今回はus-central1-a
を使用します.gcloud compute instances create my-app-instance \ --image-family=debian-10 \ --image-project=debian-cloud \ --machine-type=g1-small \ --scopes userinfo-email,cloud-platform \ --metadata-from-file startup-script=startup-script.sh \ --metadata app-location="gs://YOUR_BUCKET_NAME/app.tar.gz" \ --zone us-central1-a \ --tags http-server
Important
YOUR_BUCKET_NAME
はご自身が定めたバケット名に置き換えてください.
-
次のコマンドを実行して,VMへの特定のネットワーク通信を許可します.
gcloud compute firewall-rules create default-allow-http-80 \ --allow tcp:80 \ --source-ranges 0.0.0.0/0 \ --target-tags http-server \ --description "Allow port 80 access to http-server"
-
次のコマンドを実行してVMの外部IPアドレスを取得します.
gcloud compute instances list
EXTERNAL_IP: xxx.xxx.xxx.xxx
の形式で出力されたIPアドレスをメモしてください. -
ブラウザで次のURLにアクセスします.
http://YOUR_INSTANCE_IP
Important
YOUR_INSTANCE_IP
は,先ほど確認した外部IPアドレスに置き換えてください.
サンプルプログラムの動作を確認できたので,次の手順に備えてここまでに作成したリソースを削除します.
- インスタンスの削除
Important
削除するインスタンスのzone
を指定する必要があります.今回はus-central1-a
です.
-
ファイアウォールルールの削除
- 次のコマンドを実行して,ファイアウォールルールを削除します.
gcloud compute firewall-rules delete default-allow-http-80
- 削除の際に確認が求められるので
y
を入力しEnter
キーで確定します.
- 次のコマンドを実行して,ファイアウォールルールを削除します.
ここまでで,アプリケーションファイルを準備し,ビルドし,VM上で動作させる方法を学ぶことができました.
続いてmain.go
のプログラムを書き換え,顧客のデータを取得できるアプリを仮想マシン上で実現してみましょう.
-
main.go
ファイルを書き換えます.- Cloud Shell Editorの画面でEXPLORERを開きます.
cloudshell_open/golang-samples/getting-started/gce/main.go
にアクセスします.Ctrl
+A
キーを同時に押してテキストを全選択し,Delete
キーで全削除します.- こちら
にアクセスし,コードをコピーして先ほど内容を全削除した
main.go
に貼り付けます. - 変更内容は自動的に保存されます.
-
Cloud Shellで以下のコマンドを実行し,アプリのビルドに必要なライブラリをインストールします.
go get github.com/gorilla/handlers go get github.com/gorilla/mux
-
先ほどと同様の手順で,ビルドを行います.
gcloud builds submit --substitutions=_DEPLOY_DIR=gs://YOUR_BUCKET_NAME,_DEPLOY_FILENAME=app.tar.gz
Important
YOUR_BUCKET_NAME
はご自身のバケット名に置き換えてください.
- VMを作成します.
gcloud compute instances create my-app-instance \ --image-family=debian-10 \ --image-project=debian-cloud \ --machine-type=g1-small \ --scopes userinfo-email,cloud-platform \ --metadata-from-file startup-script=startup-script.sh \ --metadata app-location="gs://YOUR_BUCKET_NAME/app.tar.gz" \ --zone us-central1-a \ --tags http-server
Important
YOUR_BUCKET_NAME
はご自身のバケット名に置き換えてください.
-
同様に,ファイアウォールルールを作成します.
gcloud compute firewall-rules create default-allow-http-80 \ --allow tcp:80 \ --source-ranges 0.0.0.0/0 \ --target-tags http-server \ --description "Allow port 80 access to http-server"
-
以下のコマンドを実行して,インスタンスの外部IPアドレスを取得します.
gcloud compute instances list
EXTERNAL_IP: xxx.xxx.xxx.xxx
の形式で出力されたIPアドレスをメモしてください. -
ブラウザで次のURLにアクセスし,アプリが実行されていることを確認してください.
http://YOUR_INSTANCE_IP/v1/customer/22530
Important
YOUR_INSTANCE_IP
は,先ほど確認した外部IPアドレスに置き換えてください.
-
外部IPアドレスにアクセスし,「
{"status": "success", "data": {"approved":585,"proposed":1602,"rejected":489}}
」と表示されていれば正常に動作しています.URL末尾の
22530
は予め記録されている顧客のID
を示しています.
この顧客IDをURLのパラメータとして指定することで,その顧客の取引履歴を取得できています.
ここで,取引履歴が存在しないID(例:70156)や,そもそも存在しない顧客ID(例:12345)を入力するとどのような結果を得られるでしょうか.
Google Cloud Compute Engine を用いてVMを作成し,その上で自作のプログラムを動作させることができました.
VMの利用料金を払い続けることで,このままこのプログラムを使用することができます.
しかし,実はこのアーキテクチャにはいくつかの問題があります.
- アップデートや脆弱性対応など,アプリケーション以外の領域に対して継続的なメンテナンスが必要
- 今回動かしているアプリケーションの他にも,Linuxでは多くのアプリケーションが動作しています.
そのすべてに対応し続けなければなりません. - 脆弱性はいつ発見されるか分かりません.常に情報収集し,影響の大きさや影響が及ぶ可能性を迅速に判断する必要があります.
- アップデートにはアプリケーションやVMの再起動が必要なものも多く,システムが使えない時間が発生します.
- 今回動かしているアプリケーションの他にも,Linuxでは多くのアプリケーションが動作しています.
- 利用者やデータの増減に合わせて,都度対応が必要
- 今後の需要を予測して,VMのスペックを上げ下げしたり,VMの数を調整したりという手間が発生します.
- 予測に失敗すると必要以上のお金がかかったり,システムがダウンしてしまったりという問題に繋がります.
- ...
クラウドサービスでは,これらの問題を解決できる様々な「マネージドサービス」が提供されています.
これらのマネージドサービスを用いることで,いわゆる「サーバレス」な環境でアプリケーションを安全かつ快適に実行することができます.
実際に,Cloud Run と Firestore を用いて今回作成したアプリケーションを動作させてみましょう.