■gcloud cmd プロジェクト一覧
gcloud projects list --filter="bangboo OR fucu" --format=json
gcloud projects list --filter="bangboo OR fku" --format=json | grep -oP '(?<="name": ")[^"]*'
■pythonでgcloud cmd, 同期処理の方法(run)と非同期処理の方法(Popen)
Pythonからシェルコマンドを実行!subprocessでサブプロセスを実行する方法まとめ | DevelopersIO (classmethod.jp)
■GCPのシークレットマネージャに重要な値を置き、それを取る
■Google Cloud における認証・認可
--terminalでpython cmd.py python3.7どう?
import json
import subprocess
import json
import subprocess
from subprocess import PIPE
p = subprocess.Popen(cmd , shell=True, stdout=subprocess.PIPE)
out, err = p.communicate()
out = json.loads(out)
[Python2.7] subprocess の使い方まとめ - Qiita
out, err = p.communicate()
out = json.loads(out)
[Python2.7] subprocess の使い方まとめ - Qiita
python2.7やとちょい違うみたい、pipenvでバージョン管理したい?
--terminalでpython cmd.py
import subprocess
from subprocess import call
cmd = 'gcloud projects list --filter=bangboo --format=json'
subprocess.call(cmd, shell=True)
--runでcurl、cmd結果をPIPEで受けたいが
import os
import subprocess
from subprocess import call
from flask import Flask
app = Flask(__name__)
#メソッド省略でGETのみ
#メソッド省略で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 output
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))■pythonでbigquery
Google クライアントライブラリ for Python で、BigQuery のデータセットやテーブルなどのメタ情報を取得してみた | DevelopersIO (classmethod.jp)
--bq.py python3 bq.py でteminal実施可能
--bq.py python3 bq.py でteminal実施可能
from google.cloud import bigquery
client = 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エラーになる場合等
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 secretmanager
client = 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インスコ
docker --version
who 誰がログインしているか
sudo gpasswd -a [ユーザ名] docker dockerグループへ追加?
■コードをコンテナ化
いったん /home/app_name に置いて
上手く行けば /usr/local/bin/app_name に移動すればいいのでは?
sudo nano 等でファイルを作る
Dockerfileの作成
RUN adduser -D myuser && chown -R myuser /myapp
(-Dはデフォルト設定で追加している、-Rは指定dir以下を再帰的に所有権変更)
(-Dはデフォルト設定で追加している、-Rは指定dir以下を再帰的に所有権変更)
USER myuser
(以降のRUNやENTRYPOINT等のINSTRUCTIONを実行するユーザを指定)
(USER nobody ならLINUXユーザで一般ユーザより弱い権限のもの)
(以降の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実行環境を作ってみる - Qiita
docker 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 | bash
gcloud init
直にOSにSDKをインスコしてもdefault service accoutだとVMスコープの問題が出る
自身のID/SAで権限を付けGCEにログインしgcloud initし操作する
sudo apt update
sudo apt install python3-pip
sudo apt-get install python3
sudo apt install jq
pip3 install --upgrade pip バージョン問題がPythonであるがこれをすると改善する場合あり
pip3 install --upgrade pip バージョン問題がPythonであるがこれをすると改善する場合あり
pip3 install --upgrade google-api-python-client
pip3 install --upgrade google-cloud-logging
pip3 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に書くため)
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スコープエラーになるのでスコープも付ける)python3 main.py で実行
■Google Cloud における認証・認可