/// BANGBOO BLOG ///

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

March 30, 2022

GCP runs off functions pubsub on scheduler
Cloud run:言語自由、リクエストタイム60分
Cloud run functions:リクエスト9分、関数をデプロ繧?
Cloud run jobs: httpが要るがジョブ実行させる
Cloud run worker pools: pubsubやKafkaのようなメッセージキュー縺?pullする(インスタンス数は手動調整・??モニターして自動変更を作りこむとかはアリ・??
  gke auto pilot mode:制限がな縺?なる
Cloud Run で臀??るサーバーレ繧? アーキテクチ繝? 23 連逋? - これのときはこう! (zenn.dev)

■RUN
httpリクエストでコンテナを呼び出す
Google Cloud Run を使うま縺? - Qiita

■繝?ンズオ繝?(run)
クイックスタート: ビルドとデプロ繧?  |  Cloud Run のドキュメント  |  Google Cloud
クイックスタート: Cloud Run 縺? Python サービスをデプロイする  |  Cloud Run のドキュメント  |  Google Cloud
基本縺?Flask縺?http responseを返すコードである必要があるみたいだ
 Scheduler手動 > Pubsub > Eventarc > Cloud runのでキックで藹??行がいい
ローカルやterminalなどで臀??成しcmdでレジストリに入れるが、~/unco で臀??記作成
 Dockerfile
 .dockerignore
 main.py
コンテナイメージにパッケージ化しContainer Registry にアップロード
 gcloud auth application-default login
 gcloud run deploy (対話型でデプロイまでできるが、SAはデフォルトになる)
 gcloud builds submit --tag gcr.io/bangboo-run/unco (ビルドのみ、手動でコンソール縺?SAを指定しデプロイする)
  gcloud builds submit --pack image=gcr.io/bangboo-run/unco ならDockerfile不要らしい
コンソールでデプロイ・??trigger/permission)-譁?ver更新のときTagを付けなおす?
 設藹??allow all trafic縺?Allow unauthenticated invocations、権限allUsers縺?Cloud Run Invokerではブラウザでも上手行縺?
 設藹??allow all trafic縺?require auth(IAM)、権限allAuthenticatedUsers縺?Cloud Run Invokerのとき
  IAMが要るのでターミナルから
  curl https://unco-zp2aehj5rq-an.a.run.app/ で縺?IAM要求の場合は饅??逶?
  curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://unco-zp2aehj5rq-an.a.run.app/ で臀??手行縺?
 設藹??allow internal traffic only縺?require auth(IAM)、権限allAuthenticatedUsers縺?Cloud Run Invokerのとき
  ターミナル縺?internal trafficでないから
  curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://unco-zp2aehj5rq-an.a.run.app/ でも駄逶?
