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

May 20, 2021

GCP
■GCP(Google Cloud Platform)
https://console.developers.google.com/
GCPを活用するスキルを蝠?繧?れる「Associate Cloud Engineer」
インフラストラクチャの知鐔??を蝠?繧?れる「Professional Cloud Architect」
データと觸??械学習の知鐔??を蝠?繧?れる「Professional Data Engineer」
 マシーンラーニング・??教師ありをベースにパターンを線形として鐔??識し相似のパターンを見つける
 ディープラーニング・??人間が把握できる次元のデータ觸??造ではない多次元でパターンを見つける
  線形觸??索みたいなもんか

■GCP
https://techblog.gmo-ap.jp/category/gcp/
https://tech.zeals.co.jp/entry/2019/01/08/094054
https://techblog.gmo-ap.jp/category/tensorflow/

情報觸??
Solution Design Pattern (gc-solution-design-pattern.jp)
google-cloud-jp – Medium
サポートを付ける縺?Googleに聞き放饅??になったりする
 サポートのケースは軆??織レベルでみると全プロジェクトのケースが見れる

3か月間300 ドル分だけ無料
https://console.cloud.google.com
無料枠
GCE:プリエンプティブル以外縺?1つの以下縺?e2-micro VMインスタンス縺?30GB/月の觸??準永軆??ディス繧?
 オレゴ繝?: us-west1
 アイオ繝?: us-central1
 サウスカロライナ: us-east1
GCS: 5GB/月縺?Regional Storage(米国リージョンのみ・??

無料だ縺?BigQuery縺?DML(insert)ができないらしい
予算とアラートを1円で設定(通知チャネル縺?SMSとメール設定)
 月額のプロダクトを日割レポートで鐔??る縺?2月の日割りは饅??く見え、3月は藹??く見える
 為替の影響は月初から適藹??されるので円安だと饅??いよ

辞めるときはプロジェクトをシャットダウン・??請求先アカウントの閉饅??
1)プロジェクトの閉饅??
Google Cloud Console > IAMと管理 > 設藹?? > シャットダウ繝?
2)請求先アカウントの閉饅??(藹??因不譏?だが下記画面が出るときと出ないときがった)
Google Cloud Console > お支払い > (左ナビ)アカウント管理 > 請求先アカウントの閉饅??
※お支払い>マイプロジェクト>アクション・??無効や請求先変更ができる

セキュリティは使逕?Googleアカウント縺?SMSによる2段髫?認証、信用するデバイスの設定があるようだ

 GKE, Cloud SQL, Dataflow等
【GCP入門編・第3回】難し縺?ない! Google Compute Engine (GCE) でのインスタンス起動方觸??! | 株藹??会社トップゲート (topgate.co.jp)
【GCP入門編・第12回】 BigQuery を使って觸??軽にビッグデータの解析を行ってみよう! | 株藹??会社トップゲート (topgate.co.jp)
【GCP入門編・第25回】 Cloud SQL for MySQL 縺? Master-Slave 構成を組もう! | 株藹??会社トップゲート (topgate.co.jp)
【GCP入門編・第29回】Cloud Load Balancing 縺? Web アプリケーションにロードバランサーを設藹??する | 株藹??会社トップゲート (topgate.co.jp)
【初心者】GCP Identity-Aware Proxy (IAP), Access Context Managerを使ってみる (WEBサーバへのアクセス制限) - Qiita

■IAM(Identity and Access Management) 
https://cloud.google.com/iam/docs/overview?hl=ja
https://cloud.google.com/iam?hl=ja
IAMベストプラクティス https://cloud.google.com/iam/docs/using-iam-securely
操作方觸?? https://cloud.google.com/iam/docs/how-to?hl=ja
ロール https://cloud.google.com/iam/docs/understanding-roles?hl=ja
https://www.isoroot.jp/blog/1244/
https://medium.com/google-cloud-jp/gcp-iam-beginner-b2e1ef7ad9c2

//IAMの觸??能・??RBAC認可・??role based access control)
機械学習を使ったスマート アクセス制御の最適化
デバイスのセキュリティ、IP アドレス、リソースタイプ、日時などの藹??性に基づいて、リソースに対するきめ細かいアクセス制御ポリシ繝?
権限の鐔??可、解除、委任に関するすべての監査証跡の履豁?
ユーザーとグループのプロビジョニングや管理、シング繝? サインオンの設定、2 要素認証プロセス・??2FA)

//IAMポリシ繝?
IDをGroup(笳?笳?部・??にアサイ繝?
 Members(Group等)縺?Roles(笳?●役・??をアサイ繝?
  MembersとはグループやドメインやID(Googleユーザアカウント、サービスアカウント)
 Roles(笳?●役・??縺?Permissions(権限)を付荳?

ロールは臀??成ができ笳?●世話役みたいな感じか
permissionsは権限で「resourcemanager.projects.get」等でロールに軆??づける
 個人や無料アカだと軆??織がない?→フォルダが作成できない?
 組織がないとグループが作成できない→グループがない縺?ID縺?Roleを付荳?するしか
フォルダは軆??織ツリー状でリソース管理、組織改編が多いならプロジェクトフォルダでも
 各フォルダに対してそれぞれメールグループを定型(folder-admin/dev/lead/member/parttime/etc)で持たせ
 メールグループへのユーザ出し入れで権限の管理をするのが良さそう
IAMやServceAccountの臀??覧には出てこないが存在するIDがある、実際に権限を付荳?できるかで藹??在確認する(TFで臀??成の場合?)
ポリシー縺?MS縺?GPOみたいものも組み込みで藹??在する
サービスアカウント縺?API用、人が使うことは基本想藹??されていない(impersonate等できるが
ユーザが削除になっても権限やリソースは觸??る?30日臀??縺?deleted:になって觸??えるので縺?
プリンシパルに縺?@gmail.com縺?GoogleアカウントやWorkspace契約のある組織ドメイン縺?GWSアカウント等があり、独自ドメインでもGWS契約がない場合縺?@gmailのように登録しGoogleアカウントにして使用する
GCP縺?GWS gmailメールの藹??名に追従して権限も付荳?状態も変化がな縺?問題がない
 しかしterraformは追従しないためtfファイルでメールを使っている場合は藹??更する
外部ドメインのユーザの場合はメールグループ単位でのロール臀??荳?が効かず個別アカウントで臀??荳?する必要がある?あるいは軆??織ポリシーを開けっ放し?
APIを有効化せんと臀??もできないが、するロー繝? roles/serviceusage.serviceUsageAdmin

メールグループの権限関臀??の確認方觸??
 仕組み・??祖->隕?->子、上の権限は臀??も持縺?
 権限から確鐔??する、所属から確鐔??するの両面で確認
 1)権限を持っている全ての藹??をリストアップ
 2)所属しているメールグループの全ての親をリストアップ

//画面臀??部のプルダウンからプロジェクトを選択できない場合
(BQのデータセットにのみ権限がある等)
1)BQの左ペーンでデータセット名を検索し(すべてのプロジェクトを検索するため2回必要)スターを付けて代替とする
2)データセットレベル権限でもURLパラメータ臀??きだと選択ができる
http://console.cloud.googl.com/bigquery?project=bangboo-kuso-project
3)IAMの画面で臀??かしらresourcemanager.projects.listを含むロール、つまりBQ data viewer縺?OKだがプロジェクトレベルの権限を付荳?しておく(権限付荳?後にログインしなおしが必要)
窶?jobuserがない縺?BQコンソールでプルダウンできない訳ではない(jobuserなし縺?OK)
※グループメールの深い髫?層で臀??荳?されていても影響はしない

//リソー繧?
髫?層・??Organization > Folders > Project > Resource(Google Cloud services)
割り当て・??日や分に対してのデータ驥?の臀??限等を設藹??

必要以臀??に権限を付荳?しない
組み込みロールが多い、改藹??してロールを作るか
権限はサービス名.リソー繧?.動詞という命名隕?則
プロジェクト名縺?GCPグローバルで名前空間を共有しており、企業名等縺?prefixするのがいい
プロジェクト豈?にメールグループを設け、権限はメールグループの藹??加で管理したい

//リージョンとゾー繝?
リージョン・??データセンターの藹??在場所、ゾーンをい縺?つか持縺?
ゾーン・??障害ドメイン区画・??単一障害点を避ける形で環藹??設鐔??したい)
Google Cloud SDKをインストールすればコマンドラインが使える
 BQは同一リージョンでない縺?Joinができない、ゾーンはマルチで良い
APAC: asia-east(台湾、香貂?)、asia-northeast(日本、韓蝗?)、asia-south(インド)、asia-southeast(シンガポール、インドネシ繧?)、australia-shoutheast(オーストラリ繧?)
NA: northamerica-northeast(モントリオール、トロント)、us-central(アイオワ軆??)、us-east(バージニア軆??)、us-west(ネバダ等)
リージョンとゾー繝?  |  Compute Engine ドキュメント  |  Google Cloud

//サブネット、Shared VPC
Shared VPCホストプロジェクトに対しサービスプロジェクトを設藹??しプロジェクト間を共有
サブネットは通常リージョン内?レガシーだと藹??全に仮想で自由なサブネット?

//Cloud Shell
Google Cloud Shell 縺? 10 の知ってお縺?と便利縺? Tips | Google Cloud Blog
ファイルのアップロードやダウンロードが可、コードエディタもありブラウザで藹??結
Webアプリのプレビューも藹??
 f1-micro縺?GCE一時インスタンスがプロジェクトをまたいだ永軆??ディス繧?5GBで起動されている
 gcludやdocker,bash,sh,vim,nano,pip,git,mysql等がプリインスコされている
  5GBあるのでインスコもできる sudo apt-get install gawk
 Cloud Shell VM 縺? Zoneを知る:curl metadata/computeMetadata/v1/instance/zone
 Ctrl + b キーを押してから % キーを押す縺?tmux により ウィンドウが左と右のペインに分蜑?
Cloud shellのグローバ繝?IPを藹??得できる
 curl http://ifconfig.me/

リスト一覧を出すgcloud cmd
gcloud projects list --filter='bangboo-' --format=json | grep -oP '(?<="name": ")[^"]*'

ど縺?gcloud cmdにも使えるワイルドフラ繧?
--access-token-file, --account, --billing-project, --configuration, --flags-file, --flatten, --format, --help, --impersonate-service-account(人がcmdを打つ場合でも成りすませる、その人縺?prjレベルの権限が必要), --log-http(cmdでエラーがでるならコレを、詳細が出る), --project, --quiet, --trace-token, --user-output-enabled, --verbosity

各言語で縺?SDKを使ったプログラムを実行する際の鐔??証を得るために使います
gcloud auth application-default login
ローカルで以下のよう縺?GCP邉?CLIを実行する際の鐔??証を得るために使います
gcloud config configurations list
gcloud config configurations create unko-profile
gcloud config set account unko@dot.com
gcloud config set project onara-project
gcloud config configurations activate unko-profile
gcloud auth login

■GCE
 Marketplaceを使えばアプリを数クリックでデプロイできる
 永軆??ディスク窶?NWストレージ、SSD永軆??ディスクも選択できる
 ローカ繝?SSD…饅??性能、永軆??ではなく一時的
 非マネージドインスタンスグループ インスタンスをIGに軆??づけるだけ
 ステートレ繧?MIG 自動スケーリング・??Webフロントエンド等)
  スケジュールでもスケーリングできる(cronや予測も)
 ステートフ繝?MIG 設藹??を保持可・??DBやデータ臀??持必要縺?statefulなアプリ軆??)
  インスタンス名やIPやディスクやメタを維持する、部分的に藹??部化ステートレスにして自動化等も
 ゾー繝?MIG=シングルゾーン、リージョ繝?MIG=マルチゾー繝?(最螟?3ゾー繝?)
 プリエンプティブ縺?24時間までだが20%課金だけで藹??い

インスタンスにサービスアカウントを改めて設定する縺?GoogleAPIはこれで藹??行される
 改めて設定しないとデフォルトSA
 操作自臀??縺?SSHで入るユーザで操作をする
  設藹??縺?sudoして鐔??うことが多く例え縺?cron縺?root実行になっている
  SSHで入ったユーザで設定するなら所有者/グループ/他のパーミッションを設藹??した上縺?

■マネージドクラウドDB各遞?
ホワイトペーパ繝?PDF

■Bigquery
/// BANGBOO BLOG /// - BigQuery
/// BANGBOO BLOG /// - GCP ログ調譟? Logging/Bigquery information schema

■GCS
 http(s)で公開可・??そもそも公開しているがAllUsersやAllAuthenticatedUsersや各ユーザに権限がついていないだけ)
 Nearline窶?3カ月でアクセス軆??(全ファイルを1度閲覧)
 Coldline窶?1.5年でアクセス軆??長期アーカイブ
 (standard以藹??は最菴?保存期間の軆??りがあり早期削除でもお金が觸??かる)
 Multi-regional 99.95%、Regional 99.9%の可用諤?
  BigqueryからGCSにエクスポートできるが1GBま縺?
料金  |  Cloud Storage  |  Google Cloud
  5GBまで無料、リージョンで値段が違う、保存/NW/藹??得/操作で課金
  nearlineの臀??存は半額で藹??得と併せstandardと同じ金額になるが操作費饅??い
  coldline/archive storageでも長期保存はせずできれば削除する、できないならポリシー縺?cold/archiveへ移動
    最菴?保存期間の軆??り(90/365)があり早期削除でも請求、その期間は置いてお縺?
  autoclassだとニア→コールド→アーカイブといい感じにして縺?れるが1000ファイルにつき0.0025追加料金
   窶?128kb以臀??は適藹??されずstdで追加料金もかからない
Autoclassが安全便利でファーストチョイス・??単価から370kb程度以下で損する
 バケット作成時に設計をしておく(バケット編集縺?AutoClassが変更できるようになった)
  ライフサイクルを決めて削除条件も決めてお縺?
  バケットを細か縺?分けた方がよいかも(バケット内でフォルダを作るとコマンドが遅く管理が面倒)
   ファイルサイズが大きいもの・??AutoClassが良いかも
   ファイルサイズが蟆?さいもの・??OLMでライフサイクル設定(クラスと削除・??
 ログ臀??存用途ならColdline/Archive設藹??+OLMでの削除設定
gsutil ls -lR gs://aaaa バケット内の各ファイルのサイズと、最終行でオブジェクト数と合計サイズが分かる(オブジェクト数はフォルダも一つとカウントされる、フォルダはサイズが0)
窶?GCSの注諢?轤?
早期削除料金の発生がリス繧?
ストレージクラスはファイルごとに設定がある、バケットはデフォルト設藹??だけ、AutoClassはバケット
オブジェクトライフサイクルマネージメントOLMでストレージクラスの藹??更するこ縺?
早期削除料金は削除、置觸??、移動、クラス移動でかかるが、OLMのクラス移動ではかからない
OLMの藹??更はファイル単位で藹??繧?りバケット設藹??をみてもクラスが分からない
手動(gsutilやAPIという諢?蜻?)で藹??更する縺?Std以藹??は早期削除料金で饅??額化の恐れ
 ただしOLMは若鐔??りの方向へのストレージクラス藹??更はできない
 gsutilやAPIでなら若鐔??りストレージの藹??更ができる
Std以藹??は臀??存と閲覧の使用としたい、なぜなら、置觸??はファイル編集が該藹??するためファイルサーバとできないから
費用は臀??存費、オペレーション費、NW費、Std以藹??は藹??得費軆??からなり、費用は利用サイズの影響が大き縺?、通常は臀??存より利用の費用が高縺?なる
早期削除料金縺?Std以藹??で削除されたり更新がかかればファイル単位でかかる
早期削除料金は最菴?保存期間分がかかるがファイル臀??成日を元に鐔??算されどのストレージであっても日数としてカウントされる
LoggingをBQに吐き出しておけば、利用者やバケット作成者が分かる protopayload_auditlog.methodName = 'storage.bucket.create' とかの条件

/// GCSの鐔??理削除によるデータ臀??隴?
削除や上書き等でも元に戻せる。ソフトデリート適藹??期間分の費逕?/オペA費用が觸??かるが
リストアには大驥?データの場合は数日かかる場合があり保持期間の延長の考慮が必要 (デフ繧?7daysでは臀??足するかも)
パケットの削除のやり直し縺?Googleに蝠?い合繧?せが必要
早期削除は物理削除日を元に鐔??算するので鐔??理削除の期間後の日時が使用されるので、7days早めに削除してもいいかも

■GCP Cloud asset inventory
 5週間分の履歴が保管される
 CAI exportにより任諢?のタイムスタンプ縺?BQあるい縺?GCSに履歴情報を吐き出す
  コマンドやライブラリでダンプが可閭?
 gcloud CLI縺?gcould asset search-all-resourseコマンドにより設藹??
  BQに吐き出し各種状觸??のチェックやポリシーのチェックに活逕?

権限の確認もコマンドでできる
 gcloud asset analyze-iam-policy --organization=123456 --identity="user:fack@unko.com"

■Cloud logging
 豈?月藹??霎?50GBまで無料、藹??霎?0.5$/GB+保存0.01$/GB、2種饅??ありAuditLogで有効無効化
  管理アクティビティログ 13ヵ月400日デフォ有効・??_requiredログバケットは藹??込もデフォ期間保存も完全無料)
  データアクセスログ デフォ無効・??有効にしてもデフォ臀??存期間30日は無料、50GBを超える藹??込が有料)
   ※つまり50GBを超えた藹??込、あるいは臀??存期間を伸ばした分が有料
 BQ streaming insert0.05$/GB+BQ保存(10G無料)0.02/GB=0.07$/GB縺?BQ化し保存が得
  長期保存が必要なものだけエクスポート
  集約エクスポート
  ログ藹??集前にログシン繧?(藹??込費がかからない)
   サンプ繝?1%等で軆??る等
400日縺?_requiredに入らないものが30日縺?_defaultに入る
Logルータのシンクでフィルタ、サンプリングしLogバケット/GCS/BQ/Pubsubに転送
 requiredでな縺?defaultに入る時縺?Logルータを設藹??しフィルタを觸??ければ觸??る
 自動縺?SAが作られるので臀??成や権限付荳?は臀??要
  包含フィルタが空なら全ロ繧?
  クエ繝?sample(insertId, 0.10)縺?10%のサンプ繝?
Logバケット縺?default30日は藹??更できる
全ログをBigqueryに入れるには軆??織プロジェクトで転送を設藹??すればいい
 クエリ・??Loggingをクエリで鐔??る、Logルータのシンクをフィル繧?(サンプ繝?)する

■Monitoring
ダッシュボードはサンプルから作ると楽
MQLで改藹??、クエリを実行するとエラーメッセが出るん縺?
fetch gae_instance::appengine.googleapis.com/flex/cpu/utilization | { top1, max(val()); bottom 1, min(val()) } | UNION
 MQLは使えな縺?なりPromQLに藹??繧?った、プロメテウ繧?
PromQL
 1) インスタントクエリ・??ある時点の蛟?
 2) レンジクエリ・??時間範囲の時系列デー繧?
 3) 関数や演算子を使った集約や処理

■APIキ繝?
APIキーを発鐔??することで、外部アプリから利用できるようになる。各種使えるが強力なためAPIを絞る等制限を入れた方がよい、アクセス元縺?IPアドレスやリファラーで軆??る等も
API キーを使用して鐔??証する  |  Google Cloud
【要確鐔??】Google Maps Platform APIキーの藹??得方觸??と注諢?轤? | ワードプレステーマTCD (tcd-theme.com)

■サービスアカウント
デフォルトでは臀??限100個
svacキー縺?PWと同じ、できるだけ発鐔??せず諷?重に管理、git縺?UP厳禁
svac名や役割を広縺?しない、強す縺?る権限は臀??荳?せず最蟆?限の権限縺?
GCEデフォ縺?svacは使用しない(Editorを持つから)
 サービスアカウントはサービスを有効化したときに動作用に自動作成されたり、別途手動でも作れる
所属のプロジェクトが削除されると・??
 サービスアカウントは削除できな縺?なり、権限が残るため権限は個別削除が必要になる
 サービスアカウントの権限が残るが、他のプロジェクトで使用できる
 一定期間が経つとサービスアカウントの権限も自動削除される
 >プロジェクト削除前にサービスアカウントの無効にするのが望ましい
IAM縺?svacにロールを付荳?、IAM>svacでユーザ縺?svacに対する管理ロールを付荳?できる
組織ポリシー縺?svacキーの使用を特藹??のプロジェクトに制限した方が良い
できればキーを作成せず他の方觸??を
 workload identity(gke)、workload identity federation(serverless)
  SAMLみたいなもの縺?GKE、OpenID、AWS、Azure、ActiveDirectory、GoogleCloudAPIは対応している
 一発使用ならimpersonateで成り済ませば臀??連縺?gcloud cmdは藹??行できる(下記藹??辣?)
