/// BANGBOO BLOG ///
■22/4/17 9:54AM
I drive or test driven
Test-first fundamentalism is like abstinence-only sex ed: An unrealistic, ineffective morality campaign for self-loathing and shaming.
TDD is dead. Long live testing. (DHH)

I need to hire new techniques to help me solve many of my problems during programming: The pain will fade. Farewell TDD, old friend.
RIP TDD from Kent Beck

そもそもテスト駆動開発の最後のところに、自分で考えてやれって書いてんなぁ、やらんでもええしって。そらそーやろ、自分で考えさせろや、やらんと分からんやろやらせろや、終了ーーーー

==============
となりそうだがドリドリについて
Assertするだけ?、何か一部しかテストでけへんの?
 テストをコード化するのはいい
 テストファーストとテストドリブンとユニットテストは違うらしいで
 javascriptとかテストできんの?

ビジネスをソフトウェアでするだけ
 ソフトウェアを捏ねくりまわしたいのではない
  特にコードをビジネス通りに書くといい
  プログラマー的変換するとよくない、ビジネスはビジネスとしてコード
   ゲームとか処理等の描き切りはスペシャルなコードを書けばいい  -実現したいことを箇条書きにする  -プログラムで処理できる内容にまで分解だけする  -コードにする ※実現したいことをそのままコードにする ※言語に左右されない粒度、機能でシンプルに簡易な書き方だけにする

脳に収まるコードの書き方 ―複雑さを避け持続可能にするための経験則とテクニック脳に収まっとんのか?と。大事なのはこっちだろ。プロダクトマネージャーのしごと ―1日目から使える実践ガイド -コミュニケーション -組織力 -リサーチ -実行※企画/予算/収支、UX/デザインの決定
他人が使うソフトウェアなら必要、自分も使うソフトウェアなら不要では
 自分でも使うくらい有用なものであるか
 品質をどこで担保するか、機能だけなのかUXなのか
 スーパープログラマには本質の部分にもっと時間を使って欲しい、死ぬ方が早い
 あんまり機能をリファクターする機会がないかも

++++++++++
ソフトウェア開発アプリケーションを超シンプルにするとリリース回数が多くなる(質とスピードを上げるにはリリース回数)
アプリの分散と並列も可、競争力はオリジナリティ、政治力か真理性か
原体験、初期衝動は、グラスルーツかグルーピーか

==============

変な常識ばかり、旧来のITがWeb業に飲み込まれ使えるようになったが、ITvsWebの何がエッセンスだったかCSは与り知らん
新しい(変化する)事は良いことみたいな感じでやってきたところもあるが、今時変化っつーたら怪しいわな。不要な変化を押し付けられたり、本当に変えるべきところを隠すために変化してたり。コンサバでええかもな

==============

リーダブルコードの要点整理と活用法をまとめた - Qiita
これはいいな
「良いコード」を書くために意識している17のTips まとめ (zenn.dev)
これも
すべての新米フロントエンドエンジニアに読んでほしい50の資料 - Qiita
知らん事結構ある、keep them simpleだが知っておかんとな、下とか
オリジン間リソース共有 (CORS) - HTTP | MDN (mozilla.org)
JSON Web Token(JWT)の紹介とYahoo! JAPANにおけるJWTの活用 - Yahoo! JAPAN Tech Blog
Overview - Chrome Developers

[Click for image]

Comment (0)