インターナル縺?IAMを使うにはどうする?(同セグメントvpcからcurl bearer、vpc scかpubsubかEventarcだけ、terminalやschdulerは饅??目・??
 →IAMを使うならallow all traficでいいのでは、allusers縺?invokerを付荳?しなければいいし
 →怖ければ同セグメント縺?VMを立ててそこからキック、あるい縺?Scheduler手動 > Pubsub > Eventarc > Cloud runがいい
runのデフォルト縺?SAは別縺?runでも同じSA実行として使い回されるので、別途作成したものを指定したい
 デプロイをコンソールで藹??行するとサービスアカウントを指定できる(run縺?Permissonでそ縺?SA縺?invokerを付ける)
ブラウ繧?+IAMをrunで使うに縺?IAP
 global ip、ドメイン、DNS、証譏?書、設藹??allow all trafic縺?require auth(IAM)、権限各メー繝?id縺?invoker
LBはバックエンド縺?serverless network end groupを選べばいい

/// IAP
(古い方觸??)
IAPを使う場合はトリガーをAllow unauthenticated invocationsにする
 現鐔??だけだそうだが、IAPに全藹??任するために藹??要となっている
 つまりIAP縺?LBが必要なため、Allow internal taraffic and from cloud load balancingとのコンビでトリガー設定をする
権限縺?Cloud run縺?allusersが付き個別縺?invokerは臀??要となり、必要なもの縺?IAP上で臀??荳?をする
 IAP上縺?Web app user縺? Allautheticatedusersを入れると、識別できる誰でも入れてしまう
 アクセスを許可したいユーザのみ個別縺?web app userをIAPで臀??荳?するこ縺?
IAP で臀??護されたリソースへのアクセスの管理  |  Identity-Aware Proxy  |  Google Cloud

(新しい方觸??)
特藹??のユーザだけCloudRunを利用させてたいなら:
 (run)認証ユーザ・??(run)内部トラフィック縺?LB経由・??IAP縺?webuserの設定
 Cloud run縺?IAPを使用するIAP用隠れSAの権限:
  プリンシパ繝?: service-[PROJECT-NUMBER]@gcp-sa-iap.iam.gserviceaccount.com
  ロー繝?: Cloud Run invoker
AllUsersでな縺?、上記縺?IAP用隠れSAに権限を振れ縺?IAPがrunを起動する
 利用ユーザ縺?IAP縺?webuserの権限を荳?える

===
dockerfileに鐔??載
FROM google/cloud-sdk:latest
 Pythonモジュールでな縺?OS側にインストールする必要がありコンテナ化縺?Dockerfileに鐔??載できる
 /// BANGBOO BLOG /// - k8s 縺?Docker記載がある
FROM python:3.9-slim
ENV PYTHONUNBUFFERED True
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./
#RUN pip install --no-cache-dir -r requirements.txt
RUN pip install Flask gunicorn
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

 python requirements.txtで縺? google-cloud-bigqueryはインスコできるがsdkは無理
  main.py縺? from google.cloud import bigquery
  Dockerfileでイメージ縺?google-cloud-sdkが入れ縺?Python縺?subprocess縺?gcloud cmdが打てる
  Dockerのベースイメージを FROM google/cloud-sdk:latest にし縺?
   RUN apt-get update && apt-get install -y \
    python3-pip
   RUN pip install --no-chache-dir -r requirements.txt
  Cloud API client library for pythonを使うに縺?requirements.txt縺?
   google-api-python-client

Dockerfileの動作縺?Cloud build縺?historyで鐔??れる
RUN which gcloud
RUN echo $PATH

OSの藹??行ユーザとコンテナ内のユーザを合繧?せないとファイル読み込み軆??ができない
 permission deniedになる
 Cloud runのそれぞれのユーザが誰なのか分からない(上記で繧?かるが)
 Dockerfile縺? RUN chmod -R 777 /app と入れてしまう

===
Cloud Run のトリガーを作成する  |  Eventarc  |  Google Cloud
run縺?scheduler/pubsubの連携縺? eventarc triggerの設定が良さそう
これ縺?Audit logに既藹??のものが記載されると発火されるというも縺?
 設藹??したrunのサービスのトリガー項目縺?
  google.cloud.scheduler.v1.CloudScheduler.Run.Jobを設藹??(スケジューラ手動実行ならこれでも連携する)
  google.cloud.pubsub.topic.v1.messagePublishedを設藹?? (Pubsub経由縺?EventArcなら)
 色ん縺?API有効が必要 クイックスタート: Pub/Sub メッセージを使用してイベントを藹??信する(Google Cloud CLI)  |  Eventarc
Schedulerとの連携に使う場合、手動実行縺?Audit logに鐔??載され動縺?が、cron定期実行ならAudit logがな縺?動作しない事が分かった
 internal trafficなら Scheduler > Pubsub > Eventarc > Cloud run

■Scheduler
 get で https://run-service-name-.kuso.run.app
 0 7 * * 1 豈?週月曜縺?6時
 Auth header縺? add OIDC token
 runのサービス縺?invokerを付けたSAを指定
 5回リトラ繧?/最大リトラ繧?0sで制限なし/バックオフ最蟆?180s最螟?1h/期間倍5回
  サービスアカウント縺?Cloud service agentロールが必要

===
■Run jobs
runはジョブならFlask不要で簡易。だがEventarc-Schedule連携がまだGAでな縺?できないので単発手動実行用。

Procfile作成
web: python3 main.py

pipしたいもの縺? requirements.txtに書縺?
 バージョンは google-cloud-bigquery · PyPIで調べる
google-cloud-bigquery==3.3.2

main.py作成
コードを書縺? from google.cloud import bigquery

gcloud auth application-default login
 run job実行とコンテナのプロジェクトを合繧?すなら
 gcloud config set project bangboo-runs
 下記は通常臀??要なようだ
 gcloud auth configure-docker

Buildpackを使用してコンテナをビルド
 Cloud buildデフォルトサービスアカウント縺?GCSバケット権限必要 123456@cloudbuild.gserviceaccount.com
gcloud builds submit --pack image=gcr.io/bangboo-runs/run_data_to_bq
 bangboo-runsのコンテナレジストリ縺?run_data_to_bqができている

Cloud runでジョブを作成
gcloud beta run jobs create job-run-data-to-bq \
    --image gcr.io/bangboo-runs/run_data_to_bq \
    --task 1 \
    --set-env-vars SLEEP_MS=10000 \
    --set-env-vars FAIL_RATE=0.5 \
    --max-retries 0 \
    --region asia-northeast1
(gcloud beta run jobs create --helpで鐔??る縺?env-varの繝?ンドルは臀??もないのでコードでエラースローする必要がありそう、そこでスリープとか使ってエラーを吐縺?と、リトライはして縺?れそう。taskを複数にすると同時に臀??個も動く)

ローカルでテスト
docker run --rm -e FAIL_RATE=0.9 -e SLEEP_MS=1000 gcr.io/bangboo-runs/run_data_to_bq

Cloud runでジョブを実行
gcloud beta run jobs execute job-run-data-to-bq

============
from flask import Flask #モジュール読み込縺?
app = Flask(__name__) #Webアプリ臀??成
@app.route("/", methods=["GET","POST"]) #エンドポイント設藹??(ルーティン繧?)
def index():
if __name__ == '__main__': #Webアプリ起動
  app.run(debug=True)

request.form.get('name', None) 隨?2引数にデフォルト値入れられるらしい

■Flask LBでパスを分ける場合
LB
 sub.domain.com /* backend-1
 sub.domain.com /dir/* backend-2
Flask
 @app.route("/dir/index", methods=["GET","POST"])
 ドメインがこの場合:https://sub.domain.com/dir/index
 Flaskには元のルートパスから指定する
●外部ファイル縺?staticフォルダはカスタムルートが必要
 Flaskルートの指定になるの縺?/static/等になりLBで振り分けた場合は都合が悪い
 Cloud runルートからの指定とし縺?/dir/static/style.css等にするにはカスタムルートが必要
Python flask
 from flask import Flask, send_from_directory
 @app.route('/dir/static/<path:filename>')
 def custom_static(filename):
  return send_from_directory('static', filename)
Python flask html
 <link rel="stylesheet" href="{{ url_for('custom_static', filename='style.css') }}">
 トップレベル縺?staticフォルダを作り静的ファイルを入れる
ブラウザ表遉?
 <link rel="stylesheet" type="text/css" href="/dir/static/style index.css">

■Flask jinja2
{# comment #} テンプレートのコメント
Template Designer Documentation — Jinja Documentation (3.1.x) (palletsprojects.com)

============
■functions
コンソールでコード書いてもデプロイエラーになると入力分が消える糞
 テキストで書いてコンソールにペーストしてやった
 開発環藹??はローカルにすべきだろう縺?
 【Python】Cloud Functions ローカル環藹??で開逋? デプロ繧? | のい太ろぐ (noitalog.tokyo)
 Cloud Functionsのローカル開発環藹??縺?Function Frameworkを使用する (rhythm-corp.com)
functionsもhttpで初めに藹??行される関数縺?Flask縺?flask.Requestオブジェクトを藹??藹??る
 PubsubトリガーとかEventarcトリガーもあるようだ
  pubsubトリガーならinetrnal traffic only縺?OKだが、https縺?all traffic必要
requirementsは藹??要?標準ライブラリならimport文を本臀??に書いていれば良い
 pprint.pprintでエラー、requirementsの場合PyPIで調べてバージョンも書こう
一時ファイル縺?/tmpというDIRであるがメモリーに臀??持される
テスト縺?JSONを書縺?場合はキッチリ書く(文字はダブルクォート等)
{
"test" : "aaa"
}
functions invoker等縺?IAMはプロジェクトレベルではな縺?各functionsに対しての設定が必要そう
functionsのデプロイ時縺?internal traffic や allow all trafic等の藹??更ができる
名前の藹??更や連携藹??更縺?functions再作成が必要で面倒

functions で縺? gcloud cmdが打てない、SDKがないから
 クライアントライブラリでは・?? > 非力そう、、cloud runならSDK縺?Dockerしgcloud cmd打てる
 Cloud クライアント ライブラ繝?  |  Cloud APIs  |  Google Cloud

Functionsはデフォルトで環藹??変数を持ってい縺?import os > os.getenv()で藹??得できる
ENTRY_POINT 実行される関数、GCP_PROJECT 現在縺?GCPプロジェクトIDとか

■pubsub
GCP - Pub/Sub サービス觸??要 - Qiita
https://www.bangboo.com/cms/blog/page_378.html
topicという入れ迚?
 メッセージがpublish投入される(コンソールでも作れるの縺?internal trafficのトリガーにできる)
 subscription縺?Topicのデータ藹??得状觸??を管理
 subscriptionからsubscribeでメッセージの藹??得
メッセージは重複する仕様
 Topicにメッセージを入れると勝手に軆??づけられたアプリが動縺?
  フィルターがあり条件を設藹??をできるがTopicを沢山作ればいいので縺?
 サブスク縺?pullはメールボックスみたいな入るだけ
  functions縺?pubsubで臀??った指定縺?Topicにメッセージが入れば動縺?
 サブスク縺?pushも送信メールボックスみたいで送る
  functions縺?httpで臀??ったエンドポイントに送られる
 pullは鐔??に臀??手く行かな縺?なる?pushの方が安定かも
  でもトラフィックの種類縺?pullならinternal traffic OK
   pubsub pull -> functions:pull なら internal traficでもOK
   pubsub push -> functions:push 縺? http なの縺? internal traficダ繝?
 functionsのデプロイ時縺?internal traffic や all等の藹??更もできる
例え縺?Run縺?Trigger縺?EventarcをPubsubで設定すれば指定縺?Topicに勝手にサブスクを作って縺?れる

pubsubを使うとき縺?runとかfunctionsとかインスタン繧?1つの方がいい
 べき等性の觸??成がなければバッチが勝手にリトライされ同時処理が起こる等で面倒
pubsubのリトライ無しで、returnで臀??とかhttp200レスポンスを返す
 pythonだ縺?main()でエラーでもtry-exceptで投げ縺?returnを返す縺?http200になる
 ackを返す時間デフ繧?10sであり処理が長いと饅??目、-600sと長縺?するといい

pubsub縺?base64ででコードするの縺?import base64
pubsub縺?jsonでデータを持ってい縺?import json
twitter
Hatena
Google Buzz
newsing
Yahoo!
Buzzurl
Technorati
del.icio.us
Choix
Iza!
Livedoor Clip
Facebook
Evernote
 

Posted by funa : 07:59 PM | Web | Comment (0) | Trackback (0)