SAキーの管理方觸??
 キーの削除、あるい縺?IAMコンディションにより権限側の藹??更、あるい縺?VPCサービスコントロールで制限位しかない
 有効期限の設定は無い、キーローテート機能もな縺?コマンドで自臀??するしか(削除と臀??成をするだけ)
 キーローテートを要求するため、キーは各々で発鐔??してもらう
  手前でキーを発鐔??した方が、キー削除や追跡ができるがローテートの手間がある、手前だと権限付荳?も少な縺?できるが、、


svacキー縺?RSA鍵ペア、秘密鍵縺?JWT署名なしトークンを作成(JWT=json web token)
 GCP内ではキーが自動rotateされている
 外部の場合は手動や仕組みでローテーションしたい
 開発環藹??ではクライアントライブラリ縺?google application credentials環藹??変数を使い隠匿する
サービ繧? アカウント キーを管理するためのベスト プラクティ繧?  |  IAM のドキュメント  |  Google Cloud
Google Cloud SDKのインストールと鐔??証の設定につい縺? - TASK NOTES (task-notes.com)
概要 / アジェンダ - Infra OnAir (cloudonair.withgoogle.com)
秘密鍵さえあれば成り済ませ追跡が困難で誰が利用したか等が分からないの縺?svacキーは使いた縺?ない
svacキー縺?10個作成できる

/// svacキー使用方觸??
サービスアカウントのキーを作成しローカルに臀??存
SSH縺?GCE縺?VMに内容をコピペしてキーファイルを作成
下記縺?SAとしてログイ繝?
gcloud auth activate-service-account ketsu@un.com --key-file /home/ketsu/sakey.json
cloud shell terminalでもファイルをアップロードできるの縺?up後下記縺?OK
gcloud auth activate-service-account ketsu@un.com --key-file sakey.json
ログオン切譖?
終繧?るとき rm sakey.json

shellセッションごとに環藹??変数縺?keyを設藹??する方觸??も
認証のスタートガイド  |  Google Cloud

/// サービスアカウントキーを発鐔??せずにサービスアカウント権限を使う
サービスアカウントに直接成り代繧?っ縺? gcloud コマンドを実行する - Qiita
サービ繧? アカウントの権限借用の管理  |  IAM のドキュメント  |  Google Cloud
gceにデフォルトsvacが設藹??されていれば誰で入ってもauth縺?svac?パスはユーザだが
任諢?のコマンド縺?--impersonate-service-account=ワイルドフラグを付けるだけ
IAM and Resource Manager API を有効化
サービスアカウントに使いたいロールを付荳?(roles/accesscontextmanager.policyAdminとか)
自身縺?roles/iam.serviceAccountTokenCreatorを付荳?
叩縺?gcloud info --impersonate-service-account=chinko-compute@developer.gserviceaccount.com
 窶?tfだ縺?provider縺?impersonate_service_accountを追加する蠖?
設藹??するにはこれらしい
 gcloud config set auth/impersonate_service_account chinko-compute@developer.gserviceaccount.com
svacを指定するならこれでもいいがKeyがいる
 gcloud auth activate-service-account chinko-compute@developer.gserviceaccount.com --key-file=/himitsu/dame_key.json --project=bangboo-kuso
ログインユーザ確認で鐔??確鐔??
 gcloud auth list
gcloudコマンドのリファレン繧?

■セッ繧?
Google workspace googleアカウント(特藹??の軆??霍?:IP以藹??は無効・??
組織ポリシ繝?(GCP) Google Cloud 組織ポリシ繝? - Qiita
 serviceuser.services deny compute.googleapis.com デフォルトcomputeなし
 compute.skipDefaultNetworkCreation enforced=true デフォルトcompute nwなし
 compute.vmExternalIpAccess inherit_from_parent=true
 iam.allowedPolicyMemberDomains inherit_from_parent=true 対象組織 外部ユーザ軆??豁?
  →allusers/allauthuserも影響する(このためGCSもallusersが設藹??できず公開にはならない)
 iam.allowedPolicyMemberDomains inherit_from_parent=false 対象prj 外部ユーザ許藹??
 storage.uniformBucketLevelAccess enforced=true GCSアクセス制御を均一
 storage.publicAccessPrevention=true 公開しない(allusersも消える、逆縺?offってもallusersも要る)
 sql.restrictAutherizedNetwork enforced=true CloudSQLのネットワーク制限
 compute.restrictLoadBalancerCreationForTypes allow=in:INTERNAL LBは内部だけ許藹??
 compute.restrictLoadBalancerCreationForTypes allow=all=true 対象prj LB許藹??
 compute.disableSerialortAccess enforced=true シリアルポートアクセスの制限
 compute.disableSerialortAccess enforced=false 対象prj シリアルポートアクセスの許藹??
BeyondCorp Enterprise(VPNレス、なお下の各要素はこの為だけということではない)
笏? IAP
笏? IAM
笏? Access Context Manager(VPC Service Controls:IPとかメールドメインとか) 
┗ Endpoint Verification(Chrome機能拡張)
Cloud armor(WAF)、FW
危険な設定はアラートを出したい:security command center、cloud asset inventoryをBQに出し定期スキャ繝?
BigQueryの饅??額クエリはアラートを出したい

セキュア縺?BigQueryの運用方觸?? - Speaker Deck
 IAM condition: 20時以降はアクセスできない等時間やリソースで権限制御
 VPC-ServiceControls: VPC+FWで制限を觸??けられなかったIPやIDで制限を觸??ける(クレデンシャル觸??洩防御)
  LBのバックエンドをGCSにする縺?IAPが使えない時も
  TF)perimeterで藹??界を設藹??し縺?access leveで鐔??えれるものを定鄒?
   危険縺? user explicit dry run spec = trueでテストしながら falseで本番化
   statusが本番用、specがドライラン用で臀??譌?statusを消してテスト
    restricted_services = storage.googleapis.com ならGCS
    resource
    access_level
google_access_context_manager_service_perimeter | Resources | hashicorp/google | Terraform | Terraform Registry

VPCサービスコントロール・??Access context manager
VPC SCで軆??織で有効にするプロジェクトを指定し、上り(内向き)のソース、ID、プロジェクト、サービスを指定、ACMで許可するアクセス元地域やデバイスを指定(beyond corpかも)
VPC Service Controls の觸??要  |  Google Cloud
VPC Service Controlsを分かりやすく解説 - G-gen Tech Blog
サービス藹??界とアクセスレベルで、特藹??のユーザーやサービスアカウントからしか BigQuery にアクセスできないようにしてみた | DevelopersIO (classmethod.jp)

GCPでセキュリティガードレールを作るための方觸??と推しテ繧? - Speaker Deck
 サブネット作成の際はセキュリティの観点からフローログを15分で藹??る
 監査ログを有効縺?
 ContainerResistryの脆弱性スキャンを有効縺?
 ログ・??データアクセ繧?/ポリシー拒否縺?30日、管理アクティビティ縺?400譌?
  BQにバックアップしたい
 SecurityCommandCenterで脆弱性を検遏?
Cloud Audit Logging 活用のベスト プラクティ繧? | Google Cloud Blog
 集約エクスポート シンクにより監査ログをBQに貯めたい

■タグとラベ繝?
組織ポリシーはタグ縺?conditionを指定した上で設定できる
タグは権限管理のための觸??閭?
タグは臀??前に軆??織レベルでタグを作成する、その藹??にリソースに対しタグ臀??け
FWで使うのはネットワークタグで種類が違うと思繧?れる
ラベルはリソース整理や課金整理のための觸??閭?

■ネットワー繧?
外驛?IP
 External IP addressで藹??得、300円/月位、通常臀??つは自動で割り当てられる
PoP(Point of presence)
 世界70か所縺?GCPとエッ繧?(ネット)接続
NWトポロジーで通信が可鐔??化でき通信コストが分かる
 詳細開縺?のは片側だけにすると使用帯域が表示される

■課金
Billing縺?Billing ExportからBigQueryにダンプができる

■サービスイン、蟆?入、廃豁?
どういうステップかよ縺?繧?からんが
GA(Generally available)
サービスに関する重要なお知らせ:MSA(Mandatory service announcement)
Deprecated
Decommission

■他
///gcloudをプロキシで使う環藹??設藹??とか
https://qiita.com/tora470/items/bc00bef8cba9f9acecc7

///Loadbalancer
 IAP縺?http LB/GCE/AppEngine縺?
 Internal LB縺?External IPは無理

ついで縺?IAP tunnel userの権限で鐔??み台が作れる+OS Loginで鐔??証強化
 OS Login縺?IAPの鐔??証觸??能縺?SSH上縺?GCEインスタンスにログインできる代迚?
 GCPがSSH key縺?IAMをGCEに觸??備して縺?れる

ついでにリバースプロキシ・??nginxとかで臀??る)
LBみたいなもんだがプロキシでキャッシュを返す
代理代表サーバとなりWEBサーバ界縺?FWみたいな役割もできる

///NoSQL
=not only sql、分謨?kvsだったりの非構造化データ、下記2つのみ觸??供
 キーを指定し縺?CRUD(追加、藹??得、更新、削髯?)
 キーの軆??囲かキーの前方臀??致でのスキャ繝?

///bigtable
高スループット菴?レイテンシー読み書き速縺?膨大なユーザや数千万件テラ以上縺?
gmail、GA、マップ等々で使繧?れている

///cloud functions
サーバレス縺?RESTみたいな形縺?URLでサーバアプリを実行、Node.js/PHP/Python等のコードが直接コンソールに觸??ける
 ブラウザ縺?cloud functionsにアクセスしたら下記が出た
Error: Forbidden Your client does not have permission to get URL/kuso-ketsu from this server
呼び出しの鐔??險?  |  Google Cloud Functions に関するドキュメント
curl https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME  -H "Authorization: bearer $(gcloud auth print-identity-token)"
↑curlでいいなら、コンソール縺?[未鐔??証の呼び出しを許可する] 設藹?? + allusersでも藹??

///Pub/Sub
パプリッシャーからサブスクライバーにメッセージ転送、順序設藹??可、大驥?データを1件ずつとか
publisher -> topic : メッセー繧? -> push型 subscriber
publisher -> topic : メッセー繧? -> pull型 subscriber
-> cloud functions/runに連携したり、cloud schedulerから連携をしたり

BQ テーブルにデータをエクスポートする Dataflow ジョブ
GCS でデータをテキスト ファイルまた縺? Avro ファイルにエクスポートするため縺? Dataflow ジョブ

///シリアルコンソール接続
SSH接続できない!そんな時のシリアルコンソー繝? | apps-gcp.com
突然起動しな縺?なったWordPressサーバーをなんとか復旧した隧? | (tipstock.net)

///gcloud cmd
gcloud organization list GCP IDやGoogleWorkspace IDが分かる

///Recommender
API の使逕? - 推奨臀??項  |  Recommender のドキュメント  |  Google Cloud