■22/4/1 12:00AM
GCP Python script
Googleがサポートするのは3つ1)クライアントライブラリ Python client library  |  Dialogflow ES  |  Google Cloud pip install google-cloud-dialogflow GCPは下記のRESTがベースにあるらしいがコレが楽かと2)REST https://googleapis.github.io/HowToREST URLにAuthベアラーと必要ならJSONを投げてJSONを受け取る URLに法則性があり get とか list なぜかうまく行かないことが多い3)gRPC https://grpc.io/
■サンプルコードのライブラリを検索するとAPIドキュメントは引っかかるAPIドキュメントgoogle.oauth2.credentials module — google-auth 1.30.0 documentationgoogle_auth_oauthlib.flow module — google-auth-oauthlib 0.4.1 documentation↓APIはgithubにコード公開されているGitHub - googleapis/google-auth-library-python-oauthlibGitHub - googleapis/google-auth-library-python: Google Auth Python Library親分はGoogle APIs on guthubGoogle APIs · GitHub
■python gcp Cloud API client libraryは下記のような所からサンプル、仕様を取るclient(bq)Class Client (3.4.0)  |  Python client library  |  Google Cloudpip install google-cloud-resource-managerClass ProjectsClient (1.10.1)  |  Python client library  |  Google Cloudpip install google-cloud-biguery-datatransferClass DataTransferServiceClient (3.11.1)  |  Python client library  |  Google Cloud
#Pyton Bigqueryrequirements.txtgoogle-cloud-bigquery==3.3.2google-cloud-logging==3.2.2----from google.cloud import bigqueryimport google.cloud.loggingimport loggingbq = bigquery.Client()sql = "select * from `unco`"results = bq.query(sql)row_counts = 0for row in results: bq_insert = bigquery.Client() sql_insert = "insert into `benki` (a) values ('" + str(row.size) + "')" logging.warning('### unco.size ' + str(row.size) + ' ###') row_count += 1
#Python pubsubデータ取得(pubsub pushの場合)requirements.txtgoogle-cloud-logging==3.2.2----import base64import jsonimport google.cloud.loggingimport loggingpubsub_data = base64.b64decode(event["data"]).decode("utf-8")logging.warning('### pubsub data ' + str(pubsub_data) + ' ###')json_pubsub_data = json.loads(pubsub_data)
#Python slack送信requirements.txtgoogle-cloud-secret-manager==2.12.6----import requestsfrom google.cloud import secretmanagerimport jsondef slack_post(message): client = secretmanager.SecretManagerServiceClient() resource = "projects/12345678901/secrets/secretkey_xxx/versions/latest" res = client.access_secret_version(name=resource) slack_url = res.payload.data.decode("utf-8") payload = { "text": message, } notify = requests.post(slack_url,data=json.dumps(payload)) if notify.status_code != requests.codes.ok: print("error") else: print("posted at slack url")
slack_post('続きは<http://yahoo.com| こちら>をクリックしてください)

@ .dockerignoreDockerfileREADME.md*.pyc*.pyo*.pyd__Pycache__.pytest_cache
@ DockerfileFROM python:3.10-slimENV PYTHONUNBUFFERED TrueENV APP_HOME /appWORKDIR $APP_HOMECOPY . ./RUN pip install --no-cache-dir -r requirements.txt
RUN pip install Flask gunicornCMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app
@ DockerfileFROM python:3.10-slimWORKDIR /appCOPY app /appRUN pip install -r requirements.txt --proxy=http://proxy:3128CMD["python", "main.py"]
■Slack通知incoming webhookかSlack apiの最低2種類があるSlack apiではts(timestamp)が取得できスレッド返信ができるが、incomingは投稿だけ。incomingは管理画面でURLを取得しそこへPostすることで投稿ができる(URLのみで漏洩すると誰でも投稿できる、どのSlackアプリが投稿しているか分かるのでURLローテすれば良いが)。apiはSlack固定のエンドポイントがありトークンをベアラに入れチャネル名を指定して投稿ができる。管理画面でトークン取得と権限スコープの設定をし、チャネル側でapiアプリの受け入れをintegrations設定するURLあるいはトークンをGCPシクレMGRに入れて、アプリで読みEPへhttp通信するAPIのテスト送信ができるchat.postMessage method | Slack
■Oauth関連
ローカルの場合(VirtualBoxとか) 1) gcloudでログインをしてPython実行するOauthクライアントIDの場合 2) ローカルPythonを実行するとAuthを聞いてくる>ブラウザが立ち上がる>ユーザ認証に変わる 3) WebアプリだとJSでAuthを聞く> 認証するとOauthクライアントIDでなくユーザ認証に変わる設定方法 OauthクライアントIDをOauth同意画面>クレデンシャルで作成 デスクトップアプリは上記②、Webアプリは上記の③でID作成する OauthクライアントIDをファイルかsecret mgrに入れてOauth認証通信をさせる  ②flow = InstalledAppFlow.from_client_secrets_file(credentials, SCOPES)   ③flow = InstalledAppFlow.from_client_config(json.loads(credentials), SCOPES)サービスアカウントの場合 4) Cloud run等のサーバがOauth通信で認証し外部サービスを使う設定方法 SAキーをファイルかsecret mgrに入れてプログラムからOauthで認証させ外部サービスを使う  EPはホスト名+パスだが、target_audienceはホスト名
GCPのOauthについてhttps://www.marketechlabo.com/python-google-auth/
Docs APIhttps://developers.google.com/docs/api/how-tos/documents?hl=ja#pythonhttps://rimever.hatenablog.com/entry/2019/10/16/060000スコープhttps://developers.google.com/identity/protocols/oauth2/scopes?hl=ja#docsgoogle-api-python-client OAuth 2.0https://googleapis.github.io/google-api-python-client/docs/oauth.htmlOauthライブラリhttps://google-auth.readthedocs.io/en/stable/reference/google.oauth2.credentials.htmlhttps://google-auth-oauthlib.readthedocs.io/en/latest/reference/google_auth_oauthlib.flow.htmlhttps://googleapis.dev/python/google-auth-oauthlib/latest/reference/google_auth_oauthlib.helpers.htmlhttps://google-auth-oauthlib.readthedocs.io/en/latest/_modules/google_auth_oauthlib/flow.html#Flow.from_client_config Oathライブラリのソースコードhttps://github.com/googleapis/google-auth-library-python-oauthlib/blob/main/google_auth_oauthlib/helpers.pyOauthクライアントIDの仕様https://github.com/googleapis/google-api-python-client/blob/main/docs/client-secrets.mdサービスアカウントで外部サービスのAPIを使うhttps://www.coppla-note.net/posts/tutorial/google-calendar-api/SAのサービス間認証の仕様https://cloud.google.com/run/docs/authenticating/service-to-service?hl=ja#use_the_authentication_librariesWebアプリのOauth認証https://github.com/googleworkspace/python-samples/blob/main/drive/driveapp/main.pyhttps://stackoverflow.com/questions/10271110/python-oauth2-login-with-google

