Google Cloud Platform - xyz600/knowledge GitHub Wiki
Functions
サーバーを建てなくても、常時リクエストに答えてくれる環境を作るための便利なもの。
立ち上げる簡単なサンプル
プロジェクトの削除方法
- https://qiita.com/sekitaka_1214/items/e11287b78adf3f468d7f
- 何かサンプル作る時は、プロジェクトごと分けて使うと、プロジェクトごと消滅させられるので楽
インスタンスをプロジェクト間で移動する方法
gcloud のコマンドあれこれ
デフォルトのプロジェクト設定
gcloud config set project ${project-id}
function の deploy
gcloud functions deploy ${function_name} --runtime python37 --trigger-http --allow-unauthenticated
API で instance を起動・停止する
API 利用
POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/zone/instances/example-instance/stop
POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/zone/instances/example-instance/start
を使って、
- myproject
- zone
- example-instance
に相当する部分を書き換えればいい
python library
def restartInstance(auth_http, gce_service):
request = gce_service.instances().start(project="myproject", zone="zone", instance="example-instance")
response = request.execute(auth_http)
print response
-
情報は、functions なら環境変数に埋めればいいかな?
-
参考: https://cloud.google.com/compute/docs/instances/stop-start-instance?hl=ja#api_1
認証周りの情報について
- 背景
- GCP functions で instance を立ち上げるため、↑の rest API にアクセスすれば良い
- GCP functions が適切な認証を受ける必要があって、どの認証を受ければいいかを知りたい
- 認証を受ける方法のユースケース
- https://cloud.google.com/docs/authentication?hl=ja#authentication_strategies
- というわけで「GCP 環境内でサービス アカウントに代わって限定公開データにアクセスする → 環境提供のサービス アカウント」が正しそう
- 注意点
- 上の定義によると、簡単に遊ぶ場合を考えるとローカルのテスト方法とデプロイ先のテスト方法が異なる
- 情報源:下記あたりがよさそう?
firebase による line bot の作成
基本的には、導入記事を見れば ok
注意点
- gcp functions だけど、express を使う例が多い
- 料金形態を Spark から Blaze にしないと、外部リクエストを裁けない
firebase depoly --only functions,hosting
で deploy する時の hosting URL はホストであって endpoint ではない- ${hosting URL}/webhook みたいなのを line に書かないとダメ
404 not found
になるのとngrok
でサーバーを建てると、/webhook
でなく/
にアクセスが来るので気づいた
- gcp functions のログは、標準入出力が普通に表示されるので、printf debug が普通にできることがわかった
- gcp functions ってサーバーレスなのに、なんで express 何だろうなぁと思うなど
- 少し考えたけど、 endpoint を発行する手間が省けていいって話なんだろうか
express を使う意味
- functions って直感的には状態を持たない関数なのに、何で express みたいなものを挟む必要ある?
- line-bot-api の middleware を挟めるから
- 60秒間次のアクセスがあるか否かを待って、アクセスがある間は同一のプロセスを動かして待ってくれているから
- なので、グローバル変素に cache を用意しておくことは意味があるらしい
line-bot-sdk の役割
- line-developers に書いてある json 仕様に従って、post をやってくれること
- json の仕様を見て自分で書いたほうが楽だと思えば、自分で書いても良いかもしれない
関数を複数ファイルに分割する
firebase の DB をいじりたい
- 適当な登録用の endpoint を立てて、自分でフロントエンドを書いて post すればよさそう
XmlHttpRequest で、status code が正常なのになぜか 0 が帰ってくる問題
- どうも、ローカルのファイルから開くと status 0 らしい