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 が作成されます。
参考資料:
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
バックエンドサービスに 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
フロントエンド
外部 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
疎通確認
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
に「組織の管理者」権限を付与しています。
yyy@gmail.com
アカウントを用いて、自身の「組織なし」プロジェクトに加えて、権限を与えられた qoosky.io「組織」の管理を行えるようになりました。
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 コンテナとして稼働します。ローカルファイルシステムのソースコードをデプロイすると、以下のようなサービスが連携されます。
- Cloud Storage へのソースコードの保存。
- Cloud Build による Docker イメージのビルド。
- 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 の利用を検討します。
トピックの作成
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 接続して利用する例
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 を設定することができます。
- 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
組織内で、組織外のアカウントに対して 請求先アカウントユーザー
ロールを付与してみます。
組織外のプロジェクトであっても、qoosky.io
組織内の「請求先アカウント」に関連付けられることが分かります。
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 に追加設定します。
確かにエクスポートできるようになりました。
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
キャッシュヒット率を向上させるために、以下のような事項に注意します。
- Protocol 情報を含まない Key を利用することで、HTTP と HTTPS のどちらのアクセスでも利用可能なキャッシュとなります。
Cache-Control
を適切に設定することで、Origin Server から Cloud CDN のキャッシュサーバへデータを再送する頻度を下げられます。
関連記事
- GKE における Node および Pod の autoscalingGoogle Kubernetes Engine (GKE) における autoscaling について、用語の意味を整理します。 GKE の機能による Node の autoscaling GKE のクラスタには Standard と Autopilot の二種類が存在します。 Autopilot の場合は Node は Google によって管理されるため、自動で autoscaling され...
- Snowflake におけるネットワーク関連の設定本ページではネットワーク関連の設定について記載します。 Network Policy によるアクセス元 IP 制限 IPv4 で指定します。IPv6 は 2021/9/21 時点では利用できません。 allowed list で許可されていない IP は block されます。 allowed list が /24 等で指定されており、その一部を
- VPC Service Controls に関する雑多な事項の整理VPC Service Controls (VPC-SC) に関する雑多な事項を記載します。 Private Google Access の基本形 Private Google Access は外部 IP を持たない VM のための機能です。VPC の機能ですが、VPC-SC と関連するため基本事項を記載します。 [Private Google Access](ht
- AWS IAM Role を GCP から STS 認証で利用する設定例GCP から AWS IAM Role を利用するための設定例を記載します。 GCP Service Account の作成 Service Account を作成して Unique ID を確認します。 AWS IAM Role の作成 Trust relationship の設定は Web Identity を選択します。Identity Provider
- Amazon Comprehend を GCP VPC 内から実行する設定の例 (Public Internet 接続なし)GCP DLP に相当する AWS サービスに Amazon Comprehend が存在します。GCP VPC 内から Public Internet を経由せずに利用する設定の例を記載します。 AWS VPC と GCP VPC の作成 クラウド 項目 値 AWS VPC region ap-northeast-1 AWS VPC CIDR 10.2.0.0/16 AWS ap-north