gcloudのエラーの記録（障害の切り分け方 "gcloud crashed (AttributeError)" を例に）

**ERROR: gcloud crashed (AttributeError): 'Namespace' object has no attribute 'authorize_session'**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16382/c945144b-ca5f-aa62-bd32-fcf083c26c57.png)

ちょっとした小ネタです。
GCPにファイルをアップロードしようとした際に遭遇したエラーが検索してもヒットしなかったのでQiitaに上げておこうという内容です。
ただ、それだけだと３行くらいで終わってしまうので、エラー遭遇時の調査手順や考え方などを紹介してみます。


## やろうとしたこと
ローカルファイルをGCPにどうやってアップロードしようか悩んでいて、こちらのQiita記事[^1] を読ませていただいて、
「こんな簡単なら出来そう」と軽いノリでやってみたところ、冒頭のエラーが発生しました。

**叩いたコマンドとエラーメッセージ**

```sh
$ gcloud alpha cloud-shell scp localhost:`pwd`/dispatchers.csv cloudshell:~/
Starting your Cloud Shell machine... 
ERROR: gcloud crashed (AttributeError): 'Namespace' object has no attribute 'authorize_session'

If you would like to report this issue, please run the following command:
  gcloud feedback

To check gcloud for common problems, please run the following command:
  gcloud info --run-diagnostics
```
実行したコマンドは参考記事からのコピー＆ペーストでした。
※書き方がまだよく分からなかったので、コピー＆ペーストしたもののこの進め方も良くなかったですね。
　詳細は割愛しますが、パスの書き方を疑って10分ほど時間を潰してしまいました。

それにしても **"gcloud crashed"** って、ちょっとインパクトありますよね。
インストールしたばかりなのにクラッシュしたの？？

### エラーメッセージで検索してみる
はじめましてのメッセージなので、素直に検索してみました。全文は少し長いので要素と思しき部分に区切って検索しています。

* gcloud crashed (AttributeError)
* 'Namespace' object has no attribute
* "Namespace"　"authorize_session"　"object has no attribute"

検索の仕方の良し悪しがありそうですが、それにしてもヒットしなかった場合「メジャーなエラーではなさそう」と判断して、エラーメッセージからの調査は一旦諦めるのもありです。

その場合、他に思い当たることや当てが有ればそれを頼りに調査を進めます。
とくに当てがないという場合は、基礎的な知識が不足しているのかもしれません。
私はまったく当てがありませんでした。

### コマンドリファレンスを読む
```sh
$ gcloud alpha cloud-shell scp localhost:`pwd`/dispatchers.csv cloudshell:~/
```
今回叩きたいコマンドには、不明な要素が２点含まれていました。（コマンド自体の知識、パスの書き方）

