author: aaaanwz gravatar

gcloudアカウントとプロジェクトを一発で切り替える方法

複数のGCPプロジェクトや異なるアカウントを使って開発していると、gcloud config setを毎回実行するのは面倒です。gcloud config configurationsを使えば、設定をまとめて切り替えることができます。 設定の作成 新しい設定を作成します: 1 2 3 4 5 6 7 8 9 # 新しい設定を作成 gcloud config configurations create my-dev-config # 設定を切り替え gcloud config configurations activate my-dev-config # アカウントとプロジェクトを設定 gcloud config set account user@example.com gcloud config set project my-dev-project 設定の一覧表示 1 2 # 設定一覧を表示 gcloud config configurations list 出力例: 1 2 3 NAME IS_ACTIVE ACCOUNT PROJECT default False old-user@gmail.com old-project my-dev-config True user@example.com my-dev-project 設定の切り替え 1 2 3 # 設定を切り替える gcloud config configurations activate default gcloud config configurations activate my-dev-config よく使うコマンド 1 2 3 4 5 6 7 8 # 現在の設定を確認 gcloud config list # 設定を削除 gcloud config configurations delete my-dev-config # 設定を複製 gcloud config configurations create new-config --activate 実際の使用例 開発環境とプロダクション環境を切り替える場合:...

July 18, 2025

max_stalenessを一括変更するSQL

Datastreamは max_staleness オプションを指定することでDatastreamが作成するテーブルにその値が反映されます。 https://cloud.google.com/datastream/docs/destination-bigquery?hl=ja#use-max-staleness しかし、Datastreamのmax_stalenessの値を後から変更しても既に作成されたテーブルには反映されません。 以下のようなSQLで手動で変更する必要があります。 1 2 3 4 FOR tables IN (SELECT DISTINCT table_schema || "." || table_name AS table_id FROM `region-asia-northeast1`.INFORMATION_SCHEMA.TABLE_OPTIONS WHERE option_name = 'max_staleness' AND table_schema = 'データセット名') DO EXECUTE IMMEDIATE "ALTER TABLE " || tables.table_id || " SET OPTIONS (max_staleness = INTERVAL 1 DAY);"; END FOR;

April 30, 2025

BigQuery日付別テーブルをまとめてDROPするSQL

1 2 3 4 FOR record IN (SELECT DISTINCT _TABLE_SUFFIX AS table_suffix FROM `dataset.table_*`) DO EXECUTE IMMEDIATE "DROP TABLE `dataset.table_" || record.table_suffix || "`"; END FOR;

February 14, 2025

Cloud ComposerのConnectionをエクスポートする方法

TL;DR Cloud Composerで 1 $ airflow connections export connections.json を実行したい場合、 1 2 $ gcloud composer environments run {ENVIRONMENT_NAME} --location={LOCATION} connections export -- /home/airflow/gcs/data/connections.json $ gsutil cat gs://{BUCKET_NAME}/data/connections.json とする。 Cloud Composerに対してAirflow CLIを実行したい場合は以下のようなコマンドで実行できる。 1 $ gcloud composer environments run {ENVIRONMENT_NAME} --location={LOCATION} [COMMAND] -- [SUBCOMMAND] しかしこの方法はCloud ComposerのバックエンドであるGKEにPodを立ち上げてAirflow CLIを実行しているため、 1 $ airflow connections export connections.json のように手元にファイルを保存するコマンドを使うことができない。(Podの中にファイルが生成され、終了とともに消えてしまう) Cloud Composerは /home/airflow/gcs にGCSをマウントしているため、そこにファイルを出力するようにすればOK。 1 2 $ gcloud composer environments run {ENVIRONMENT_NAME} --location={LOCATION} connections export -- /home/airflow/gcs/data/connections.json $ gsutil cat gs://{BUCKET_NAME}/data/connections....

December 16, 2024

GitHub Actionsでterraform CD/CD環境を構築する

概要 terraformでGoogle Cloudのリソースを管理し、GitHub ActionsによるCI/CDを構築するまでの手順をまとめます。 更に以下の要件を実現します。 Credentialを用いず、Workload Identity連携でサービスアカウントの認証をする Pull Requestをオープンした際、terraform plan結果のを自動でコメントする 1. gcloud CLIのセットアップ インストール ログイン 1 $ gcloud auth application-default login 作業するGoogle Cloudプロジェクトの権限を持つアカウントでログインする 2. GCSバケットの作成 tfstateファイルの置き場となるバケットを作成する 3. tfファイルの配置 以下のリソースを定義したtfファイルを配置する 手順2で作成したバケットのimport GitHub Actionsが用いるサービスアカウント GitHub Workload Identity連携の有効化 1 2 3 4 5 6 7 8 . ├── README.md ├── locals.tf ├── main.tf ├── modules │ └── workload_identity │ └── main.tf └── provider.tf locals.tf 1 2 3 4 5 # 定数の定義 locals { project_id = "your-project-name" # UPDATE HERE region = "asia-northeast1" } provider....

July 30, 2024

BigQueryにおけるGA4データの扱いづらさを解決する

