■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
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)
■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)
Navi: < 5 | 6 | 7 | 8 >
-Home
-Column [136]
-Europe [9]
-Gadget [79]
-Web [137]
-Bike [4]
@/// BANGBOO BLOG ///