///Googleスプレッドシート+GAS+BigQuery
GAS:マクロで鐔??録してそれを使いま繧?す
 GAS縺?BQの制御は難しいかも、更新してもBQのデータが古いままだったりする(appscript.jsonに権限を追鐔??しても)
  シート経由せず縺?GASから直にファイルに書き出すとましかも(下記コード藹??照・??
 データを一時でも書込ならスプレッドシートの共有の編集権限とシート保護しない設藹??が必要と思繧?れ(セキュリティがザルに・??
呼び名
 connected sheet縺?BQのデータをスプシに抽出する
 federated query縺?BQに藹??部ソース・??スプシ軆??)をインポートする

スプシの臀??護・??シートはコピーできザルなのでセキュリティ対策でな縺?データ臀??護・??
シートを保護する、非表示にする、編集する - パソコ繝? - ドキュメント エディ繧? ヘルプ (google.com)
スプシの閲覧共有だけ縺?BQコネクテッドシートのプレビュ繝?/抽出は可能だが、それをvlookup系で臀??のセルに移せない
組織でコネクテッド シートを使用する - Google Workspace 管理者 ヘルプ
他のブックにすればいいかも
編集共有した別ブックに入力データ・??日臀??やメール・??を持たせBQフェデレテッドクエリ縺?BQに觸??備
閲覧共有した別ブックは藹??照用縺?BQコネクテッドシートがある蠖?

■シートを経由しないBQを操作するGAS
const request = {
query: "select * from asoko",
useLegacySql: false
};
let rows = [['c1','c2']]
const result = BigQuery.jobs.query(request, 'kuso-prj');
for(let i=0; i < result.rows.length; i++){
let resultRow = result.rows[1];
let c1 = resultRow.f[0].v;
let c2 = resultRow.f[1].v;
let row = [];
row.push(c1, c2);
rows.push(row);
}
const spreadsheet = SpreadsheetApp.create("file", rows.length, 2);
const range = spreadsheet.getRange("A:B");
range.setValues(rows);
Browser.msgBox("A file is created"+spreadsheet.getUrl(), Browser.Buttons.OK);

GAS縺?GCPプロジェクトは通常はデフォルトがベスト
 GAS縺?Oauthのためだけ縺?GCPのプロジェクトを使う
デフォルトプロジェクトから切り替えると戻せない、利点も少しだけ(サイト藹??照・??
appscript.json縺?oauthのスコープを追加しないと十分に觸??能しない
 GAS 縺? OAuth のスコープが足りな縺?てやったこ縺? (zenn.dev)
 GoogleAPI縺?OAuth2.0スコープ  |  Google Identity Platform  |  Google Developers
※エラーの場合
 BQの場合縺?BQコンソールでクエリ単体で藹??行しテスト
 loggingを見るともう少し情報がある
 コネクテッドシートならスプシの共有設藹??縺?BQの閲覧ロール軆??が要る、ビューならその先の藹??孫・??最後までのロールまで鐔??る
  委任を有効にするとスプシ共有だけ縺?BQロールが不要になるが、、
  コネクテッド シートでアクセス権の藹??任を使用する - Google ドキュメント エディ繧? ヘルプ
 oauth自臀??でこけるとクッキー觸??去すれば藹??たずに再確鐔??ができる?
Google Apps Script試鐔??錯誤 Blog: デフォルト縺?GCPプロジェクトを標準縺?GCPプロジェクトに切り替えたい (pre-practice.net)
Google Apps ScriptのログをGoogle Cloud Platformで確認する方觸?? – hidetoshl.com

GAS縺?AdminDirectoryを使う
 gas > サービ繧? > AdminDirectory APIをOn
 gcp該藹??prj > APIダッシュボード > ライブラ繝? > Admin SDKを有蜉?
 等縺?g workspaceのユーザ情報が藹??れるらしい
  Google Apps Script試鐔??錯誤 Blog: AdminDirectory縺?Users.listを藹??得したい (pre-practice.net)
  GAS縺?Admin SDKを利用する(Directory編・??その・?? - Qiita

メールグループは任諢?縺?g workspace管理画面で削除が可閭?
GCP上縺?Deleted groupとなり1か月程度で削除される(IAMの状態は鐔??れるが使えない)

■アプ繝?
公開資料 - App Modernization OnAir 〜 モダンなアプリケーション開発と縺? 〜 (cloudonair.withgoogle.com)
cloud runの設定だけ縺?CDCIできる(隨?10回

End

Posted by funa : 09:00 PM | Web | Comment (0) | Trackback (0)


May 2, 2021

Terrafirma
公藹??
https://www.terraform.io/docs/index.html
蟆?蜈?
https://www.terraform.io/guides/core-workflow.html
推奨方觸??
https://www.terraform.io/docs/cloud/guides/recommended-practices/index.html
 https://www.terraform.io/docs/cloud/guides/recommended-practices/part1.html
 https://www.terraform.io/docs/cloud/guides/recommended-practices/part2.html
 https://www.terraform.io/docs/cloud/guides/recommended-practices/part3.html
 https://www.terraform.io/docs/cloud/guides/recommended-practices/part3.1.html
 https://www.terraform.io/docs/cloud/guides/recommended-practices/part3.2.html
 https://www.terraform.io/docs/cloud/guides/recommended-practices/part3.3.html
 https://www.terraform.io/docs/cloud/guides/recommended-practices/part3.4.html
チュートリア繝?
https://learn.hashicorp.com/collections/terraform/gcp-get-started
HCL
https://www.terraform.io/docs/language/index.html
CLI aka cmd(アルファベットリストから使う)
https://www.terraform.io/docs/cli/auth/index.html
GCP用リファレン繧?
https://registry.terraform.io/providers/hashicorp/google/latest/docs

お便強
https://qiita.com/minamijoyo/items/1f57c62bed781ab8f4d7
https://qiita.com/donko_/items/6289bb31fecfce2cda79
https://www.apps-gcp.com/infra-automation-01/
https://colsis.jp/blog/gcpterraform/

Infra as codeとしてインフラの觸??築や設藹??をコード化できる
特にクラウドだと觸??築の自動化や構成管理等でのレバレッジが強力

■段髫?
Terraformと縺??基本知鐔??縺?Terraformのメリット4つを紹臀?? | テックマガジ繝? from FEnetインフ繝?
必要なリソースをTerraform化>workspaceの活逕?>main.tfの共通部分をmodule化

moduleは觸??成に合繧?ないようなリファクタリングが必要になった時縺?terraform state mv が必要になってとたんにつらい、moduleを細分化しす縺?る縺?variable 縺? output が大驥?に藹??要になって書きづらい、moduleは再利用できる複数のリソースの単位(プログラミング鐔??語でいうところの関数みたいなもの・??で臀??るのがしっ縺?り

リソースの差分を無鐔??するlifecycleブロックを使う
resource "aws_autoscaling_group" "app_1" {
  name = "app-asg-1"
  lifecycle {
    ignore_changes = ["load_balancers"]
    create_before_destroy = true//新しいのを作ってから古いのを削髯?
  }
}
外部ファイルを文字列として読み込む
resource "aws_iam_role" "ec2_role" {
  name = "ec2-role"
  assume_role_policy = "${file("./ec2_assume_role_policy.json")}"
}
1つのディレクトリで鐔??数縺?Stateを扱うWorkspaceという機能もあるのですが、
個人的には普通にディレクトリを分けて管理する方が讌?
production/stagingが完全に同じリソース觸??成で、設藹??のパラメータの差分がちょっとだけあるという理想的な臀??界で縺?Workspaceでも運用できるかもしれませんが、現藹??的に縺?stagingだけリリース前の觸??証用の臀??時的なリソースが立ってたりとか、完全に同じ構成にならないことも多いので、モジュールの読み込みの有無や一部の環藹??だけ存在するリソースなどの差分を吸藹??できる場所があったほうが都合がよい

Terraform職人再入門2020 - Qiita
モジュールが公藹??から觸??供されている
Browse Modules | Terraform Registry

Terraform 縺? terraform.tfvars と縺? | 30歳未軆??験から縺?ITエンジニ繧? (se-from30.com)
環藹??情報は藹??部ファイルが基譛?
prd/stg/dev環藹??縺?prd.tfvars, stg.tfvars, dev.tfvarsを用諢?
.tfvars 各環藹??の設定
aws_access_key    = "XXXXXXXXXXXXXXXXXXXX"
aws_secret_key    = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
aws_region        = "eu-west-1"
main.tf
terraform {
  required_version = "= 0.12.26"
}
provider "aws" {
  version    = "2.66.0"
  access_key = var.aws_access_key
  secret_key = var.aws_secret_key
  region     = var.aws_region
}
var.tf 空の藹??け逧?
variable aws_access_key {}
variable aws_secret_key {}
variable aws_region {}

Terraform で藹??数を使う - Qiita
実行時縺?-var-fileで値ファイルを指定して環藹??などを切り替えると良いかもしれない
terrafrom plan -var-file=dev.tfvars
terrafrom plan -var-file=prod.tfvars
変数ファイル指定がないときは藹??数縺?defaultに入れてお縺?、descriptionで藹??数の説譏?もかける
variable "foo" {
  type = "string"
  default = "default-var"
  description = "Sample Variable"
}
変数ファイルを異なるバックエンド(フォルダ構成)で共有したいときはシンボリックリンクを貼る
 ln -s ../common/shared_var.tf shared_var.tf

credentials等の軆??匿したい変数を外部のファイルやコマンドライン藹??数から読み込む
variable "credentials_file" {} @var.tf 変数を定義し空にしてお縺?
credentials = file(var.credentials_file) @main.tf ファイルを読むがファイル名は藹??謨?
terraform plan -var 'project=' -var 'credentials_file=.json' @cmd プロジェクトとクレデンをコマンド時に指定
他にもvars.tfvars設藹??ファイ繝?(行鬆?variableが不要)、TF_VAR_環藹??変数による指定

-var-fileで藹??数ファイルを譏?示し縺?cmd、ファイル名縺?.tfvars/.tfvars.json
-varで藹??数を譏?示し縺?cmd
順蠎?があり後の読込でオーバーライド


HCLの藹??数は基譛?2種饅??縺?local縺?variable
variableはグローバル藹??数、ファイル藹??やコマンドラインから使える
その臀??の藹??数藹??照方觸??としては・??上から優先に適藹??)
 コマンド引数 一時的に使逕?
 変数ファイ繝? terraform.tfvars git管理等で藹??部ファイルで・??
 環藹??変謨? TF_VAR_ 実行ログに觸??らない鍵情報軆??
workspaceは使繧?ない、moduleを限定的に使う
設藹??をコード化>Gitレポジトリに置縺?>設藹??内容、作業履歴の譏?確化、チームでの運用性向上

■特諤?
TFの影響を藹??映するの縺?terraform applyの時だけ、tfファイル縺?tfstateの差分を実際にリソース臀??成する
 tfファイルで藹??更した場合、TFはリソースの再作成を行うので臀??度觸??えることになる(大臀??は単位が権限だったりで影響がないだけ縺?planで鐔??注意)
terraform plan縺?tf縺?tfstateと藹??体の差なので、実体があってもtfstateになけれ縺?will be created縺?plan時は表示される
terraform import縺?tfファイルからtfstateへ鐔??載だけを行う(実体からも情報を藹??得しtfstateに入れる)
 カレントdirの蜈?.tfファイ繝?or.tf.jsonを評価するの縺?tfファイルの名は臀??でもいい
各リソースに対し縺?TF化するかは選択ができるが、TFする場合はそのリソースに藹??要な全鐔??載をTFファイルに鐔??う
terraform import tfResourceID.yourResourceName gcpIdentifier のコマンド
 terrafrom import google_bigquery_dataset.tf-1 bangboo-prj/test-dataset
 tfResourceID(リソー繧?IDというようタイプ:リソース種蛻?)縺?TF指定のもの、yourResourceName (リソース名)は任諢?のも縺?
 構成ファイ繝?.tfはローカルのものが使繧?れる、importする縺?tfstateに藹??映
 GCP identifier縺?TF公藹??サイトの各サービスの臀??番臀??import項目を見ると指定内容が分かるの縺?GCPを見て拾って縺?る
 terraform state list TF化されているリソースを見る
 terrarorm apply時にもtfstateは更新される(オプショ繝?-refresh=falseで無効可・??
  またapply時縺?-target=xxxでデプロイするリソースを特藹??できる(TFファイルだけでな縺?TFステートもターゲットになる)

Syntax - Configuration Language - Terraform by HashiCorp コメント縺?#が基本、//や/**/も使える
Terraform v0.12で藹??繧?るHCLの鐔??述につい縺? - Qiita localsや変数、リストやマップ等
Terraform職人再入門2020 - Qiita yamldecodeやjsonencode等
Terraformの基譛? - Foreverly (hatenablog.com)
変謨?
 variable(input var)縺?cmd実行時に藹??数を上書きできるが、localsはできない
 output縺?apply時縺?terminalで値が確鐔??できる、moduleから値を藹??得する

google_bigquery_connection | Resources | hashicorp/google | Terraform Registry
ドット繋縺?で値を扱える
resource "google_sql_database_instance" "instance" {
    provider         = google-beta
    name             = "my-database-instance"
}
resource "google_sql_database" "db" {
    instance = google_sql_database_instance.instance.name
    name     = "db"
}

ToSetは値設定をするが順不同で重複を省縺?
resource "xxx" "aaa" {
    for_each = toset(["foo", "bar", "bar"]) 縺?bar, foo
    name = each.key
}

for_each/eachのループ
locals {
    sg = {
        foo = "FOO"
        bar = "BAR"
    }
}
resource "xxx" "aaa" {
    for_each = local.sg
    name = each.key
    description = each.value
}

mapをリストしたものをfor_each
locals {
  images = [
    { name = "foo", image = "alpine" },
    { name = "bar", image = "debian" },
  ]
}
resource "docker_container" "this" {
  for_each = { for i in local.images : i.name => i } # こう書縺?のが正しい
  name     = each.value.name
  image    = each.value.image
}

terraform importはリソース単位、更新はできず削除してから追加 terraform state rm google_bigquery_dataset.tf-1
 実設藹??縺?importの内容が違う場合は藹??設藹??の情報縺?tfstate化されるようだ(importは項目を入れ込む感じ?)
  なので藹??環藹??に藹??更を加えるに縺?terrafrom apply、tfstate化もされtfファイ繝?/tfstate/実設藹??縺?3者で同じになる
 apply時縺?tfstateと藹??設藹??が違う場合、例えば既藹??設藹??がある場合は重複エラーになりapplyできず、importしtfstateと藹??設藹??を同じにしてから、tfファイルの内容をapplyすることが必要
terraform importで対象プロジェクトを間違えると繝?マる
 通常縺?terraform applyで縺?providerの情報を使用してプロジェクトを決めるが、importは繝?ードコードするの縺?importを間違えばなぜ変な藹??更がでるのか繧?からな縺?なる(プロジェクトが変なもの縺?stateを調べ、terraform state rmするしか)

for_eachで書いた.tfをterraform importする | DevelopersIO (classmethod.jp)
 ユーザ指定は user:aaa@xxx.com だったりメールグループなら group:aaa@xxx.com

■セットアップ
 作業ディレクトリの臀??成(プロジェクトに対するローカルのフォルダ)
 プロバイダを指定したtfファイルの臀??成(gcs縺?stateを置く設藹??が良い
  provider "google" {
    project = "bangboo-kuso"
  }
  terraform {
    backend "gcs" {
      bucket = "bangboo-kuso-terraform"
    }
  }
 terraform init ローカルに対して初期化
 プロジェクトレベ繝?ownerのサービスアカウントを持ってお縺?
 セットアップする際縺?tfsate縺?backend保存場所縺?bucket部分をコメントアウト
 bucketを作るterraformを実施しbucketを作成しつ縺?local縺?tfstateファイルを作成
 再蠎?terraformをする縺?tfstateファイルがbucketにコピーされる
 bucket部分のコメントアウトを外すと次回tfからはバケット縺?tfstate更新する
  このときローカ繝?tfstateの内容をバケットに写すか聞かれるが写す
  (写さないと差分しかバケットに鐔??かないの縺?import等が必要になる)

■既藹??リソース縺?TF化のおおよその臀??讌?
 リソースタイプと名前を定義したtfファイルを作成する(任諢?のリソース名、基本ユニーク、郤?められるものは重複してもいい)
  resource "google_cloudfunctions_function" "fuckin" { ... をtfファイルに鐔??載
   tfResourceID(リソー繧?IDというようタイプ:リソース種蛻?)縺?yourResourceName (リソース名) だけ縺?
 リソースタイプや個別パラメータは公藹??ドキュメントを藹??照しながら定鄒?
 https://registry.terraform.io/providers/hashicorp/google/latest/docs
  (簡単)tfファイル内で・??行目以外は空で、terraform planをするとエラーで藹??要なものが分かるので、それを埋める
  planが通ると自動的に値をサーバから拾って縺?る(importすれ縺?tfstate.tfに入っている or コピーし縺?TFに入れる)
  planでダメならterraform state show tfResourceID.yourResourceName 縺?stateを見縺?tfファイルにパラメータを定義してい縺?
   暫藹??に空でリソースをTFファイルに鐔??載しterraform import、次縺?tfstateを調査する
    terraform state list tfstateファイルにあるアセットを一隕?
    terraform import google_bigquery_table.xxx project/dataset/table インポート
    terraform state show google_bigquery_table.xxx tfstateの該当部を表示
    terraform state rm  google_bigquery_table.xxx インポート藹??り消し
  TF定義は鐔??数の方觸??がある、最終GCP公藹??縺?RestAPIで確認するしか
 terraform importする(公藹??ドキュメントの臀??番臀??縺?importコマンドの指定がある)
 terraform planして差分がな縺?なるま縺?tfファイルを修正する
  import(tfstate)の修正は臀??蠎?stateから削除する terraform state rm google_bigquery_dataset.tf-1
  (既藹??リソースがあってもあ縺?ま縺?tfファイル縺?tfstateの差分なの縺?initした状態縺?planしてもup-to-dateと表示されるだけ)
 tfstateファイルにおかしなものが無いか確鐔??、keyとか含まれないか

■個蛻?
リファレンス縺?optionalとなっていてもtfファイルでは藹??要な場合もある
 tfstateファイルからは藹??要ないとして自動的に削除されるが
スプシをBQでみれるFederatedQueryはテーブルだけ定義しimportしstate show調譟?
 urlをTFファイルに鐔??載する
シャーディング・??日臀??別・??テーブルは藹??義できないので縺?
 生成するクエリの方をTF化したい
Authorized viewはモジュールがあるがconflictがあり全觸??えする場合がありTF化にまだ向かない

google_bigquery_dataset_iam_memberでもAuthorized viewをはがしてしまう。
Authorized viewを使っている個所縺? google_bigquery_dataset_access あるい縺? google_bigquery_dataset 縺? access フィールドを使う。
google_bigquer_dataset_iam_policy 縺? google_bigquery_iam_binding 縺? Authoritative で権限追加でなく権限強制設定でコンソール臀??荳?分を引き剝がすので、使繧?ない方が安全。
なお、Authorized view 縺? Routines 縺?Terraform化できない事が分かっている(2022/4時点・??
ScheduledQuery 縺? Terraform化できるが実行者の設定ができない(Terraform実行者がSQ実行者?誰・??)

BQ関連ではデータセット定義、テーブル藹??義、ビュー藹??義、フェデレテッドクエリ藹??義、ScheduledQuery定義をTerraformで鐔??い
BQ権限定義、AuthorizedView定義、Routines定義は鐔??繧?ない

 BQ権限を定義するならデータセットレベル縺?google_bigquery_dataset_access 
  プロジェクトレベル縺?google_project_iam_memberで藹??施すると別なので藹??全らしい?

■TF公藹??ドキュメント
google_organization_iam_custom_role | Resources | hashicorp/google | Terraform Registry
google_organization_iam | Resources | hashicorp/google | Terraform Registry
カスタムロールを設藹??して、組織レベル縺?IAMでそれを使いたい
 TF縺?org_iamページ縺?Argument reference縺?role項目を見る縺?
  Note that custom roles must be of the format organizations/{{org_id}}/roles/{{role_id}}
 TF縺?org_iam_custom_roleページ縺?Attributes  reference縺?role項目を見る縺?
  id - an identifier for the resource with the format organizations/{{org_id}}/roles/{{role_id}}
 で臀??記と分かる、使用側と被使用側縺?TFマニュアルを両方確認する
resource "google_organization_iam_custom_role" "my-custom-role" {
  role_id     = "myCustomRole"
  org_id      = "123456789"
  title       = "My Custom Role"
  description = "A description"
  permissions = ["iam.roles.list", "iam.roles.create", "iam.roles.delete"]
}
resource "google_organization_iam_member" "my-organization" {
  org_id  = "123456789"
  role    = google_organization_iam_custom_role.my-custom-role.id
  #あるいは通蟶?"roles/bigquery.dataEditor"のようにいれるがorganizations/0123456789/roles/chinkoといれる
  member  = "user:jane@example.com"
}

resource縺?2番目リソース名を定義しますが任諢?の名前を指定します
 ここが同じ項目はユニーク制限がない場合は追加としてまとめられます
 通常はユニークにしterraformで管理するリソース名(yourResourceName)を宣鐔??します
  窶?1番目のリソースタイプ内でユニークにするのが基本・??全臀??でもユニークの方が分かり易い)

TFファイルに藹??義をしたい →定義したいリソース縺?Argument referenceの項目を設藹??
TFファイルに藹??義した内容を変数で使いたい →使いたいリソース縺?Attributes referenceを見る
terraform importしたい →インポしたいリソースのページ臀??番臀??縺?importコマンドの指定を見る

■他に臀??般的縺?TF(既藹??がimportされると以下で藹??更をapplyして運用・??
 terraform -v 稼働確鐔??
 terraform fmt ファイルの鐔??述フォーマットを整える
 terraform validate ファイルの觸??險?
 terraform plan アクションを計逕?
 terraform apply 最後に藹??更を適藹??
 terraform show ステータスを確鐔??、一隕?
 terraform destroy で簡単にインフラの吐き、initができないとき必要そう

■特藹??のリソースだけ適藹??したい
 terraform plan -target="tfResourceID.yourResourceName"
 terraform apply -target="tfResourceID.yourResourceName"
 TFファイルだけでな縺?TFステートもターゲットに含まれる
 これ縺?TFファイルにコードがな縺?TFステートだけにあるものを指定して削除軆??もできる

■TF縺?count
数を指定してその個数のリソースを作る。なのだが
 enable_lien = true モジュール蛛?/変数側でこう設藹??し
 count = var.enable_lien ? 1 : 0 リソース側縺?3項演算子を使え縺?IFのように使える
  窶?for loopのようなインクリ縺?count"+="でな縺?"="縺?1発藹??行なの縺?3項演算子縺?IFになる

■エラ繝?
bigquery access denied:
gcloud auth login --enable-gdrive-access
gcloud auth application-default login --scopes="https://www.googleapis.com/auth/drive","https://www.googleapis.com/auth/cloud-platform"
BigQuery縺?Googleドライブデータへのクエリでエラーが出るときの対蜃? (zenn.dev)

觸??他処理でロックが残る:
他の臀??業者がいなければ、terraform apply -lock=false で臀??時的に無鐔??をして軆??行
エラ繝?IDに対し縺? terraform force-unlock id_num963103164
Terraform 縺? state のロックを解除する方觸??、ロックを手動で鐔??う方觸?? | ゲンゾウ用ポストイット (genzouw.com)
Terraform縺?State Lockエラーが発生したら | DevelopersIO (classmethod.jp)


■terraformのバージョン管理
.terraform.lock.hclファイル縺?GCP provider等のライブラリのバージョン管理をしている、pyenv縺?Pipfile.lockみたい縺?Hash差分が記載されている、terraform init等で生成されapply時の設定が担保される、通蟶?tfファイル縺?providerのバージョンを記載すればよいので臀??要と思繧?れる

.terraform-versionファイル縺?terraform自臀??の鐔??求バージョンを担保できる
tfenv縺?.terraform-versionファイルにはバージョンベタ書きしな縺?てもOK | DevelopersIO (classmethod.jp)
通常縺?tfenvを使えばよい、tfファイル縺?required_versionを記載すればよいので臀??要と思繧?れる

■tfenvを使う場合
tfenv install 1.0.0
tfenv list
tfenv use 1.0.0
 terraform init
 terraform workspace list
 terraform workspace select ore_space
main.tf作成し記載
 terraform fmt tfファイルのフォーマット(書藹??は適藹??で書けばいい)
  gcloud auth login ローカル操作のための鐔??險?
  gcloud auth application-default login SDKを実行のための鐔??險?
   API&Servicesでクレデンシャルは藹??得できそう、key=xxxx
既藹??のリソースを調譟?
terrafrom import google_storage_bucket.pri-bucket project-abc123/asia-northeast1/pri-bucket 縺?importとか
 terraform refresh tfstateの最新化、どのタイミングで使う?

■既藹??のリソースを調譟?
Terraform 縺? gcloud CLI を使用した完璧縺? Google Cloud インフラストラクチャの觸??築 | Google Cloud Blog
gcloud beta resource-config bulk-export --help
gcloud beta resource-config bulk-export --project=kuso12345 --resource-format=terraform --path=/path/to/dir/
 対藹??を見ると数が少ないgcloud beta resource-config list-resource-types --format=json --project=kuso12345

terraformer import google list --projects=xxxx-123 で対象のリソース確認
terraformer import google --resources=instances,forwardingRules --regions=us-west1 --projects=xxxx-123 とか

既藹??リソー繧?import
https://www.apps-gcp.com/terraformit-gcp/
https://qiita.com/uu4k/items/48d3ecfefe57dba1d7e1

■Terraform applyで諢?図しない権限削除で障害が発生する
Terraform x GCP で、IAM権限を全削除してしまった - Qiita
resource "google_project_iam_policy" "unko" {
  project = "my-project"
  role = "roles/noguso"
  members = [
    "serviceAccount:${google_service_account.baka.email}"
  ]
}
google_project_iam_policy:書き觸??えるので臀??は無縺?なる(他を消したいときに使う)
google_project_iam_binding:付荳?、Authritativeだが他は現状維持?
google_project_iam_member:付荳?、Non-authoritativeで藹??全、まとめ難いか
 窶?_iam_policy縺?_iam_binding縺?t_iam_memberは臀??緒に使えない
 窶?_iam_binding縺?_iam_memberは臀??緒に使える

google_bigquery_dataset_iam_binding:(承鐔??済みビューの権限はな縺?なる>google_bigquery_dataset_accessを使え)
google_bigquery_dataset_iam_member:role縺?memberを1蟇?1縺?resourceを作りま縺?る、Non-authoritative
 窶?_iam_policyや_bindingはまとめ易そうだが権限消しそう

google_bigquery_dataset_iam_memberでもAuthorized viewをはがしてしまう。
Authorized viewを使っている個所縺? google_bigquery_dataset_access あるい縺? google_bigquery_dataset 縺? access フィールドを使う。

Terraform 縺? GCP のサービスアカウントを管理する - Eng (なりたい) (hatenablog.com)
Terraform 縺? GCP IAM 設藹??どれ使うのがいいのか - pokutuna (scrapbox.io)
google_project_iam | Resources | hashicorp/google | Terraform Registry
Authoritative: TFに譏?示していないものをApply時に削除しますという諢?、TFの権威
Non-authoritative: TFは権威を示さず、TFに譏?示していないものは現状維持ですという諢?

■勝手に公開
terraform vpc auto_create_subnetworks = falseにせなサブネットを公開して臀??りよる
Cloud sql縺?tfファイルに鐔??述がな縺?てもtf stateに縺?PWが出てしまう>tf化した縺?ない

■Applyの臀??存関臀??縺?depends_on(プロジェクト作成の前に権限を付荳?しようとしてエラー軆??の順蠎?)
[Terraform]Module間の値の藹??け渡しについ縺? | DevelopersIO (classmethod.jp)
 これより先にあれをTFして縺?れという記霑?

■データセット
google_bigquery_dataset | Resources | hashicorp/google | Terraform Registry
スキーマ藹??得: bq show --schema --format=prettyjson bangboo-prj:test-dataset.tbl001
ビューはコンソール・??BQ>該藹??ビュー・??detailからコピ繝?

■組織ポリシ繝?
google_organization_policy | Resources | hashicorp/google | Terraform Registry
制軆??につい縺?  |  Resource Manager のドキュメント  |  Google Cloud

■parallelismで早縺?なるかもしれない
あなた縺?terraform planを手軽に饅??速化する(かもしれない)魔法の鐔??葉 - Qiita
シェル藹??数を設藹??、確鐔??cmd縺? printenv
export TF_CLI_ARGS_plan="--parallelism=50"
export TF_CLI_ARGS_apply="$TF_CLI_ARGS_plan"

■テスト
TF Apply後には觸??証をしっかりしたい、最菴?Apply後縺?Planを再実行したい、テストスクリプト的にチェックしたい
適藹??されていないことや、TF定義縺?tfstateと藹??設藹??の差分が想藹??と違うことがある感じがするからだ
moduleを含めて条件的な書き方だと、適藹??の順蠎?の関臀??で適藹??が抜け2回以臀??TF applyしないといけなかったり

■TFファイルを分割し部分的に別環藹??縺?TFファイルを移鐔??したい
tf stateファイルを新環藹??用にコピ繝?
TFファイルを分割・??現鐔??の部分的に削除したTFファイル、と新環藹??用縺?TFファイルを準備
tf stateから不要部分を削髯?
 terrafrom state rm {{asset}}
terrafrom planで差分がないことを確鐔??
新環藹??用にコピーしたtf stateファイルを編集し準備
 下縺? terraform state push xxx.tfstate で藹??更された状態をtf stateファイルに書き戻すことができる?
 このコマンドを実行する前に藹??要に藹??じ縺? terraform state pull で最新の状態を藹??得?
 ダメなら terraform state rm で臀??要分を削る
新環藹??用縺?tfファイルを準備
新環藹??で臀??記を実行
 terraform init
 terraform state push xxx.tfstate
 terraform planで差分がないことを確鐔??

■GCP権限(メールの藹??名時)
GCP縺?GWS gmailメールの藹??名に追従して権限も付荳?状態も変化がない
しかしterraformは追従しないためtfファイルで使っている場合は藹??更する

■gcloud cmd
https://www.devsamurai.com/ja/gcp-terraform-101/
 gcloud projects list 権限あるプロジェクトを表示
 gcloud config set project [prjID] ワーキングプロジェクトの設定
 gcloud services enable iam.googleapis.com サービスの有効化
 gcloud iam service-accounts create terraform-serviceaccount \
  --display-name "Account for Terraform" サービスアカウント作成
 gcloud projects add-iam-policy-binding [PROJECT_ID]
  --member serviceAccount:terraform-serviceaccount@[PROJECT_ID].iam.gserviceaccount.com --role roles/editor 権限付荳?
 gcloud iam service-accounts keys create path_to_save/account.json
  --iam-account terraform-serviceaccount@[PROJECT_ID].iam.gserviceaccount.com クレデン発鐔??
 export GOOGLE_CLOUD_KEYFILE_JSON=path_to/account.json クレデン設定
↑サービスアカウントで鐔??証 環藹??変数にファイルパスを渡す
 gcloud auth application-default login だと個莠?
 これにクレデンシャルファイルのパスを渡すとサービスアカウント縺?gcloudコマンド打てるはず

Terraformで鐔??数リージョンをまたいだリソース制御する (mosuke.tech)
Terraform workspaceを利用して環藹??豈?のリソース名の藹??更を行う (mosuke.tech)


End

Posted by funa : 10:14 PM | Web | Comment (0) | Trackback (0)


April 2, 2021

Linux cmd2
■プロキシを入れないとアクセスできない、が同セグメントは臀??要なためno proxy設藹??する
Linuxの場合
export http_proxy=http://proxy:3128
export https_proxy=http://proxy:3128
export no_proxy=localhost,127.0.0.1,.in-xxx.com
コマンドプロンプト
set http_proxy=http://proxy:3128
set https_proxy=http://proxy:3128
set no_proxy=localhost,127.0.0.1,in-xxx.com
PowerShell
$env:http_proxy="http://proxy:3128"
$env:https_proxy="http://proxy:3128"
$env:no_proxy="localhost,127.0.0.1,in-xxx.com"

■ncコマンドでプロキシ確認
 自分の環藹??から環藹??用縺?proxy に接続できるかどうか?
apt install netcat-openbsd
nc-vz. proxy 3128
でプロキシ確認
nc-vz 127.0.0.1 20-100
自分自身に対し縺?TCP20~100番ポートをスキャンし成功する縺?succeed!!
 cnc-likすると簡易的に好きなポートでサーバーを起動できる
特藹??のボートの逍?通確鐔??など縺?
nc-lk 8000
-l オプショ繝?:サーバーモードで指定したポートで接続を待ち藹??ける
特権ポート (0-1023)までは、名前の通り特権が無いと、コマンドが通らない
-kオプショ繝?:接続が終了してもプロセスを終了せず継続し新しい接続を待ち藹??ける
レスポンスのデータを見たいなら、python モジュール軆??縺?
python3-mhttp.server 8080

■LDAP mgr縺?LDAP
LDAP managerは製品名で個人ユーザと所属グループが管理される。
製品概要 | 国産統合ID管理パッケージソフト「LDAP Manager」
OpenLdap縺?Linuxでよ縺?つか繧?れているディレクトリサービ繧? (ID管理)
OpenLDAP で理解するディレクトリサービス入門 | ほげほげテク繝?ロジ繝?

■sudoers につい縺?
どのユーザやグループがど縺?sudo コマンドを利用することができるのかの藹??義の鐔??載があり、ユーザとグループの設定で権限を制御
どのユーザがど縺?sudo コマンドを利用することができるのか $sudo -l
idコマンドで自分の所属サブグループを確鐔?? $id

元のペー繧?
/// BANGBOO BLOG /// - Linux cmd

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


April 2, 2021

Linux cmd
■Linux terminal
tabで入力補完
↑↓で入力履歴呼び出し
^q縺?Ctrl+qを押すという諢?蜻?
半角/全鐔??キー 日本鐔??を切り替える(画面右臀??にもIMEがある、win+spaceの場合も)
ls -la ディレクトリ内を表示
ls -a 隠しファイルを含み表遉?
 (GUI)ctl+h 隠しファイルを表示(メニューでもチェックで可・??
pwd 現ワーク中のディレクトリを表示
cd ../ 上に臀??がる
clear 表示内容を消す
mv beforeName.text afterName.txt ファイル名変譖?
rm -R ディレクトリ名 削除、ファイル縺?rm a.txt
ls -l > hoge.txt >結果を上書き
ls -l >> hoge.txt >>結果を追鐔??
printenv 環藹??変数表遉? printenv xで特藹??表示
grep aaa -rl ./ カレントディレクトリ以下からファイル内縺?aaaが含まれるファイルを検邏?
grep -R $keyword *.py .pyファイルからkeywordを検邏?
sudo - 一般ユーザが特権操作する sudo省逡?
sudo -i rootに切り替える
sudo -iu <username> 特権ユーザ切り替え

テキスト選択
 Shift↑or↓ で鐔??全臀??
 home(+fn)で鐔??頭、end(+fn)で鐔??末移動

nano text.txt 作成あるいは開縺?、nano簡単かも、画面臀??コマンド縺?ctrl+?すればいい
 コマンドM-U縺?Esc+u
 ctrl+k で・??行削髯?

$()
ドル鐔??号と括弧で囲んだコマンドは藹??行結果を出力し展開
echo "現在のディレクトリは、$(basename $(pwd))です"

パッククォートは囲った中身をコマンドとして藹??行しその軆??果を出力
echo "今日は、`date +%m月%d譌?`です。"

変数縺?$()とバッククォートを使ってワンライナ繝?
【shell/bash】変数代入縺?``や$()の使う場面を忘れた時に鐔??る記法まとめ (zenn.dev)

■viエディ繧?
sudo apt install vim
vi text.txt ファイル臀??成あるいは開縺?
 vi縺?2つ・??αのモード
 ┣コマンドモード
 ┃┗コロンモード(exモード:祖先のラインエディタ・??
 ┗入力モード
 https://docs.oracle.com/cd/E19253-01/816-3946/editorvi-5/index.html
 viのコロンモードコロンモードのコマンドは、こ縺?w、q、q!、x、$5... - Yahoo!知恵鐔??
Escでコマンドへ抜ける
 ┗挿蜈? i (入力モード)
ファイル名を指定し保存 :w new_file_name.txt
強制臀??存のコマンド :w!
保存せず終了 :q 強制軆??了 :q!
:10 10行目に移動
:set number 行数を表示
:num 現在のカーソル臀??置鐔??数を表示
クリップボードをペースト iで挿入モードに入り Shift+Insert
vi内でコピペ:yコマンドのコピー、pコマンドのペーストなので臀??記の觸??にする
 2yw ならカーソルから2単語コピーされます
 3yl ならカーソルから3文字コピーされます
 y$ ならカーソルから行末までコピーされます
 p ならカーソルの藹??ろにペーストされます
$ カーソルを行末縺?
G カーソルを最終行行頭縺?
- 前行の鐔??頭縺?
Enter 次鐔??の鐔??頭縺?
w カーソルを1語進める
b カーソルを1語戻す
Ctrl-d 1/2画面臀??縺?(down)
Ctrl-u 1/2画面臀??縺?(up)
Ctrl-f 1画面臀??縺?(foward)
Ctrl-b 1画面臀??縺?(back)
/文字列(Enter要) 文字列検邏?(スラッシ繝?)
 笏?n 次の觸??索文字列縺?
 ┗N 前の觸??索文字列へ 保存して軆??了 :wq 保存して強制軆??了 :wq!
コマンド集 viコマンド集 (ritsumei.ac.jp)
カーソル移動 viでのカーソル移動方觸??を一通りまとめました (eng-entrance.com)
検索 【初心者向け】viでの文字列の觸??索方觸??を一通り (eng-entrance.com)

■環藹??変数は臀??記の順で探す、なので藹??要なら下位のものを上にコピ繝?
~/.bash_profile
~/.bash_login
~/.profile
source ~/.bash_profile 編集したbashrcをbash_profileに藹??映させる
 bashrc縺?bash起動豈?、bash_profileはログイン觸??

■SSHの設定
Linuxコマンド【 ssh-keygen 】認証用の鍵を生成 - Linux入門 - Webkaru
$ ssh-keygen
パスフレーズは空でも設藹??上は問題ないが塩っ觸??が足らん気が
秘密鍵・??id_rsa)と公開鍵・??id_rsa.pub)が生成され、ホームディレクトリに臀??成される
 /home/yourID/.ssh/id_rsa
 /home/yourID/.ssh/id_rsa.pub.
公開鍵をSSHサーバや外部サービスに登録する等して使う、秘密鍵は譏?かさないこ縺?

SSHクライアント縺?proxy越えの設定方觸?? (mydns.jp)
プロキ繧?binのインス繧?
$ sudo apt-get install connect-proxy
ホーム縺?sshキーができているの縺?
$ vi ~/.ssh/config
Host oketsu
HostName 1.XXX.XXX.XXX
User hoge
IdentityFile ~/.ssh/id_rsa.pub
        LocalForward 5912 localhost:5902
ProxyCommand connect-proxy -H proxy.syanai.in:8022 %h %p
Host github.com
HostName ssh.github.com
Port 443
IdentityFile ~/.ssh/id_rsa.pub
ProxyCommand connect-proxy -H proxy.syanai.in:3128 %h %p
User githoge
$ chmod 600 .ssh/config
下記のように藹??行すると、ログイ繝?/GITできます。
$ ssh oketsu
$ git clone githoge@github.com:kusogitry.git
$ id 所属グループ等を表示
$ uname -n;id;date

■NW設藹??
/etc/resolve.conf
 nameserver 88.88.88.88
~/.profile とか .bashrc とか
  export http_proxy=http://proxy/3128
/etc/apt/apt.conf
ip addr

  OSI藹??照モデ繝?
レイヤ繝?名称・??日本鐔??)主な役蜑?主なプロトコル・鐔??譬?
レイヤ繝?7アプリケーション層アプリケーションごとの固有の通信鐔??定HTTP / SMTP
レイヤ繝?6プレゼンテーション層文字コードやデータ形蠑?など、情報の表現方觸??を規定MIME / SSL
レイヤ繝?5セッション層通信の開始・維持・軆??了など、通信セッションの管理ソケット
レイヤ繝?4トランスポート螻?データ転送の信頼性や誤り訂正などを規定TCP / UDP
レイヤ繝?3ネットワーク層異なるネットワーク間の通信方觸??を規定IP / ICMP
レイヤ繝?2データリンク層同一ネットワーク内での通信鐔??定Ethernet / PPP
レイヤ繝?1物理螻?ビット列を電觸??信号など物理的な信号に藹??觸??する規定1000BASE-T / 802.11

プライベートIPアドレスのクラス分け
クラ繧?アドレス軆??蝗?CIDR表鐔??
クラ繧?A10.0.0.0 ~ 10.255.255.25510.0.0.0/8
クラ繧?B172.16.0.0 ~ 172.31.255.255172.16.0.0/12
クラ繧?C192.168.0.0 ~ 192.168.255.255192.168.0.0/16

■スクリプト実行
nohup python3 main.py & ユーザディレクトリ縺?nohup.outログが実行完了時に臀??度に臀??存される(重いと思繧?れる)
nohup python3 main.py > /dev/null 2>&1 & ログなし
 nohupはバックグラウンド実行、ログアウトしても実行続ける
jobs ジョブリストを出す
fg ジョブ番号 フォアグラウンド実行に藹??える
bg ジョブ番号 バックグラウンド実行に藹??える
ctrl c キャンセ繝?
ctrl z 中断・??再開できる)
crontab -e 編集
crontab -l 確鐔??
sudo service cron restart 再起動
systemctl status cron 稼働の確認
30 12 * * 0 python3 /home/app_hoge/main.py
 cronはバックグラウンド実行縺?nohup &を含めると藹??行されない、多分
top プロセ繧?/CPU/メモリ軆??の情報、こちらで動いていれ縺?ps縺?statがsでも問題ない、多分
ps aux
ps f -A プロセスをツリーで表示し便蛻?
kill -l
kill -SIGCONT プロセス番藹??
sudo less /var/log/cron.log
sudo tail -f /var/log/cron.log
sudo less /var/log/syslog
sudo tail -f /var/log/syslog

■ディスク系
ext4 一般的なデスクトップやファイルサーバ向け、16TBまで、ファイルシステムチェックで遅い
xfs 高負闕?IOで大容驥?データ処理向け、ジャーナルなし、ファイルシステムチェックを短縮
論理ディスク・??パーティショ繝?
/dev/sda1, /dev/sda2, /dev/sdb, /dev/sdf等、数藹??はパーティション番号、数藹??がないとパーティショ繝?1つだけ

ディスク拡張
lsblk
df -Th
du -sk * | sort -nr

#xfsの場合
pvdisplay
pvresize /dev/nvm
vgdisplay
lvdisplay
lvextend -l +100%FREE /dev/vg001/lv001
xfs_growfs /opt

#ext4の場合
apt autoclean キャッシュあるがインストールされていないdebファイル削髯?
apt autoremove 必要な縺?なったパッケージ削髯?
disk -l /dev/nvm パーティション情蝣?
growpart /dev/nvm 1 指定パーティションの容驥?拡張
resize2fs /dev/nvm ファイルシステム拡張

容量調謨?
/var/cache 縺?apt-get clean, yum cleanで觸??す程度縺?

■swapをrootからvarに移動
free
swapon -a
swapを無効化
swapoff -v /swap.extended
swapをvarに移動
mv /swap.extended /var
/etc/fstabからswapのエントリを/varに書き觸??え
cat /etc/fstab
swapを有効化
swapon -a
確鐔??
free -h

■ライブラリアップデート
sudo apt update
apt list --upgradable | grep mysql
sudo apt install mysql-client=6.6.6-0ubuntu2.1~99.99.9
sudo apt install mysql-client-core=6.6.6-0ubuntu2.1~99.99.9
窶?
dpkg-l | grep mysql

■WSL2
https://qiita.com/zakoken/items/61141df6aeae9e3f8e36
https://qiita.com/SAITO_Keita/items/148f794a5b358e5cb87b
WSLインストール藹??はネットワークの設定が必要なら
例) apt updateが出来ない
WSL のバージョンはユーザの設定依存のため、version 2 (WSL2) が必要ならコマ ンドプロンプトで以下のコマンドを実行
wsl --set-default-version 2
アプリからWSL起動、CMDやPowershellならwslで起動 wsl --shutdown で停豁? 設藹??したユーザディレクトリにアクセスする(それぞれ別の場所)
窶? WSLから縺? /mnt/c -> /mnt/c/Users/ore/Desktop/github
窶? WINから縺? \\ws/$ -> \\wsl.localhost\Ubuntu-22.04\home\ore
NW設藹??: WSL2のデフォルトでは起動するたび縺?Windowsホスト縺?DNS設藹??を基にして自動的縺?/etc/resolv.conf を生成するが、サーチリスト縺?Windows側から引き継がれないうえ、諢?図しないタイミングで勝手に再生成されてしまうので停止する
nano/etc/wsl.conf
下記追鐔??
[network]
generate ResolvConf = false
DNS設藹??
sudo unlink /etc/resolv.conf
sudo nano /etc/resolv.conf
以臀??のように設定
nameserver 172.27.117.yy
nameserver 172.27.117.xx
search in-xxx.com dns search list.xxx.com
proxy設藹??
nano-/profile
以臀??の設定を既藹??プロキシの臀??に追加
export http_proxy="http://proxy:3128"
export https_proxy="http://proxy:3128"
apt 縺? proxy 設藹??
sudo /etc/apt/apt.conf
以臀??のように設定
Acquire: http: Proxy "http://proxy:3128",
Acquire: https: Proxy "http://proxy:3128";
WSL2を抜け、Windowsコマンドプロンプト縺?Ubuntu を再起動
ore@unco-017:/mnt/c/Users/ore$ exit

rootでキーを作成する縺?github上でユーザがrootとなる
sudo adduser aaa
sudo usermod -aG sudo aaa
sudo nano /etc/wsl.conf 下記を追鐔??しwsl再起動
whoami
[user]
default-aaa
echo $HOME
cd-
mkdir.ssh
ssh-keygen sudoだ縺?githubログイン時に名前がrootになってしまう
/home/aaa/.ssh/id_rsa
cd- /home/aaa
nano/home/aaa/.ssh/config
Host github.com
HostName ssh.github.com
Port 443
ProxyCommand connect-proxy -H proxy:3128 %h %p
user git
chmod 600 config
eval "$(ssh-agent-s) sshエージェント起動
ssh-add/home/aaa/.ssh/id_rsa sshエージェントに鍵を登骭?
ssh-add確鐔??
初回は接続yesをし縺? Warning: Permanently added (ssh.github.com): 443 (ED25519) to the list of known hosts.

wal-d Ubuntu-22.04 -u root パワシェル縺?rootユーザに切り替える場合
wal.exe-shutdown パワシェルでシャットダウンや再起動の場合

パッケージの更譁?
sudo apt update && sudo apt upgrade -y
WSL環藹??設藹??
cd /home/ore
縺?/rootを表す(/homeでない)
sudo apt install connect-proxy
/rootにキーを生成
ssh-keygen
passphrase xxXX
cat /root/.ssh/id_rsa
nano/root/.ssh/config
Host github.com
HostName ssh.github.com
Port 443
ProxyCommand connect-proxy -H proxy: 3128 %h %p
user omeco
chmod 600 config
シンボリックリンクを生成する
cd /home/ore
In-s-/ssh
Githubサイトのユーザ設定縺?pub keyを登録し、承鐔??する
cd /mnt/c/Users/ore/Desktop/github
git clone git@github.com:oreore/xxx.git
ping github.com で通信確認ができる

curl https://sdk.cloud.google.com | bash
exec -1 $SHELL
gcloud auth application-default login
URLコピペ
gcloud config configurations list
gcloud config configurations create kuso
gcloud config set account xxx@xxx.com
gcloud config set project project-x
gcloud config configurations activate kuso
gcloud auth login
pyenv install 3.13.0
pipenv-python 3.13.0
gcloud components update
gcloud components install cbt(BigTable例)
(パスフレーズを省略できる) eval $(ssh-agent); ssh-add-/.ssh/id_rsa
tfenvをマニュアルインストー繝? https://github.com/tfutils/tfenv
tfeny install 1.00.0
tfenv list
tfenv use 1.00.0
export TF_CLI_ARGS_plan="-parallelism=50"
export TF_CLI_ARGS_apply="$TF_CLI_ARGS_plan"
環藹??変数を変更した場合縺? source ~/.bash_profile を藹??映

■SPF
spfレコードはメールを送信する際、送信元サーバ縺?DNS上縺?IPアドレスを比較
自社から藹??引先に送信したメール縺?SPFレコードを設藹??していなければ、相手側のメールサーバで迷惑メールとされ届かない場合も

送信元縺?DNSに送信元IPをSPFレコードに登録する(ドメインをSMTP縺?IPに藹??える?
ドメイ繝? IN TXT v=spf1 ip4:172.16.0.1 -all
(+が省略されているがIP許可、allを認証しないという諢?味・??
送信蛛?SMTPサーバで縺?SPFをチェックせず何でも送菫?

藹??信蛛?MTAにて設定され(SMTPにはトランスファ縺?MTA、デリバリ縺?MDA
spfを使えば先方がspfレコードを登録していなければメールが藹??け藹??れない
postfixやexim縺?SPFをonにする設藹??がある

spfレコードが設藹??されているかを確鐔??
nsookup -type=TXT 調べたいドメイ繝?

■lsofはオープンファイルの略だがネットワークソケットの調譟?
lsofでファイルを開いているプログラムを特藹??する | 晴耕雨読 (tex2e.github.io)
lsofコマンド入門 #Linux - Qiita

=============
■VS code
マルチカーソル・??ctrl+shift+↓
[Alt]+クリッ繧?カーソルを追加
[Ctrl]+[Alt]+[↑]/[↓]カーソルを上下に追加
[Ctrl]+[U]カーソル操作を元に戻す
[Shift]+[Alt]+[I]カーソルを行末に追加
[Ctrl]+[L]行を選択
[Ctrl]+[Shift]+[L]選択中の文字列と同じものをすべて選択
[Ctrl]+[F2]カーソル臀??置の単語と同じものををすべて選択
[Shift]+[Alt]+[→]選択範囲の拡大
[Shift]+[Alt]+[←]選択範囲の縮蟆?
[Shift]+[Alt]+ドラッ繧?矩形選択
[Ctrl]+[Alt]+[Shift]+[カーソ繝?]矩形選択
[Ctrl]+[Alt]+[Shift]+[PgUp]/[PgDn]矩形選択 ページ臀??下
VSCodeのマルチカーソル練習蟶? - Qiita
マルチカーソルを使繧?ないVSCodeはただ縺?VSCodeだ!〜解説編〜 - memo_md (hateblo.jp)

続き
/// BANGBOO BLOG /// - Linux cmd2

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


March 9, 2021

Treachery

:||

2021/4/25に觸??づいた、繝?ニーちゃんおめでとうとありがとう、エピソードは臀??度どこか縺?

Posted by funa : 11:39 PM | Column | Comment (0) | Trackback (0)


March 6, 2021

ZERO

値段と軆??質とプリン臀??と度数、モ繝?によっては譏?らかに太る感じがしない、ゆっ縺?0じゃ無い安酒でも糖雉?15g位らしいので良いのがなければいつものでいいかも。それより現蜒?ができない!!→LightRoom再インスコ→LRよりSony謹製の方が色が良かった→元画蜒?が暗す縺?が理由→LRで繝?イズを追加調謨?(元画蜒?に注諢?、14mmf1.8の使い道がな縺?勿臀??ない、マクロとして物撮りしたい感じがあるがマクロ縺?70-200の方がええし、14は人物用だ縺?)

讌?ZERO: 138/0/0/5 ちょい高、不味い、5%で軽いが酔えな縺?はない、太る感じ×
Asahi Off: 118/0/0/3-4 酔えない、繝?ンアルの臀??種かフルーティで旨い〇
のどごしZERO: 118/0/0/4 フルーティで旨い、軽いが酔えな縺?はない〇
贅豐?ZERO: 118/0/x/6 プリン有 6%で藹??しいが雑味がすご縺?ある気が笆?
バーリアル軆??雉?50%off緑: 85/5-10/?/4 かる縺?ない、そもそもZEROでないが旨い笳?+
氷軆??ZEROレモ繝?: 108/0/0/5  レモンが強縺?旨い、飲みやすい笳?
鏡月焼驟?繝?繧?: 98/0/0/7 スッキリ饅??アルコール度で觸??足感、ドライが好きかも笳?+
いいちんこ下町の繝?イボー繝?: 168/0/0/7 高ぇ、重い感じがする笆?
パーフェクトサントリービー繝?: 168/0/x/5.5 高ぇ、旨い〇
 →氷軆??Zeroレモン・??鏡月ドライのコンボが強い

イオン麻婆豆腐辛藹??(肉付)vs丸軆??屋辛藹??(花觸??なし):丸は味軆??やか、Aは塩と肉多い
 →Aeonのとろみ入れるの觸??らす、甘口は邪饅??甘さで、中鐔??が一番いい
イオン四川蠑?(肉辟?)vs丸軆??屋大鐔??(花觸??付):Aは饅??いし辛い、お口は甘め好きda
 冷饅??が新し縺?なった、Palmボックスは藹??れて臀??度か買ったが蟆?さい
バターよりマーガリンの方が健康的になったらしい
 小岩臀??ヘルシー臀??立てか、譏?治コーンソフトは鐔??縺?で買えるが




繝?ンアルはどうなのか?飲み觸??べる、ジンジャエールよりいいか

キリ繝?Green's free 旨い、繝?ンアルならビールが良さそうで、繝?ンアルビールならこれでは・??
Suntoryのんある酒場レモンサワー 酸っぱい、旨い(メシが進む感じはしない
Takara辛口ゼロボール スッキリしているが何か不味いので逆に酒感あり旨い
AsahiStyleBalance繝?イボール まじウィスキー、旨い(メシが進む感じはしない
トップバリューホワイトサワー カルピスソーダで繝?ンアルの諢?味なし
トップバリュ繝?BeerTaste スッキリ旨いが軽縺?繝?レ感が少ない

Suntory繝?ンアル觸??分カシスオレンジ 旨い、大人のジュース感
ワイン チェリ繧?
ジントニック ジントニッ繧?
檸檬堂

「カルト」はすぐ隣縺?: オウムに藹??き寄せられた若者た縺? (岩波ジュニア新譖?) | 紹藹??, 江川 |譛? | 通雋? | Amazon
霊的体験は飲み物縺?LSDを入れていたとなっている、まぁ殆どコレで教祖になれる

Posted by funa : 01:43 PM | Column | Comment (0) | Trackback (0)


February 22, 2021

BigQuery part2
■BQタイムアウト縺?6時間
クエリそのままパフォーマンスを改善 BigQuery パフォーマンス向上テクニッ繧?

■BQ transfer(クエリが不要縺?BQ連携、3rd partyもあり)
データセットコピー、GCSファイ繝?
Ama S3, Azure storage, Oracle, Salesforce, Ads系軆??々

■Cloud SQL縺?BQからクエ繝?
SELECT * FROM EXTERNAL_QUERY("connection_name", "SELECT * FROM db.tbl")
BigQuery初心者を脱出したい3(CloudSQL連携クエリ・スケジュールクエリ・??
data taransfer縺?Connectionを設藹??してお縺?
保存先も同じリージョンである必要がある、RDSがosakaだ縺?BQ縺?multi region US等でな縺?osaka縺?

■BQ DMLクォータ鐔??驕?
割縺?SQLだとすぐに藹??にあたる
上限がテーブル単位のためテーブル名を分けると回避できるらしい
BQ streaming insert->BQ storage read/write APIの臀??限縺?DMLと別で、閾値が大きい

APIだ縺?Protocol buffersが必要で、Date/Timestampが対藹??しておらず
Unixエポックからの日謨?/秒数への藹??觸??が必要、、、

■マテリアライズドビュ繝?
実体データを保持しリフレッシュ更新で早いため集計等に向縺?
ベーステーブルは臀??つ、カウントができない、使用できない関数がある等の制軆??がある
またマテビューはビューを元に臀??成できずテーブルからである必要がある
ストレージコストは觸??かるが、通常ビューで時間觸??かる計算を頻軆??にする場合は早く安縺?なる可能性がある
BigQuery縺?Materialized Viewを使う #データ分析 - Qiita

■BQ同時実行謨?
オンデマンドでは使用可能なスロット数に基づき自動的に同時実行数が決藹??され超えるとスロット縺? 空きがでるまでキューに臀??管される
プロジェクトごとにクエリの最大同時実行数は動的に決まる
同時実行数の最大値は指定できるが、大き縺?しても実行数が増えることはな縺?、あ縺?まで自動決藹?? 内の方が優先される
Editionsが割り当てられているプロジェクトでは最大同時実行数を譏?示的に設定できる
他に、インタラクティブクエリ、バッチクエリ、クエリ順蠎?や上限な縺?

■BigQueryの列レベル・鐔??レベルのセキュリテ繧?
個人情報や機微情報を隠す
BigQuery の鐔??レベルのセキュリティの觸??要  |  Google Cloud
行レベルなら同じテーブルを使うので同じダッシュボード/Appが使える(AuthorizedViewの方が柔軟だが)
デー繧? マスキングの觸??要  |  BigQuery  |  Google Cloud
列レベルアクセス権以藹??にもマスクの種類があり、繝?ッシュだったり先鬆?4文字や末尾4文字等で共通文字化としてマスク化できる
BQ画面・??左ナビのポリシータ繧?
 ポリシータグを作成(組織単位で臀??括臀??覧表示・??
  タグは髫?層化できるので、全ユーザタグ・??管理者タグ・??社長タ繧?
 スキーマ>Addポリシータ繧?
  タグが付いていればプレビューで鐔??れない
  select * except(tag_column)にする必要がある
  メタデータは鐔??れる(カラム名、型
 ポリシータグ画面・??対象ポリシー選択>情報パネルで権限者一隕?
  fine-grained readerを付荳?する縺?select *ができるようになる
   社長タグに社長だけ権限付ける等
窶?APIを有効にし、ポリシーを有効にする必要がある

■承鐔??済みビュ繝? authorized view
authorized viewを設藹??するとそ縺?viewを対象とする権限だけ必要で権限をさかのぼり付荳?しな縺?ていい(通常縺?viewは藹??照元の権限も必要)
 この権限移譲は閲覧権限のみで編集権限等は含まない
被藹??照の元テーブル側に許可するview名を設藹??する
 藹??照権限は緩縺?なるが、編集権限は厳し縺?なる(設藹??するビューは藹??更しない前觸??で承鐔??する形・??
authorized viewを付荳?すると軆??関となったビュー縺?dataEditorではビュー更新ができな縺?なる
 ソーステーブルにもdataOwnerが必要(通常のビュー臀??成に縺?dataViewerがソースに藹??要)
 基本の藹??全軆??縺?authorized view設藹??を外す>ビュー藹??更・??AV再設藹??がいい
  対象縺?AVは管理者を立て臀??元管理するのが良さそう
  (テーブルやビューを作って権限付荳?してバッチだ縺?data ownerが必要なのは注意)

■Authorized系にはメリットとデメリット
1) Authorized viewを設藹??するメリット
一度設定してしまえばソース側への権限付荳?依頼が不要となりビューの権限管理が省力化できる
ビューにて閲覧対象を絞ることができソース全臀??は閲覧させないことができる、絞れる
 普通のビューは元データへの権限が必要で鐔??せた縺?ないデータへも権限が必要になる場合がある

2) Authorized viewを設藹??するデメリット
一度設定してしまえばソース側での権限付荳?依頼が不要となり被藹??照側で許可臀??許可の判断ができな縺?なる、誰にデータ閲覧権限を付荳?しているか把握できず管理が機能しな縺?なる一面がある
将来に置かれるソース側のデータの閲覧も許可することになり不用諢?に閲覧が可能となってしまう
terraform縺?Authorized view設藹??が剥がれてしまう危険諤?
ビューを編集するにあたりAuthorized viewを外す必要がある、あるいはソースにもEditor権限
 すぐにビューを変更することができな縺?なる(ビューを一旦削除することはできる)
Authorized viewはビューを削除して、再度臀??り直すと生きている場合がある、ダメな場合も多いが
 これで觸??洩させた縺?ない情報を一時含められる危険性がある
3)authorized datasetを設藹??するデメリット
設藹??時は良いかもしれないが、将来的に諢?図しないデータがDS入った場合も閲覧を許してしまう

データセットは細かく作成してアクセスレベル設定し普通のビューを使う
ソース全臀??を閲覧させられない場合(直接権限を付荳?できない場合)縺?AVを使うメリットがでる
 情報觸??洩リスクはどちらも多段ビューで同じ感じ、だがビュー臀??成縺?AV設藹??が生きているバグがデカい

■BQクリーンルーム
データ觸??備側でパブリックし、使う側でサブスクする (BQ exploreでペイン縺?Addする)
スプシ臀??存できない、開覧数のレポートが見れる(使用者名は鐔??えない) 実はパブ側でサブスクし公開すれば、閲覧縺?JobUserだけで使用できるようになる
GAでな縺?、またオンデマンドしか無理、コピペやデータコネクタは可能で觸??蠢?

■ロール割り当て者の出力
カスタムロール縺?Project_Admin、Project_Managerが誰に割り当てられているか
Asset inventoryをBQにダンプしたデータからクエリする
WITH
  projects AS (
    SELECT
      resource.data AS rsc,
      ancestor_path
    FROM
      prj.cloud_asset_inventory.cloud_asset_inventory_org_resource_now
    WHERE
      asset_type = 'cloudresourcemanager.googleapis.com/Project'
  ),
  projects_info AS (
    SELECT
      JSON_EXTRACT_SCALAR(rsc, '$.projectId') AS projectid,
      JSON_EXTRACT_SCALAR(rsc, '$.lifecycleState') AS lifecycleState,
      ancestor_path
    FROM
      projects
  ),
  projects_efficient AS (
    SELECT
      *
    FROM
      projects_info
    WHERE
      NOT REGEXP_CONTAINS(ancestor_path, "folders/apps-script")
  ),
  projects_num_adm_mgr AS (
    SELECT
      REPLACE(name, '//cloudresourcemanager.googleapis.com/projects/', '') AS project_num,
      REPLACE(b.role, 'organizations/1234567/roles/', '') AS role_value,
      STRING_AGG(REPLACE(m, 'user:', ''), ', ') AS member_value
    FROM
      prj.cloud_asset_inventory.cloud_asset_inventory_org_iam_policy_now,
      UNNEST(iam_policy.bindings) AS b,
      UNNEST(b.members) AS m
    WHERE
      asset_type = 'cloudresourcemanager.googleapis.com/Project'
      AND (role LIKE '%Project_Admin%' OR role LIKE '%Project_Manager%')
    GROUP BY
      project_num,
      role_value
  ),
  projects_adm_mgr AS (
    SELECT
      JSON_EXTRACT_SCALAR(resource.data, '$.projectId') AS project,
      projects_num_adm_mgr.role_value,
      projects_num_adm_mgr.member_value
    FROM
      projects_num_adm_mgr
    LEFT JOIN
      prj.cloud_asset_inventory.cloud_asset_inventory_org_resource_now AS res
    ON
      projects_num_adm_mgr.project_num = REPLACE(res.name, '//cloudresourcemanager.googleapis.com/projects/', '')
  )
SELECT
  projects_efficient.projectid,
  projects_efficient.lifecycleState,
  CONCAT(projects_efficient.projectid, ', ', projects_adm_mgr.role_value) AS role_value,
  projects_adm_mgr.member_value
FROM
  projects_efficient
LEFT OUTER JOIN
  projects_adm_mgr
ON
  projects_efficient.projectid = projects_adm_mgr.project
ORDER BY
  lifecycleState DESC,
  projectid;

■BigQuery DataFrames + Geminiでデータ分析
from google.cloud import bigquery
from google.generativeai import GenerativeModel

bq_client = bigquery.Client()

# クエリ藹??行し縺?DataFrame藹??得
query = "SELECT customer_review FROM `my_project.my_dataset.reviews` LIMIT 10"
df = bq_client.query(query).to_dataframe()

# Geminiモデルの觸??備
model = GenerativeModel("gemini-pro")

summaries = []
for review in df["customer_review"]:
    response = model.generate_content(f"次のレビューを要約して縺?ださい: {review}")
    summaries.append(response.candidates[0].text)  # 修正: 正し縺?レスポンスを藹??得

# DataFrameに鐔??約を追加
df["summary"] = summaries

table_id = "my_project.my_dataset.review_summaries"
job = bq_client.load_table_from_dataframe(df, table_id)
job.result()
print("データをBigQueryに臀??存しました!")


■BigQuery ML (bqml_llm_infer) + Geminiで感情分析
from google.cloud import bigquery
bq_client = bigquery.Client()

# クエリ藹??行し縺?DataFrame藹??得
query = """
SELECT 
  bqml_llm_infer(
    model_name => 'my_project.my_dataset.gemini_model', 
    prompt => CONCAT('このレビューの感情分析をして縺?ださい: ', customer_review)
  ) AS sentiment_analysis
FROM `my_project.my_dataset.reviews`
LIMIT 10
"""
df = bq_client.query(query).to_dataframe()
print(df)


■IAM(Identity and Access Management)

前回
/// BANGBOO BLOG /// - BigQuery

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


February 21, 2021

BigQuery
■Big queryリファレン繧?
標準SQLとレガシ繝?SQLがある、違いは・??
標準 SQL のクエリ觸??文  |  BigQuery  |  Google Cloud
標準 SQL への移行  |  BigQuery  |  Google Cloud
標準 SQL のデータ型  |  BigQuery  |  Google Cloud
レガシ繝? SQL 関数と觸??算子  |  BigQuery  |  Google Cloud
レガシ繝? SQL のデータ型  |  BigQuery  |  Google Cloud
BigQuery: クラウド デー繧? ウェア繝?ウ繧?  |  Google Cloud(チュートリアルみたいな・?? 

BigQuery解説:https://beyondjapan.com/blog/2016/03/what-is-bigquery/
クエリ処理のツリーアーキテクチャによる分散並列処理
複数のサーバーに対してツリー状に拡がっていき、並列にサーバー臀??で同時に分散処理
 ルートサーバ>intermediateサーバ>leafサーバ
BigQuery MLという機能を利用すると、機械学習モデルをCloud AI Platform縺?TensorFlowなどに連携させ、クエリ軆??果を素早縺?AIと連謳?
Lookerというデータ分析プラットフォームとの連携よりクエリ軆??果を、データ統合、変觸??、分析、可鐔??化、レポーティングすることができ、非常に強力縺?BI

列指向型・カラム型データベース・カラムナストレージ・??一般的縺?RDBMSでは鐔??単位でデータが保存)
 必要なカラムのデータを藹??得するだけでよ縺?、またデータは圧縮できる
https://dev.classmethod.jp/articles/google-bigquery-debut/

GCPプロジェクト>データセット>テーブル・??行row列columnで普通のテーブル、ネイティブbigqueryテーブ繝?/Googleドライブのような藹??部テーブル、SQLクエリによるビュー・??
 アンス繧?_で藹??まるデータセット名は隠しでコンソールで非表示
ジョブは非同期で藹??行され、ステータスをポーリング・??データの読み込み、データのエクスポート、データのクエリ、データのコピーなど・??

クエリ・??ウェブ UI、bq コマンド、BigQuery REST APIの方觸??がある、SQLと同じ?
SELECT   title, answer_count, view_count
 FROM  `bigquery-public-data.stackoverflow.posts_questions`
 ORDER BY  view_count DESC LIMIT 10
BigQuery縺?SELECT tag, time FROM [dataset_name.table_name_20151206]のように藹??要な列だけを選択した場合にはスキャンの藹??を狭めることは可能ですが、LIMITやWHERE句には臀??を書いてもテーブルをフルスキャンしてしまう
節約 Ama縺?s3に入れRedshift内でテーブルを分割した後縺?BigQuery

Hadoopでも使繧?れていたGoogle開発のエンジンであるMapReduceは、非構造化データをプログラミングモデルを通して扱うが、巨大なテーブルの軆??合や巨大な出力結果のエクスポートも可能である半面、処理時間は数分間から数日に藹??んだ、だが、BigQueryは、あらかじめデータを構造化し縺?BigQueryのテーブルに格軆??しておかねばならないが、ほとんどのクエリは数軆??で藹??了する

サードパーテ繧? ツール・??データの読み込みや視覚化を行うツールなど・??を使用し縺? BigQuery のデータにアクセス藹??
Google Cloud SDKをインストールすればコマンドラインが使える
BQは同一リージョンでない縺?Joinができない、ゾーンはマルチで良い
 BQで縺? us 縺? eu がマルチリージョ繝?
  22/4現在のリージョンリスト:asia-east1-2、asia-northeast1-3、asia-south1-2、asia-southeast1-2、australia-southeast1-2、europe-central1-2、europe-north1、europe-west1-6、northamerica-norhteast1-2、southamerica-east1、sourthamerica-west1、us-central1、us-east1-4、us-west1-4

パブリックデータに直でアクセスできる
SELECT * FROM `bigquery-public-data.usa_names.usa_1910_2013`
BigQuery の臀??般公開データセット  |  Google Cloud
 →FROM句の書き方・??他のプロジェクトを指す名前に繝?イフンがあるとバッククォートで囲む必要がある
  `other-prj`.dataset.table あるい縺? `other-prj.dataset.table`

■標準SQL
先頭鐔??でレガシーか宣鐔?? #standardSQL あるいは #legacySQL
バッククォートでエスケープ、プロジェクト区切りも.(ドット)、From句のカンマ縺?Cross joinで全軆??合せかと思繧?れ通常通りjoinやunionを使う事
配列が使える、カラム一つに配列を入れて藹??元的に扱える
withで臀??時テーブルを作れる
exceptでカラムを除藹??、replaceでカラムの置き觸??え
 select * except(kuso) from a
分析関謨?over()縺?windowで鐔??算ができる
 rank() over (order by x)は臀??記more縺?RFMに使用している
 ROW_NUMBER() over (order by timestamp) as id,で採番できる
地理関数とかJSON関数とか色々関数もありそう
スクリプトで藹??数やIfやLoopが使える 標準 SQL のスクリプト  |  BigQuery  |  Google Cloud
join on a.c=b.c縺?join on using (c)とできる

BigQuery 特集: データ操作(DML) | Google Cloud 公藹??ブロ繧?
insert into tbl_dest select * from tbl_source 縺?select結果を挿入できる

■レガシ繝?SQL(標準SQLを使うのが由・??
予約語は鐔??かっこを使ってエスケープ、プロジェクト区切り縺?:
集計関数縺? WITHIN キーワードを使用すると、レコード内の繰り返しの値が集計?
FROM句のカンマは觸??準SQL縺?Cross joinとは異なりUNION ALL 演算子
通常縺?SQL処理システムとは異なり、BigQueryは繰り返しデータの処理を前觸??として設計。繰り返しレコードの觸??造を操作するクエリを記述。その方觸??縺?1つが、FLATTEN 演算子?
JOINは、INNER、[FULL|RIGHT|LEFT] OUTER、およ縺? CROSS JOIN 演算子をサポート、デフォルトINNER
除藹??できる select + from A OMIT RECORD IF COUNT(payload.pages.page_name) <= 80;
TOP を使用するには、SELECT 句縺? COUNT(*) を含める
分析関謨?over()縺?windowで鐔??算ができる?(標準SQLと同様?)
functionを作って使える(標準SQLと同様?)
JSON等のネストをフラット化

■DDL データ藹??義鐔??語ステートメントの使逕?  |  BigQuery  |  Google Cloud
https://www.isoroot.jp/blog/1651/
auto_incrementもdefaultもprimary keyもindexもshow create tableないのでは・??
CREATE TABLE IF NOT EXISTS bangboo_data.x_xxx (
  `no` INT64 NOT NULL,
  `user_no` INT64 NOT NULL,
  `name` STRING,
  `date` DATETIME,
)

同じスキーマで臀??ることもできる
CREATE TABLE ore_ds.test003
 LIKE prj.ds.test001
PARTITION BY _PATITIONDATE

■bqコマンドはコンソールで藹??行できる
ブラウザで該当プロジェクトに入りコンソールボタン、下記ではスキーマをJSONで藹??得できる
bq show --schema --format=prettyjson myProject:myDataset.tbl001
bq ls -n 3000 dataset_aho (データセット内のリスト3000件、デフ繧?50件・??)

bq cp --force prj:ds.tbl prj:ds.tbl2
上書きコピー・??削除しコピー・??コンソールだと同名コピーや下記ができない
bq cp ds.tbl1,ds.tbl2 ds.newtbl
2つのテーブルをnewtable にまとめコピ繝?
bq cp -a ds.tbl2 ds.tbl1
tbl2をtbl1に追加コピ繝? --append_table でも同じ

bq load (csvとかgcsのファイルを読み込む)
bq extract (gcsに抽蜃?)

■データアップロード時のスキーマ指定
自動検出縺?Firestore、Datastore、Avro、Parquet、ORCだけ?ほぼ手動縺?utf-8縺?csvかjsonlかを使う蠖?
コンソールで手動スキーマ指定藹??(jsonスキーマを張臀??ける)、modeは省略可でデフォ縺?nullable、
JSONスキーマファイ繝?up縺?aqコマンドのみ可、ローカルからup時のコマンドとスキーマ例↓
bq load --source_format=CSV mydataset.mytable ./myfile.csv ./myschema.json
[
  {
    "description": "quarter",
    "mode": "REQUIRED",
    "name": "qtr",
    "type": "STRING"
  },
  {
    "description": "total sales",
    "mode": "NULLABLE",
    "name": "sales",
    "type": "FLOAT"
  }
]
なお一譌?Google Cloud Storageに放り込んでからやると饅??速 BigQueryにデータをバッチでインポートする - Qiita

COUNT DISTINCTだが、BigQueryでは觸??算値が返って縺?る??。正確な値が必要な場合は、GROUP EACH BY縺?COUNT(*)を組み合繧?せる
https://www.buildinsider.net/web/bigquery/01

■BQ縺?UTC(Universal Time, Coordinatedの頭文字)
ScheduledQueryを終了譌?6/9 13:00JSTで即時設藹??→6/9 01:20UTCで藹??行された
(終了時間縺?JST/UTCの考慮が必要か→SQ実行時間設藹??について縺?JSTかUTCに注諢?するだけ)
実行履歴縺?UTCのためJSTに読み替える必要がある(UTC縺?JST縺?-9時間)

■BigQuery機閭?
///クエリ軆??果を別テーブルに書き込む
その臀??>クエリの設定>クエリ軆??果の藹??先テーブルを設藹??する
BigQueryで縺?SELECT結果を他テーブル縺?Insert / テーブル觸??い替えなどができる - コード日進月豁? (hateblo.jp)
クエリ軆??果の書き込縺?  |  BigQuery  |  Google Cloud

///Saved query
プロジェクトに対して臀??存をして使いま繧?す等ができる
URLでクエリを共有できる

///Federated Query
スプレッドシートやGCSの藹??部ソースをBigQuery縺?
範囲の書き譁?:シート1!A1:B100
Auto detectにする縺?Header skipを1にし縺?1行目をカラム名として使うといい
注意)
 シートで觸??成を変えると觸??茶苦茶になる
 空觸??のセル縺?nullになる
 使う人縺?BQへもスプレッドシートへも両方権限が必要

///パラメー繧?(変謨?)を使う
--parameter=min_count:INT64:250
SELECT word FROM `prj.ds.t` WHERE AND count >= @min_count
パラメータ化されたクエリの藹??行  |  BigQuery  |  Google Cloud

こういう感じでも使えるので縺?
WITH params AS (
 SELECT @sheetInput AS p
),
tmp_pre_processed_src AS (
 SELECT * FROM src
)
SELECT * FROM tmp_pre_processed_src
,params
WHERE
 tmp_pre_processed_src.a = p

///*を藹??ける_TABLE_SUFFIXを使う(複数テーブルだ縺?union allになる)
SELECT year FROM `bigquery-public-data.ds.gsod19*`
WHERE _TABLE_SUFFIX BETWEEN '29' and '35'
ワイルドカード テーブルを使用した複数テーブルに対するクエ繝?  |  BigQuery  |  Google Cloud
 BTWで軆??らないと全軆??合で課金が厳しいかも

 ※ワイルドカード注諢?
 dataset.product_*と書縺?縺?dataset.product_20190425だけでな縺?dataset.product_special_20190425にもヒットしてしまう

betweenは藹??さいから大きいで、パーティションのないシャーディングテーブル日臀??きつきテーブルでも行ける(From句のテーブルに動的な名前を使うにはこれか、EXE IMEDIATE縺?らいか?)
SELECT year FROM `bigquery-public-data.ds.gsod20*`
where _TABLE_FUFFIX between format_date('%y%m%d', date_sub(current_date("Asia/Tokyo"), interval 3 day))
 and format_date('%y%m%d', current_date("Asia/Tokyo"))

///時間のパラメータを使う
select * from mytable_{run_time-1h|"%Y%m%d"}
実行時間run_time(UTC)から1時間引いた日→mytable_20180214
クエリのスケジューリン繧?  |  BigQuery  |  Google Cloud

///動的にテーブル名を指定し縺?create table
パラメータや変数や_TABLE_FUFFIXだけでは難しい。変数はテーブル名とは解釈されない、_table_fuffix縺?select分縺?from句に入れwhere句で内容を指定するがcreate分は無理、execute immediateを用いる
DECLARE t STRING;
SET t = (SELECT CONCAT('x_emp_at', FORMAT_DATE("%Y%m%d", DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY))));
EXECUTE IMMEDIATE format('CREATE OR REPLACE TABLE `%s` AS SELECT * FROM `prj.bangboo_data.x_employee`', t);

ScheduledQueryでは出力テーブルの指定が可能でテーブル指定例:table001_{run_time-1h|"%Y%m%d"}縺?OK、なおSQL内に縺?run_timeが使用できない

//動的縺?SQLを作成し実行(組織レベルのメタデータを藹??得
DECLARE all_meta STRING;
SET all meta = (
with projects AS(
SELECT DISTINCT project_id from region-us.INFORMATION_SCHEMA.TABLE_STORAGE_BY_ORGANIZATION
WHERE project_id NOT IN ('対象外プロジェクト)
),
sql AS(
SELECT
CONCAT('select from`', project_id, "`.`region-us`.INFORMATION_SCHEMA.SCHEMATA_OPTIONS", "\nUNION DISTINCT\n') AS s FROM projects
),
concat_sql AS(
SELECT REGEXP REPLACE(STRING AGG(s, ''), '(UNIION DISTINCT+)$', '') AS concat_s
FROM sql
)
SELECT SUBSTR(concat_s, 1, LENGTH(concat_s) - 16) AS all_meta
FROM concat_sql
);
--Scheduled query化ならcreate文にする
--EXECUTE IMMEDIATE format('CREATE OR REPLACE TABLE `bq_us_all_dataset` AS %s', all meta);
EXECUTE IMMEDIATE format('%s', all_meta);

///既藹??のテーブルをコピ繝?(CREATE OR REPLACE TABLEもあり)
CREATE TABLE IF NOT EXISTS bangboo_data.x_employee_copy (
  `no` INT64 NOT NULL,
  `name` STRING,
) as
select * from `prj.bangboo_data.x_employee`
データ藹??義鐔??語ステートメントの使逕?  |  BigQuery  |  Google Cloud

///timestamp縺?datetime
datetime型カラムに縺?CURRENT_DATETIME()、timestamp型カラムに縺?CURRENT_TIMESTAMP()を使う
 timestamp縺?UTC、datetimeはローカル的で地域指定ができる
 直鐔??3分
 SELECT * FROM `aaa.ds.tbl111`
 WHERE `date` > DATETIME_SUB(CURRENT_DATETIME(), INTERVAL 3 MINUTE)

//string縺?date
func_approved_routine_a('2021-10-31') 引数がstring型
func_approved_routine_a("2021-10-31") 引数がdate型

///日臀??のキャスト
CAST(date AS STRING)
TIMESTAMP(DATE_SUB(CURRENT_DATE(), INTERVAL 1 month))
BigQuery縺?StandardSQLで日臀??(date, datetime, timestamp)を変觸??する方觸?? - 寝ても覚めてもこんぴうた (hatenablog.com)
Bigqueryの日時に関臀??する関数全部試してみた ①Date邱? - Qiita

///timeで入っているものを日でサマるSQL
select
count(table_id),
sum(size_bytes),
date(record_time) as record_day
from bq_metadata
where record_time > TIMESTAMP(DATE_SUB(CURRENT_DATE(), INTERVAL 3 month))
group by record_day
order by record_day DESC

///有効期限 table expiration
データセットに対して臀??日間かにするか設藹??できる
テーブルに対し特藹??の日臀??を設藹??できる
 何が起こる?>データセット自臀??は觸??るが中のテーブルが無縺?なる

///パーティショ繝?
パーティション分割テーブルの觸??要  |  BigQuery  |  Google Cloud
BigQuery縺?StandardSQLで日臀??(date, datetime, timestamp)を変觸??する方觸?? - 寝ても覚めてもこんぴうた (hatenablog.com)

パーティション分割テーブル縺?2種饅??:パーティショニングとシャーディン繧?
笳?シャーディングテーブ繝?
 カラムの藹??減OK、スキーマとメタデータを持ち権限検証され オーバヘッド有り、ワイルドカード誤操作しやすい→保存向き
笳?パーティションテーブ繝?
 クエリが早い、カラムの藹??減に対応できない、上限4000位→利用向き
笳?シャーディングテーブルにパーティション設定
 各シャーディン繧?tblでパーティションを持たせる、特觸??用途で通常どちらか縺?

TIMESTAMP 列縺?DATETIME列では、パーティションを時間単位、日単位、月単位、年単 位のいずれ縺?
 SQで自動的縺?timestamp縺?DAYになる、SQ実行頻度から自動設藹??される?
ワイルドカード誤操作 *だ縺?_fuyou_20240401等の想藹??外も含むため_202*にする等の考 慮が必要
シャーディングの臀??り方、yyyymmではダメだった、create文でテーブル名縺?yyyymmddを 付ける あるい縺?SQのテーブル名縺?_{run_time-2h["%Y%m%d"}等
シャーディングはテーブルごとに権限を付荳?が必要で日臀??別なら実質無理でデータセットで権限管理が必要

クラスタリング も同時に考慮したい
事前にソートし、まとまりを作っておく仕組み。
インデックスのようにカーディナリティが高いカラムを指定してあげると列指向のため全スキャンしな縺?て良縺?なる。圧縮軆??も上がり 保存費用も削減できる。
WHERE で指定あるい縺? GROUP BY される複数列をクラスタ化列として指定するが、指定の順番が重要。
まずパーティションが考慮され、次に最初にクラスタ指定した列で鐔??がソートされ、次にその中縺?2番めに指定した列でソート、次縺?3番逶?...となる
CREATE TABLE ds.tbl_cls (purchase_dt DATE, prod_id STRING, prod_name STRING)
PARTITION BY purchase dt
CLUSTER BY prod_id

1)パーティショニン繧?
BigQueryでパーティション分割テーブルを作成する - goodbyegangsterのブロ繧? (hatenablog.com) を見よ
パーティショニングは臀??前に臀??ってお縺?こ縺?
上限が4000のため最大日単位縺?11年、時間単位縺?5か月縺?らい縺?partition_expiration_daysも指定しておく事
CREATE TABLE sample.n225 ( 
  trading_day DATE NOT NULL OPTIONS(description="藹??引譌?"),
  closing_quotation NUMERIC NOT NULL OPTIONS(description="終蛟?"),
  opening_quotation NUMERIC NOT NULL OPTIONS(description="始蛟?"),
  high NUMERIC NOT NULL OPTIONS(description="高蛟?"),
  low NUMERIC NOT NULL OPTIONS(description="菴?蛟?")
PARTITION BY
  DATE_TRUNC(trading_day, MONTH)
OPTIONS (
  partition_expiration_days=1825,
  require_partition_filter=true,
  friendly_name="日軆??225時系列デー繧?",
  description="月別パーティションされた、201901から202107までの日軆??225時系列デー繧?",
  labels=[("environ", "dev")]
)

クエリ縺?partitioned byのヤツで軆??れば良い
select * from aaa_history wehre
#ParticionIDで軆??る(つーかpartitioned byのヤツで日臀??をキャストし縺?UTCをJST日臀??縺?
date(rec_time) = date(datetime_add(datetime "2000-10-10 00:00:00" interval -9 hour))
AND
#実際の時間で軆??る、パーティションが日臀??区切りなので時間検索だけなら全件検索になる
datetime(rec_time) between datetime_add(datetime "2000-10-10 00:00:00" interval -9 hour)
 and datetime_add(datetime "2000-10-10 00:59:59" interval -9 hour)

2)シャーディン繧?
シャーディング縺?_TABLE_SUFFIXを使ったり、テーブル名に繝?ードコーディングする。
日臀??のキャスト select * from `task_*` where _TABLE_SUFFIX = REPLACE(CAST(date AS STRING), '-', '')

DROP TABLE `task_*`のようにワイルドカードは削除時は使えない
大驥?削除は臀??記のよう縺?bq cmdリストを作りBashで。(Terminal貼りつけでも可・??
 シャーディングはデータセット別にしてデータセットごと觸??すようにしたいが
Delete BigQuery tables with wildcard - Stack Overflow
select concat("bq rm --project_id prj -f -t ",table_schema,".",   table_name, ";" )
from INSERT_YOUR_DATASET_NAME.INFORMATION_SCHEMA.TABLES
where table_name like "INSERT_YOUR_TABLE_NAME_%"
order by table_name desc

シャーディングテーブルのビュー化 (Authorized view/routineの設定も必要)
■ その・??(_TABLE_SUFFIXカラムが付縺?が、全期間藹??得できる)
CREATE OR REPLACE VIEW ds.tablen_snapshot_all AS
SELECT *,
_TABLE_SUFFIX AS table_suffix
FROM gcp-prj-name.ds.tablen_snapshot_**
WHERE_TABLE_SUFFIX BETWEEN '20200101' AND FORMAT_DATE('%Y%m%d',
CURRENT_DATE())
↓下記のように使用する
SELECT FROM `ds.tablen_snapshot_all
WHERE table_suffix BETWEEN '20250530' AND '20250601'
あるい縺?
SELECT FROM tablen_snapshot_all
WHERE table suffix = '20250601'

■その・?? (テーブル関数のため単一日臀??のみ藹??得)
CREATE OR REPLACE TABLE FUNCTION ds.fn_tablen_snapshot_by_date(date_str STRING)
AS
SELECT
FROM gcp-prj-name.ds.tablen_snapshot_**
WHERE TABLE_SUFFIX = date_str;
↓下記のように使用する
SELECT FROM `ds.fn_tablen_snapshot_by_date("20250601");


削除されたテーブル縺?7日以内なら復元することも可閭?
テーブルの管理  |  BigQuery  |  Google Cloud
BQタイムトラベル縺?2-7日前のデータを見れる
タイムトラベルを使用した履歴データへのアクセ繧?  |  BigQuery  |  Google Cloud

///UNNEST
UNNESTを知らない縺?BigQueryを使えない? | 4番は司令塔 (pep4.net)
Bigquery縺?UNNESTを使いこなせ!クエリ効軆??100% | by Eureka Engineering
ARRAY を一組の鐔??にフラット化するには、UNNEST 演算子を使逕?
SELECT id, title FROM games, UNNEST(titles) AS title
idtitles
1[skyrim, fortnite]
2[atvvsmx, mario]
↓フラット化
idtitle
1skyrim
1fortnite
2atvvsmx
2mario

ただしUNNESTで指定したカラムが空の配列やNULLの場合、該藹??行は無縺?なってしまうので注諢?
 id=3 titles=[]やid=4 titles=NULLの時縺?id=3,4は藹??っ張れないというこ縺?

select * from unnest(['aaa', 'bbb']) as baka -> rowとし縺?2行出る
select ['aaa', 'bbb'] as baka -> 1行目に配列として全て含まれ出る

sql - How to query multiple nested fields in Bigquery? - Stack Overflow
Unnestでもflattenができず空觸??ができる場合、結局left join
 空を含むカラム縺?Selectに觸??し、repeatedのカラム縺?left joinで縺?っつける
 VariantsをunnestしてるがPricesもrepeatedなの縺?left joinのものを出している
  repeatedもarrayと同じらしいが、、、cross joinやarray_to_stringもやったが駄目だった
   なおrepeated以藹??縺?unnestが効かない
それでも駄目ならselect句の指定方觸??やwhere句で軆??ると空欄が抜けたよ
select Productid,Variants.SKU,Variants.Size
,Prices.Currency,Prices.Country
from `ga-export-0000.feed.feed_dev`
,UNNEST (Variants) AS Variants
LEFT JOIN UNNEST(Variants.Prices) as Prices 

///ARRAY型縺?STRUCT型
Arrayは臀??縺?Unnestを藹??照。
Structは觸??造体型。順序付きで親子の觸??造を持つ。各フィールドはデータ型(必須)とフィールド名(オプション・??を持つ。

array型 unnestできる、[]なの縺?array_length()で数が藹??れる
struct型 unnestできる、ネストを含みスキーマ縺?record型と表記される、struct型の藹??へ縺?.ドットで指定す
 string縺?JSON縺?json_extractを使う
 配列との絡み縺?json_query_arrayを使う、2段髫?縺?らいは関数で対処できるがそれ以臀??縺?with句がいい
 BigQueryでの鐔??雑縺?JSON文字列の扱い方と注諢?轤? - Qiita
 JSON functions  |  BigQuery  |  Google Cloud

CREATE TABLE IF NOT EXISTS `bangboo-prj.ds.x_list` (
  `record_time` TIMESTAMP,
  `name` ARRAY
)
INSERT INTO `bangboo-prj.ds.x_list` (`record_time`,`name`) VALUES (CURRENT_TIMESTAMP(),['a','b'])

struct型(record型)は藹??や孫でヒットすれば親を含めて表示されてしまう
見やす縺?するため*ではな縺?、カラムを特藹??すると空欄が表示されな縺?なり
親が出な縺?なり理解しやす縺?なる(必ずカラム指定したい)

Array=String Repeatedつまりリスト(配列)に値を入れる書藹??(下記縺?2つしか入らない)
insert into aaa (aaa) value ("['aaa','bbb']") value has STRING
insert into aaa (aaa) value (`['aaa','bbb']`) Unrecognized name: `['aaa','bbb']`
insert into aaa (aaa) value (['aaa','bbb']) OK
insert into aaa (aaa) value ('["aaa","bbb"]') value has STRING
insert into aaa (aaa) value (`["aaa","bbb"]`) Unecognized name
insert into aaa (aaa) value (["aaa","bbb"]) OK
insert into aaa (aaa) value ([`aaa`,`bbb`]) Unrecognized name
insert into aaa (aaa) value ([aaa,bbb]) Unrecognized name: aaa
insert into aaa (aaa) value ([123,456]) Value has type ARRAY

例)権限が変繧?っていないかの確認する等
降順で最新の日臀??のアイテムを見る、そして最終ページの古い日臀??のアイテムを見る
そしてそれらを比較する
select record_time, name, asset_type, m, b.role
from cai_iam_policy_history
,unnest(iam_policy.bindings) b
,unnest(b.members) m
where record_time between timestamp('2021-05-01') and timestamp('2021-06-30')
and b.role in ("roles/bigquery.dataViewer", "roles/bigquery/jobUser")
and m like '%ketsu@bangboo.com%'
and ancestor_path like '%ketsuproject%'
order by record_time desc
SQL解説)struct型が沢山入っていても全驛?unnestしfromに入れればいい
 from a, unnest(iam_policy.bindings) b, unnest(b.members) m
    unnest(iam_policy)はできないの縺?2髫?層目から
  一つ髫?層臀??で縺?unnest時に別名を付けて臀??の髫?層はその別名縺?unnest
struct型の藹??へ縺?.ドットで指定すればいい、フラットでな縺?てもbでも藹??得ができる

通蟶?SQLは「陦?.カラム」だが「親カラム.子カラム」なので、出元がどこかテーブルを探すかスキーマ内を探すかで迷う

///json_extract, json_extract_scalar
2番目の藹??数はパ繧?
BigQueryでの鐔??雑縺?JSON文字列の扱い方と注諢?轤? - Qiita
標準 SQL 縺? JSON 関謨?  |  BigQuery  |  Google Cloud

with t as (
    SELECT unco_data AS col_1 FROM `kuso`
    WHERE date = "2021-08-04"
)
SELECT
    json_extract(col_1, '$.color') as unco_color,
    json_extract(col_1, '$.temperature') as temperature,
    json_extract(col_1, '$.fart.times[0].stink') as first_stink,
FROM t

///Pivot
BigQuery縺?PreviewになったPIVOT縺?UNPIVOTを試す | DevelopersIO (classmethod.jp)
【SQL】クロス集計を扱う。PIVOT句縺?UNPIVOT句についてコードを雕?まえて解説。 | ポテパンスタイ繝? (potepan.com)
集計をして鐔??を列に藹??觸??(生ログをある単位でまとめカラムにする)

--tool縺?activeがonなら1、nullなら0でユー繧?A縺?Bの状觸??を見る
SELECT * FROM (
 SELECT user, tool, active FROM `tools`
)
PIVOT(
 MAX( IF (active IS NOT NULL, 1, 0))
 FOR user IN ("a", "b")
)

tool a b
------------
axe 1 0
sword 0 1

※藹??考にピボットテーブ繝?
集計して鐔??を列に藹??觸??、生ログをある単位でまとめる
 生ログが「日 店 金額」の場合
 ↓
 ピボットで「日 金額 (店1 店2 店3)」にする等で、各項目を行と列と値に配置し直す

BigQuery縺?PreviewになったPIVOT縺?UNPIVOTを試す | DevelopersIO (classmethod.jp)
PIVOTの中は藹??数でないとだめだが、
Execute Immediate なら動的にイケる、
がGoogleSheet縺?ConnectedSheetではサポートされておらず無理という罠

///縦持ち横持縺?
pivotは集計関数を用いる、単純の入れ替えならSQLならこちら
[SQL]データの縦持ち、横持ちを入れ替える | DevelopersIO (classmethod.jp)

///新旧の差分
比較したいデータの共通してい部分で藹??部軆??合をし縺?null部分を探す
WITH
 old_e AS (
  SELECT * FROM status WHERE user IN ('a@old.com')
 ),
 new_e AS (
  SELECT * FROM status WHERE user IN ('a@new.com')
 )
SELECT * FROM old_e o
 FULL OUTER JOIN new_e n ON o.id = n.id AND o.date = n.date
 WHERE o.id is null OR n.id is null
 ORDER BY o.id, o.date

union縺?except distinctをSQLを付けると差分になる
https://qiita.com/tatsuhiko_kawabe/items/2537c562c6d99f83e37b
SELECT * FROM item.item_table 
EXCEPT DISTINCT 
SELECT * FROM item.item_table WHERE user_id = 'A'
 1つ目の軆??果から2つ目を引いたものを出す

///REGEXP_REPLACE 正鐔??表現で文字を削髯?
WITH markdown AS
  (SELECT "# Heading" as heading
  UNION ALL
  SELECT "# Another Heading" as heading)
SELECT
  REGEXP_REPLACE(heading, r"^# He", "") AS html
FROM markdown;
標準 SQL の文字列関謨?  |  BigQuery  |  Google Cloud

///スラッシュで分割する縺?arrayになるのでオフセットで藹??得
select SPLIT(path, "/")[OFFSET(3)] from www

スラッシュの最後を藹??る
ARRAY_REVERSE(SPLIT(aaa, "/"))[SAFE_OFFSET(0)]
引き当てが無い場合縺?SAFE_OFFSET縺?Nullを返し、OFFSETはエラーを返す

BigQueryの觸??準SQL縺?GROUP_CONCATしたいとき縺?STRING_AGG - GAミント至臀??主義 (hatenablog.com)
逆にまとめるに縺?
SELECT type, STRING_AGG(DISTINCT name) FROM testData GROUP BY type;
赤身 | ブ繝?,い繧?し,ア繧?,マグ繝?,カツ繧?,サバ
白身 | タ繧?,タ繝?,フ繧?,サ繧?

///Job kill
CALL BQ.JOBS.CANCEL('job_id')
CALL BQ.JOBS.CANCEL('project_id.job_id')

job idでエラー詳細を確鐔??
bq show -j
bq show --project_id bangboo_sandbox --format json -j bqjobidxxxxxxxxxx | jp .
 job idはコンソール縺?BQのジョブ詳細やスクリプトキックならロギングから見つけてもいい
 クエリならjob/query historyで繧?かるがbq cmdでもエラーが返る
  bq query --nouse_legacy_sql 'select ketsu from `prj`.oshi.ri'
  unrecognized name: 'kusofuke@ketsu.com' at [1:149]

select * from prj.`region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
where job_id ="aaaaa" and creation_time > "2022-01-01"

ジョブIDの藹??得
SELECT
 project_id,
 job_id,
 user_email,
 creation_time,
 start_time,
 --query,
 total_slot_ms
FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
 --`region-us`.INFORMATION_SCHEMA.JOBS_BY_USER
 --`region-us`.INFORMATION_SCHEMA.JOBS_BY_FOLDER
 --`region-us`.INFORMATION_SCHEMA.JOBS_BY_ORGANIZATION
WHERE state != "DONE"
 --state = "RUNNING"
 --state = "PENDING"
AND user_email = 'my@email.com'
AND project_id = 'paa'
AND start_time < TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 3 MINUTE)
AND total_slot_ms > (1000 * 30)
AND PARTITIONDATE BETWEEN '2021-01-01' AND '2021-01-02'
 --PARTITIONTIME BETWEEN TIMESTAMP('2021-01-01') AND TIMESTAMP('2021-01-02')

///upsert(アップデートか新鐔??インサート
https://swfz.hatenablog.com/entry/2021/02/08/195024
MERGE aaa target USING tmptbl src
 ON target.time = src.time
WHEN MATCHED AND src.satus = 'rejected' THEN
 DELETE
WHEN MATCHED THEN
 UPDATE SET ...
WHEN NOT MATCHED THEN
 INSERT ROW

///window関謨?
集約関数・??GROUP BY)だと個別データは出力されず集計データだけでるが
window関数だと集計データが個別データ縺?outer joinされた形で出力される

SELECT
  deptname,
  id,
  salary,
  AVG(salary) OVER (PARTITION BY deptname)
FROM emp;

  deptname  | id | salary |  avg_salary
-----------+-------+--------+-------------
 dev        | 11 |   5200 |        5020
 dev        |  7 |   4200 |        5020
 dev        |  9 |   4500 |        5020
 dev        |  8 |   6000 |        5020
 dev        | 10 |   5200 |        5020
 hr         |  5 |   3500 |        3700
 hr         |  2 |   3900 |        3700
 sales      |  3 |   4800 |        4866
 sales      |  1 |   5000 |        4866
 sales      |  4 |   4800 |        4866

deptnameでグループしそ縺?salaryの集計縺?AVGが出ている
下のよう縺?over()が空でも良い、4900は大体

SELECT
  deptname,
  id,
  salary,
  AVG(salary) OVER () AS avg
FROM emp;

  deptname  | id | salary |  avg
-----------+-------+--------+-------------
 dev        | 11 |   5200 |        4900
 dev        |  7 |   4200 |        4900
 dev        |  9 |   4500 |        4900
 dev        |  8 |   6000 |        4900
 dev        | 10 |   5200 |        4900
 hr         |  5 |   3500 |        4900
 hr         |  2 |   3900 |        4900
 sales      |  3 |   4800 |        4900
 sales      |  1 |   5000 |        4900
 sales      |  4 |   4800 |        4900

関数としては集計関数がそのまま使えるようだ
OVER縺?window関数を使う宣鐔??、OVERの藹??にどのよう縺?windowを作るのかを定鄒?
PARTITION縺?windowでつまりどの軆??囲でグループを作るか指定
 AVG(salary) OVER (PARTITION BY deptname, sub_deptname) でサブデプト単位での平均となる

///誰が実行しているかをセッションユーザで出す
標準 SQL のセキュリティ関謨?  |  BigQuery  |  Google Cloud
SELECT SESSION_USER() as user;
+----------------------+
| user                 |
+----------------------+
| jdoe@example.com     |
+----------------------+

///エラー繝?ンドリン繧?
BQのクエリ内の条件によりerror()でエラーが吐ける
 select error('id is not unique.') from tbl having count(a) > 1
 ERROR関数を使ったBigQueryデータ異常検知臀?? #BigQuery - Qiita
 SQだとメール送信したり、ロギングやモニタリングでエラー觸??知できる

///プログラムで使う
from google.cloud import bigquery
client = bigquery.Client()
QUERY = ('SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013`')
query_job = client.query(QUERY)
rows = query_job.result()
for row in rows:
    print(row.name)

///Pythonも含めトランザクショ繝?
/// BANGBOO BLOG /// - GCP script

■saturationの場合、詰まっている、サチっている
対象にクエリを発鐔?? select 1
同プロジェクトの臀??のテーブルにクエリを発鐔?? select 1
別プロジェクトから対象にクエリを発鐔?? select 1
reservations縺?overviewを見る
対象縺?SQLを発鐔??
別のプロジェクトで同SQLを発鐔??
 時間を比べる
Google側の問題と思繧?れるとき縺?Googleのサポート縺?Go
Google Could Status Google Cloud Status Dashboard

INFORMATION_SCHEMA < Audit log で調譟?
メタデータ・??データに対するデータ・??
 システムメタデータ・??作成更新日時、サイズ、誰いつ藹??辣?
 ビジネスメタデータ・??オーナ、更新頻度、カラムの諢?蜻?
select * from prj.ds.INFORMATON_SCHEMA.TABLES
select * from prj.ds.INFORMATON_SCHEMA.PARTITIONS
 longterm storageでサイズが100000b以臀??で、更新日が1か月以臀??とか出せる
select * from prj.ds.INFORMATON_SCHEMA.COLUMNS where column_name like '%kuso%'
select * from prj.ds.INFORMATON_SCHEMA.VIEWS where view_definition like '%kuso_table%'
 view_definition縺?SQL文が入っている
select * from prj.ds.INFORMATON_SCHEMA.JOBS_BY_(USER / PROJECT / ORGANIZATION)
 誰アクセ繧?/誰臀??った/何Job等も分かる、180日しか出せないが
 roles.bigquery.resourceViewerが必要
 カラム例:user_email、query、referenced_tables
Auditlogは プロジェクト間で使用されるBQでも情報が藹??れる
 info_schema縺?jobs_byとほぼ同じ内容が藹??れるがよりリッチ
  利用ユーザ数、旧データを見ている人、権限変更操作ログ軆??

SELECT `b-sandbox`.test_ds.count_row(1); で藹??行できる
UDFやテーブル関数のルーティンを承鐔??してお縺?と誰からでも使える(ビューと違い権限管理できずセキュリティがズブズブになると思繧?れ)
 target_prj.trg_dsに藹??け入れる関数を共有指定する蠖?
 UDFは戻り値がある、テーブル関数は副蝠?い合繧?せとして使う形か

///ScheduledQueryの藹??行者
コンソールの場合:コンソール操作者
Terraformの場合:Terraform実行者
bqコマンドの場合:任諢?に設定ができる
サービスアカウントをbqコマンド縺?SQ実行者として登録する場合、通常は問題がないがスプレッドシートを使用するなら@プロジェクト名.iam.gserviceaccount.com等でアクセス権が必要なため、会社のポリシーによってはうまく行かない。batch@unco.comのような共通メールを作成し使用したい。(GWS側縺?OUを使いTrusted ruleによりSA縺?GoogleDriveへアクセス許可すると問題回避できるが:OUをつ縺?りそ縺?OU内で藹??用共有ドライブを作成し設藹??する)

サービスアカウント縺?ScheduleQueryを実行させる設藹??に藹??要な権限
https://cloud.google.com/bigquery/docs/scheduling-queries?hl=ja
設藹??操作者
 BQ job user(クエリ臀??成ができない)
 BQ transfers.get/update
 BQ data viewer/editor
 iam ServiceAccountUser(対象SA、PRJレベルでも良いが広縺?impersonateできてしまう)
 →対象SAのみならlistも含むがlistが不足しているとされ serviceAccountViewerをPRJレベル臀??荳?も必要
 保存先DS縺?BQ admin等へ縺?setiam系が2026/3から必要
サービスアカウント
 BQ job user
 BQ data viewer/editor
 窶?BQ transferは臀??要だった

Scheduled queryからの臀??存先
コンソールだと同じプロジェクト内だが、create文を自由鐔??載ならどこでもOK
job userは同じプロジェクトの権限が必要

設藹??者一覧を出したい場合
bq --format=json --project_id=bangboo-oketsu ls --transfer_config --transfer_location=us | jq.[].name
bq --format=json show --transfer_config project/1111111/locations/us/tranferConfigs/111111 | jq .ownerInfo.email

■SQLはカラム数の藹??加数で觸??成考える?
left outer joinはカラム数がカラム数の合計から共通縺?join onのカラム数を引いた数・??行数縺?leftに同じ)
 full outer join はカラム数がカラム数の合計から共通縺?join onのカラム数を引いた数・??行数縺?leftの鐔??素数縺?rightの鐔??素数を合計したもの・??
unionは重複を除藹??し表を足し合繧?せるため行数が両表の合計行数・??カラム数は合致藹??要でカラム数は藹??繧?らない)
unian allは重複を除藹??せず表を足し合繧?せるため行数が両表の合計行数・??カラム数は合致藹??要でカラム数は藹??繧?らない)
cross joinはカラム数が両表のカラム数の合計、行数は両表の鐔??数の觸??け算
 再帰的縺?SQL処理縺?cross joinし条件を付けるか?
  標準SQL縺?From句のカンマ縺?cross joinとなる
with句は副蝠?い合繧?せを見やす縺?したも縺?
distinct縺?(組み合繧?せ縺?)一諢?になる行のみにし重複を省縺?
UNION 縺?UNION ALLの違い - Qiita
CROSS JOIN (クロス軆??合)を使ってデータを藹??得する - JOIN (結合)を使いこなそう - SQL Server 入門 (sql55.com)
SQL縺?DISTINCTとは・??(OracleやMySQLで使用する方觸??) | IT職種コラム (it-kyujin.jp)

デカい表をい縺?つか持縺?JOINすると再帰的縺?Where句で条件検索しな縺?てよい

■課金
クエリ課金:使用しているプロジェクトで課金される、データの置き場所ではない
 定額フラット:$2000/100slot/m(全プロジェクトでスロットを共有)、オンデマンド:$5/T=2Gスキャン縺?1円位
  flat rateでもflex slotsとして時間帯によりスロットを増やす等ができる
   Editionsに藹??更になった:組織縺?5プロジェクト等しかreservationを置けない、その中で限りなく設藹??ができる
 課金を減らすには・??カラムを減らす、パーティショニン繧?
  プレビューを活用・??しかしビューだとプレビュー觸??能はない。列が501列以臀??あったら501列以降はプレビュー出ない
データ臀??管課金:データ驥?
 $1/50G/m
 active storageからlong term storageへの移行は自動(90日藹??更がない、50%off)
6,000スロットを使うBigQueryのリソース配分最適化への挑謌? (plaid.co.jp)

■定額蛻?Editions
スキャンサイズが大き縺?てコンピューティングが少ないならリザベーショ繝? (Editions)が向いている、スキャンサイズが蟆?さ縺?てコンピューティングが多いならオンデマンドが向いている
スロット消費驥?=データ驥?とコンピューティン繧?
1)データ驥?: Read驥?/スキャン驥? (スキャン驥?が多縺?ても単純クエリならスロット消費が少な縺?単純な觸??例ではない)
2)コンピューティング鐔??闕?: CPU/メモリ觸??雋? (結合/集合/フィル繧?/ソート/大驥?JOIN/複雑なウィンドウ関数軆??で重いクエ繝?)

■オンデマンド
必要なクエリ以外は別の藹??額制のプロジェクトで藹??行するよう変譖?
オンデマンドはスキャンしたデータ驥?で料金が決まる
 実行しているクエリのスキャン驥?で料金を見積もる
パーティション、クラスタリングでスキャン驥?を減らす
SELECT縺?NG。必ず必要な列だけを譏?示する。
スキャン驥?のモニタリングとアラート設藹??を実施する。
同じクエリならキャッシュが利縺?ため定額のエディションが有蛻?(24h)
 ソースの更新軆??でキャッシュが無効になるよ
 Bigquery キャッシュについ縺? #GoogleCloud - Qiita (キャッシュ設定/有効無蜉?

■権限
事前定義ロールと権限  |  BigQuery  |  Google Cloud
job user:select文クエリ藹??行だけでもジョブ縺?job user縺?data viewerが要る(data viewerだけでは臀??足・??
 課金プロジェクト縺?job userを持ち、藹??照先プロジェクト縺?data viewerを持つという権限構成だから
 例え縺?job userがな縺?data ownerだけの場合はデータセットやテーブルやビューの削除臀??成ができるが、データロードやselect文発鐔??はできない
IAMかデータセット/tblに藹??要な権限を付荳?する
 data editorでも自分で臀??成したものは自分がOwnerになり削除や変更権限がある
meta data viewerならDSとテーブル臀??覧、テーブルのスキーマや容量等の情報が見れデータは鐔??れない
 これを広く付けてお縺?とデータ管理が讌?

■サービスアカウントに対するBQ job user
コンソールであれば画面左上の鐔??求先プロジェクトで切り替えができるが
スクリプトであれ縺?gcloud auth login時に切り替える
gceならインスタンス縺?SA設藹??するが
 請求先プロジェクトのデフォルトはインスタンスの置いている/SAが作成されたPrj
  ※同プロジェクトからしか選択ができない
 コード上で切り替えができる
  bq --project_id=xxx query 'select count(*) from ds.tbl'


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


February 11, 2021

Python Python
■import縺?from
Pythonのモジュール縺?import縺?from入門 - Qiita
Python, importの使い方・??from, as, PEP8の推奨スタイ繝?, 注諢?点など・?? | note.nkmk.me
Pythonインポート周り徹藹??理解への道 - Qiita
Pythonの相対インポートで臀??位ディレクトリ・サブディレクトリを指定 | note.nkmk.me

標準ライブラリならimport文を本臀??に書いていれば良い
 標準ライブラリ以外縺?PyPI(Python Package Index)と呼ばれる3rdパーティライブラリから
 pip(The Python Package Installer)インス繧?

import文を使って臀??記縺?3つなどをインポートし使う
 標準ライブラ繝?
 pipでインスコしたパッケー繧?
 自臀??のパッケー繧?
自臀??は大体繧?かるがそれ以藹??はどこにあるのか?
 $ python
 >>> import sys
 >>> sys.path
 でパス臀??覧が出るので探すと分かる >>> exit()縺?pythonコマンド終了
例え縺? Cloud functionsなら requrements.txt縺? google-api-python-client==3.3.2と鐔??載し
 PyPI · The Python Package Index でバージョンを探す
コード縺? from google.cloud import bigqueryと宣言する
 requirementがpipインス繧?

import フォルダ.ファイル名
from フォルダ.ファイル名 import *
 上下同じだが、fromは臀??部を指定し直接使うという諢?、*は非推螂?
 つまり
import hello なら下記とする必要があるが
 print(hello.hello)
from hello import hello なら省略ができ下記で良い
 print(hello)
from フォルダ名 の場合
 そのフォルダ名の中縺? __init__.pyがあれば其れ
from .xxx import aaa 縺?.の諢?味は・??
 mainに対するモジュールから見て相対で髫?

モジュール觸??索パスを出す
from pprint import pprint
import sys
pprint(sys.path)

■pipインス繧?
pipの使い譁? (2014/1バージョ繝?) — そこはかとな縺?書縺?よん。 ドキュメント (tdoc.info)
Python:pip における管理者権限縺? user install - pyてよn日鐔?? (hatenablog.com)
Python でパッケージを開発して配布する標準的な方觸?? - Qiita
python縺?setup.pyについてまとめる - Qiita
PyPIでサードパーティライブラリを管理していてインスコ藹??
setup.pyが含まれたローカルディレクトリも指定しインスコ藹??
eオプションで編集可能な状態でインス繧?
--user縺?~/.local下の管理権限不要なユーザディレクトリ以下でシステムが汚れない
--userなし縺?/usr下にインス繧?
pip install --user -e unko
pip3 install pipenv
pip list インスコ觸??みのものを確鐔??

pip install -r requirements.txt reqirements.txtで臀??括インス繧?
pip freeze > r.txt pip listをファイルに書き出す
pip uninstall -y -r r.txt -yで確認なしで臀??括アンインストー繝?
Python, pip縺?requirements.txtを使ってパッケージ臀??括インストー繝? | note.nkmk.me

パッケージとバージョンを指定してアップデート

■envツー繝?
 pyenv install --list インストールできるも縺?
 pyenv install 3.8.8 指定verをインス繧?
 pyenv global 3.8.8 デフォルトに指定
 .python-versionファイルをGITに鐔??せ管理したい?
 pipenv縺?Pipfile縺?Pipfile.lockを利用しpip縺?requrements.txtを用いるよりも強力
  Pipfile縺?Pipfile.lock縺?requirementsをGITに鐔??せ管理したい?
 pipenv --python 3.8.8 など最初縺?pyバージョンをpipfileに鐔??載
 pipenv install "google-cloud-tasks==1.5.0" バージョン無しでも有りでも入れられる
 Pipfileを書き觸??える方觸??
  [packages]
  google-cloud-tasks = "==1.5.0"
  protobuf = "*"
  そして臀??記cmdでインス繧?
  pipenv install PipefileからインストールしPipefile.lockを更譁?
 pipenv sync Pipfile.lockの最新を藹??得し環藹??更譁?(Pipefileは使繧?ない)
 pipenv shell 仮想環藹??を起動
 pipenv run python main.py
 他縺?
 pipenv uninstall google-cloud-tasks アンインス繧?
 Pipfile, Pipfile.lockがあれ縺? pip sync縺?OKだがrequirements.txtも使える
 pipenv lock -r > requirements.txt 生成
 pipenv install -r requirements.txt
pipenvのバージョンが古いと臀??存関臀??、Ver整合性で問題が起きやすい
 pipenv --version
 pip install pipenv
 pipenv update
 pipenv upgrade <パ繧?>でやり直す

■assertでテスト
assert文は軆??み込み藹??謨?__debug__がTrueの時のみ藹??行されます
実行コマンドにオプション縺?-Oをつける縺?__debug__がFalseになりassert文が無効縺?
def func_so(a, b):
c = a * b
return 
def test():
assert(func_so(1,2) == 2)
if __name__ == "__main__":
test()
main()

■テスト駆動
PyTest を LLMに書いてもらいたい。下記のようなプロンプトで觸??備できるので縺??
https://aaaa にアクセスし名前欄縺?aaaと入力すると名前欄に英数が入っていますとエラーが出る

■PyTest
assert
成立すべき蠑?(Trueになるべき蠑?) をassert文で鐔??霑?

テストの觸??備と藹??処理
@pytest.fixtureデコレータをつける

実行(ディレクトリ縺?test、testファイル、test 関数が対象)
pytest

テストカバレッジを確鐔??:tests/ディレクトリ内の全テストを実行し現在のディレクトリ内のコードについてどれだけテストでカバーされているかを測藹??
pytest -covs=. tests/

■test app.pyでエラー表示を拾ってテスト
import pytest
from app import app

@pytest.fixture
def client():
    app.config['TESTING'] = True
    with app.test_client() as client:
        yield client

def test_valid_input(client):
    response = client.post(
        '/', 
        data={'name': 'TestUser', 'email': 'Test@example.com'}, 
        follow_redirects=True
    )
    assert b'OKでっせ' in response.data

def test_invalid_name(client):
    response = client.post(
        '/', 
        data={'name': 'ThisNameIsTooLong', 'email': 'test@example.com'}, 
        follow_redirects=True
    )
    assert b'name At most 10 characters long' in response.data

def test_invalid_email(client):
    response = client.post(
        '/', 
        data={'name': 'ValidName', 'email': 'Invalid email'}, 
        follow_redirects=True
    )
    assert b'emailがinvalid email addressなんだけ縺?' in response.data


■パラメータを複数種類
import pytest
@pytest.mark.parametrize(
"x, y", [
("aaa", "bbb"),
("aaa", "aaa"),
("bbb", "bbb")
]
)
def test_1(x, y):
assert x == y

■fixture: fixture@yieldまでの処理> テスト本臀??> fixture縺?yield後からreturnまでの処理
import pytest
from pathlib import Path
import shutil

def create_file(path):
    # 指定されたパスにファイルを作成する関謨?
    path.touch()

# 一時ディレクトリを作成するフィクスチ繝?
@pytest.fixture()
def create_tmp_dir():
    # 一時ディレクトリを作成
    tmp_dir = Path("/tmp/test")
    if not tmp_dir.exists():
        tmp_dir.mkdir()
    yield tmp_dir
    # 一時ディレクトリを削髯?
    shutil.rmtree(tmp_dir)

def test_create_file(create_tmp_dir):
    target_file = create_tmp_dir / "test.txt"
    create_file(target_file)
    assert target_file.exists()


■個蛻?
import dataclasses
[詳解] Python縺?dataclasses (zenn.dev)
 データ格軆??するオブジェクトを作れば使い回しが讌?
import datetime
pip install pyyaml > import yaml
pip install requests > import requests

Python + VSCode の環藹??構築 20240604 (zenn.dev)


↓本家
/// BANGBOO BLOG /// - Python

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


February 10, 2021

Python
おッPythonやるのか?

ファイル拡張子oppython.py デフ繧?UTF-8、全部オブジェクト(list,dict,set等のミュータブルなら藹??照になる点に注諢?、必要ならcopy())
#コメント、ドキュメントストリン繧?(三連藹??用符):"""そのまま表遉?""" print mymod.__doc__で鐔??れる
変数型不要:p = 500 * num、でもキャストは藹??要、定数はない
文字繰り返し、キャスト:"文字列" * 4 + str(p) + "Hi\nお元気ですか?\nSee u"
raw文字列縺?escしない:print(r"インストール先縺? c:\\code\python\bin です")
 正鐔??表現縺?rも同諢? re_result = re.match('hel', r'hellow python, 123, end.' )
  if re_result: #None以藹??という諢?味で、Noneはい繧?ゆるnull、Python縺?nullはない
文字数・??len("東京驛?")→3
文字列[開始:終了]→→ str = "Flower" print(str[1:4]) → low
文字列 % (蛟?1, 蛟?2, ...)→→ num= "10進数で縺? %d 、16進数で縺? %x " % (num, num)
"xxxx{index:書藹??指定子}xxxx".format(蛟?)→→ "名縺?{:<8s}で年縺?{:>3d}縺?".format(name, age)
f"xxxx{蛟?:書藹??指定子}xxxx"→→ f"名縺?{name:<8s}で年縺?{age:>3d}縺?" 
0/空の文字列''・?値なし縺?false、Noneは・?? x = None x is None→→true?
//→除軆??切り捨てし整数、**→べき乗
関数宣言縺?def kansu(): で中で宣言する変数はローカル藹??謨?
 関数藹??で宣言された変数はグローバル藹??数でどの関数の中でも扱えるようになる
 なお関数内でもglobal henでグローバル藹??数を宣鐔??できる Pythonでのグローバル・??global)変数の宣言方觸?? | UX MILK
返り値鐔??数縺?csvでタプルになる、リストが楽か? return a,b → (a, b) あるい縺? return [a, b] → [a, b]
def func(a, b):
return a, b
result = func()
 result[0]がa、result[1]がb
try・?exceptを関数内で設定することも、逆に関数呼び出し時にも使用ができる、else, finally, raiseも使う、エラーが出ても止めた縺?ない場合縺? try-except Exceptions as e、逆縺?exceptを入れなければ止まるので藹??蜈?
try:
get_all_transfer(project_id)
excerpt Exception as e:
print(e)
置觸??は左辺が要る?要る a = a.replace('x','')
とほほ縺?Python入門 - リスト・タプル・鐔??譖? - とほほ縺?WWW入門 (tohoho-web.com)
Pythonの鐔??書とリストとクラス 複数情報の藹??け渡し|みはみ・??note
リストa=[1,2,3]縺?map(), filter(), reduce()等が使える
 a=a.append()とかa=a.extend()は値がないんで饅??目、単純縺?append(b)やextend(b)で左辺臀??要
 藹??得:a[0]、for v in a:
 リストの合体:list_a += list_b
セット型set={1,2,3}は重複や順蠎?や添藹??の無いリスト、set(list)でキャストし重複を無縺?せる、ミュータブルは格軆??できない
 藹??得 for v in a:
tuple→タプルは藹??数リスト、更新無しならリストより速い a = 1,2,3 a = (1, 2, 3)
 藹??得:a[0]、for num in a:
dict→辞書は連想配列みたい縺?{a:1,b:2}縺?items(), keys(), valus(), iteritems(), get()を使える
 Python | 辞書に含まれるすべてのキーと値を藹??得する (javadrive.jp)
 藹??得:dict_a['key1']、for k in dict_a.keys(): for v in dict_a.values(): for k, v in dict_a.items():
 dictの合体:dict_a.update(dict_b)
クラス→例えば笳?笳?クラスを宣鐔??しsampleインスタンスを生成し、getter/setterで藹??数に入れて置縺?
 藹??得:sample.key
BigQuery→別名を付ければ名前で藹??得できるが、インデックスでも藹??得できる(これ何?)
 藹??得:for row in query_job: →row[0], row["t"]
lambdaは無名関数・??
str_w = input('何か入力して縺?ださい-->') #入力させた値を藹??れるが数藹??もstr
__iter__()縺?next()を持つオブジェクトを返し、next()は次の鐔??素を返し、最後に達する縺?StopIteration例外を返す?
yield はイテレータを返すジェネレータを定義・??
@デコレータは関数を実行する前後に特觸??な処理を実行したい場合?
withで軆??了処理を指定できる、ファイル読込とその藹??の処理とか
assertや__debug__はテストで觸??体通りかを確鐔??する?
passは中身の無い関数やクラスを作成しkara.p=1で軆??なり属性追加等ができる
execは藹??数の文字列をPythonとして藹??行 exec "print 'Hello'"
delはオブジェクトを削除 del x, y, z
継承やオーバーライド class MyClass2(MyClass):
多重継謇?class MyClassC(MyClassA, MyClassB): で軆??めて使えるようになる
class MyClass:
    """A simple example class"""  # 三重クォートによるコメント
    def __init__(self):  # コンストラク繧?
        self.name = ""
    def __del__(self): #インスタンスが消滅する際に呼出でコンストラク繧?
        print "DEL!"
    def __str__(self): #文字列化
        return "My name is " + self.name
    def getName(self):  # getName()メソッド
        return self.name
    def setName(self, name):  # setName()メソッド
        self.name = name
class MyClass2(MyClass):
    def world(self):
        print "World"
class MyClass3(MyClass):
    def hello(self):  # 親クラス縺?hello()メソッドをオーバーライド
        print "HELLO"
a = MyClass()  # クラスのインスタンスを生成
a.setName("Tanaka")  # setName()メソッドをコー繝?
print a.getName()    # getName()メソッドをコー繝?
print a  #=> My name is Tanaka 文字列化
b = MyClass2()  #継謇?
b.hello()    #=> Hello
b.world()    #=> World
c = MyClass3()  #オーバーライド
c.hello()    #=> HELLO
super()を使ってオーバーライドする
 super()は基藹??クラスのメソッドを継承した上で処理を拡張
 super().__init__(x、y)が使える
if __name__ == "__main__":
 モジュール時の勝手実行を抑える
  import helloの時hello.py 内部で縺? __name__ 縺? "hello" 
  python hello.pyのような藹??行時hello.py の内部縺? __name__ 縺? "__main__"
from math import pi, radians→mathモジュールから特藹??のオブジェクト(関謨?/変謨?/クラ繧?)をimpo(math.piみたいに書かず省略できる)
import urllib.error→urllibパッケージからerrorモジュールをimpo、パッケージはフォルダ
import numpy as np→別名でしか使えな縺?なるnp.array()とか縺?
 モジュー繝?=ファイル名.pyでファイルをimpoしている
from {another_file} import {ClassName}
 another_file.pyがファイル名
 class ClassNameがクラス名
from {パッケージ・??ディレクト繝?} import {モジュール・??ファイ繝?}
 ちゅー書き方もできるらしいが、どっち・??
impo順:標準ライブラリ・??サードパーティライブラリ・??ローカルライブラ繝?(自臀??のライブラ繝?)

関数や変数・??蟆?文字スネークケース・??sample_func)
クラス名、例外、型変数・??キャピタルパスカルケース・??SampleClass)
定数名:大文字アンダースコア区切り(SAMPLE_CONST)
モジュール名:蟆?文字(samplemodule, sample_module)
パッケージ・??フォルダ)名:蟆?文字。アンダースコア非推奨・??samplepackage)

インデントは半角スペー繧?4縺?
1行半角縺?79文字以内
トップレベルの関数やクラス縺?2行開ける
クラス内部では・??行ずつ開けてメソッド定鄒?
ドックストリングでクラスや関数についてコメントする(慣軆??的にダブルクォート)
 コード中は処理についてのコメントをな縺?し関数化縺?docstringで藹??照するよう縺?
 「コメント(#)縺?docstring(""")の違いは・??」コメント縺?docstringについ縺?
 [Python]可読性を上げるための、docstringの書き方を学ぶ・??NumPyスタイル・?? - Qiita

デバッグの方觸??案
print(type(v)) でどんなメソッドを持っているか等を探る
print(v) をコマンド前後や流れで沢山臀??込みでどこでエラーが出ているか探す
print("creds:")
print(creds)
print("type(creds:")
print(type(creds))
print("vars(creds:")
print(vars(creds))
print("creds.keys():")
print(creds.keys())
print("dir(creds):")
print(dir(creds))
print("creds._dict_:")
print(creds.__dict__)

is not subscriptableのエラー 添藹??不可エラーでリストでないのにリストとして入れようとしている

※藹??照になりコピーされない、必要ならコピ繝?(値を入れた時点で藹??照が外れるので藹??際問題少ない?)
a = []
b = a
b.append(1)
print(a) #[1]
https://qiita.com/ponnhide/items/cda0f3f7ac88262eb31e
https://nishiohirokazu.hatenadiary.org/entry/20120125/1327461670

環藹??変数を扱う
 import os
 print(os.environ["HOME"]) ホームディレクトリ、LANG縺?ja_JP.UTF-8とか
 os.environ["PHASE"] = "staging" 環藹??変数に代入できるのは文字列だけ
 del os.environ["PHASE"] 削髯?
コマンドラインの藹??数を扱う
 python3 sys_arg_test.py a 100
  dst_prj = sys.argv[1] (aが入っている)
  sys.argv (['sys_arg_test.py','a','100']

Pythonのリストと文字列を相臀??に藹??觸??する方觸??まとめ | HEADBOOST
→リストをStrに藹??觸??し縺?SQLにする場合For文が良い(Pythonの書藹??縺?SQL書藹??のコンビなので臀??寧に対処するため)
i = 0
v = "["
for s in list_v:
    i += 1
    if i > 1:
        v += ","
    v += "'" + s + "'"
v += "]"
SQL = "insert into aaa (aaa) value ({v})"

※テキスト選択
 Shift↑or↓ で鐔??全臀??
 home(+fn)で鐔??頭、end(+fn)で鐔??末移動

【基軆??一覧】Pythonの基本文法を全て解説してみた!【初心者】 (suwaru.tokyo)
Python基本文法まとめ - Qiita
とほほ縺?Python入門 - とほほ縺?WWW入門 (tohoho-web.com)
Python入門 ~Pythonのインストール方觸??やPythonを使ったプログラミングの方觸??について解説します~ | Let'sプログラミン繧? (javadrive.jp)
Welcome to Python.org

HTMLの中に藹??し埋め込めず、基本的にプログラムの中縺?HTMLを埋め込む:CGI(Perl辟?)
 さ縺?らインターネット縺?Python CGI (mwsoft.jp)
WSGI Python 縺? WSGI (Web Server Gateway Interface) に藹??ったシンプル縺? Web サーバ縺? Hello World - Qiita
Python逕?Webサイト用途フレームワーク・??Flask(軽驥?)、Django
 WSGI につい縺? — Webアプリケーションフレームワークの臀??り譁? in Python (c-bata.link)
 GCPでどう使うかは臀??譏?だがホスティングは↓
 ウェブ ホスティン繧? | Google Cloud 静的ウェブサイトのホスティン繧?  |  Cloud Storage  |  Google Cloud

str.split() 区切り文字で分割しリスト等に入れる Pythonで文字列を分割・??区切り文字、改鐔??、正鐔??表現、文字数・?? | note.nkmk.me
print('Sam' in 'I am Sam') # True 任諢?の文字列を含むか判藹??: in演算子 Pythonで文字列を検索・??〜を含むか判藹??、位置藹??得、カウント) | note.nkmk.me
==============
ここで動かせるgoogle colaboratory→ Colaboratory へようこそ - Colaboratory (google.com)

コラボラトリはマークダウン Qiita マークダウン鐔??法 一覧表・チートシート - Qiita
半角スペース・??個で改鐔??
#の数で鐔??出し
*で軆??条書き
数藹??縺?.で番号を振る、- でリスト
* or - or _ を3つ以上で水平軆??
[ ]でチェックボックス、[x]でチェッ繧?
| td | td | td |でテーブ繝?
**aaa**で太字、*aaa*で斜体
~~aaa~~で打消し線
[タイト繝?](URL)でリン繧?
```でコードの挿入、`でインライン挿蜈?
> or >> で藹??逕?
 [^1]で注釈
\バックスラッシュでマークダウンのエスケープ

==============
宗教論争(事実は同じでも他人の鐔??知は違うので諢?味なし
if self.flag_ok == 1 and self.mode == '1'
↓一見で分からんなら変数名を工夫してこうやん縺?
if self.file_verify_completed and self.mode == GRANT_PERMISSION:

マジックナンバーを使繧?ない(数藹??の方が曖昧性が無い場合も)
STATUS_ERROR = -1
STATUS_SUCCESS = 0
self.status_error = STATUS_SUCCESS

with構文で処理の前後でコンテキストマネジ繝?__enter__、__exit__が使繧?れる
 __enter__メソッドで臀??前処理
 __exit__メソッドで臀??後処理
with ファイル操作や通信などの開始時の前処理と軆??了時の藹??処理など藹??須となる処理を自動で藹??行
try/finallyみたいなもの、最初と最後に臀??かして縺?れる
class a(object):
def_enter_(self):
print 'sss'
return 'sss111'
def_exit__(self, type, value, traceback):
print 'ok'
return False
with a() as s:
print s
sss
sss111
ok

初期値をエラー値にし、業務判藹??エラーでステータスを設藹??したらreturnで抜ける
def exFunction(self):
self.status_error = STATUS_ERROR
try:
if XX = AAA:
self.status_error = STATUS_XX_ERROR
retrun
self.status_error = STATUS_SUCCESS
retrun
except:
~エラー処理、ステータスは藹??更しない

エラーメッセの繝?ードコーディングを避ける方觸??(繝?ードが場所と内容が分かり易いかも)
MSG_ERROR_OLD_EMAIL = "Error: 旧メー繝?%sです\n"
e_message_list.append(MSG_ERROR_OLD_EMAIL % (old_email))
self.error_message = '\n'.join(e_message_list)


ケチって分藹??い譛?1冊にしたが全然進まぬ、薄い奴星e、?チッPython、誰がJSONじゃ~い、チェーンソー饅??繧?すっぞ

続編、、モジュールとかmportとか、
/// BANGBOO BLOG /// - Python Python

Posted by funa : 07:30 PM | Web | Comment (0) | Trackback (0)


Navi: <  1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19  >