公藹??
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 RegistryTerraform 縺? 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ステートもターゲットになる)
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するしか)
■セットアップ
作業ディレクトリの臀??成(プロジェクトに対するローカルのフォルダ)
プロバイダを指定した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 Registrygoogle_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ステートだけにあるものを指定して削除軆??もできる
■terraformのバージョン管理
.terraform.lock.hclファイル縺?GCP provider等のライブラリのバージョン管理をしている、pyenv縺?Pipfile.lockみたい縺?Hash差分が記載されている、terraform init等で生成されapply時の設定が担保される、通蟶?tfファイル縺?providerのバージョンを記載すればよいので臀??要と思繧?れる
.terraform-versionファイル縺?terraform自臀??の鐔??求バージョンを担保できる
通常縺?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の最新化、どのタイミングで使う?
■既藹??のリソースを調譟?
terraformer import google --resources=instances,forwardingRules --regions=us-west1 --projects=xxxx-123 とか
既藹??リソー繧?import
https://www.apps-gcp.com/terraformit-gcp/
ダメなら 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 クレデン発鐔??
■プロキシを入れないとアクセスできない、が同セグメントは臀??要なため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
■sudoers につい縺?
どのユーザやグループがど縺?sudo コマンドを利用することができるのかの藹??義の鐔??載があり、ユーザとグループの設定で権限を制御
どのユーザがど縺?sudo コマンドを利用することができるのか $sudo -l
■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譌?`です。"
変数縺?$()とバッククォートを使ってワンライナ繝?
■viエディ繧?
sudo apt install vim
vi text.txt ファイル臀??成あるいは開縺?
vi縺?2つ・??αのモード
┣コマンドモード
┃┗コロンモード(exモード:祖先のラインエディタ・??
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!
■環藹??変数は臀??記の順で探す、なので藹??要なら下位のものを上にコピ繝?
~/.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サーバや外部サービスに登録する等して使う、秘密鍵は譏?かさないこ縺?
$ 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表鐔?? |
|---|
| クラ繧?A | 10.0.0.0 ~ 10.255.255.255 | 10.0.0.0/8 |
| クラ繧?B | 172.16.0.0 ~ 172.31.255.255 | 172.16.0.0/12 |
| クラ繧?C | 192.168.0.0 ~ 192.168.255.255 | 192.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レコードが設藹??されているかを確鐔??
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
■Big queryリファレン繧?
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
`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関数とか色々関数もありそう
■レガシ繝?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 Cloudhttps://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"
}
]
COUNT DISTINCTだが、BigQueryでは觸??算値が返って縺?る??。正確な値が必要な場合は、GROUP EACH BY縺?COUNT(*)を組み合繧?せる
///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 CloudBigQuery縺?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 Overflowselect 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 CloudBQタイムトラベル縺?2-7日前のデータを見れる
タイムトラベルを使用した履歴データへのアクセ繧? | BigQuery | Google Cloud ///UNNEST
UNNESTを知らない縺?BigQueryを使えない? | 4番は司令塔 (pep4.net)ARRAY を一組の鐔??にフラット化するには、UNNEST 演算子を使逕?
SELECT id, title FROM games, UNNEST(titles) AS title
| id | titles |
| 1 | [skyrim, fortnite] |
| 2 | [atvvsmx, mario] |
↓フラット化
| id | title |
| 1 | skyrim |
| 1 | fortnite |
| 2 | atvvsmx |
| 2 | mario |
ただし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 OverflowUnnestでも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 CloudCREATE 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 Cloudwith 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(
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)]
///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 CloudSELECT SESSION_USER() as user;
+----------------------+
| user |
+----------------------+
| jdoe@example.com |
+----------------------+
///エラー繝?ンドリン繧?
BQのクエリ内の条件によりerror()でエラーが吐ける
///プログラムで使う
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 DashboardINFORMATION_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し条件を付けるか?
■課金
クエリ課金:使用しているプロジェクトで課金される、データの置き場所ではない
定額フラット:$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 | Google Cloudjob 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'
$ 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インス繧?
PyPIでサードパーティライブラリを管理していてインスコ藹??
setup.pyが含まれたローカルディレクトリも指定しインスコ藹??
eオプションで編集可能な状態でインス繧?
--user縺?~/.local下の管理権限不要なユーザディレクトリ以下でシステムが汚れない
--userなし縺?/usr下にインス繧?
pip install --user -e unko
pip3 install pipenv
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
import datetime
pip install pyyaml > import yaml
pip install requests > import requests
Python + VSCode の環藹??構築 20240604 (zenn.dev)↓本家
/// BANGBOO BLOG /// - 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行開ける
デバッグの方觸??案
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']
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.orgHTMLの中に藹??し埋め込めず、基本的にプログラムの中縺?HTMLを埋め込む:CGI(Perl辟?)
さ縺?らインターネット縺?Python CGI (mwsoft.jp)WSGI
Python 縺? WSGI (Web Server Gateway Interface) に藹??ったシンプル縺? Web サーバ縺? Hello World - QiitaPython逕?Webサイト用途フレームワーク・??Flask(軽驥?)、Django
WSGI につい縺? — Webアプリケーションフレームワークの臀??り譁? in Python (c-bata.link) GCPでどう使うかは臀??譏?だがホスティングは↓
ウェブ ホスティン繧? | Google Cloud 静的ウェブサイトのホスティン繧? | Cloud Storage | Google Cloudstr.split() 区切り文字で分割しリスト等に入れる
Pythonで文字列を分割・??区切り文字、改鐔??、正鐔??表現、文字数・?? | note.nkmk.meprint('Sam' in 'I am Sam') # True 任諢?の文字列を含むか判藹??: in演算子
Pythonで文字列を検索・??〜を含むか判藹??、位置藹??得、カウント) | note.nkmk.me==============
ここで動かせるgoogle colaboratory→
Colaboratory へようこそ - Colaboratory (google.com)半角スペース・??個で改鐔??
#の数で鐔??出し
*で軆??条書き
数藹??縺?.で番号を振る、- でリスト
* 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