背景 Google AnalyticsをBigQueryに連携してSQLで分析しようという時、event_params や user_properties が 1 2 3 4 5 6 7 8 9 10 11 ARRAY< STRUCT< key STRING, value STRUCT< string_value STRING, int_value INT64, float_value FLOAT64, double_value FLOAT64 > > > という大変扱い辛い型のため、以下のようにサブクエリを多用したSQLを度々書いていく必要があります。 1 2 3 4 5 6 7 8 9 SELECT TIMESTAMP_MICROS(event_timestamp) event_timestamp, (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location') AS page_location, (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_title') AS page_title, ... FROM `analytics_123456789.events_*` WHERE _TABLE_SUFFIX BETWEEN '20240101' AND '20240131' このSQLの結果をデータマートにすれば解決かと思いきや、event_paramsにプロパティを追加する度にデータマートをメンテナンスする必要があり運用が非常に面倒です。...

May 6, 2024

グロースハックのための施策テスト設計

PDCAサイクルにおいて、バイアスを除去した効果検証(Check)を行うためにはどのようなPlanningを行う必要があるかをまとめる。 要約 以下のいずれかに該当するようにテストを設計する 施策の対象者の選択(介入)ロジック 指標の予測可否 介入条件の予測可否 介入群と同様なトレンドの群がある 介入を連続値の閾値で決定している 効果検証手法 完全ランダム - - - - 無作為化比較試験 人為的 可 - - - 回帰分析 人為的 不可 可 - - 傾向スコアマッチング 人為的 不可 不可 はい - Causal Impact 人為的 不可 不可 いいえ はい 回帰不連続デザイン a. 無作為化比較試験(A/Bテスト) 適用ケース 無作為に適用される施策であること ex.トップページのデザイン変更 ユーザーアカウントがテスト/コントロール群のどちらに割り振られたかがデータからわかること 特定の条件を満たしたユーザーにのみ影響する施策は選択バイアスを考慮する必要があるためこの手法は使えない。 ex. アンケートに回答したユーザーにクーポンを送付、クーポンの売上への貢献度を調べたい場合など。 アンケートに回答している時点で購入意欲が高く、クーポン有/無のグループの性質が異なっているため比較ができない。 このケースでA/Bテストを適用したければ アンケートに回答したユーザーからランダムでクーポン配布 とすれば選択バイアスを打ち消せるが、サンプル数確保、ユーザー体験、ビジネス機会損失などを考慮する必要がある。 検証手順 施策によって改善される指標を決定 (PdM) ex. 訪問頻度、滞在時間 テスト群の割合、テスト期間の決定(PdM, DS) 施策が適用される人数 (ex. テスト期間中における新トップページのアクセスUU数) が1000人を超えるように見積もる A/Bテストの実施 (Dev) LaunchDarklyなどを用いる 統計的仮説検定 (DS) p-hacking回避のため、2で決めたテスト期間の終了時に一度だけ検定を行う。...

March 4, 2024

BigQuery+SendGridでマーケティングオートメーションを構築する

BigQueryとSendGridを組み合わせて、顧客データを基にパーソナライズしたメールを送信する方法を解説します。 送信したメールの効果測定・分析方法についても少し触れます。 1. SendGridテンプレートの作成 Sendgrid公式ドキュメントを参考に、Dyamic templateを作成します。 今回は以下のようなメールを送りたいとします。 A様への今週のおすすめ商品です! 商品B (1000円) 商品C (1500円) 購入はこちらから! https://example.com Dynamic templateは以下のように記述します。 1 2 3 4 5 6 7 8 {{customer_name}}様への今週のおすすめ商品です! {{#each products}} {{this.number}}. {{this.product_name}} ({{this.price}}円) {{/each}} 購入はこちらから! https://example.com このテンプレートに対して、送信対象ごとに以下のようなデータを埋め込む事が目標になります。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 { "customer_name": "A", "products": [ { "number": 1, "product_name": "商品B", "price": 1000 }, { "number": 1, "product_name": "商品C", "price": 1500 }, ] } 2....

February 1, 2024

特徴量重要度(SHAP)をDataframeで取得する

SHAP を用いて shap.summary_plot() で特徴量重要度のグラフを出力できるが、定量データとして取得したい場合がある。 以下のようにすればDataFrameにできる。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import lightgbm as lgb from sklearn import datasets import shap X = train_df.drop('target', axis=1) y = train_df['target'] model = lgb.train( params={}, train_set=lgb.Dataset(X, y) ) explainer = shap.TreeExplainer(model) shap_values = explainer(X) pd.DataFrame(shap_values.values[0], columns=["feature_importance"], index=X.columns).sort_values( by="feature_importance", ascending=False) feature_importance age 0.045195 gender 0.001254 … …

December 25, 2023

Apache Airflowのstandalone環境でHTTP接続が無期限にハングする問題

概要 Mac OS環境にて airflow standalone でAirflowを立ち上げると、DAGでHTTP接続を行おうとした際に無期限にハングする。 原因 OSXのPythonのバグ 回避策 Airflowを立ち上げる際に NO_PROXY="*" をセットする 1 2 3 $ export NO_PROXY="*" $ export AIRFLOW_HOME=/path/to/airflow/home $ airflow standalone ref: https://github.com/apache/airflow/discussions/35903

December 22, 2023