GCP の基本的な使い方
[履歴] [最終更新] (2021/11/23 16:15:09)
最近の投稿
注目の記事

概要

GCP の基本的な使い方について、コマンド例などを記載します。

Web ブラウザ経由で gcloud コマンドを利用 (Cloud Shell)

GCP において、Cloud Console (Web UI) によるリソース管理操作と同等の処理は、gcloud コマンドによって行うこともできます。Cloud Shell を利用すると、Web ブラウザから、gcloud がインストールされた Debian 環境を利用できます。

  • 利用料金は無料です。
  • プロジェクトによらず永続化された 5GB のホームディレクトリが割り当てられます。
  • 非アクティブな状態が 1 時間続くと、セッションは終了し、その VM は破棄されます。
  • ホームディレクトリ以外は永続化されていません (apt 等でインストールしたコマンドはなくなります)
  • 120日使われていないとホームディレクトリが削除されます (削除される前にメール通知がなされます)

gcloud コマンド例

認証

認証済みのアカウントリスト、および現在アクティブなアカウントを確認します。

gcloud auth list

ユーザアカウントを用いたログイン

gcloud auth login

サービスアカウントによる認証

gcloud auth activate-service-account --key-file /path/to/service-account-key-file.json

現在アクティブなアカウントの権限で API アクセス等を行うためのアクセストークンを生成

gcloud auth print-access-token

アクティブなアカウントの切り換え

gcloud config set account my-another-account@qoosky.io

設定の確認

gcloud コマンドが対象とするプロジェクトID などを設定値として持つことができます。

現在の設定における、プロジェクトID を確認

gcloud config list project

現在の設定を確認、すべて確認 (--all)

gcloud config list
gcloud config list --all

--zone フラグを毎回指定せずに、既定値を設定しておくことができます。

リージョン一覧

gcloud config get-value compute/zone
gcloud config get-value compute/region
gcloud config set compute/zone [asia-northeast1-a]
gcloud config set compute/region [asia-northeast1]

プロジェクトの情報を確認

gcloud compute project-info describe --project my-project-id | head

gcloud のコンポーネントのインストール状況を確認

gcloud components list

gcloud beta サブコマンド (コンポーネント) をインストール

sudo apt-get install google-cloud-sdk

補完が効く gcloud シェル環境を起動

gcloud beta interactive

VM インスタンス

VM インスタンスの作成

gcloud compute instances create my-instance-1 --machine-type n1-standard-2 --zone asia-northeast1-a

情報の確認

gcloud compute instances describe my-instance-1

SSH 接続

gcloud compute ssh my-instance-1 --zone asia-northeast1-a

シリアルポートへの出力の確認

gcloud compute instances get-serial-port-output my-instance-1

Windows インスタンスに RDP 接続するためのパスワード初期化

gcloud compute reset-windows-password my-instance-1 --zone asia-northeast1-a --user my-username

Kubernetes (GKE)

GKE クラスタを作成

gcloud container clusters create my-cluster

.kube/config ファイルをダウンロード

gcloud container clusters get-credentials my-cluster

GKE クラスタの削除

gcloud container clusters delete my-cluster

下記二つについて、用途によって使い分ける必要があります。

  • Kubernetes の Ingress を利用する際は HTTP(S) Load Balancer が作成されます。
  • LoadBalancer タイプの Service を利用する際は Network load balancer が作成されます。

Uploaded Image

Choosing a load balancer

参考資料:

Cloud SQL

Cloud SQL で稼働する MySQL への接続

gcloud sql connect mydb --user=root

ヘルプ等

ヘルプ確認 --help

gcloud compute instances create --help

ログレベルの変更

gcloud auth list --verbosity debug

L4 ロードバランサ

VM インスタンスの準備

ロードバランサのバックエンドとなる VM インスタンスを準備します。VM 起動時には image を指定できます。指定しない場合は、既定の image が利用されます。

指定できる image には public なものが含まれます。debian-cloud が提供する image は以下のコマンドで確認できます。

gcloud compute images list --project=debian-cloud --no-standard-images