■Oauthについて下記の少なくとも下記の種類があり、クライアントライブラリやコード等々で違いで使い分ける必要がある。今回はSA+シクレmgrを使用した。-ローカル(gcloud auth login と認証)-OauthクライアントID (アプリ上で認証が個人ユーザに引き継がれる) -デスクトップ -Webアプリ(jsでサイト上)-サービスアカウント -キーファイル -シクレmgr
使用ライブラリーに注意1) OauthクライアントID (ローカルファイル)from google_auth_oauthlib flow import InstalledAppFlowflow = InstalledAppFlow.from_client_secrets_file("credentials.json", SCOPES)creds flow.run_local_server(port=0)
2) ローカルにおいたSAキーfrom google auth import load_credentials_from_filecreds = load_credentials_from_file('credentials.json', SCOPES)[0]
3) Secret mgrにおいたSAキーimport jsonfrom google.oauth2.service_account import Credentialsfrom google.cloud import secretmanagerclient = secretmanager.SecretManagerServiceClient()resource_name = "projects/()/secrets/{}/versions/latest" format(project_num, secret_name)res = client.access_secret_version(name=resource_name)credentials = res.payload.data.decode("utf-8")cred_dict=json.loads(credentials)creds = Credentials.from_service_account_info(cred_dict, scopes=SCOPES)creds.refresh(Request())
※) これは使わないfrom google.oauth2.service_account import IDTokenCredentials#ファイルからcredentials = IDTokenCredentials.from_service_account_file(service_account,target_audience=target_audience)#シクレmgrからcredentials = IDTokenCredentials.from_service_account_info(service_account.target_audience=target_audience)
ライブラリーのソースコード本体や仕様書https://github.com/googleapis/google-auth-library-python-oauthlib/blob/main/google_auth_oauthlib/helpers.pyhttps://googleapis.dev/python/google-auth-oauthlib/latest/reference/google_auth_oauthlib.helpers.htmlhttps://google-auth-oauthlib.readthedocs.io/en/latest/reference/google_auth_oauthlib.flow.htmlhttps://google-auth-oauthlib.readthedocs.io/en/latest/_modules/google_auth_oauthlib/flow.html#Flow.from_client_config
サービスアカウントのライブラリ情報https://google-auth.readthedocs.io/en/master/reference/google.auth.htmlhttps://google-auth.readthedocs.io/en/master/reference/google.oauth2.service_account.html#module-google.oauth2.service_accounthttps://qiita.com/que9/items/38ff57831ea0e435b517



