■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)
■22/2/26 2:52AM
GCP script
GitHub - GoogleCloudPlatform/professional-services: Common solutions and tools developed by Google Cloud's Professional Services team
■gcloud cmd プロジェクト一覧
gcloud projects list --filter="bangboo OR fucu" --format=jsongcloud projects list --filter="bangboo OR fku" --format=json | grep -oP '(?<="name": ")[^"]*'
■pythonでgcloud cmd, 同期処理の方法(run)と非同期処理の方法(Popen)Pythonからシェルコマンドを実行!subprocessでサブプロセスを実行する方法まとめ | DevelopersIO (classmethod.jp)
--terminalでpython cmd.py python3.7どう?
import json
import subprocess
from subprocess import PIPEp = subprocess.Popen(cmd , shell=True, stdout=subprocess.PIPE)
out, err = p.communicate()
out = json.loads(out)
[Python2.7] subprocess の使い方まとめ - Qiita
python2.7やとちょい違うみたい、pipenvでバージョン管理したい?--terminalでpython cmd.pyimport subprocessfrom subprocess import callcmd = 'gcloud projects list --filter=bangboo --format=json'subprocess.call(cmd, shell=True)
--runでcurl、cmd結果をPIPEで受けたいがimport osimport subprocessfrom subprocess import callfrom flask import Flaskapp = Flask(__name__)
#メソッド省略でGETのみ@app.route("/", methods=["GET","POST"])def hello_world(): name = os.environ.get("NAME", "World") cmd = 'gcloud projects list --filter=bangboo --format=json' output = ' will die' subprocess.call(cmd, shell=True) name = "Hello {}!".format(name) output = name + output return outputif __name__ == "__main__": app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
■pythonでbigqueryPython Client for Google BigQuery — google-cloud-bigquery documentation (googleapis.dev)BigQuery API Client Libraries | Google CloudGoogle クライアントライブラリ for Python で、BigQuery のデータセットやテーブルなどのメタ情報を取得してみた | DevelopersIO (classmethod.jp)
--bq.py python3 bq.py でteminal実施可能from google.cloud import bigqueryclient = bigquery.Client()QUERY = ( 'SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013` ' 'WHERE state = "TX" ' 'LIMIT 100')query_job = client.query(QUERY)rows = query_job.result()for row in rows: print(row.name)
■BigQueryのトランザクション処理Multi-statement transactions | BigQuery | Google Cloud
BigQueryはOLAPのため、同時クエリ発行等で、処理時間差や実行順番等で想定と違う場合が多くトランザクション処理は苦手だがコレを使うとよい、例えば、truncateしてinsertするとconcurrentエラーになる場合等///transactionの注意複数のSQLをセミコロンで区切った上で連結しBEGIN~END;を一括で発行する必要がある(SQL1行毎発行ではダメ)BEGINを複数、BEGIN内でTRANSACTIONを複数だとクエリの順番が入れ替わることがあるので注意 pythontry except else finally(tryはネストOK)とtime.sleepを入れ、挿入して服問い合わせを使い最新以外を削除する妥協策もある 最新1行だけでなく複数行OKで最新を取得するような構成にして
sql_begin = "BEGIN BEGIN TRANSACTION;"sql_history = f"INSERT INTO `{ds.tbl}` (record_date. a, b) values (CURRENT_TIMESTAMP(), 'a', 'b');"sql_commit = "COMMIT TRANSACTION;"sql_end = "END;"sql = sql_begin + sql_history + sql_commit + sql_end
■GCPのシークレットマネージャに重要な値を置き、それを取るfrom google.cloud import secretmanagerclient = secretmanager.SecretManagerServiceClient()res = client.access_secret_version(resource_id)value = res.payload.data.decode("utf-8")GCPのSecret Managerで値を取得しようとしてハマった - Qiita
■GCE(Docker使う版)へSSH後に何をするかsudo apt-get update
DockerインスコInstall Docker Engine on Ubuntu | Docker DocumentationUbuntuにdockerをインストールする - QiitaUbuntu 22.04にdockerをインストールする - Qiita
docker --versionwho 誰がログインしているかsudo gpasswd -a [ユーザ名] docker dockerグループへ追加?
■コードをコンテナ化いったん /home/app_name に置いて上手く行けば /usr/local/bin/app_name に移動すればいいのでは?sudo nano 等でファイルを作る
Dockerfileの作成Dockerfileの書き方, 利用する命令, 作成手順 - わくわくBank (wakuwakubank.com)社内のDockerfileのベストプラクティスを公開します│FORCIA CUBE│フォルシア株式会社RUN adduser -D myuser && chown -R myuser /myapp
(-Dはデフォルト設定で追加している、-Rは指定dir以下を再帰的に所有権変更)USER myuser
(以降のRUNやENTRYPOINT等のINSTRUCTIONを実行するユーザを指定)
(USER nobody ならLINUXユーザで一般ユーザより弱い権限のもの)
Dockerfileをキック、あるいはdocker composeをキックsudo docker build -t img_unco . でカレントのDockerfileをビルド
docker images リストdocker tag [イメージID] img_unco:latest 名前がつかない場合docker rmi [イメージID] 削除docker ps -a コンテナ一覧docker rm [コンテナID] 削除
ビルド後にdocker runが必要docker container run -d --name cnt_unco -v ${pwd}:/app img_unco:latest↓これが便利docker container run -rm --name cnt_unco -v ${pwd}:/app img_unco:latest
オプション-v ${pwd}:/app はOSローカル環境とコンテナ内のディレクトリを同期-p 80:8000 はポート-d はバックグラウンド実行(デタッチ)-rm はrun後にコンテナを自動削除(イメージは残る)
docker composeでpython実行 DockerでPython実行環境を作ってみる - Qiitadocker compose exec コンテナ名 bash でコンテナに入れる
docker container ls コンテナのステータス確認GCEはデフォルトサービスアカウントで動作するがgcloudコマンドはgcloud auth loginが必要等々のサービスアカウントのOauth問題等がある(DockerfileのUSERやRUNでgcloud auth default login等で調整する?)
■GCEセットアップ(Docker使わない版)curl https://sdk.cloud.google.com | bashgcloud init直にOSにSDKをインスコしてもdefault service accoutだとVMスコープの問題が出る 自身のID/SAで権限を付けGCEにログインしgcloud initし操作するsudo apt updatesudo apt install python3-pipsudo apt-get install python3sudo apt install jq
pip3 install --upgrade pip バージョン問題がPythonであるがこれをすると改善する場合ありpip3 install --upgrade google-api-python-clientpip3 install --upgrade google-cloud-loggingpip3 install google-cloud 要る?pip3 install google.cloud.bigquery 要る?pip3 install google.cloud.logging 要る? pipでうまくいかない場合 python3 -m pip install google.clud.bigquery と必要ならPythonを通して入れるべき所に入れるPythonコードで from google.cloud import logging 等を記載
import logging も必要(python標準のロギングでlogging.warning()でGCP loggingに書くため)
pipはpythonモジュール用、サブプロセスのOSでコマンドを打つならaptでインスコちなみにrequirements.txtはpip、pip install -r requirements.txtなお現設定を書き出すには pip freeze > requirements.txt pip3 install jq をしていたが不要で sudo apt install jq でやり直した pip3 list pip3 uninstall jq
gcloud auth application-default login --scopes="https://www.googleapis.com/auth/cloud-platform","https://www.googleapis.com/auth/bigquery","https://www.googleapis.com/auth/drive" コマンド打つならgcloud auth loginでログインする(Oauthスコープエラーになるのでスコープも付ける) BigQueryでGoogleドライブデータへのクエリでエラーが出るときの対処 (zenn.dev)python3 main.py で実行
■Google Cloud における認証・認可Google Cloud における認証・認可の仕組みがこれを見ればおおよそわかる (zenn.dev)
Comment (0)
■21/12/25 5:46PM
リンク踏合組合
シンプルで軽量! 新しいCSSリセット「The New CSS Reset」を作成したElad Shechterにインタビュー | コリス (coliss.com)
【2021年版】おすすめのリセットCSSまとめ!基本と使い方の解説も | Web Design Trends (webdesign-trends.net)
【2021年版】リセットCSSのガイドライン|基礎から使い方を徹底解説 - WEBCAMP MEDIA (web-camp.io)
新しい日本語フォントがたくさんリリースされてる! 2021年、日本語の新作フリーフォントのまとめ | コリス (coliss.com)
2022年用、日本語のフリーフォント573種類のまとめ -商用サイトだけでなく紙や同人誌などの利用も明記 | コリス (coliss.com)
BigQueryにおけるポリシータグを用いた秘密情報管理とデータ連携の仕組み - ZOZO TECH BLOG
【新機能】Google Cloud 純正の構成図ツール Architecture Diagramming Tool が発表されました | DevelopersIO (classmethod.jp)
[B! 技術] とりあえずWebサービス作る時の私の技術選定ポイント (hatena.ne.jp)
----------------
LiveとPushを使用した音楽制作 | Ableton
ABLETON LIVE 特集|サウンドハウス (soundhouse.co.jp)
製品情報:APC40:AKAI professsional (akai-pro.jp)
音楽制作に弾みをつけてくれる無料オンラインツール10選 | LANDR Blog
signal - Online MIDI Editor
最近こういう奴多いよな、なんか命令とか受けとんのか、カミカゼけ
Comment (0)
Navi: < 4 | 5 | 6 | 7 >
-Home
-Column [128]
-Europe [9]
-Gadget [77]
-Web [133]
-Bike [4]
@/// BANGBOO BLOG ///