出力例

NAME                        PROJECT       FAMILY     DEPRECATED  STATUS
debian-10-buster-v20210316  debian-cloud  debian-10              READY
debian-9-stretch-v20210316  debian-cloud  debian-9               READY

--machine-type を指定しない場合は、一番小さいサイズの n1-standard-1 が既定値となっています。

gcloud compute machine-types list --zones asia-northeast1-a

VM にはタグ --tags を付与できます。また、起動時に実行したいスクリプトも指定できます。

gcloud compute instances create my-instance-1 \
  --image-project debian-cloud \
  --image-family debian-10 \
  --zone asia-northeast1-a \
  --tags my-tag-1 \
  --metadata startup-script="#! /bin/bash
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html"

インスタンスのリストを取得

gcloud compute instances list

Firewall ルールの作成

VM インスタンスへの HTTP 通信を許可するための設定を追加します。--target-tags で VM インスタンスに付与したタグを指定します。

gcloud compute firewall-rules create my-firewall-rule-for-www --target-tags my-tag-1 --allow tcp:80

外部 IP の作成

L4 ネットワークロードバランサに付与するための外部 IP を作成します。

gcloud compute addresses create network-lb-ip-1 --region asia-northeast1

VM インスタンスのグループを作成

L4 ロードバランサのバックエンドとなる VM インスタンスグループを作成します。

gcloud compute http-health-checks create my-http-health-check
gcloud compute target-pools create my-www-pool --region asia-northeast1 --http-health-check my-http-health-check
gcloud compute target-pools add-instances my-www-pool --instances-zone asia-northeast1-a --instances my-instance-1,my-instance-2,my-instance-3

外部 IP を VM インスタンスグループに転送するための設定を作成

作成した外部 IP への HTTP 通信を VM インスタンスグループに転送するための設定を作成します。

gcloud compute forwarding-rules create my-www-rule \
    --address network-lb-ip-1 \
    --ports 80 \
    --target-pool my-www-pool \
    --region asia-northeast1

gcloud compute forwarding-rules describe my-www-rule --region asia-northeast1

疎通確認

gcloud compute addresses list
NAME             ADDRESS/RANGE   TYPE      PURPOSE  NETWORK  REGION           SUBNET  STATUS
network-lb-ip-1  35.221.114.178  EXTERNAL                    asia-northeast1          IN_USE

curl -sS http://35.221.114.178
<!doctype html><html><body><h1>www1</h1></body></html>

L7 ロードバランサ

Managed Instance Group (MIG) の作成

GCP には VM を作成するためのテンプレート機能が存在します。

gcloud compute instance-templates create my-instance-template-1 \
  --image-project=debian-cloud \
  --image-family=debian-10 \
  --region=asia-northeast1 \
  --tags=my-allow-health-check-tag \
  --network=default \
  --subnet=default \
  --metadata=startup-script="#! /bin/bash
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo systemctl restart apache2
    echo '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html"

テンプレートから作成できるものの一つに、Managed Instance Group (MIG) があります。

gcloud compute instance-groups managed create my-managed-instance-group-1 \
  --template=my-instance-template-1 \
  --size=2 \
  --zone=asia-northeast1-a

二つの VM が MIG で作成されたことが確認できます。

gcloud compute instances list

Firewall ルールの作成

MIG で管理される VM インスタンスに対して、L7 ロードバランサ 130.211.0.0/22,35.191.0.0/16 からの HTTP アクセスを許可するように設定します。

gcloud compute firewall-rules create my-allow-health-check-fw-rule \
  --target-tags=my-allow-health-check-tag \
  --action=allow \
  --direction=ingress \
  --rules=tcp:80 \
  --network=default \
  --source-ranges=130.211.0.0/22,35.191.0.0/16

外部 IP の作成

HTTP ロードバランサに外部からアクセスするための IP アドレスを作成します。

gcloud compute addresses create my-lb-eip-1 \
  --ip-version=IPV4 \
  --global

gcloud compute addresses describe my-lb-eip-1 \
  --format="get(address)" \
  --global

