Google Compute Engine

1. はじめに

皆さん、こんにちは。今日はご参加いただき、ありがとうございます。Google Compute Engine について学ぶには、

この Codelab では、サンプルのゲストブック アプリケーションを使用して Compute Engine を操作します。

Compute Engine インスタンスを作成して nginx をデプロイし、最後にネットワーク ロードバランサを前面に配置します。Compute Engine インスタンスは、グラフィカル コンソールまたはコマンドラインから作成できます。このラボでは、コマンドラインの使用方法について説明します。

ComputeEngine_128px.png

Google Compute Engine の仮想マシンは、世界規模のファイバー ネットワークに接続された Google のデータセンター内で稼働します。提供されるツールとワークフローにより、単一インスタンスからグローバルでロードバランスされたクラウド コンピューティングまでスケーリングできます。

これらの VM はすばやく起動し、永続ディスク ストレージを備え、一貫したパフォーマンスを提供します。マシンは、事前定義されたサイズを含むさまざまな構成で利用でき、特定のニーズに合わせて最適化されたカスタム マシンタイプを使用して作成することもできます。

Compute Engine 仮想マシンは、他のいくつかの Google Cloud プロダクト(Kubernetes Engine、Cloud Dataproc、Cloud Dataflow など)でも使用されているテクノロジーです。

2. 設定と要件

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列で、いつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud Console により一意の文字列が自動生成されます(通常は内容を意識する必要はありません)。ほとんどの Codelab では、プロジェクト ID を参照する必要があります(通常、プロジェクト ID は「PROJECT_ID」の形式です)。好みの文字列でない場合は、別のランダムな ID を生成するか、独自の ID を試用して利用可能であるかどうかを確認することができます。プロジェクトの作成後、ID は「フリーズ」されます。
  • 3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud Console で課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルを終了した後に課金が発生しないようにリソースをシャットダウンするには、Codelab の最後にある「クリーンアップ」の手順を行います。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Google Cloud Shell

Google Cloud と Compute Engine はノートパソコンからリモートで操作できますが、この Codelab では Cloud 上で動作するコマンドライン環境である Google Cloud Shell を使用します。

この Debian ベースの仮想マシンには、必要な開発ツールがすべて揃っています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働するため、ネットワークのパフォーマンスと認証が大幅に向上しています。つまり、この Codelab に必要なのはブラウザだけです(はい、Chromebook で動作します)。

  1. Cloud Console から Cloud Shell を有効にするには、[Cloud Shell をアクティブにする] b125d9eb26a46cc5.png をクリックします(環境のプロビジョニングと接続に若干時間を要します)。

1067942a9a93f70.png

Screen Shot 2017-06-14 at 10.13.43 PM.png

Cloud Shell に接続すると、すでに認証は完了しており、プロジェクトに各自の PROJECT_ID が設定されていることがわかります。

gcloud auth list

コマンド出力

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

コマンド出力

[core]
project = <PROJECT_ID>

なんらかの理由でプロジェクトが設定されていない場合は、次のコマンドを実行します。

gcloud config set project <PROJECT_ID>

PROJECT_ID が見つからない場合は、設定手順で使用した ID を確認するか、Cloud コンソール ダッシュボードで確認します。

cc3895eeac80db2c.png

Cloud Shell では、デフォルトで環境変数もいくつか設定されます。これらの変数は、以降のコマンドを実行する際に有用なものです。

echo $GOOGLE_CLOUD_PROJECT

コマンド出力

<PROJECT_ID>
  1. 最後に、デフォルトのゾーンとプロジェクト構成を設定します。
gcloud config set compute/zone us-central1-f

さまざまなゾーンを選択できます。詳しくは、リージョンとゾーン

3. Compute Engine インスタンスを作成する

すでに説明したように、この Codelab では gcloud コマンドラインを使用します。ここで行う作業はすべて、コンソール(console.cloud.google.com)を使用して行うことができます。

まず、デフォルトの設定でインスタンスを作成します。

$ gcloud compute instances create myinstance
Created [...].
NAME: myinstance
ZONE: us-central1-f
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING

後で重要な EXTERNAL_IP をメモしておきます。

