Google Cloud SDKコマンド チートシート



# はじめに
実際に使ったコマンドのメモです。
随時更新していきます。
詳細は公式リファレンスをご参照下さい。


# INDEX
- [gcloudコマンド](#gcloudコマンド)
- [gsutilコマンド](#gsutilコマンド)


# gcloudコマンド 
[公式リファレンス](https://cloud.google.com/sdk/gcloud/reference)
## $ gcloud init
### 現在のconfigurationを初期化 or 新たなconfigurationを作成
対話形式で以下を指定する

* 現在のconfigurationを初期化 or 別のconfigurationを初期化 or 新規作成
* configuration名を設定
* gcpアカウントを選択
* プロジェクトを選択
* ゾーンを選択

```sh
$ gcloud init
```

<br>
## $ gcloud auth ~
### ログイン
gcloudコマンドをつかってGCPへアクセスするための認証

```sh
$ gcloud auth login
```
### ログアウト
```sh
$ gcloud auth revoke
```

<br>
## $ gcloud projects ~
### プロジェクトの一覧
```sh
$ gcloud projects list
```

### プロジェクト作成
```sh
$ gcloud projects create プロジェクトID --name プロジェクト名
```

### プロジェクト削除
```sh
$ gcloud projects delete プロジェクトID
```

### サービスアカウントへ権限付与 / 削除

```sh
$ gcloud projects add-iam-policy-binding プロジェクトID \
--member serviceAccount:サービスアカウントネーム@プロジェクトID.iam.gserviceaccount.com \
--role roles/storage.admin # <- 例えばストレージ管理者
```

```sh
$ gcloud projects remove-iam-policy-binding プロジェクトID \
--member serviceAccount:サービスアカウントネーム@プロジェクトID.iam.gserviceaccount.com \
--role roles/storage.admin # <- 例えばストレージ管理者
```

<img width="1137" alt="スクリーンショット 2020-02-10 0.16.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/d01bb796-0ab7-211a-2d56-05b7d14bb7aa.png">

### roleリスト
https://cloud.google.com/iam/docs/understanding-roles?hl=ja#service-accounts-roles

<br>
### プロジェクトに紐付いている権限を一覧表示

```sh
$ gcloud projects get-iam-policy プロジェクトID
```

<br>
## $ gcloud compute ~
### GCEインスタンスの一覧
```sh
$ gcloud compute instances list
```

`--filter`オプションで絞り込み

```sh
$ gcloud compute instances list --filter="zone:(us-central1-a asia-northeast1-a)"
```


### 使用可能な公開OSイメージの一覧

```sh
$ gcloud compute images list

NAME                                                  PROJECT              FAMILY                            DEPRECATED  STATUS
centos-6-v20200714                                    centos-cloud         centos-6                                      READY
centos-7-v20200714                                    centos-cloud         centos-7                                      READY
...
```

### OSイメージの詳細表示
Shielded VM(セキュリティ制御により強化されたGoogleCloud上の仮想マシン)に対応しているかなど確認可能。

```sh
# ここでは以下を指定
# イメージ名: debian-9-stretch-v20200805
# イメージプロジェクト: debian-cloud

$ gcloud compute images describe debian-9-stretch-v20200805 --project debian-cloud

archiveSizeBytes: '16262238720'
creationTimestamp: '2020-08-05T10:54:28.717-07:00'
description: Debian, Debian GNU/Linux, 9 (stretch), amd64 built on 20200805
diskSizeGb: '10'
family: debian-9
guestOsFeatures:
- type: VIRTIO_SCSI_MULTIQUEUE
id: '6709658075886210235'
kind: compute#image
labelFingerprint: 42WmSpB8rSM=
licenseCodes:
- '1000205'
licenses:
- https://www.googleapis.com/compute/v1/projects/debian-cloud/global/licenses/debian-9-stretch
name: debian-9-stretch-v20200805
rawDisk:
  containerType: TAR
  source: ''
selfLink: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-9-stretch-v20200805
sourceType: RAW
status: READY
storageLocations:
- eu
- eu
- us
- eu
- asia
- asia
- eu
- asia
- us
- asia
- us
- eu
- us
- us
- asia
- us
- asia
- asia
- us
- eu
- us
- us
- asia
- asia
```



### GCEインスタンスの作成
```sh
$ gcloud compute instances create webserver(任意のインスタンス名) \
--image-family ubuntu-1804-lts \
--image-project ubuntu-os-cloud \
--zone asia-northeast1-b \
--machine-type n1-standard-4 \
--create-disk size=375GB,type=pd-ssd \
--metadata-from-file startup-script=./script.sh
```

> [INSTANCE_NAME] は、新しいインスタンスの名前です。
> [IMAGE_FAMILY] は、使用可能なイメージ ファミリーのいずれかです。
> [IMAGE_PROJECT] は、イメージが属するイメージ プロジェクトです。
> [DISK_IMAGE] は、セカンダリ ディスクのソースイメージです。使用可能なイメージのリストを表示するには、gcloud compute images list を実行します。空のディスクを作成する場合は、ディスク イメージやイメージ プロジェクトを指定しないでください。
> [DISK_IMAGE_PROJECT] は、ディスク イメージが属するイメージ プロジェクトです。空のディスクを作成する場合は、ディスク イメージやイメージ プロジェクトを指定しないでください。
> [SIZE_GB] は、セカンダリ ディスクのサイズです。
> [DISK_TYPE] は、永続ディスクの種類（pd-standard または pd-ssd のいずれか）です。
> ディスクを使用する前に、ディスクをフォーマットしてマウントします。 
https://cloud.google.com/compute/docs/disks/add-persistent-disk?hl=ja#formatting

https://cloud.google.com/compute/docs/instances/create-start-instance?hl=ja

`--metadata-from-file startup-script=./script.sh`を指定するとインスタンス起動時にスクリプト任意のスクリプトがはしる。

### GCEインスタンスの削除
```sh
$ gcloud compute instances delete インスタンス名
```

### GCEインスタンスの停止
複数指定可能

```sh
$ gcloud compute instances stop インスタンス名1 インスタンス名2
```

### GCEインスタンスの起動

```sh
$ gcloud compute instances start インスタンス名
```

### GCEインスタンスの詳細表示
```sh
$ gcloud compute instances describe インスタンス名

canIpForward: false
cpuPlatform: Intel Haswell
creationTimestamp: '2020-08-05T23:51:06.025-07:00'
deletionProtection: false
disks:
- autoDelete: true
...
```

### GCEインスタンスのマシンタイプ変更
インスタンスが停止している必要があります。

```sh
$ gcloud compute instances set-machine-type  インスタンス名 --machine-type マシンタイプ（e2-smallなど）
```

### GCEインスタンスにネットワークタグを追加

```sh
$ gcloud compute instances add-tags db(インスタンス名) --tags mysqlserver(タグ名) --zone asia-northeast1-b
```

### プロジェクトの詳細表示
```sh
$ gcloud compute project-info describe --project プロジェクト名
```

### ファイル転送(ローカル -> インスタンス)
```sh
$ gcloud compute scp ローカルファイルパス インスタンス名:転送先ディレクトリパス (--zone ゾーン名)
```

scpコマンドでも可能 (転送先ディレクトリがない場合はエラー)

```sh
$ gcloud compute scp インスタンス名:ファイルパス ローカルパス (--zone ゾーン名)
```

### ディレクトリ転送(ローカル -> インスタンス)
```sh
$ gcloud compute scp --recurse インスタンス名:転送先ディレクトリパス ローカルディレクトリパス
```

scpコマンドでも可能 (転送先ディレクトリがない場合は自動で作成される)

```sh
$ scp -r -i ~/.ssh/path/to/id_rsa ローカルディレクトリパス GCPログインユーザ名@インスタンス外部IP:転送先ディレクトリパス(配下にディレクトリごと格納)
```


### GCEインスタンスにSSH接続
初回は自動でキーペアを生成してくれる。
パスフレーズの入力が必要(省略可)

```sh
$ gcloud compute ssh webserver(インスタンス名)

WARNING: The public SSH key file for gcloud does not exist.
WARNING: The private SSH key file for gcloud does not exist.
WARNING: You do not have an SSH key for gcloud.
WARNING: SSH keygen will be executed to generate a key.
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): <- 任意のパスフレーズを登録
Enter same passphrase again: <- 確認のため再入力
...
Enter passphrase for key '/Users/ホームディレクトリ名/.ssh/google_compute_engine': <- さっき登録したパスフレーズを入力(秘密鍵にアクセス)
...
```


### GCEのファイアウォールルールを作成

```sh
$ gcloud compute firewall-rules create mysql-remote-access(ファイアウォールルール名) \
--allow tcp:3306 \
--source-ranges 150.164.20.10 \ # 接続許可するIPを指定できる(指定しない場合0.0.0.0/0となる)
--source-tags mysqlclient(接続元インスタンスに付与したネットワークタグ名) \ # ローカルマシンなど外部から接続する場合は指定不要
--target-tags mysqlserver(接続先インスタンスに付与したネットワークタグ名)
```

### GCEイのファイアウォールルールを変更

```sh
$ gcloud compute firewall-rules update default-allow-ssh(ファイアウォールルール名) \
--allow tcp:80
```

### 静的IPアドレス一覧を表示

```sh
$ gcloud compute addresses list

NAME  ADDRESS/RANGE  TYPE      PURPOSE  NETWORK  REGION           SUBNET  STATUS
hoge  32.72.200.100  EXTERNAL                    asia-northeast1          IN_USE
fuga  32.72.106.216  EXTERNAL                    asia-northeast1          IN_USE
```

<br>
## $ gcloud app ~
### GAEインスタンスの一覧
```sh
$ gcloud app instances list
```

<br>
## $ gcloud sql ~
### Cloud SQLインスタンスの一覧
```sh
$ gcloud sql instances list
```



<br>
## $ gcloud config ~

### アカウントの切り替え
```sh
$ gcloud config set account アカウントID(Googleアカウント)
```

### プロジェクトの切り替え
```sh
$ gcloud config set project プロジェクトID
```

### リージョン設定
```sh
$ gcloud config set compute/region us-central1
```

### ゾーン設定
```sh
$ gcloud config set compute/zone us-central1-a
```

### configuration一覧を表示
```sh
$ gcloud config configurations list

NAME     IS_ACTIVE  ACCOUNT            PROJECT  COMPUTE_DEFAULT_ZONE  COMPUTE_DEFAULT_REGION
default  True       example@gmail.com  pj-name  asia-northeast1-b     asia-northeast1
```

### configurationをアクティベート
```sh
$ gcloud config configurations あｃちゔぁて コンフィグレーション名
```

### configurationを削除
```sh
$ gcloud config configurations delete コンフィグレーション名
```

$ gcloud config configurations activate nkomiya-pj-komiya

### Cloud ML Engineの設定
ローカルで予測/トレーニングジョブに使用するPythonインタープリタ

```sh
$ gcloud config set ml_engine/local_python $(which python3)
```

### 設定解除
```sh
$ gcloud config unset ml_engine/local_python
```

### プロジェクトのプロパティを表示
```sh
$ gcloud config list

# [compute]
# region = us-central1
# zone = us-central1-a
# [core]
# account = anata_no_address@gmail.com
# disable_usage_reporting = True
# project = anata_no_project_id
# 
# Your active configuration is: [default]
```
```sh
$ gcloud config list project

# [core]
# project = anata_no_project_id
# 
# Your active configuration is: [default]
```
```sh
$ gcloud config list project

# [core]
# project = anata_no_project_id
# 
# Your active configuration is: [default]
```

ログイン中のアカウントリスト

```sh
$ gcloud config list account

# [core]
# account = anata_no_address@gmail.com
# 
# Your active configuration is: [default]
```

## $ gcloud alpha ~
### プロジェクト名の変更
```sh
$ gcloud alpha projects update anatano_pj_id --name=atarashii_pj_name
```

## $ gcloud iam ~
### サービスアカウント作成
**※ サービスアカウントネームとサービスアカウントディスプレイネームに注意**
<img width="1137" alt="スクリーンショット 2020-02-10 0.10.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/f50a8e15-dd4f-f488-846b-c6fdf0d8bf85.png">

```sh
$ gcloud iam service-accounts create サービスアカウントネーム \
                                   --display-name サービスアカウントディスプレイネーム \
                                   --description 　説明文
```

### サービスアカウント削除
```sh
$ gcloud iam service-accounts delete サービスアカウントネーム@プロジェクトID.iam.gserviceaccount.com
```

### サービスアカウントキー作成

```sh
$ gcloud iam service-accounts keys create path/to/キー名.json \
--iam-account サービスアカウントネーム@プロジェクトID.iam.gserviceaccount.com
```

## $ gcloud services ~
### API（サービス）のリストを表示

プロジェクトで利用可能なAPIのリスト

```sh
$ gcloud services list --available
```
プロジェクトで有効になっているAPIのリスト

```sh
$ gcloud services list --enabled
```

### API(サービス)を有効化
```sh
$ gcloud services enable ml.googleapis.com # <- APIネーム
```

### API(サービス)を無効化
```sh
$ gcloud services disable ml.googleapis.com # <- APIネーム
```

## $ gcloud ai-platform ~
https://cloud.google.com/sdk/gcloud/reference/ai-platform/?hl=ja
### ローカルでトレーニング
```sh
$ gcloud ai-platform local train \
  --package-path working \ # トレーニングのファイルが入ったディレクトリのパス
  --module-name working.predict \ # ディレクトリ名.ファイル名(--package-pathを指定していない場合は、ターミナル上のカレントディレクトリから記述。指定した場合はターミナル上のカレントディレクトリ配下から記述。)
  --job-dir local-training-output # プログラム内で利用する場合に使う。
```
**※ モジュールファイル内に記述したsys.path[0]にモジュールファイルのディレクトリではなく、ターミナルのカレントディレクトリが入ってくる。import時にfromのパスに注意**

### トレーニングジョブの送信
```sh
$ gcloud ai-platform jobs submit training $JOB_NAME \
  --package-path working/ \
  --module-name working.predict \
  --region us-central1 \
  --python-version 3.5 \
  --runtime-version 1.13 \
  --job-dir gs://バケット名/ディレクトリ名 \
  --stream-log
```

### モデルリソース作成
```sh
$ gcloud ai-platform models create モデルリソース名 \
  --regions us-central1 \
```

### モデルリソース削除
```sh
$ gcloud ai-platform models delete モデルリソース名 \
```

### バージョンリソース作成
```sh
$ gcloud ai-platform versions create バージョンリソース名 \
--model モデルリソース名 \
--runtime-version 1.14 \
--python-version 3.5 \
--framework xgboost \
--origin gs://バケット名/path/to/dir/ # <- model.pklなどがあるディレクトリ
```

### ローカルで予測
```sh
$ gcloud ai-platform local predict \
--model-dir path/to/local/models/dir/ \
--json-instances path/to/local/jsondir/predict.json \ # <- 予測対象となるインプットデータ
--framework xgboost \
--signature-name model.pkl
```
.pycファイルでエラー吐くのでこうしておくと便利

```sh
$ rm /usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/lib/googlecloudsdk/command_lib/ml_engine/*.pyc && \
gcloud ai-platform local predict \
--model-dir path/to/local/models/dir/ \
--json-instances path/to/local/jsondir/predict.json \
--framework xgboost \
--signature-name model.pkl
```

### ai-platformで予測
```sh
$ gcloud ai-platform predict \
--model モデルリソース名 \
--version バージョンリソース名 \
--json-instances ローカルのjsonパス # <- 予測対象となるインプットデータ
```

## $ gcloud sql ~
### CloudSQL インスタンス作成

```sh
$ gcloud sql instances create anatano-instance-name \
--tier=db-f1-micro \
--region=us-central1 \
--storage-type=HDD

# 数分かかる
# Creating Cloud SQL instance...done.       
# Created [https://sqladmin.googleapis.com/sql/v1beta4/projects/salck-visualization/instances/slash-cmd-api-instance].
# NAME                    DATABASE_VERSION  LOCATION       TIER         PRIMARY_ADDRESS  PRIVATE_ADDRESS  STATUS
# anatano-instance-name   MYSQL_5_7         us-central1-a  db-f1-micro  34.69.9.99       -                RUNNABLE
```

### CloudSQL インスタンスの値を取得

```sh
$ gcloud sql instances describe anatano-instance-name

# backendType: SECOND_GEN
# connectionName: anatano-pj-name:us-central1:anatano-instance-name
# databaseVersion: MYSQL_5_7
# ...
#   storageAutoResize: true
#   storageAutoResizeLimit: '0'
#   tier: db-f1-micro
# state: RUNNABLE
```

### MySQLユーザーのパスワードを設定

```sh
$ gcloud sql users set-password root --host=% --instance [INSTANCE_NAME] --password [PASSWORD]
```


<br>
# gsutilコマンド
[公式リファレンス](https://cloud.google.com/storage/docs/gsutil)
## $ gsutil mb
### バケット作成
```sh
$ gsutil mb -l us-central1 gs://バケット名
```
## $ gsutil rm
### バケット削除
```sh
$ gsutil rm -r gs://バケット名
```

## $ gsutil ls
### バケット内を表示
```sh
$ gsutil ls -la gs://バケット名
```
## $ gsutil cp 
### ファイルのアップロード
gcs上にディレクトリがない場合は作成される。

```sh
$ gsutil cp ローカルファイルのパス gs://バケット名/ディレクトリ名/ファイル名
```

-m オプションで複数ファイルをマルチスレッドで並列アップロード

```sh
$ gsutil -m cp local/path/*.csv gs://バケット名/ディレクトリ名/
```

### ディレクトリのアップロード

```sh
$ gsutil cp -r ローカルディレクトリのパス gs://バケット名/親となるディレクトリ名/
```

### ファイルのダウンロード
```sh
$ gsutil cp gs://バケット名/ディレクトリ名/ファイル名 ローカルファイルのパス
```

### ディレクトリのダウンロード
```sh
$ gsutil cp -r gs://バケット名/ディレクトリ名 親となるローカルディレクトリパス/
```

### ファイルのダウンロード
```sh
$ gsutil cp -r gs://バケット名/ディレクトリ名 親となるローカルディレクトリパス/

or 

$ gsutil cp -r gs://バケット名/ディレクトリ名 ローカルファイルパス
```

### ファイルの削除
```sh
$ gsutil rm -f gs://バケット名/ディレクトリ名/ファイル名
```

### ディレクトリの削除
```sh
$ gsutil rm -ｒ gs://バケット名/ディレクトリ名/
```

### バケット内の全てのオブジェクトを一般公開
```sh
$ gsutil iam ch allUsers:objectViewer gs://バケット名
```

### バケット内の任意のオブジェクトを一般公開
```sh
$ gsutil acl ch -u AllUsers:R gs://BUCKET_NAME/OBJECT_NAME
```

# こんなエラー出たら
`ml_engine/` 配下の.pycファイルを削除
**※パスは環境により変わることがあります(下記はgoogle-cloud-sdkをbrew installしている場合)**

```sh
ERROR: (gcloud.ai-platform.local.predict) RuntimeError: Bad magic number in .pyc file
```
↓

```sh
$ rm /usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/lib/googlecloudsdk/command_lib/ml_engine/*.pyc
```


<br>
# bqコマンド
[公式リファレンス](https://cloud.google.com/bigquery/docs/reference/bq-cli-reference?hl=ja)

## $ bq mk
### データセット作成
```sh
$ bq --location US mk --dataset(-d) プロジェクトID:データセットID
```

## $ bq rm
### データセット削除
```sh
$ bq rm --dataset(-d) プロジェクトID:データセットID
```

### テーブル削除
```sh
$ bq rm --table(-t) データセットID.テーブル名
```

## $ bq ls
### データセットの確認
```sh
$ bq ls
```

### プロジェクトの確認
```sh
$ bq ls -p
```

## $ bq load
### csv読み込み
--autodetect -> 自動でスキーマ設定
データセット名.テーブル名 -> テーブル名はファイル名と同じがよいか？？

```sh
$ bq load \
--autodetect \
--source_format CSV \
データセット名.テーブル名 \
gs://バケット名/path/to/file.csv
```

## bq query
GUIでクエリを発行する際はmaximum bytes billedを設定しておく
-> クエリが制限を超えたバイト数を読み取ると、課金されずにクエリが失敗する
※ limit句は表示を制御するだけなので費用は変わらない
[BigQuery のおすすめの方法: 費用を抑える](https://cloud.google.com/bigquery/docs/best-practices-costs?hl=ja)

### クエリ結果からテーブル作成
デフォルト プロジェクト以外のプロジェクトにあるテーブルにクエリ結果を書き込むには、project_id:dataset.table の形式でプロジェクトIDを先頭に追記

```sh
$ bq query \
--destination_table データセット名.テーブル名 \
--use_legacy_sql=false \
'
SELECT
  *
FROM
  hoge
'
```