外部 IP を L7 ロードバランサに転送するための設定を作成

HTTP ヘルスチェックを作成します。

gcloud compute health-checks create http my-http-health-check --port 80

バックエンド

L7 ロードバランサのバックエンドを作成します。バックエンドに登録されているインスタンスはなく、空です。

gcloud compute backend-services create my-backend-service \
  --protocol=HTTP \
  --port-name=http \
  --health-checks=my-http-health-check \
  --global

Uploaded Image

バックエンドサービスに MIG を登録します。

gcloud compute backend-services add-backend my-backend-service \
  --instance-group=my-managed-instance-group-1 \
  --instance-group-zone=asia-northeast1-a \
  --global

ロードバランサ

バックエンドサービスへのマッピングを作成します。

gcloud compute url-maps create my-url-map --default-service my-backend-service

Uploaded Image

フロントエンド

外部 IP へのアクセスを、URL マッピングに向ける設定を作成します。

gcloud compute target-http-proxies create my-http-proxy --url-map my-url-map

gcloud compute forwarding-rules create my-forwarding-rule \
  --target-http-proxy=my-http-proxy \
  --ports=80 \
  --address=my-lb-eip-1 \
  --global

Uploaded Image

疎通確認

HTTP 通信が通ることを確認します。

$ curl -sS http://34.117.181.59/
<!doctype html><html><body><h1>www1</h1></body></html>

WebSocket

HTTP(S) L7 ロードバランサは、HTTP/2 を利用する場合を除き、WebSocket に対応しています。

参考資料: WebSocket support

Session affinity

HTTP(S) L7 ロードバランサは、同じ Session における Load balance 先を固定化するための Session affinity 機能を備えています。

参考資料: Session affinity

複数の「組織」

複数のプロジェクトを複数人で扱う際には、それらのプロジェクトを「組織」としてまとめて管理すると便利です。

「組織」を作成するためには example.com といったドメインが必要になります。ドメインを入手したら、そのドメインを用いて「Cloud Identity」または「Google Workspace」のアカウントを作成します。「Cloud Identity」または「Google Workspace」は GCP の外に存在するサービスです: https://admin.google.com/

複数のドメインが存在する場合は、複数の「Cloud Identity」または「Google Workspace」を持つことができます。

「組織」の管理者ロール Organization Administrator (組織の管理者) を付与することで、あるアカウントからその組織を管理できるようになります。

以下の例では、qoosky.io ドメインで Cloud Identity を作成した際に作られた admin-xxx@qoosky.io アカウントを用いて、yyy@gmail.com に「組織の管理者」権限を付与しています。

Uploaded Image

yyy@gmail.com アカウントを用いて、自身の「組織なし」プロジェクトに加えて、権限を与えられた qoosky.io「組織」の管理を行えるようになりました。

Uploaded Image

gsutil コマンドによる Cloud Storage の利用

バケット作成

gsutil mb gs://mybucket-20210428-3/

コピー

gsutil cp myimg.jpg gs://mybucket-20210428-3/
gsutil cp -r gs://mybucket-20210428-3/myimg.jpg .
gsutil cp gs://mybucket-20210428-3/myimg.jpg gs://mybucket-20210428-3/my-folder/

リスト

gsutil ls gs://mybucket-20210428-3/
gsutil ls -l gs://mybucket-20210428-3/myimg.jpg

削除

gsutil rm gs://mybucket-20210428-3/myimg.jpg

権限操作

gsutil acl ch -u AllUsers:R gs://mybucket-20210428-3/myimg.jpg
gsutil acl ch -d AllUsers gs://mybucket-20210428-3/myimg.jpg

HTTP 429 エラーについて

Cloud Storage に限らず GCP の API には Rate Limit が設けられています。上限を越えてアクセスすると HTTP 429 が返されます。Exponential backoff 等をアプリケーションに実装して対応します。

参考資料:

Data encryption options

