モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

目次目次を開く/閉じる

GCP の基本的な使い方

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2021/03/15
最終更新最終更新
2024/02/27
記事区分記事区分
一般公開

目次

    クラウドネイティブなアーキテクチャを設計するのが好きです。主にGCPを利用しています。

    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 が作成されます。

    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
    

    バックエンドサービスに 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 コンテナとして稼働します。ローカルファイルシステムのソースコードをデプロイすると、以下のようなサービスが連携されます

    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 の利用を検討します。

    トピックの作成

    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 のキャッシュサーバへデータを再送する頻度を下げられます。

    参考資料: Best practices for content delivery

    Likeボタン(off)0
    詳細設定を開く/閉じる
    アカウント プロフィール画像

    クラウドネイティブなアーキテクチャを設計するのが好きです。主にGCPを利用しています。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    >>さらに詳しくステッカーを贈る
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      ログインする

      関連記事