/// BANGBOO BLOG ///

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

February 26, 2022

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=json
gcloud 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 PIPE
p = 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.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の縺?
@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
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エラーになる場合等
///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以臀??を再帰的に所有権藹??更・??
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 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 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に書縺?ため)

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 における認証・鐔??藹??
twitter
Hatena
Google Buzz
newsing
Yahoo!
Buzzurl
Technorati
del.icio.us
Choix
Iza!
Livedoor Clip
Facebook
Evernote
 

Posted by funa : 02:52 AM | Web | Comment (0) | Trackback (0)