Cloud Storage は以下の暗号化方式をサポートしています。

  • Server-side encryption
    • Google-managed encryption key による暗号化。
    • Customer-managed encryption key を Cloud Key Management で管理して暗号化。
    • Customer-supplied encryption key を gsutil 等でファイルアップロードする際に指定して暗号化。
  • Client-side encryption
    • 暗号化したデータをアップロード。

参考資料: Data encryption options

IsLive について

Cloud Storage には Lifecycle management の機能が備わっており、特定の condition に合致したオブジェクトの Storage Class を変更したり、自動的に削除することが可能です。IsLive は condition で利用可能な値の一つです。Object Versioning が有効になっているバケットにおいて、最新のバージョンでない場合は false となります。

参考資料: Object Lifecycle Management

Resumable uploads

サイズの大きいファイルをアップロードする際、分割してアップロードされるため、通信が切断されたとしても最初からすべてをアップロードする必要はありません。

参考資料: Resumable uploads

Cloud Functions の利用例

関数のデプロイ

ソースコードの存在するディレクトリに移動します。

mkdir -p myapp
cd myapp/

index.js

exports.helloWorld = (req, res) => {
  console.log('my log');
  res.send('OK!');
};

Cloud Functions は docker コンテナとして稼働します。ローカルファイルシステムのソースコードをデプロイすると、以下のようなサービスが連携されます

  1. Cloud Storage へのソースコードの保存。
  2. Cloud Build による Docker イメージのビルド。
  3. Container Registory による Cloud Storage へのバケット作成。イメージ保存。

そのため、必要な API を有効化しておく必要があります。

gcloud services enable cloudbuild.googleapis.com
gcloud services list --enabled
gcloud services list --available

HTTP エンドポイントへのアクセスをトリガとして起動するように関数を登録してみます。

gcloud functions deploy helloWorld --runtime nodejs14 --trigger-http

IAM による認証を行うために、以下の質問では N を指定します。

Allow unauthenticated invocations of new function [helloWorld]? (y/N)?

作成されたリソースの確認

ソースコードが格納されたバケットと、Docker イメージが格納されたバケットが確認できます。

gsutil ls

gs://gcf-sources-xxxxxxxxxxxx-us-central1/
gs://us.artifacts.my-project-xxxxxxxx.appspot.com/

Cloud Build のログ

gcloud builds list --region us-central1

Container Registry

gcloud container images list --repository=us.gcr.io/my-project-xxxxxxxx/gcf/us-central1

Cloud Functions

gcloud functions describe helloWorld
#gcloud functions delete helloWorld

動作検証

curl -sS -XGET -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://us-central1-my-project-xxxxxxxx.cloudfunctions.net/helloWorld

OK!

gcloud を用いる場合

gcloud functions call helloWorld --data '{}'

ログの確認

gcloud functions logs read helloWorld

Cloud Pub/Sub の利用例

コストを抑えるためには Pub/Sub Lite の利用を検討します。

Uploaded Image

トピックの作成

gcloud pubsub topics create myTopic
gcloud pubsub topics list

サブスクリプションの作成

gcloud pubsub subscriptions create --topic myTopic mySubscription
gcloud pubsub subscriptions create --topic myTopic mySubscription2
gcloud pubsub topics list-subscriptions myTopic

メッセージのパブリッシュ

gcloud pubsub topics publish myTopic --message 'Hello'

サブスクリプションからメッセージを取得

gcloud pubsub subscriptions pull mySubscription --auto-ack
gcloud pubsub subscriptions pull mySubscription2 --auto-ack
gcloud pubsub subscriptions pull mySubscription --auto-ack --limit=3
  • サブスクライバーが ack すると、サブスクリプションからメッセージが消えます。
  • --limit で、一度にサブスクリプションから取得するメッセージの数を変更できます。
  • サブスクリプションから pull するのではなく、サブスクライバーの HTTP エンドポイントに push させることもできます。
  • Cloud Pub/Sub が受信した順序でメッセージを Subscribe することができます: Ordering messages
    • 例えば Dataflow と組み合わせることで、Pub/Sub streams の exactly-once processing を実現することができます。

Dataproc の利用例