インスタンスはいくつかのデフォルトを使用して作成されます。

  • 選択したゾーン。すべてのインスタンスはゾーン内に存在します。インスタンスの作成時にゾーンを選択するには、--zone フラグを使用します。または、(初期設定で行ったように)デフォルト ゾーンを設定して、--zone フラグを省略することもできます。
  • 最新の Debian GNU/Linux 9(Stretch)イメージ。独自のカスタム イメージを使用している場合は、ここにイメージ名を指定します。例: --image my-own-image
  • n1-standard-1 マシンタイプn1-highmem-4n1-highcpu-6 など、別のマシンタイプを選択することもできます。事前定義されたマシンタイプの中にニーズに合ったマシンタイプがない場合は、カスタム マシンタイプを使用します。
  • インスタンスと同じ名前のルート永続ディスクが自動的にインスタンスに組み込まれます。

gcloud compute instances create --help を実行すると、使用可能なすべてのオプションが表示されます。

4. ポート 80 に対してファイアウォールを有効にする

デフォルトでは、Google Cloud Platform は少数のポートアクセスのみを許可します。Nginx はまもなくインストールするので、まずファイアウォールの構成でポート 80 を有効にしましょう。

$ gcloud compute firewall-rules create allow-80 --allow tcp:80
Created [...].
NAME: allow-80
NETWORK: default
DIRECTION: INGRESS
PRIORITY: 1000
ALLOW: tcp:80
DENY:
DISABLED: False

これにより、allow-80 という名前のファイアウォール ルールが作成され、受信接続(--source-ranges)が許可される IP アドレス ブロックのデフォルト リストが 0.0.0.0/0(全体)に設定されます。

gcloud compute firewall-rules create --help を実行すると、すべてのデフォルトと、タグに基づいてファイアウォール ルールを適用する機能など、使用可能なすべてのオプションが表示されます。

5. インスタンスに SSH 接続する

(引き続き Cloud Shell から)コマンドラインから SSH でインスタンスに接続するには:

$ gcloud compute ssh myinstance
Waiting for SSH key to propagate.
Warning: Permanently added 'compute.12345' (ECDSA) to the list of known hosts.
...

yourusername@myinstance:~#

これで完了です。とても簡単です。(本番環境ではパスフレーズを入力してください)。

または、コンソール(console.cloud.google.com)から直接インスタンスに SSH 接続することもできます。それには、[Compute Engine] >[VM インスタンス] に移動し、[SSH] をクリックします。

bfbc03997a41946e.png

6. Nginx をインストールする

myinstance(新しく作成したインスタンス)にログインして、nginx をインストールします。

$ sudo su - 
# apt update
# apt install -y nginx
# service nginx start
# exit

myinstance から curl を使用して、サーバーが実行されていることをテストします。

$ curl -s localhost | grep nginx
<title>Welcome to nginx!</title>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
<a href="http://nginx.org/">nginx.org</a>.<br/>
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>

ウェブ UI を使用してインスタンスを一覧表示し、インスタンスの外部 IP を見つけます。

dcc4e56e82ba2603.png

SSH を終了し、Cloud Shell から次のコマンドを実行します。

$ gcloud compute instances list
NAME: myinstance
ZONE: us-central1-f
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING

次に、http://EXTERNAL_IP/ に移動します。ここで、EXTERNAL_IPmyinstance のパブリック IP です。nginx ページが表示されます。

49b52b9354041f3b.png

7. 起動スクリプト

インスタンスを毎回設定するのではなく、起動スクリプトを使用して、起動時にインスタンスを初期化できます。

次の内容のファイルを startup.sh という名前で作成します(vimnanoemacs などの任意のテキスト エディタを使用できます)。

#! /bin/bash
apt-get update
apt-get install -y nginx
service nginx start
sed -i -- 's/nginx/Google Cloud Platform - '"$HOSTNAME"'/' /var/www/html/index.nginx-debian.html

この起動スクリプトで新しい VM インスタンスを作成するには、次のように入力します。

$ gcloud compute instances create nginx \
         --metadata-from-file startup-script=startup.sh 
Created [...].
NAME: nginx
ZONE: us-central1-f
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING

