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のフルアクセスっぽい。
とりあえずこれつけとけばGCPのAPIに弾かれることはなさそう。
drive というのは Google Drive, sheet, docs 等のAPIにアクセスするための scope 。