Dataflow は GCP サービス間のデータの流れを構築するサービスです。一方、Dataproc はデータ分析等を行う計算資源を一時的に用意するサービスとして捉えられます。

クラスタの作成

gcloud config set dataproc/region us-central1

gcloud dataproc clusters create my-cluster \
--master-boot-disk-size 32GB \
--worker-boot-disk-size 32GB \
--master-machine-type n1-standard-2 \
--worker-machine-type n1-standard-2 \
--num-workers 2

ワーカ数の変更、クラスタの削除

gcloud dataproc clusters update my-cluster --num-workers 4
gcloud dataproc clusters delete my-cluster

起動したクラスタの master VM に SSH 接続して利用する例

Uploaded Image

PySpark が利用できます。

myuser@my-cluster-m:~$ which gcloud
/usr/bin/gcloud

myuser@my-cluster-m:~$ which pyspark
/opt/conda/default/bin/pyspark

利用例

>>> rdd = sc.parallelize([('hi', i) for i in range(10000)])
>>> df = rdd.toDF()
>>> df.show()
+---+---+
| _1| _2|
+---+---+
| hi|  0|
| hi|  1|
| hi|  2|
| hi|  3|
| hi|  4|
| hi|  5|
| hi|  6|
| hi|  7|
| hi|  8|
| hi|  9|
| hi| 10|
| hi| 11|
| hi| 12|
| hi| 13|
| hi| 14|
| hi| 15|
| hi| 16|
| hi| 17|
| hi| 18|
| hi| 19|
+---+---+
only showing top 20 rows

BigQuery

データセットの作成、確認、削除

bq mk mydataset
bq ls
bq rm -r mydataset

パブリックデータセットの確認

bq ls bigquery-public-data:
bq ls data-to-insights:

テーブルスキーマの確認

bq show bigquery-public-data:samples.shakespeare
bq show data-to-insights:ecommerce.all_sessions_raw

テーブルの作成

bq load mydataset.mytable mydata.csv name:string,gender:string,count:integer
bq show mydataset.mytable

クエリ

bq query 'SELECT * FROM mydataset.mytable'

古いデータを自動削除するための設定

Cloud Storage の lifecycle と同様に、BigQuery におけるデータに対して expiration を設定することができます。

Uploaded Image

  • Dataset に対して default table expiration を設定可能です。
    • テーブル全体が削除されます。
  • Table に対して expiration time を設定可能です。
    • テーブル全体が削除されます。
  • Partition 設定が有効な table に対して partition expiration を設定可能です。
    • テーブル内の partition が削除されていきます。
    • 2021-11-21 時点において、Cloud Console からの設定はサポートされていません。

参考資料: Use the expiration settings to remove unneeded tables and partitions

「請求先アカウント」について

「請求先アカウント」は組織の中に存在しており、通常は一つだけ作成することが推奨されています。

「請求先アカウント」は一つ以上のプロジェクトと関連付けることができ、プロジェクトで発生した費用の請求先となります。

「請求先アカウント」とプロジェクトを関連付けるためには、「請求先アカウント」の 請求先アカウントユーザー ロールと、プロジェクトの オーナー または プロジェクト支払い管理者 ロールが必要となります。

請求先アカウントユーザー ロールは組織におけるロールであり、プロジェクトレベルでは設定できません。

例えば、qoosky.io 組織における 請求先アカウントユーザー ロールを xxxx@gmail.com アカウントに付与すると、xxxx@gmail.com アカウントは、別の組織であっても、そのプロジェクトの オーナー または プロジェクト支払い管理者 であれば、qoosky.io の中に存在する「請求先アカウント」に請求するようなプロジェクトを作成できます。

qoosky.io 組織内で、組織外のアカウントに対して 請求先アカウントユーザー ロールを付与してみます。

Uploaded Image

組織外のプロジェクトであっても、qoosky.io 組織内の「請求先アカウント」に関連付けられることが分かります。

Uploaded Image

VPC-SC 内の BigQuery に Billing Data をエクスポート