Comment (0)

■22/3/30 7:59PM
GCP runs off functions pubsub on scheduler
run:言語自由、リクエストタイム60分functions:リクエスト9分、関数をデプロイ
  gke auto pilot mode:制限がなくなる
Cloud Run で作るサーバーレス アーキテクチャ 23 連発 - これのときはこう! (zenn.dev)
■RUNhttpリクエストでコンテナを呼び出す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にinvokerLBはバックエンドに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 の有効化  |  Identity-Aware Proxy  |  Google Cloud Cloud runでIAPを使用するIAP用隠れSAの権限:  プリンシパル: service-[PROJECT-NUMBER]@gcp-sa-iap.iam.gserviceaccount.com  ロール: Cloud Run invokerAllUsersでなく、上記のIAP用隠れSAに権限を振ればIAPがrunを起動する
 利用ユーザはIAPでwebuserの権限を与える

===
dockerfileに記載FROM google/cloud-sdk:latest
 PythonモジュールでなくOS側にインストールする必要がありコンテナ化のDockerfileに記載できる
 /// BANGBOO BLOG /// - k8s にDocker記載があるFROM python:3.9-slimENV PYTHONUNBUFFERED TrueENV APP_HOME /appWORKDIR $APP_HOMECOPY . ./#RUN pip install --no-cache-dir -r requirements.txtRUN pip install Flask gunicornCMD 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 gcloudRUN echo $PATHRUN who

Cloud runのpython動作はloggingで見るPython 用 Cloud Logging の設定  |  Google CloudGoogle Cloud Logging Python v3.0.0 スタートガイド | Google Cloud Blog
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でなくできないので単発手動実行用。Cloud Run Jobs を解説する by Kazuu Shinohara | google-cloud-jp (medium.com)クイックスタート: Cloud Run で Python ジョブをビルドして作成する  |  Cloud Run のドキュメント  |  Google Cloud
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.comgcloud 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)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-2Flask @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()で取得できる環境変数の使用  |  Google Cloud Functions に関するドキュメントENTRY_POINT 実行される関数、GCP_PROJECT 現在のGCPプロジェクトIDとか

■pubsub
GCP - Pub/Sub サービス概要 - Qiita
https://www.bangboo.com/cms/blog/page_378.htmltopicという入れ物 メッセージが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 base64pubsubはjsonでデータを持っていてimport json
Comment (0)

Navi: <  7 | 8 | 9 | 10  >
-Home
-Column [128]
-Europe [9]
-Gadget [77]
-Web [133]
-Bike [4]

@/// BANGBOO BLOG ///