/// 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


April 1, 2022 List
GCP Python script on Apr 01, 2022 12:00 AM

April 1, 2022

GCP Python script
Googleがサポートするのは3つ
 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ドキュメント
APIはgithubにコード公開されている
親分はGoogle APIs on guthub

■python gcp Cloud API client libraryは下記のような所からサンプル、仕様を取る
client(bq)
pip install google-cloud-resource-manager
pip install google-cloud-biguery-datatransfer

#Pyton Bigquery
requirements.txt
google-cloud-bigquery==3.3.2
google-cloud-logging==3.2.2
----
from google.cloud import bigquery
import google.cloud.logging
import logging
bq = bigquery.Client()
sql = "select * from `unco`"
results = bq.query(sql)
row_counts = 0
for 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.txt
google-cloud-logging==3.2.2
----
import base64
import json
import google.cloud.logging
import logging
pubsub_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.txt
google-cloud-secret-manager==2.12.6
----
import requests
from google.cloud import secretmanager
import json
def 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| こちら>をクリックしてください)

@ .dockerignore
Dockerfile
README.md
*.pyc
*.pyo
*.pyd
__Pycache__
.pytest_cache

@ Dockerfile
FROM python:3.10-slim
ENV PYTHONUNBUFFERED True
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./
RUN pip install --no-cache-dir -r requirements.txt
RUN pip install Flask gunicorn
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

@ Dockerfile
FROM python:3.10-slim
WORKDIR /app
COPY app /app
RUN pip install -r requirements.txt --proxy=http://proxy:3128
CMD["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のテスト送信ができる

■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 API
https://developers.google.com/docs/api/how-tos/documents?hl=ja#python
https://rimever.hatenablog.com/entry/2019/10/16/060000
スコープ
https://developers.google.com/identity/protocols/oauth2/scopes?hl=ja#docs
google-api-python-client OAuth 2.0
https://googleapis.github.io/google-api-python-client/docs/oauth.html
Oauthライブラリ
https://google-auth.readthedocs.io/en/stable/reference/google.oauth2.credentials.html
https://google-auth-oauthlib.readthedocs.io/en/latest/reference/google_auth_oauthlib.flow.html
https://googleapis.dev/python/google-auth-oauthlib/latest/reference/google_auth_oauthlib.helpers.html
https://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.py
Oauthクライアント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_libraries
WebアプリのOauth認証
https://github.com/googleworkspace/python-samples/blob/main/drive/driveapp/main.py
https://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 InstalledAppFlow
flow = InstalledAppFlow.from_client_secrets_file("credentials.json", SCOPES)
creds flow.run_local_server(port=0)

2) ローカルにおいたSAキー
from google auth import load_credentials_from_file
creds = load_credentials_from_file('credentials.json', SCOPES)[0]

3) Secret mgrにおいたSAキー
import json
from google.oauth2.service_account import Credentials
from google.cloud import secretmanager
client = 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.py
https://googleapis.dev/python/google-auth-oauthlib/latest/reference/google_auth_oauthlib.helpers.html
https://google-auth-oauthlib.readthedocs.io/en/latest/reference/google_auth_oauthlib.flow.html
https://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.html
https://google-auth.readthedocs.io/en/master/reference/google.oauth2.service_account.html#module-google.oauth2.service_account
https://qiita.com/que9/items/38ff57831ea0e435b517


Posted by funa : 12:00 AM | Web | Comment (0) | Trackback (0)


PhotoGallery


TWITTER
Search

Mobile
QR for cellphone  QR for smart phone
For mobile click here
For smart phone click here
Popular Page
#1Web
#2Hiace 200
#3Gadget
#4The beginning of CSSレイアウト
#5Column
#6Web font test
#7Ora Ora Ora Ora Ora
#8Wifi cam
#9みたらし団子
#10Arcade Controller
#11G Suite
#12PC SPEC 2012.8
#13Javascript
#14REMIX DTM DAW - Acid
#15RSS Radio
#16Optimost
#17通話SIM
#18Attachment
#19Summer time blues
#20Enigma
#21Git
#22Warning!! Page Expired.
#23Speaker
#24Darwinian Theory Of Evolution
#25AV首相
#26htaccess mod_rewite
#27/// BANGBOO BLOG /// From 2016-01-01 To 2016-01-31
#28竹書房
#29F☆ck CSS
#30Automobile Inspection
#31No ID
#32Win7 / Win10 Insco
#33Speaker
#34Arcade Controller
#35Agile
#36G Suite
#37Personal Information Privacy Act
#38Europe
#39Warning!! Page Expired.
#40GoogleMap Moblile
#41CSS Selectors
#42MySQL DB Database
#43Ant
#44☆od damnit
#45Teeth Teeth
#46Itinerary with a eurail pass
#47PHP Developer
#48Affiliate
#49/// BANGBOO BLOG /// From 2019-01-01 To 2019-01-31
#50/// BANGBOO BLOG /// From 2019-09-01 To 2019-09-30
#51/// BANGBOO BLOG /// On 2020-03-01
#52/// BANGBOO BLOG /// On 2020-04-01
#53Windows env tips
#54恐慌からの脱出方法
#55MARUTAI
#56A Rainbow Between Clouds‏
#57ER
#58PDF in cellphone with microSD
#59DJ
#60ICOCA
#61Departures
#62Update your home page
#63CSS Grid
#64恐慌からの脱出方法
#65ハチロクカフェ
#66/// BANGBOO BLOG /// On 2016-03-31
#67/// BANGBOO BLOG /// From 2017-02-01 To 2017-02-28
#68/// BANGBOO BLOG /// From 2019-07-01 To 2019-07-31
#69/// BANGBOO BLOG /// From 2019-10-01 To 2019-10-31
#70/// BANGBOO BLOG /// On 2020-01-21
#71Bike
#72Where Hiphop lives!!
#73The team that always wins
#74Tora Tora Tora
#75Blog Ping
#76無料ストレージ
#77jQuery - write less, do more.
#78Adobe Premire6.0 (Guru R.I.P.)
#79PC SPEC 2007.7
#80Google Sitemap
#81Information privacy & antispam law
#82Wifi security camera with solar panel & small battery
#83Hope get back to normal
#84Vice versa
#85ハイエースのメンテ
#86Camoufla
#87α7Ⅱ
#88Jack up Hiace
#89Fucking tire
#90Big D
#914 Pole Plug
#925-year-old shit
#93Emancipation Proclamation
#94Windows env tips
#95Meritocracy
#96Focus zone
#97Raspberry Pi
#98Mind Control
#99Interview
#100Branding Excellent
Category
Recent Entry
Trackback
Comment
Archive
<     April 2022     >
Sun Mon Tue Wed Thi Fri Sat
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
Link