GCP の Cloud Billing データは、BigQuery にエクスポート可能です。エクスポート対象の BigQuery が VPC-SC 内に存在する場合、以下の Google 管理のサービスアカウントによるアクセスが失敗します。

cloud-account-pricing@cloud-account-pricing.iam.gserviceaccount.com

これを回避するためには、上記サービスアカウントからのアクセスを許可する access-level を作成して VPC-SC に設定する必要があります。2021-5-26(Wed) 現在のところ、Cloud Console ではなく gcloud コマンドを使用する必要があります

CONDITIONS.yaml

- members:
    - serviceAccount:cloud-account-pricing@cloud-account-pricing.iam.gserviceaccount.com

組織ID の確認

gcloud organizations list

ポリシー名の確認

gcloud access-context-manager policies list --organization xxxxxxxx

アクセスレベルの作成

gcloud access-context-manager levels create billing_data_export --title 'billing_data_export' \
--basic-level-spec CONDITIONS.yaml --policy xxxxxxxxxx

VPC-SC に追加設定します。

Uploaded Image

確かにエクスポートできるようになりました。

Uploaded Image

Organization Policy によるリージョン制限

  • Google Cloud Platform - Resource Location Restriction によって、リソースのリージョンやゾーンを制限できます。
  • 作成済みのリソースは影響を受けません。新規に作成されるリソースの制限となります。
    • App Engine の Auto-scaling や MIG による処理は、新規リソース作成として扱われることに注意します。

If you have a preexisting zonal or regional MIG, and later set a resource location constraint, MIG operations will fail if they violate the constraint. You must recreate the MIG in a permitted location.

参考資料:

Tomcat と App Engine Standard

App Engine Standard で提供される Java 環境において、アプリケーションを実行するために Tomcat のような Web コンテナは不要です。App Engine 独自のコンテナが利用されます。

関連資料:

Cloud CDN

キャッシュヒット率を向上させるために、以下のような事項に注意します。

Uploaded Image

  • Protocol 情報を含まない Key を利用することで、HTTP と HTTPS のどちらのアクセスでも利用可能なキャッシュとなります。
  • Cache-Control を適切に設定することで、Origin Server から Cloud CDN のキャッシュサーバへデータを再送する頻度を下げられます。

参考資料: Best practices for content delivery

関連ページ
    概要 こちらのページで基本的な使い方を把握した Terraform を用いると、GCP 環境内にリソースを作成できます。GCP で組織を用いる際に必要となる Cloud Identity は GCP の外に存在する Google のサービスです。Cloud Identity が出力するログを GCP 内の Cloud Logging に取り込む方法について、Terraform モジュールのソース
    概要 Cloud Logging は GCP 内のリソース等で生成されるログを処理するためのサービスです。旧称は Google Stackdriver Logs です。Cloud Logging 自体は、Operations Suite という枠組みの一部という位置付けです。基本的な使い方を記載します。 gcloud および API の利用
    概要 こちらのページで基本的な使い方を把握した GCP の Data Loss Prevention (DLP) サービスを用いると、文章や画像の中に含まれる、電話番号や氏名および住所といった、個人を特定し得る情報 Personally Identifiable Information (PII) の検出を行えます。更に追加の設定によって、検出した情報を消したり他の文字列で置き換えたり、ハッシュ
    概要 GCP 環境をプロビジョニングするための Terraform の基本的な設定を記載します。 本ページで利用する terraform のバージョンは以下のとおりです。 [vagrant@localhost myrepo] terraform --version Terraform v0.14.8 簡単な例 (VPC の作成)
    概要 Cloud Identity における SSO について、概要を把握するための情報を記載します。 Cloud Identity Cloud Identity は GCP を含む Google のサービスを利用するための Identity as a Service (IDaaS) または Identity Provider (IdP) です。Cloud Identity で管理する Gr
    概要 こちらのページに記載した GCP における Cloud IAM について、基本的な使い方を記載します。 用語 Permission <service>.<resource>.<verb> という形式で表現されます。例えば、後述の Custom Role を作成するためには iam.roles.create