正直「alpha・・とは？」という状態なので、仮に動作してしまってもこの理解のままでは不安が残ります。
早くエラーを解消したいとはやる気持ちを一旦脇において、公式リファレンスを読んで基本くらいは抑えておきましょう。
[公式リファレンス：gcloud alpha cloud-shell scp](https://cloud.google.com/sdk/gcloud/reference/alpha/cloud-shell/scp?hl=JA)[^2]

細かいオプションは必要に迫られないとピンと来ないので、流しておいて[EXAMPLESとNOTES](https://cloud.google.com/sdk/gcloud/reference/alpha/cloud-shell/scp?hl=JA#GCLOUD-WIDE-FLAGS)を見ておくとよいでしょう。

```text
NOTES
This command is currently in ALPHA and may change without notice. 
If this command fails with API permission errors despite specifying the right project, 
you may be trying to access an API with an invitation-only early access allowlist. 
These variants are also available:

$ gcloud cloud-shell scp
$ gcloud beta cloud-shell scp
```
なるほど。なんとなく察しはついていても「あー、alpha版なのね」と一度納得すると運用中の安心感が違います。

ちなみにコマンドに **alpha** って明記させるのって**（仮）**みたいなものですよね！？

```sh
# こういうこと？
gcloud （仮） cloud-shell scp ****
```



### エラーが発生する範囲を確認する
さて、公式リファレンスを読んでもエラーの原因究明に役立つ内容はなさそうでした。
こういう時はアレですね。どこまでエラーが出るのか、範囲を確認することでヒントが増えそうです。

#### gcloud 
たとえば、 `gcloud` だけで同じエラーが出る場合 gcloud 関連の一切のコマンドが使えないことになります。
すると当初疑っていたパスの書き方とか、そんな次元ではなくなります。
再インストールするか、実行環境の不具合か、を疑うとよいかと思います。

ただ、今回は直前に `gcloud init` でconfigureを生成したばかりだったので確認済みとしました。
※もし、ある日突然動作しなくなった場合は、試しに `gcloud` だけで検証してみるとよいでしょう。

#### gcloud alpha cloud-shell
alpha は先に確認したとおり「これ仮だから！」とユーザに認識させることが目的なので、cloud-shell まで確認します。
では、`gcloud alpha cloud-shell` でどんなコマンドが発行できるかなのですが、もう一度[リファレンス](https://cloud.google.com/sdk/gcloud/reference/alpha/cloud-shell/scp?hl=JA)を見てみます。

左側に階層が表示されていると思いますが、scpの他に **get-mount-command**, **ssh** があることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16382/25cd0f3a-bcee-5f12-8214-ba083afff7f4.png)

ここでは ssh を使って動作確認をしてみましょう。選んだ規準は「短い」「一般的」の２点です。
もしまた何かエラーが出ても、世間的に使われている方が、需要があるため適切な情報を見つけられる確率が高くなります。
マニアックなものを選んでしまうと、情報が無かったり偏っていたりして、いっそう泥沼にはまることがあります。

#### gcloud alpha cloud-shell ssh
使い方は[「公式リファレンス：gcloud alpha cloud-shell ssh」](https://cloud.google.com/sdk/gcloud/reference/alpha/cloud-shell/ssh?hl=JA)のEXAMPLES がそのまま利用できます。

```sh:
$ gcloud alpha cloud-shell ssh
```

※割愛していますがgcloudを使い始める際は、最初に `gcloud init` を実行しています。
　そこでGoogleアカウントのログインやGCPプロジェクトの選択をしています。

　なので、先のSSHコマンドを発行すると、**事前に指定しておいたアカウントでプロジェクトにsshログインする**
　といったことになります。

コマンドを実行すると、このような「このサーバを信用しますか？」といったダイアログが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16382/0a64561f-dd8f-e007-cb5f-10435e6ccde5.png)
自分で管理しているサーバであることを確認して「はい(Y)」を選択して登録します。

ところで、唐突ですが今回のケースに関しては、これで原因が分かりました。

[scp](https://ja.wikipedia.org/wiki/Secure_copy)は、sshを前提としたコマンド（またはプロトコル）となります。
sshを発行してはじめてホストの信頼が問われたということは、
**ホストを信頼していない状態で SCP を利用しようとしていた** ということになります。

ということは、エラーもそれに起因するものと推測できます。

まぁ、**それならそうと言ってください**という思いはありますが。

#### gcloud alpha cloud-shell ssh（２回目以降）

```sh
$ gcloud alpha cloud-shell ssh
Automatic authentication with GCP CLI tools in Cloud Shell is disabled.
To enable, please rerun command with `--authorize-session` flag.
Starting your Cloud Shell machine...
Waiting for your Cloud Shell machine to start...done.
```
２回目からはこのようなメッセージがさらっと表示されて、別窓に cloud shell が表示されるようになります。

#### gcloud alpha cloud-shell scp （再度）
確認のため、当初実行したかったコマンドを叩いて見ましょう。

```sh
$ gcloud alpha cloud-shell scp localhost:`pwd`/dispatchers.csv cloudshell:~/
`pwd`/dispatchers.csv: No such file or directory

ERROR: (gcloud.alpha.cloud-shell.scp) [C:\Users\HogeFuga\AppData\Local\Google\Cloud SDK\google-cloud-sdk\bin\sdk\pscp.exe] exited with return code [1].
```
また違うエラーが出ましたが、パスが通っていないことが分かるメッセージに変わりました。
ここまで来たらパスの部分を調整していくだけです。

#### 成功する書き方（例）

```sh
gcloud alpha cloud-shell scp localhost:c:/source/dispatchers.csv cloudshell:/home/hoge/dispatchers.csv
dispatchers.csv           | 11090 kB | 5545.5 kB/s | ETA: 00:00:00 | 100%
```
成功すると、このようにファイル名やファイルサイズなどが表示されます。
また、念のためGCPにログインして cloud-shell で ls などを実行してみると、アップロードしたファイルが確認できると思います。

## おわり
なじみの薄いエラーが表示され、検索してもそれらしき情報がヒットしなかったのでQiitaに投稿させていただきました。
が、あらためてエラーメッセージを見てみると

```sh
ERROR: gcloud crashed (AttributeError): 'Namespace' object has no attribute 'authorize_session'
```

「'authorize_session' が無いよ。」と仰ってますね。
Namespace object に囚われてしまった結果、ずいぶん遠回りをしてしまいましたが、
落ち着いてエラーメッセージを紐解くことができたら、この時点で気づけてもよさそうですね。scpだし。

ということでエラーが発生した際に、まず第一にやること。それは、**落ち着くこと** 。これだけは覚えておきましょう。



[^1]: [「ローカルマシン からCloud Shellに接続(ssh, scp, mount)する」](https://qiita.com/flatfisher/items/1d6ffe94787b77e3f2ee)　を参考にさせていただきました。ありがとうございました・・！

[^2]: 蛇足ですが、リファレンスへのリンクは gcloudツールの**[クイックスタート](https://cloud.google.com/sdk/docs/quickstart-windows?hl=JA)**のページ下部にしめされています。