GCP の基本的な使い方について、コマンド例などを記載します。
GCP において、Cloud Console (Web UI) によるリソース管理操作と同等の処理は、gcloud コマンドによって行うこともできます。Cloud Shell を利用すると、Web ブラウザから、gcloud がインストールされた Debian 環境を利用できます。
認証済みのアカウントリスト、および現在アクティブなアカウントを確認します。
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 インスタンスの作成
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
GKE クラスタを作成
gcloud container clusters create my-cluster
.kube/config
ファイルをダウンロード
gcloud container clusters get-credentials my-cluster
GKE クラスタの削除
gcloud container clusters delete my-cluster
下記二つについて、用途によって使い分ける必要があります。
参考資料:
Cloud SQL で稼働する MySQL への接続
gcloud sql connect mydb --user=root
ヘルプ確認 --help
gcloud compute instances create --help
ログレベルの変更
gcloud auth list --verbosity debug
ロードバランサのバックエンドとなる 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
VM インスタンスへの HTTP 通信を許可するための設定を追加します。--target-tags
で VM インスタンスに付与したタグを指定します。
gcloud compute firewall-rules create my-firewall-rule-for-www --target-tags my-tag-1 --allow tcp:80
L4 ネットワークロードバランサに付与するための外部 IP を作成します。
gcloud compute addresses create network-lb-ip-1 --region asia-northeast1
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 への 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>
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
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
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
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>
HTTP(S) L7 ロードバランサは、HTTP/2 を利用する場合を除き、WebSocket に対応しています。
参考資料: WebSocket support
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 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
Cloud Storage に限らず GCP の API には Rate Limit が設けられています。上限を越えてアクセスすると HTTP 429 が返されます。Exponential backoff 等をアプリケーションに実装して対応します。
参考資料:
Cloud Storage は以下の暗号化方式をサポートしています。
参考資料: Data encryption options
Cloud Storage には Lifecycle management の機能が備わっており、特定の condition に合致したオブジェクトの Storage Class を変更したり、自動的に削除することが可能です。IsLive
は condition で利用可能な値の一つです。Object Versioning が有効になっているバケットにおいて、最新のバージョンでない場合は false となります。
参考資料: Object Lifecycle Management
サイズの大きいファイルをアップロードする際、分割してアップロードされるため、通信が切断されたとしても最初からすべてをアップロードする必要はありません。
参考資料: Resumable uploads
ソースコードの存在するディレクトリに移動します。
mkdir -p myapp
cd myapp/
index.js
exports.helloWorld = (req, res) => {
console.log('my log');
res.send('OK!');
};
Cloud Functions は docker コンテナとして稼働します。ローカルファイルシステムのソースコードをデプロイすると、以下のようなサービスが連携されます。
そのため、必要な 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
コストを抑えるためには 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
--limit
で、一度にサブスクリプションから取得するメッセージの数を変更できます。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
データセットの作成、確認、削除
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 を設定することができます。
参考資料: Use the expiration settings to remove unneeded tables and partitions
「請求先アカウント」は組織の中に存在しており、通常は一つだけ作成することが推奨されています。
「請求先アカウント」は一つ以上のプロジェクトと関連付けることができ、プロジェクトで発生した費用の請求先となります。
「請求先アカウント」とプロジェクトを関連付けるためには、「請求先アカウント」の 請求先アカウントユーザー
ロールと、プロジェクトの オーナー
または プロジェクト支払い管理者
ロールが必要となります。
請求先アカウントユーザー
ロールは組織におけるロールであり、プロジェクトレベルでは設定できません。
例えば、qoosky.io
組織における 請求先アカウントユーザー
ロールを xxxx@gmail.com
アカウントに付与すると、xxxx@gmail.com
アカウントは、別の組織であっても、そのプロジェクトの オーナー
または プロジェクト支払い管理者
であれば、qoosky.io
の中に存在する「請求先アカウント」に請求するようなプロジェクトを作成できます。
qoosky.io
組織内で、組織外のアカウントに対して 請求先アカウントユーザー
ロールを付与してみます。
組織外のプロジェクトであっても、qoosky.io
組織内の「請求先アカウント」に関連付けられることが分かります。
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 に追加設定します。
確かにエクスポートできるようになりました。
Google Cloud Platform - Resource Location Restriction
によって、リソースのリージョンやゾーンを制限できます。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.
参考資料:
App Engine Standard で提供される Java 環境において、アプリケーションを実行するために Tomcat のような Web コンテナは不要です。App Engine 独自のコンテナが利用されます。
関連資料:
キャッシュヒット率を向上させるために、以下のような事項に注意します。
Cache-Control
を適切に設定することで、Origin Server から Cloud CDN のキャッシュサーバへデータを再送する頻度を下げられます。