http://EXTERNAL_IP/ にアクセスすると、更新されたホームページが表示されます。数秒経ってもすぐに再試行が表示されない場合は、ホストがまだ nginx を起動している可能性があります。

8. サーバーのクラスタを作成する

サーバーのクラスタを作成するには、まずインスタンス テンプレートを作成する必要があります。インスタンス テンプレートを作成したら、インスタンス グループを作成して、作成するインスタンスの数を管理できます。

まず、起動スクリプトを使用してインスタンス テンプレートを作成します。

$ gcloud compute instance-templates create nginx-template \
         --metadata-from-file startup-script=startup.sh
Created [...].
NAME: nginx-template
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
CREATION_TIMESTAMP: 2022-03-18T15:10:37.621-07:00

次にターゲット プールを作成しますターゲット プールは、それを使用してグループ内のすべてのインスタンスに 1 か所からアクセスできるようになると同時に、今後の手順の負荷分散に必要です。

$ gcloud compute target-pools create nginx-pool
Created [...].
NAME: nginx-pool
REGION: us-central1
SESSION_AFFINITY: NONE
BACKUP:
HEALTH_CHECKS:

最後に、そのテンプレートを使用してインスタンス グループを作成します。

$ gcloud compute instance-groups managed create nginx-group \
         --base-instance-name nginx \
         --size 2 \
         --template nginx-template \
         --target-pool nginx-pool
Created [...].
NAME: nginx-group
LOCATION: us-central1-f
SCOPE: zone
BASE_INSTANCE_NAME: nginx
SIZE: 0
TARGET_SIZE: 2
INSTANCE_TEMPLATE: nginx-template
AUTOSCALED: no

これにより、名前の接頭辞が nginx- の 2 つの VM インスタンスが作成されます。

作成されたすべてのインスタンスが表示されるはずです。

$ gcloud compute instances list
NAME: myinstance
ZONE: us-central1-f
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING

NAME: nginx
ZONE: us-central1-f
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING

NAME: nginx-frpl
ZONE: us-central1-f
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING

NAME: nginx-ztg4
ZONE: us-central1-f
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.X.X
EXTERNAL_IP: X.X.X.X
STATUS: RUNNING

9. ネットワーク ロードバランサを作成する

次のような Google Cloud Platform のロードバランサには、いくつかの種類があります。

インスタンス グループをターゲットとするリージョン ネットワーク ロードバランサを作成しましょう。

$ gcloud compute forwarding-rules create nginx-lb \
         --ports 80 \
         --target-pool nginx-pool
Created [...].

$ gcloud compute forwarding-rules list
NAME: nginx-lb
REGION: us-central1
IP_ADDRESS: X.X.X.X
IP_PROTOCOL: TCP
TARGET: us-central1/targetPools/nginx-pool

その後、ブラウザから http://IP_ADDRESS/ からロードバランサにアクセスできます。IP_ADDRESS は、前のコマンドを実行した結果として表示されたアドレスです。

時間があるため、今回は HTTP ロードバランサの作成は行いません。

10. クラスタをクリーンアップする

クラスタは忘れずにシャットダウンしてください。シャットダウンしないと、クラスタを実行し続け、費用が発生します。次のコマンドは、Google Compute Engine インスタンス、インスタンス グループ、ターゲット グループ、ロードバランサを削除します。

$ gcloud compute forwarding-rules delete nginx-lb

$ gcloud compute instance-groups managed delete nginx-group

$ gcloud compute target-pools delete nginx-pool

$ gcloud compute instance-templates delete nginx-template

$ gcloud compute instances delete nginx

$ gcloud compute instances delete myinstance

$ gcloud compute firewall-rules delete allow-80

上記の各コマンドで、リソースの削除を確認するよう求められます。

11. 次のステップ

これで、この Compute Engine Codelab は終了です。

Compute Engine のその他の機能

Google Compute Engine には豊富な機能があります。必要に応じて、これらのいくつかを調べることをおすすめします。

Google Kubernetes Engine

Google Kubernetes Engine(GKE)は、Google Cloud のホスト型フルマネージド Kubernetes サービスです。GKE を使い始める際に役立つ Codelab がいくつかあります。まずはこちらをお試しください。

フィードバックをお寄せください