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)
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のでキックで藹??行がいい
■繝?ンズオ繝?(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 にアップロード
コンテナイメージにパッケージ化し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不要らしい
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がいい
→怖ければ同セグメント縺?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
global ip、ドメイン、DNS、証譏?書、設藹??allow all trafic縺?require auth(IAM)、権限各メー繝?id縺?invoker
LBはバックエンド縺?serverless network end groupを選べばいい
/// IAP
(古い方觸??)
/// IAP
(古い方觸??)
IAPを使う場合はトリガーをAllow unauthenticated invocationsにする
現鐔??だけだそうだが、IAPに全藹??任するために藹??要となっている
つまりIAP縺?LBが必要なため、Allow internal taraffic and from cloud load balancingとのコンビでトリガー設定をする
現鐔??だけだそうだが、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で臀??荳?するこ縺?
アクセスを許可したいユーザのみ個別縺?web app userをIAPで臀??荳?するこ縺?
IAP で臀??護されたリソースへのアクセスの管理 | Identity-Aware Proxy | Google Cloud
↓
(新しい方觸??)
特藹??のユーザだけCloudRunを利用させてたいなら:
(run)認証ユーザ・??(run)内部トラフィック縺?LB経由・??IAP縺?webuserの設定
↓
(新しい方觸??)
特藹??のユーザだけ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の権限を荳?える
利用ユーザ縺?IAP縺?webuserの権限を荳?える
===
dockerfileに鐔??載
FROM google/cloud-sdk:latest
Pythonモジュールでな縺?OS側にインストールする必要がありコンテナ化縺?Dockerfileに鐔??載できる
/// BANGBOO BLOG /// - k8s 縺?Docker記載がある
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
RUN who
Cloud run縺?python動作縺?loggingで鐔??る
OSの藹??行ユーザとコンテナ内のユーザを合繧?せないとファイル読み込み軆??ができない
permission deniedになる
Cloud runのそれぞれのユーザが誰なのか分からない(上記で繧?かるが)
Dockerfile縺? RUN chmod -R 777 /app と入れてしまう
===
Cloud Run のトリガーを作成する | Eventarc | Google Cloud
run縺?scheduler/pubsubの連携縺? eventarc triggerの設定が良さそう
これ縺?Audit logに既藹??のものが記載されると発火されるというも縺?
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
■Run jobsgoogle.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ロールが必要
===
サービスアカウント縺?Cloud service agentロールが必要
===
runはジョブならFlask不要で簡易。だがEventarc-Schedule連携がまだGAでな縺?できないので単発手動実行用。
Procfile作成
web: python3 main.py
pipしたいもの縺? requirements.txtに書縺?
バージョンは google-cloud-bigquery · PyPIで調べる
バージョンは 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
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
============■Flask
Flaskへようこそ — Flask Documentation (2.0.x) (msiz07-flask-docs-ja.readthedocs.io)
とほほ縺?Flask入門 - とほほ縺?WWW入門 (tohoho-web.com)
Flaskの基軆?? - 闘うITエンジニアの鐔??え書き (magata.net)
Flaskへようこそ — Flask Documentation (2.0.x) (msiz07-flask-docs-ja.readthedocs.io)
とほほ縺?Flask入門 - とほほ縺?WWW入門 (tohoho-web.com)
Flaskの基軆?? - 闘うITエンジニアの鐔??え書き (magata.net)
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)
============■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)
テキストで書いてコンソールにペーストしてやった
開発環藹??はローカルにすべきだろう縺?
【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必要
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
Cloud クライアント ライブラ繝? | Cloud APIs | Google Cloud
Functionsはデフォルトで環藹??変数を持ってい縺?import os > os.getenv()で藹??得できる
ENTRY_POINT 実行される関数、GCP_PROJECT 現在縺?GCPプロジェクトIDとかtopicという入れ迚?
メッセージがpublish投入される(コンソールでも作れるの縺?internal trafficのトリガーにできる)
subscription縺?Topicのデータ藹??得状觸??を管理
subscriptionからsubscribeでメッセージの藹??得
メッセージは重複する仕様
Topicにメッセージを入れると勝手に軆??づけられたアプリが動縺?
フィルターがあり条件を設藹??をできるがTopicを沢山作ればいいので縺?
サブスク縺?pullはメールボックスみたいな入るだけ
functions縺?pubsubで臀??った指定縺?Topicにメッセージが入れば動縺?
サブスク縺?pushも送信メールボックスみたいで送る
functions縺?httpで臀??ったエンドポイントに送られる
pullは鐔??に臀??手く行かな縺?なる?pushの方が安定かも
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





