gcpug / nouhau

Google Cloud Platformのノウハウを共有するRepository
https://gcpug.jp
MIT License
653 stars 23 forks source link

Cloud SchedulerからCloud SpannerのInsntaceのNodeCountを操作する #94

Open sinmetal opened 5 years ago

sinmetal commented 5 years ago

以下の記事でCloud SchedulerからGCPのAPIを直接操作するというのが出ている。 サンプルとしてはCompute EngineのManaged Instance GroupのSizeを変えている。

https://medium.com/google-cloud/automatic-oauth2-using-cloud-scheduler-and-tasks-to-call-google-apis-55f0a8905baf

Cloud Spannerでもなんとなくやってみようかなという気持ちになったので、やってみた。

NodeCountの変更は https://cloud.google.com/spanner/docs/reference/rest/v1/projects.instances/patch を利用して行うので、 https://developers.google.com/apis-explorer/#search/spanner.instances.update/m/spanner/v1/spanner.projects.instances.patch?name=projects%252Fhoge%252Finstances%252Ffuga&_h=3&resource=%257B%250A++%2522instance%2522%253A+%250A++%257B%250A++++%2522nodeCount%2522%253A+3%250A++%257D%252C%250A++%2522fieldMask%2522%253A+%2522nodeCount%2522%250A%257D& みたいなリクエストを送ることになる。

Cloud Scheduler用のService Accountを作成し、以下のようなコマンドを実行すればいいはず。

gcloud beta scheduler jobs update http migtest  --schedule "5 * * * *" --http-method=PATCH \
  --uri="https://spanner.googleapis.com/v1/projects/hoge/instances/fuga"  --oauth-service-account-email=cloud-scheduler@hoge.iam.gserviceaccount.com    \
  --message-body='{"instance": {"nodeCount": 2},"fieldMask": "nodeCount"}' \
  --headers=Content-Type=application/json \
  --oauth-token-scope=https://www.googleapis.com/auth/cloud-platform

しかし、このコマンドはエラーになる。 エラーは Valid choices are [delete, get, head, post, put]. で、Cloud Scheduler HTTPがPATCHに対応してないので、発生するエラー。 PATCH対応については https://issuetracker.google.com/issues/118662028 でリクエストされている。

なので、とりあえず X-HTTP-Method-Override https://cloud.google.com/apis/docs/http?hl=en#long_request_urls でPATCHに上書きする!

gcloud beta scheduler jobs update http migtest  --schedule "5 * * * *" --http-method=POST \
  --uri="https://spanner.googleapis.com/v1/projects/hoge/instances/fuga"  --oauth-service-account-email=cloud-scheduler@hoge.iam.gserviceaccount.com    \
  --message-body='{"instance": {"nodeCount": 1},"fieldMask": "nodeCount"}' \
  --headers=Content-Type=application/json,X-HTTP-Method-Override=PATCH \
  --oauth-token-scope=https://www.googleapis.com/auth/cloud-platform

これでCloud SchedulerだけでNodeCountを変更できる。 エラーとかのハンドリングが何もできないので、実用的かどうかは何とも言い難い。

以下の内容は @apstndb さんに教えてもらいました!

apstndb commented 5 years ago

これから困る人が増えてきそうだから本家の issue の方にも workaround として書いておきました。 また、あとから見ると参考リンクは HTTP Guidelines よりも System Parameters の方が良さそうだった。 https://cloud.google.com/apis/docs/system-parameters?hl=en#definitions

apstndb commented 5 years ago

上の issue の続きで API は何も禁止なんかしていないことが判明。弾かれるのは gcloud 特有らしい。 https://cloud.google.com/scheduler/docs/reference/rest/v1/projects.locations.jobs?hl=en#httpmethod

sinmetal commented 5 years ago

社内の人が、Deployした後、Cloud SchedulerのGUIのEDITでPATCHに変えるってのをやってて、な・・・なるほど!!!みたいな気持ちになった