ruby スクリプトから BigQuery の external table (google sheet) を SELECT できなくてハマった

Mac で自分の個人アカウントを使って ruby スクリプトの動作確認をしようとしたのだが、BigQuery の external table (google sheet) を SELECT するところで PERMISSION_DENIED が出て一晩ハマった。

「個人アカウントを使って」というのは
gcloud auth application-default login した上で ADC(Application Default Credential)で認証
という意味。

ruby 側で drive の oauth scope は付与しているのに動かない。
service account の鍵を使うと動いた。
具体的には、googleauth の ServiceAccountCredentials を使うやり方だと動いた。

よくよく確認してみると、gcloud auth application-default に --scopes オプションがあったので、

gcloud auth application-default login --scopes=https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/drive

を打ったら動くようになった。

よく分からないが、User Account を使う場合(Authorization Code)は、oauth scope は gcloud auth する際に指定しなければならないっぽい。
逆にこれやっておけば、 ruby 側で drive の scope 指定せずとも動いた。
ちなみに、bqコマンドに drive の scope を許可したい場合は、

gcloud auth login --enable-gdrive-access

とする。

gcp の認証方式についてはこちらの記事が詳しい。 medium.com

前にも同じようなことでハマった気がする...
GCP の認証ムズい...

なお、

gcloud auth application-default login --scopes=https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/accounts.reauth,https://www.googleapis.com/auth/drive

で指定している scope についてだが、
cloud-platform というのは、GCPのフルアクセスっぽい。
とりあえずこれつけとけばGCPAPIに弾かれることはなさそう。
drive というのは Google Drive, sheet, docs 等のAPIにアクセスするための scope 。