TECH PLAY

株式会社G-gen

株式会社G-gen の技術ブログ

753

G-gen の片岩です。当記事では Vertex AI Custom Training において カスタムコンテナ を使用し、標準では提供されていない LightGBM モデルの学習から 寄与度(SHAP)の出力 まで実行する方法を紹介します。 はじめに ビルド済みコンテナとカスタムコンテナの使い分け カスタムコンテナの利点 構成図 初期設定 データの準備と分割 カスタムコンテナの準備 ディレクトリとリポジトリの準備 学習スクリプトの作成 Dockerfile の作成 コンテナのビルドとプッシュ 学習ジョブの実行 推論と評価指標の確認 分析レポートの解釈 はじめに ビルド済みコンテナとカスタムコンテナの使い分け Vertex AI Custom Training には学習ジョブを実行するためのコンテナイメージとして、大きく 2 つの選択肢があります。 コンテナの種類 特徴 向いているケース ビルド済みコンテナ Google Cloud が用意したイメージ XGBoost や TensorFlow など、標準的なフレームワークをすぐに使いたい時 カスタムコンテナ 自分で Dockerfile を書いて作成するイメージ LightGBM など未提供のライブラリを使いたい時や、独自の処理を組み込みたい時 カスタムコンテナの利点 ビルド済みコンテナでもジョブ実行時の引数に requirements=["lightgbm", "shap"] のように指定することでライブラリを追加できます。ビルド済みコンテナについては以下の記事を参照してください。 blog.g-gen.co.jp しかし実務の本番運用において、実行時にライブラリを動的にインストールすることは、以下のデメリットがあります。 1 点目は、 環境の再現性が低下する ことです。 ジョブを実行するたびにインターネットから最新のパッケージを取得するため、依存ライブラリのバージョンが上がったために突然ジョブが落ちたり、学習結果が変わってしまうといった、本番運用で避けたいリスクを招きます。 2 点目は、 実行のたびにオーバーヘッドが発生する ことです。 毎回ライブラリをダウンロードしてインストールする処理が走るため、余計な待ち時間が発生します。 カスタムコンテナを利用することにより、上記のデメリットを回避できます。 参考 : カスタム コンテナの概要 構成図 当記事で紹介する手順に関する構成図は以下のとおりです。環境構築の負荷を軽減するため、ソースコードの作成や Python 実行環境に Colab Enterprise を使用します。 初期設定 はじめにライブラリのインストールと環境変数の設定を行います。今回は可視化や解釈のためのライブラリ( seaborn 、 shap )も追加します。 # 必要なライブラリのインストール !pip install google-cloud-aiplatform lightgbm shap scikit-learn pandas seaborn matplotlib -q # プロジェクトとリージョンの設定 # ※ ご自身の環境に合わせて書き換えてください PROJECT_ID = "your-project-id" LOCATION = "asia-northeast1" # バケットとフォルダの定義 ROOT_BUCKET = "gs://your-bucket" EXPERIMENT_NAME = "diamonds-lgbm-v1" WORK_DIR = f "{ROOT_BUCKET}/{EXPERIMENT_NAME}" # Vertex AI SDK の初期化 from google.cloud import aiplatform aiplatform.init(project=PROJECT_ID, location=LOCATION, staging_bucket=WORK_DIR) # バケットが存在しない場合のみ作成 !gsutil mb -l {LOCATION} {ROOT_BUCKET} データの準備と分割 データは機械学習デモで使用されるダイヤモンドの価格データを使用します。このデータはカラットなどの数値データや、カットや色といったカテゴリ変数を含みます。 学習データと推論データに分割して Cloud Storage に保存します。 import seaborn as sns from sklearn.model_selection import train_test_split import pandas as pd # データのロード (~54,000行) df = sns.load_dataset( 'diamonds' ) # 文字列カラムを 'category' 型に変換 cat_cols = [ 'cut' , 'color' , 'clarity' ] for col in cat_cols: df[col] = df[col].astype( 'category' ) # 学習データと推論データに 90:10 の割合で分割 train_full_df, test_df = train_test_split(df, test_size= 0.1 , random_state= 42 ) # データの保存 train_filename = "train.csv" train_full_df.to_csv(train_filename, index= False ) test_filename = "test.csv" test_df.to_csv(test_filename, index= False ) # GCS へアップロード !gsutil cp {train_filename} {WORK_DIR}/data/{train_filename} !gsutil cp {test_filename} {WORK_DIR}/data/{test_filename} print (f "学習データ: {WORK_DIR}/data/{train_filename}" ) print (f "推論データ: {WORK_DIR}/data/{test_filename}" ) カスタムコンテナの準備 ディレクトリとリポジトリの準備 Colab Enterprise 上に作業ディレクトリを用意し、Google Cloud 上に完成したコンテナの保存先となる Artifact Registry のリポジトリを作成します。 # 作業用ディレクトリの作成 !mkdir -p custom_container # Artifact Registry にリポジトリを作成 (初回のみ) !gcloud artifacts repositories create custom-training-repo \ --repository- format =docker \ --location={LOCATION} \ --description= "Custom Training Repository" || true 学習スクリプトの作成 コンテナ内で実行される task.py を作成します。 今回はモデルの学習だけでなく、過学習を確認するための学習曲線と、予測の根拠を説明するための寄与度の画像を生成し、モデルと一緒に Cloud Storage へアップロードする処理を組み込みます。 %%writefile custom_container/task.py import argparse import os import pandas as pd import lightgbm as lgb import shap import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from google.cloud import storage from urllib.parse import urlparse import warnings warnings.filterwarnings( 'ignore' ) parser = argparse.ArgumentParser() parser.add_argument( '--train-data-uri' , dest= 'train_data_uri' , type = str , required= True ) args = parser.parse_args() # --- GCS ダウンロード / アップロード用の関数 --- def download_from_gcs (gcs_uri, local_file): parsed_url = urlparse(gcs_uri) client = storage.Client() bucket = client.bucket(parsed_url.netloc) blob = bucket.blob(parsed_url.path.lstrip( "/" )) blob.download_to_filename(local_file) def upload_to_gcs (local_file, gcs_dir): parsed_url = urlparse(gcs_dir) client = storage.Client() bucket = client.bucket(parsed_url.netloc) blob_path = f "{parsed_url.path.lstrip('/').rstrip('/')}/{local_file}" bucket.blob(blob_path).upload_from_filename(local_file) # --- 1. データの準備 --- print (f "Downloading data from {args.train_data_uri}..." , flush= True ) local_train_file = "train.csv" download_from_gcs(args.train_data_uri, local_train_file) df = pd.read_csv(local_train_file) cat_cols = [ 'cut' , 'color' , 'clarity' ] for col in cat_cols: df[col] = df[col].astype( 'category' ) X = df.drop(columns=[ "price" ]) y = df[ "price" ] # スクリプト内で学習用と検証用に分割 (データリーク防止) X_train, X_val, y_train, y_val = train_test_split(X, y, test_size= 0.1 , random_state= 42 ) # --- 2. モデルの学習 --- print ( "Training LightGBM model..." , flush= True ) model = lgb.LGBMRegressor(n_estimators= 100 , random_state= 42 ) # 学習過程を記録するために eval_set を渡す model.fit( X_train, y_train, eval_set=[(X_train, y_train), (X_val, y_val)], eval_names=[ 'train' , 'valid' ] ) # --- 3. 分析画像の生成と保存 --- # ① 学習曲線の描画 lgb.plot_metric(model, metric= 'l2' ) plt.title( 'Learning Curve (MSE)' ) plt.tight_layout() plt.savefig( "learning_curve.png" ) plt.close() # ② SHAP値(寄与度)の描画 print ( "Calculating SHAP values..." , flush= True ) explainer = shap.TreeExplainer(model) shap_values = explainer(X_val.sample( min ( 1000 , len (X_val)), random_state= 42 )) plt.figure() shap.plots.beeswarm(shap_values, show= False ) plt.title( "SHAP Feature Importance" ) plt.tight_layout() plt.savefig( "shap_importance.png" ) plt.close() # --- 4. 成果物のアップロード --- aip_model_dir = os.getenv( "AIP_MODEL_DIR" ) if aip_model_dir: print (f "Uploading artifacts to: {aip_model_dir}" , flush= True ) model.booster_.save_model( "model.txt" ) upload_to_gcs( "model.txt" , aip_model_dir) upload_to_gcs( "learning_curve.png" , aip_model_dir) upload_to_gcs( "shap_importance.png" , aip_model_dir) print ( "Upload completed." , flush= True ) Dockerfile の作成 Dockerfile を記述します。ベースイメージには Python 3.12 を指定し、LightGBM に必要な libgomp1 をインストールします。 %%writefile custom_container/Dockerfile FROM python: 3.12 -slim # LightGBM に必須の OS ライブラリをインストール RUN apt-get update && apt-get install -y --no-install-recommends \ libgomp1 \ && rm -rf /var/lib/apt/lists/* # 必要な Python ライブラリのインストール RUN pip install --no-cache- dir \ pandas scikit-learn lightgbm shap matplotlib google-cloud-storage WORKDIR /app COPY task.py /app/task.py ENTRYPOINT [ "python" , "task.py" ] コンテナのビルドとプッシュ Cloud Build を使用してコンテナをビルドし、プッシュします。 # Cloud Build でビルドとプッシュを実行 REPO_NAME = "custom-training-repo" IMAGE_URI = f "{LOCATION}-docker.pkg.dev/{PROJECT_ID}/{REPO_NAME}/lgbm-shap-trainer:latest" !gcloud builds submit --tag {IMAGE_URI} ./custom_container 学習ジョブの実行 作成した自作コンテナ ( IMAGE_URI ) を指定して、学習ジョブを送信します。引数 base_output_dir を指定することで、指定した Cloud Storage のパス配下にモデルや画像を保存できます。 # ジョブの定義 job = aiplatform.CustomContainerTrainingJob( display_name= "diamonds-lgbm-shap-job" , container_uri=IMAGE_URI, ) # ジョブの実行 print ( "ジョブを送信しました。完了までお待ちください..." ) job.run( machine_type= "n1-standard-4" , replica_count= 1 , args=[ f "--train-data-uri={WORK_DIR}/data/train.csv" ], # 成果物の保存先フォルダを指定 base_output_dir=f "{WORK_DIR}/model_output" ) 推論と評価指標の確認 ジョブ完了後、Cloud Storage から学習済みモデルをダウンロードし、Colab Enterprise 上でテストデータに対する精度評価を行います。 import numpy as np import lightgbm as lgb from sklearn.metrics import r2_score, mean_squared_error import pandas as pd # 1. 学習の成果物のダウンロード MODEL_DIR = f "{WORK_DIR}/model_output/model" print ( "学習済みモデルと分析画像をダウンロードします..." ) !gsutil cp {MODEL_DIR}/model.txt . !gsutil cp {MODEL_DIR}/learning_curve.png . !gsutil cp {MODEL_DIR}/shap_importance.png . # 2. テストデータの読み込み df_test = pd.read_csv(f "{WORK_DIR}/data/test.csv" ) cat_cols = [ 'cut' , 'color' , 'clarity' ] for col in cat_cols: df_test[col] = df_test[col].astype( 'category' ) X_test = df_test.drop(columns=[ "price" ]) y_true = df_test[ "price" ] # 3. ローカル推論の実行 local_model = lgb.Booster(model_file= "model.txt" ) predictions = local_model.predict(X_test) # 4. 評価指標の計算と表示 r2 = r2_score(y_true, predictions) rmse = np.sqrt(mean_squared_error(y_true, predictions)) print ( "-" * 30 ) print (f "評価結果 (データ数: {len(y_true)}件)" ) print (f "R2 Score (決定係数): {r2:.4f}" ) print (f "RMSE (誤差の大きさ): {rmse:.4f}" ) print ( "-" * 30 ) 以下は筆者の環境における実行結果です。R2スコアが 0.98 を超える精度の高いモデルが作成できました。 ------------------------------ 評価結果 (データ数: 5394件) R2 Score (決定係数): 0.9817 RMSE (誤差の大きさ): 543.6218 ------------------------------ 分析レポートの解釈 単に予測精度を出すだけでなく、AI が なぜその予測をしたのか を解釈することは実務において重要です。コンテナ内で生成した学習曲線の画像と SHAP を用いた個別データの分析結果を確認します。 import shap from IPython.display import Image, display print ( "=== 学習曲線 (過学習の確認) ===" ) display(Image( "learning_curve.png" )) print ( " \n === 全体の寄与度 (SHAP Beeswarm) ===" ) display(Image( "shap_importance.png" )) # --- 個別データに対するSHAP(表形式)--- print ( " \n === 特定のデータ(1件目)の予測の根拠 ===" ) explainer = shap.TreeExplainer(local_model) single_instance = X_test.iloc[[ 0 ]] shap_values_single = explainer(single_instance) shap_df = pd.DataFrame({ "特徴量 (Feature)" : single_instance.columns, "実際の値 (Value)" : single_instance.values[ 0 ], "価格への影響 (SHAP値)" : shap_values_single.values[ 0 ] }) shap_df = shap_df.reindex(shap_df[ "価格への影響 (SHAP値)" ].abs().sort_values(ascending= False ).index) base_value = explainer.expected_value predicted_price = predictions[ 0 ] print (f "【ベースライン価格 (平均)】: {base_value:.2f}" ) display(shap_df.style.format({ "価格への影響 (SHAP値)" : "{:+.2f}" }).hide(axis= "index" )) print (f "【最終予測価格】: {predicted_price:.2f}" ) 学習曲線(Learning Curve) を確認すると、学習データと検証データの誤差(MSE)が共に右肩下がりで収束しています。 これは、未知のデータである検証データに対しても過学習を起こすことなく学習ができている証拠です。 全体の寄与度 では、上にある特徴量ほど予測への影響力が大きいことを示しています。横軸の 0 を基準に、右側が 価格を上げる要因 、左側が 価格を下げる要因 です。 プロットの赤色は数値が大きいデータであり、青色は数値の小さいデータを表しています。例えば carat は右側に赤色でプロットされているため、 carat が大きいほど高価になる ことが分かります。 最後に 特定の1件に対する予測の根拠 を表形式で出力しました。 全体の平均価格(ベースライン)を基準として、「重さが0.24カラットと小さいためマイナス評価」「透明度(clarity)がVVS1と高品質であるためプラス評価」といったように、最終的な予測価格に至るまでの内部の計算ロジックをビジネス部門に説明できます。 片岩 裕貴 (記事一覧) クラウドソリューション部 クラウドディベロッパー課 和歌山県在住のエンジニア。興味分野はAI/ML。Google Cloud Partner Top Engineer に選出(2025 / 2026)。
アバター
G-gen の片岩です。当記事では Vertex AI Custom Training を使用して、機械学習モデルのトレーニングから推論まで実行する方法を紹介します。Vertex AI Custom Training を使うことで、クラウド上のフルマネージド環境で機械学習モデルをトレーニングできます。 はじめに 機械学習モデルのトレーニング手法 Vertex AI Custom Training とは 構成図 初期設定 データの準備と分割 学習スクリプトの作成 学習ジョブの実行 推論の実行 推論結果の確認 はじめに 機械学習モデルのトレーニング手法 Google Cloud のマネージドサービスを使って機械学習モデルをトレーニングする方法は、大きく分けて3つあります。 手法 向いているケース Vertex AI AutoML データを用意するだけで、少ない手順でモデルをトレーニングしたい時 BigQuery ML BigQuery のデータを使用して SQL でモデルをトレーニングしたい時 Vertex AI Custom Training モデルの開発環境や工程を細かく制御したい時 当記事では、最も柔軟性の高い Vertex AI Custom Training に焦点を当て、モデルのトレーニングおよび推論を実行する方法をご紹介します。 Vertex AI についての解説、Vertex AI AutoML や BigQuery ML についての詳細は以下の記事を参照してください。 blog.g-gen.co.jp blog.g-gen.co.jp blog.g-gen.co.jp Vertex AI Custom Training とは Vertex AI Custom Training は、PyTorch、TensorFlow、Scikit-learn や XGBoost といったフレームワークを実行できるフルマネージドサービスです。 ローカルで開発した Python コードを Docker コンテナとして実行するため、サーバーの起動や停止といったインフラ管理を意識せず、 コードの自由度 と クラウドのスケーラビリティ を両立できます。 AutoML では対応しきれない細かいチューニングや、独自のアルゴリズムを実装したいエンジニアにとって、有用な選択肢です。 参考 : カスタム トレーニングの初心者向けガイド 構成図 当記事で紹介する手順に関する構成図は、以下のとおりです。環境構築の負荷を軽減するため、ソースコードの作成や Python 実行環境に Colab Enterprise を使用します。 Colab Enterprise については以下の記事を参照してください。 blog.g-gen.co.jp 初期設定 はじめに、ライブラリのインストールと環境変数の設定を行います。 今後、別のモデルを作成する時にバケットを使い回せるようにするため、Cloud Storage はバケットの中にディレクトリを作成します。 # 必要なライブラリのインストール !pip install google-cloud-aiplatform xgboost scikit-learn pandas -q # プロジェクトとリージョンの設定 # ※ ご自身の環境に合わせて書き換えてください PROJECT_ID = "your-project-id" LOCATION = "asia-northeast1" # バケットとフォルダの定義 ROOT_BUCKET = "gs://your-bucket" EXPERIMENT_NAME = "california-housing-xgb-v1" WORK_DIR = f "{ROOT_BUCKET}/{EXPERIMENT_NAME}" # Vertex AI SDK の初期化 from google.cloud import aiplatform # staging_bucket を指定すると、自動生成されるファイルもこのフォルダに整理されます aiplatform.init(project=PROJECT_ID, location=LOCATION, staging_bucket=WORK_DIR) # バケットが存在しない場合のみ作成 !gsutil mb -l {LOCATION} {ROOT_BUCKET} データの準備と分割 データは機械学習デモにしばしば使用される California Housing(カリフォルニアの住宅価格)を使用します。このデータセットは、scikit-learn に含まれています。 モデルの作成に使用する学習データと推論に使用する推論データに分割し、Cloud Storage に保存します。 from sklearn.datasets import fetch_california_housing from sklearn.model_selection import train_test_split import pandas as pd # データのロード data = fetch_california_housing(as_frame= True ) df = data.frame # 学習データと推論データに 90:10 の割合で分割 train_full_df, test_df = train_test_split(df, test_size= 0.1 , random_state= 42 ) # 学習データの保存 train_filename = "train.csv" train_full_df.to_csv(train_filename, index= False ) # 推論データの保存 test_filename = "test.csv" test_df.to_csv(test_filename, index= False ) # GCS へアップロード (フォルダ /data 配下へ) !gsutil cp {train_filename} {WORK_DIR}/data/{train_filename} !gsutil cp {test_filename} {WORK_DIR}/data/{test_filename} print (f "学習データ: {WORK_DIR}/data/{train_filename}" ) print (f "推論データ: {WORK_DIR}/data/{test_filename}" ) 学習スクリプトの作成 Vertex AI Custom Training として実行する Python スクリプトを作成します。今回は機械学習アルゴリズムに XGBoost を採用します。 環境変数 AIP_MODEL_DIR で与えられた Cloud Storage に作成したモデルを保存すると、自動的に Vertex AI Model Registry にアップロードされます。 %%writefile task.py import argparse import pandas as pd import xgboost as xgb from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error import os from google.cloud import storage from urllib.parse import urlparse # 引数の受け取り parser = argparse.ArgumentParser() parser.add_argument( '--train-data-uri' , dest= 'train_data_uri' , type = str , required= True ) args = parser.parse_args() # GCS から学習用データセットをダウンロード parsed_url = urlparse(args.train_data_uri) bucket_name = parsed_url.netloc blob_path = parsed_url.path.lstrip( "/" ) local_filename = "downloaded_train.csv" client = storage.Client() bucket = client.bucket(bucket_name) blob = bucket.blob(blob_path) print (f "Downloading training data from: {args.train_data_uri}" , flush= True ) blob.download_to_filename(local_filename) # 学習用データセットを読み込む df = pd.read_csv(args.train_data_uri) # 特徴量とターゲットに分離し、Numpy Array に変換 target_col = "MedHouseVal" X = df.drop(columns=[target_col]).values y = df[target_col].values # トレーニングに必要な学習データと評価データに分割する X_train, X_val, y_train, y_val = train_test_split(X, y, test_size= 0.1 , random_state= 42 ) # XGBoost モデルの構築と学習 model = xgb.XGBRegressor( n_estimators= 100 , learning_rate= 0.1 , max_depth= 5 , random_state= 42 , objective= 'reg:squarederror' ) model.fit( X_train, y_train, eval_set=[(X_val, y_val)], verbose= True ) # 評価スコアを Cloud Logging に出力する score = model.score(X_val, y_val) mse = mean_squared_error(y_val, model.predict(X_val)) print (f "Validation Score (R^2): {score:.4f}" , flush= True ) print (f "Validation MSE: {mse:.4f}" , flush= True ) # モデルの保存 model_filename = "model.bst" model.save_model(model_filename) aip_model_dir = os.getenv( "AIP_MODEL_DIR" ) if aip_model_dir: print (f "Uploading model to: {aip_model_dir}" , flush= True ) parsed_url = urlparse(aip_model_dir) bucket_name = parsed_url.netloc blob_path = parsed_url.path.lstrip( "/" ).rstrip( "/" ) + "/" + model_filename # Cloud Storage にアップロード bucket = client.bucket(bucket_name) blob = bucket.blob(blob_path) blob.upload_from_filename(model_filename) print ( "Model upload completed." , flush= True ) 学習ジョブの実行 作成したスクリプトをコンテナで実行します。今回は Google Cloud が 提供するビルド済みコンテナを使用するため、Dockerfile の作成は不要です。 また、軽量なモデルのため n1-standard-4 マシンタイプを使用しますが、巨大なモデルをトレーニングしたい場合は GPU を使用することで高速に処理できます。 # ジョブの定義 job = aiplatform.CustomTrainingJob( display_name= "california-housing-xgb-job" , script_path= "task.py" , container_uri= "asia-docker.pkg.dev/vertex-ai/training/xgboost-cpu.2-1:latest" , requirements=[ "pandas" , "google-cloud-storage" ], staging_bucket=WORK_DIR, model_serving_container_image_uri= "asia-docker.pkg.dev/vertex-ai/prediction/xgboost-cpu.2-1:latest" ) # ジョブの実行 print ( "ジョブを送信しました。完了まで5分ほどお待ちください..." ) model = job.run( machine_type= "n1-standard-4" , replica_count= 1 , model_display_name= "california-housing-xgb-model" , # GCS上の学習データパスを引数で渡す args=[f "--train-data-uri={WORK_DIR}/data/train.csv" ] ) ジョブ終了後に Cloud Storage にモデルが保存されていることを確認できます。 Google Cloud コンソールの モデルレジストリの画面でモデルが作成されていることを確認できます。 推論の実行 本番運用では Vertex AI に備わっているオンライン推論やバッチ推論を使用して大量のリクエストを捌きますが、ここでは Colab Enterprise の実行環境上で推論を実行します。 # --------------------------------------- import xgboost as xgb import pandas as pd import matplotlib.pyplot as plt # --- モデルの場所 --- model_gcs_uri = model.uri # GCSのパスを直接指定する場合 # model_gcs_uri = WORK_DIR + "/aiplatform-custom-training-xxxxx/model" print (f "参照モデル: {model_gcs_uri}" ) # 推論データのダウンロード !gsutil cp {model_gcs_uri}/model.bst . !gsutil cp {WORK_DIR}/data/test.csv . print ( "ダウンロード完了。推論を開始します..." ) # モデルの読み込み local_model = xgb.XGBRegressor() local_model.load_model( "model.bst" ) # データの読み込み df_test = pd.read_csv( "test.csv" ) # 推論用に「正解列」を削除したデータフレームを作ります target_col = "MedHouseVal" X_test = df_test.drop(columns=[target_col]) # 推論の実行 # .values をつけて数値行列として渡します predictions = local_model.predict(X_test.values) # --- 結果の表示 --- print ( " \n === 推論結果 (最初の10件) ===" ) for i, pred in enumerate (predictions[: 10 ]): print (f "データ{i}: 予測価格 {pred:.4f}" ) 推論結果の確認 最後に予測結果と正解データを照合して評価指標を計算し散布図を描画します。 from sklearn.metrics import r2_score, mean_squared_error import numpy as np # 正解データの抽出 y_true = df_test[ "MedHouseVal" ] # 精度評価 (答え合わせ) r2 = r2_score(y_true, predictions) rmse = np.sqrt(mean_squared_error(y_true, predictions)) print ( "-" * 30 ) print (f "評価結果 (データ数: {len(y_true)}件)" ) print (f "R2 Score (決定係数): {r2:.4f}" ) print (f "RMSE (誤差の大きさ): {rmse:.4f}" ) print ( "-" * 30 ) # 結果の可視化 (散布図) plt.figure(figsize=( 8 , 8 )) plt.scatter(y_true, predictions, alpha= 0.5 , color= 'blue' , label= 'Predictions' ) # 理想線 (y=x) min_val = min (y_true.min(), predictions.min()) max_val = max (y_true.max(), predictions.max()) plt.plot([min_val, max_val], [min_val, max_val], 'r--' , label= 'Ideal Fit' ) plt.title(f "Actual vs Predicted (R2: {r2:.3f})" ) plt.xlabel( "Actual Price" ) plt.ylabel( "Predicted Price" ) plt.legend() plt.grid( True ) plt.show() 片岩 裕貴 (記事一覧) クラウドソリューション部 クラウドディベロッパー課 和歌山県在住のエンジニア。興味分野はAI/ML。Google Cloud Partner Top Engineer に選出(2025 / 2026)。
アバター
G-gen の三浦です。当記事では、 Google Workspace CLI と、Google が提供する生成 AI CLI ツールである Gemini CLI を組み合わせて、Google Workspace の管理操作を自然言語で行いました。 概要 Gemini CLI とは Google Workspace CLI とは 検証の流れ Google Workspace CLI のセットアップ インストールと初期設定 OAuth 同意設定(Step A) OAuth クライアント作成(Step B) セットアップ完了 CLI の認証 Gemini CLI の設定 動作検証 ユーザーおよびグループのリストアップ 予定のリストアップ(Google カレンダー) ファイルのリストアップ(Google ドライブ) メールのリストアップ(Gmail) 概要 Gemini CLI とは Gemini CLI とは、ターミナルから直接 Gemini の機能を利用できる、オープンソースの生成 AI コマンドラインインターフェイスです。詳細は以下の記事をご参照ください。 blog.g-gen.co.jp Google Workspace CLI とは Google Workspace CLI は、Google Workspace の各種 API をターミナルから操作できるコマンドラインツールです。操作結果を JSON で取得できるため、一覧取得や絞り込み、簡易的な集計にも利用できます。 当ツールは Google の公式サポート対象製品 ではありません 。Google の従業員によって開発されたツールではありますが、公式製品ではなく、技術サポートやその他のサポートは 提供されません 。また、当ツールは Apache-2.0 ライセンスのもとに公開されているオープンソースツールであり、無償で利用できます。また当記事を執筆した2026年3月6日現在では v0.3.3 であり、v1.0 に向けて破壊的変更が入る可能性もあることに留意して下さい。 参考 : googleworkspace/cli - GitHub 当ツールには AI エージェント向けの skills が豊富に用意されており、Gemini CLI などから自然言語の指示で gws コマンドを実行して Google Workspace を操作できるのが特徴です。 当記事で検証した Google Workspace の管理操作は以下のとおりです。 対象 検証内容 Admin SDK Google Workspace のユーザー一覧の取得、最終ログイン日時の集計、所属グループの確認 Google カレンダー 今日の予定一覧の取得、来週の空き時間の抽出 Google ドライブ マイドライブのファイル一覧取得、更新日時による絞り込み Gmail 受信トレイの一覧取得、未読メールの絞り込み なお Google Workspace CLI の利用には、Google Cloud プロジェクト上での API 有効化や OAuth クライアントの作成が必要です。今回は検証用に専用の Google Cloud プロジェクトを用意し、その環境で動作確認します。 参考 : googleworkspace/cli - GitHub 検証の流れ 検証手順は以下のとおりです。 項番 内容 説明 1 Google Workspace CLI のセットアップ Google Cloud プロジェクトの選択、API の有効化、OAuth クライアントの設定を行います。 2 Google Workspace CLI のログイン Google アカウントで認証します。 3 Gemini CLI の設定 Gemini CLI の拡張機能として Google Workspace CLI を導入します。 4 Gemini CLI からの操作検証 Gemini CLI から自然言語で Google Workspace の操作を依頼し、動作を確認します。 Google Workspace CLI のセットアップ インストールと初期設定 以下のコマンドで Google アカウントにログインします。gcloud コマンドが使えない場合、公式ドキュメントの手順に沿ってインストールします。 gcloud auth login 参考 : Google Cloud CLI をインストールする Google Workspace CLI のセットアップ時に API を有効化するため、事前に Cloud Resource Manager API を有効化しておきます。 # 環境変数を設定 PROJECT_ID = " your-project-id " # Google Cloud プロジェクト ID を設定   gcloud services enable cloudresourcemanager.googleapis.com --project = $PROJECT_ID 以下のコマンドで Google Workspace CLI をインストールします。 npm install -g @googleworkspace/cli 以下のコマンドで Google Workspace CLI のセットアップを実施します。 gws auth setup セットアップは 5 つのステップで構成されています。Step 1(gcloud CLI の確認)は自動で完了します。 Google アカウントを選択し、Enter キーを押します。 ┌ gws auth setup ─────────────────────────────────────────────────┐ │ ✓ Step 1 /5: gcloud CLI — found │ │ ▸ Step 2 /5: Authentication │ │ ○ Step 3 /5: GCP project │ │ ○ Step 4 /5: Workspace APIs │ │ ○ Step 5 /5: OAuth credentials │ └─────────────────────────────────────────────────────────────────┘ ┌Select a Google account──────────────────────────────────────────┐ │ ○ ➕ Login with new account │ │▸ ◉ miura@dev.g-gen.co.jp │ │ ○ xxxxxx@example.com │ └─────────────────────────────────────────────────────────────────┘ Google Cloud プロジェクトを選択します。先ほど API を有効化したプロジェクトを選択します。 ┌Select a GCP project─────────────────────────────────────────────┐ │ ○ ➕ Create new project │ │▸ ◉ your-project-id │ │ ○ project-aaa │ └─────────────────────────────────────────────────────────────────┘ 続いて、使用する API を有効化します。選択した API が Google Cloud プロジェクト上で有効化されます。今回は以下の 4 つを選択します。 API 用途 Admin SDK API ユーザー・グループの管理 Google Calendar API カレンダーの予定管理 Google Drive API ドライブのファイル操作 Gmail API メールの送受信・管理 # ◉ が選択済み(今回は Drive / Gmail / Calendar / Admin SDK を選択) ┌Select APIs to enable 4 / 22 selected─────────────────────────────┐ │ ◉ Google Drive drive.googleapis.com │ # 選択 │ ○ Google Sheets sheets.googleapis.com │ │ ◉ Gmail gmail.googleapis.com │ # 選択 │ ◉ Google Calendar calendar-json.googleapis.com │ # 選択 │ ○ Google Docs docs.googleapis.com │ │ ○ Google Slides slides.googleapis.com │ │ ○ Google Tasks tasks.googleapis.com │ │ ○ People ( Contacts ) people.googleapis.com │ │ ○ Google Chat chat.googleapis.com │ │ ○ Google Vault vault.googleapis.com │ │ ○ Groups Settings groupssettings.googleapis.com │ │ ○ Reseller reseller.googleapis.com │ │ ○ Licensing licensing.googleapis.com │ │ ○ Apps Script script.googleapis.com │ │ ◉ Admin SDK admin.googleapis.com │ # 選択 │ ○ Classroom classroom.googleapis.com │ │ ○ Cloud Identity cloudidentity.googleapis.com │ │ ○ Alert Center alertcenter.googleapis.com │ │ ○ Google Forms forms.googleapis.com │ │ ○ Google Keep keep.googleapis.com │ │ ○ Google Meet meet.googleapis.com │ │ ○ Cloud Pub/Sub pubsub.googleapis.com │ └─────────────────────────────────────────────────────────────────┘ OAuth クライアント ID の作成と入力を行います。ターミナルに表示される Step A(OAuth 同意画面の設定)と Step B(OAuth クライアント ID の作成)の手順を実施します。 ┌ gws auth setup ─────────────────────────────────────────────────┐ │ ✓ Step 1 /5: gcloud CLI — found │ │ ✓ Step 2 /5: Authentication — miura@dev.g-gen.co.jp │ │ ✓ Step 3 /5: GCP project — your-project-id │ │ ✓ Step 4 /5: Workspace APIs — 4 enabled, 0 skipped │ │ ▸ Step 5 /5: OAuth credentials — Waiting for manual input... │ │ │ │ Manual OAuth client setup required. │ │ │ │ Step A — Consent screen ( if not configured ) : │ │ https://console.cloud.google.com/apis/credentials/consent │ │ → User Type: External, then save through all screens. │ │ │ │ Step B — Create an OAuth client: │ │ https://console.cloud.google.com/apis/credentials │ │ → ' Create Credentials ' → ' OAuth client ID ' │ │ → Application type: Desktop app │ └─────────────────────────────────────────────────────────────────┘ ┌Enter OAuth Client ID────────────────────────────────────────────┐ │ > │ └─────────────────────────────────────────────────────────────────┘ OAuth 同意設定(Step A) Step A で表示されている URL へアクセスし、[開始] を選択します。 開始を選択 以下の情報を入力し、[次へ] を選択します。 アプリ名: 任意のアプリ名 ユーザーサポートメール: 管理者のメールアドレスを指定 アプリ情報を入力 参考 : Manage OAuth App Branding 先の Step A で User Type: External と指定があったため、[外部] を選択し、[次へ] を選択します。 対象を設定 任意のメールアドレスを入力し、[次へ] を選択します。 連絡先情報を設定 ポリシーを確認の上で、[同意します] を選択し、[続行] > [作成] を選択します。 ポリシーの確認 [対象] へ移動し、テストユーザーの [+Add users] を選択し、セットアップ時に指定した自身の Google アカウントを選択し [保存] を選択します。 テストユーザーの追加 追加確認 OAuth アプリの公開ステータスが テスト中 のため、テストユーザーにアカウントを追加することでアクセスが可能になります。 公開ステータスの確認 参考 : Manual OAuth setup (Google Cloud Console) OAuth クライアント作成(Step B) 次に Step B の URL へアクセスし、 [認証情報を作成] > [OAuth クライアント ID] を選択します。 OAuth クライアント ID を選択 Step B の指定( Application type: Desktop app )に従い、[デスクトップ アプリ] を選択します。 デスクトップアプリを選択 任意の名前を入力し、[作成] を選択します。 OAuth クライアント ID の作成 OAuth クライアント ID とクライアントシークレットが表示されるので、控えておきます。 クライアント ID とシークレットの確認 セットアップ完了 ターミナルへ戻り、クライアント ID とシークレットを入力して Enter を押します。 ┌Enter OAuth Client ID────────────────────────────────────────────┐ │ > XXXXX.apps.googleusercontent.com │ └─────────────────────────────────────────────────────────────────┘ ┌Enter OAuth Client Secret────────────────────────────────────────┐ │ > GOCSPX-XXXXX │ └─────────────────────────────────────────────────────────────────┘ 以下のように表示されれば、セットアップは完了です。 $ gws auth setup { " account " : " miura@dev.g-gen.co.jp " , " apis_enabled " : 4 , " apis_failed " : 0 , " apis_skipped " : 0 , " client_config " : " ~/.config/gws/client_secret.json " , " message " : " Setup complete! Run `gws auth login` to authenticate. " , " project " : " XXXXX " , " status " : " success " }   ✅ Setup complete ! Run `gws auth login` to authenticate. $ CLI の認証 以下のコマンドで認証を実施します。 gws auth login scope(アプリがアクセスできるデータの範囲)の設定画面が表示されるので、今回は以下の 5 つを選択し、Enter を押します。 scope 用途 admin.directory.group.readonly グループ情報の参照 admin.directory.user.readonly ユーザー情報の参照 calendar.readonly カレンダーの予定参照 drive.readonly ドライブのファイル参照 gmail.readonly メールの参照 # [x] が選択済み(今回は Admin SDK(user / group)/ Calendar / Drive / Gmail の readonly を選択) Select OAuth scopes 5 / 72 selected   ───────────────────────────────────────────────────────────────────────────────────────────────── [ ] ✨ Recommended ( All Non-Restricted + Readonly ) [ ] 🔒 Read Only [ ] ⚠️ Full Access ( All Scopes ) ~省略~ [ x ] drive. readonly ⛔ RESTRICTED # 選択 ~省略~ [ x ] gmail. readonly ⛔ RESTRICTED # 選択 ~省略~ [ x ] admin.directory.group. readonly # 選択 ~省略~ [ x ] admin.directory.user. readonly # 選択 ~省略~ [ x ] calendar. readonly # 選択 ~省略~ ───────────────────────────────────────────────────────────────────────────────────────────────── ↑↓ Navigate Space Toggle a All Enter Confirm Esc Cancel   OAuth アプリの公開ステータスが テスト中 の場合、指定できるスコープに上限があります。デフォルトの Recommended は多数のスコープを含むため、明示的に利用するスコープを選択する必要があります。 参考 : Interactive (local desktop) ブラウザが開き認証画面が表示されるため、アカウントを選択します。 アカウントを選択 OAuth アプリから前手順で選択したスコープに対する権限付与の許可画面が表示されるため、内容を確認して [許可] を選択します。 権限許可の設定 You may now close this window. とブラウザに表示されるため、コンソールへ戻り、以下内容が出力されていることを確認します。 { " credentials_file " : " ~/.config/gws/credentials.enc " , " encryption " : " AES-256-GCM (key secured by OS Keyring or local `.encryption_key` ) " , " message " : " Authentication successful. Encrypted credentials saved. " , " scopes " : [ " https://www.googleapis.com/auth/drive.readonly " , " https://www.googleapis.com/auth/gmail.readonly " , " https://www.googleapis.com/auth/admin.directory.group.readonly " , " https://www.googleapis.com/auth/admin.directory.user.readonly " , " https://www.googleapis.com/auth/calendar.readonly " , " https://www.googleapis.com/auth/cloud-platform " ] , " status " : " success " } cloud-platform スコープは gws auth login の実行時に自動で追加されます。 Gemini CLI の設定 以下のコマンドで Gemini CLI の Extension(拡張機能)として、Google Workspace CLI をインストールします。 gemini extensions install https://github.com/googleworkspace/cli 以下の警告が表示された場合、 Y を入力して Enter を押します。 The extension you are about to install may have been created by a third-party developer and sourced from a public repository. Google does not vet, endorse, or guarantee the functionality or security of extensions. Please carefully inspect any extension and its source code before installing to understand the permissions it requires and the actions it may perform.   Agent skills inject specialized instructions and domain-specific knowledge into the agent ' s system prompt. This can change how the agent interprets your requests and interacts with your environment. Review the skill definitions at the location(s) provided below to ensure they meet your security standards. Do you want to continue? [Y/n]:Y この警告は、サードパーティ製の拡張機能がエージェントのシステムプロンプトに指示を追加し、動作に影響を与える可能性があることを示しています。インストール前にソースコードや権限を確認することが推奨されています。 以下のコマンドで google-workspace-cli が拡張機能として登録されていることを確認します。 gemini extensions list 2 >&1 | grep -n " google-workspace-cli "   # 出力例 25:✓ google-workspace-cli ( latest ) 28: Path: ~/.gemini/extensions/google-workspace-cli 34: ~/.gemini/extensions/google-workspace-cli/CONTEXT.md 動作検証 ユーザーおよびグループのリストアップ Gemini CLI を起動し、以下プロンプトを入力します。 Google Workspace のユーザーを一覧で確認したい 以下のように gws コマンドの実行許可が出ることを確認し、許可します。 > Google Workspace のユーザーを一覧で確認したい   Action Required Shell: gws admin users list ...(省略) Allow execution of: ' gws ' ? 1 . Allow once 2 . Allow for this session 3 . No, suggest changes ( esc )   ユーザーが 10 件表示されることを確認します。 # 出力例(各種値はマスク)   ✦ Google Workspace のユーザー一覧(最初の 10 件)を取得しました。   ┌───────────────────────┬──────────────────┬───────────────────────────────────┐ │ ID │ 氏名 │ プライマリメールアドレス │ ├───────────────────────┼──────────────────┼───────────────────────────────────┤ │ 1070 *********** 6529 │ g*** s******* │ 13 ****.***@***************.** │ │ 1161 *********** 2967 │ や******** │ a*************@***************.** │ │ 1015 *********** 9379 │ あ******* │ a******@***************.** │ │ 1161 *********** 5713 │ こ******** │ a*********@***************.** │ │ 1031 *********** 8256 │ し****** │ b**@***************.** │ │ 1158 *********** 3809 │ t*** C***** │ c*****@***************.** │ │ 1089 *********** 0291 │ み******** │ c***************@***************.** │ │ 1071 *********** 2585 │ t*** C** │ c*******.****@***************.** │ │ 1159 *********** 7349 │ で******** │ d*******@***************.** │ │ 1168 *********** 3985 │ t*** s***** │ d****************@***************.** │ └───────────────────────┴──────────────────┴───────────────────────────────────┘   さらに多くのユーザーを確認したい場合や、特定の条件で絞り込みたい場合はお知らせください。   次に以下プロンプトで、最終ログイン日時をもとに集計します。 最終ログインが1週間前のユーザーが何名いるか知りたい Gemini CLI は gws admin users list を実行してユーザーの lastLoginTime を取得し、その結果をもとに最終ログイン日時を集計しました。 # 出力例   ✦ 全ユーザー 100 名を調査した結果、以下のようになりました。   * 最終ログインが 1 週間以上前のユーザー: 71 名 * まだ一度もログインしていないユーザー: 9 名 * 過去 1 週間以内にログインしたユーザー: 20 名 次に、ユーザーが所属している Google グループを確認します。 miura@dev.g-gen.co.jp が所属している Google グループを知りたい Gemini CLI は最初に gws admin groups list を実行しましたが、 fields の指定方法が誤っていたため一度エラーになりました。その後、 fields を --params 内へ移して再実行し、正常に結果を取得できました。 # 出力例(メールアドレスはマスク)   ✦ miura@dev.g-gen.co.jp が所属している Google グループは以下の通りです。   ┌─────────────────────────────────────┬─────────────────────────┐ │ メールアドレス │ グループ名 │ ├─────────────────────────────────────┼─────────────────────────┤ │ m*******************@************** │ m********************* │ │ m***************@************** │ a** │ │ t***@************** │ t*** │ └─────────────────────────────────────┴─────────────────────────┘ 予定のリストアップ(Google カレンダー) 以下プロンプトを入力し、今日の予定を一覧で確認します。 今日の予定を一覧で確認したい。開始時刻、タイトル、参加者の有無だけ出して 本日の予定が一覧表示されることを確認します。 # 出力例   ✦ 本日の予定は以下の通りです。   ┌──────────┬──────────┬────────────────────┐ │ 開始時刻 │ タイトル │ 参加者 │ ├──────────┼──────────┼────────────────────┤ │ 08:00 │ 会議 │ あり ( 自分含め 2 名 ) │ └──────────┴──────────┴────────────────────┘   他に確認したい時間帯や、特定の予定の詳細が必要であればお知らせください。   次に、来週の平日 13:00〜18:00 の空き時間を確認します。 来週の平日、13:00〜18:00 の間で予定が入っていない時間帯を日ごとに教えて 来週の空き時間が日別に出力されることを確認します。 # 出力例   ✦ 来週の平日( 2026 / 03 / 09 〜 03 / 13 )、13:00〜18:00 の空き時間は以下の通りです。     * 3 / 9 ( 月 ) : 13:00 〜 18:00(終日空いています) * 3 / 10 ( 火 ) : 空き時間なし * 3 / 11 ( 水 ) : 13:00 〜 18:00(終日空いています) * 3 / 12 ( 木 ) : 13:00 〜 18:00(終日空いています) * 3 / 13 ( 金 ) : 13:00 〜 14:00、15:00 〜 18:00     予定の調整やミーティングの作成など、他にお手伝いできることはありますか?   ファイルのリストアップ(Google ドライブ) 以下プロンプトを入力し、マイドライブのファイルを新しい順に 10 件取得します。 マイドライブのファイルを新しい順に 10 件だけ確認したい。ファイル名、種類、更新日時を出して Gemini CLI は gws drive files list を実行します。なお、 fields は --fields ではなく --params 内に指定する必要があり、最初の実行でエラーになった後、Gemini CLI が自動で修正し再実行しました。 # 出力例(ファイル名はマスク)   ┌───────────────┬─────────────────────────┬─────────────────────┐ │ ファイル名 │ 種類 ( MIMEタイプ ) │ 更新日時 ( UTC ) │ ├───────────────┼─────────────────────────┼─────────────────────┤ │ **** │ Google ドキュメント │ 2025-07-16 04:52:29 │ │ **** │ Google スライド │ 2025-07-14 15:52:29 │ │ **** │ Google スプレッドシート │ 2025-07-14 15:50:37 │ │ **** │ PDF │ 2025-07-13 13:29:10 │ │ **** │ テキストファイル │ 2025-03-10 07:40:26 │ │ **** │ フォルダ │ 2025-03-10 07:40:24 │ │ … │ … │ … │ └───────────────┴─────────────────────────┴─────────────────────┘   次に、直近 7 日以内に更新されたファイルに絞り込みます。 直近 7 日以内に更新された Google Drive のファイルだけを一覧で確認したい。ファイル名と更新日時を出して 確認した結果、該当ファイルが存在しない場合はその旨が表示されることを確認します。 ✦ 直近 7 日以内( 2026 年 2 月 27 日以降)に更新された Google Drive のファイルは見つかりませんでした。     参考までに、先ほど確認したマイドライブの最新ファイルは 2025 年 7 月に更新された「****」でした。より長い期間(例:直近 1 ヶ月や 1 年)で確認したい場合は、その旨お知らせください。 メールのリストアップ(Gmail) 以下プロンプトを入力し、受信トレイの最新メールを 10 件取得します。 受信トレイのメールを新しい順に 10 件だけ確認したい。差出人、件名、受信日時を出して Gemini CLI は gws gmail users messages list / get を用いてメール一覧を取得し、表形式に整形して表示します(差出人・件名は記事掲載用にマスクしています)。 # 出力例(差出人・件名はマスク)   ┌───────────────┬───────────────┬────────────────────┐ │ 差出人 │ 件名 │ 受信日時 ( JST換算 ) │ ├───────────────┼───────────────┼────────────────────┤ │ ******** │ ******** │ 2026 / 03 / 04 10:50 │ │ ******** │ ******** │ 2026 / 03 / 03 17:40 │ │ ******** │ ******** │ 2026 / 03 / 03 02:01 │ │ … │ … │ … │ └───────────────┴───────────────┴────────────────────┘   次に、未読メールに絞り込んで最新 10 件を取得します。 未読メールを新しい順に 10 件だけ確認したい。差出人、件名、受信日時を出して # 出力例(差出人・件名はマスク)   ✦ 未読メールの最新 10 件は以下の通りです。   ┌───────────────┬───────────────┬────────────────────┐ │ 差出人 │ 件名 │ 受信日時 ( JST換算 ) │ ├───────────────┼───────────────┼────────────────────┤ │ ******** │ ******** │ 2026 / 03 / 04 10:50 │ │ ******** │ ******** │ 2026 / 03 / 03 17:40 │ │ … │ … │ … │ └───────────────┴───────────────┴────────────────────┘ 三浦 健斗 (記事一覧) クラウドソリューション部 2023年10月よりG-genにジョイン。元オンプレ中心のネットワークエンジニア。 ネットワーク・セキュリティ・唐揚げ・辛いものが好き。 Google Cloud Partner All Certification Holders 2025 / Google Cloud Partner Top Engineer 2026
アバター
G-gen のminです。BigQuery の データマスキング 機能を解説します。データマスキングを使うと、機密情報をマスキングして特定できない形でクエリ結果に表示させることができ、分析を阻害せずにデータを保護することができます。 データマスキングとは 概要 列レベルのアクセス制御との違い 仕組み 権限とロール マスキングルールの種類 定義済みルール カスタムマスキングルーチン ルールの優先順位 設定手順 分類とポリシータグの作成 データポリシーの作成 テーブル列へのタグ付け データポリシーの列への直接付与 制約と注意点 互換性のない機能 SQL で利用する際の注意点 コストへの影響 セキュリティの考慮事項 データマスキングとは 概要 BigQuery の データマスキング とは、BigQuery テーブルの特定の列に対して、ユーザーの権限に応じてデータをマスクして表示する機能です。 ポリシータグと呼ばれるタグをテーブルの列に付与することで、誰が機密情報に直接アクセスできるか、あるいはマスクされた状態でアクセスできるか、またマスキングをどのように行うかを定義します。この機能により、分析を阻害せずにデータを保護することができます。 参考 : Introduction to data masking 列レベルのアクセス制御との違い BigQuery で特定の列を保護する他の機能として、 列レベルのアクセス制御 があります。 参考 : BigQueryの列レベルのアクセス制御・行レベルのセキュリティを解説 - G-gen Tech Blog 列レベルのアクセス制御とデータマスキングの主な違いは、「権限がない場合にエラーにするか、マスクして見せるか」という点です。 比較項目 列レベルのアクセス制御 データマスキング 主な目的 特定の列へのアクセス自体を制限する アクセスを許可しつつ、値を加工してマスクする 権限がない場合の挙動 クエリに含めるとエラー(Access Denied)になる 値がマスクされて表示される 分析への影響 クエリ自体が実行できない マスクされた状態で集計や結合が可能 主なユースケース 閲覧を完全に禁止すべき極めて機密性の高い情報 個人の特定は避けつつ、統計分析には利用したい情報 列レベルのアクセス制御では、権限のないユーザーが機密情報の列を含むクエリを実行すると エラー になります。 一方、データマスキングを使用すると、権限のないユーザーでもクエリ自体は成功させつつ、データの値をハッシュ値や NULL、あるいは「XXXX」のように、 別の文字列に置き換えて表示 させることができます。 仕組み データマスキングは、以下のように設定されます。 分類(Taxonomy)とポリシータグの作成 分類はデータの意味的な区分を表すコンテナです。この分類の中に、「個人情報」「機密情報」など複数のポリシータグを定義できます。各ポリシータグには IAM ロールを直接紐づけることが可能です。 データポリシーの作成 ポリシータグに対して、「どのようなマスキングルールを適用するか」と「どのプリンシパルに適用するか」を定義します。 テーブル列への適用 テーブルの列にポリシータグを紐付けます。 ポリシーが適用された列へクエリが実行されると、クエリ実行時に以下のように動的に表示結果に反映されます。 タグに紐づく IAM ポリシーが評価される 対象ユーザーのロールが確認される 必要に応じてマスキングルールが適用される 権限とロール データマスキングの挙動は、ユーザーが持つ IAM ロールによって決定されます。主に以下の2つのロールが関係します。 ロール名 ID 権限の内容 きめ細かい読み取り roles/datacatalog.categoryFineGrainedReader 元のマスクされていない生データを閲覧できる。 マスクされた読み取り roles/bigquerydatapolicy.maskedReader マスクされたデータを閲覧できる。 ユーザーが上記のどちらの権限も持っていない場合、 Access Denied エラーとなり、クエリは失敗します。 マスキングルールの種類 定義済みルール データポリシーには、以下の定義済みのマスキングルールを適用できます。 参考 : Introduction to data masking - Data masking rules ルール名 動作概要 適用可能なデータ型 ハッシュ(SHA-256) 値を SHA-256 でハッシュ化して表示します。同じ値は常に同じハッシュ値になる(決定論的である)ため、JOIN のキーとして利用可能です。 STRING, BYTES メールマスク メールアドレスの @ の前を XXXXX に置き換えます(例: XXXXX@gmail.com )。無効な形式の場合は SHA-256 ハッシュ化されます。 STRING 先頭/末尾 4 文字 先頭または末尾の 4 文字のみを表示し、残りを XXXXX に置き換えます。文字列が短い場合は SHA-256 ハッシュ化されます。 STRING 年月日マスク 日付をその年の1月1日に切り詰めます(例: 2026-02-14 → 2026-01-01 )。 DATE, DATETIME, TIMESTAMP デフォルトのマスキング値 データ型に応じたデフォルト値を返します。 全ての型 NULL 化 NULL を返します。データ型自体もマスクしたい場合に使用します。 全ての型 ランダムハッシュ 読み取りごとに一意のソルトを自動生成して非決定論的にハッシュ化します。同じ値でもクエリごとに結果が変わるため、セキュリティ強度は高いですが、異なるクエリ間での JOIN はできません。ポリシータグでは使用できず、列に直接付与するデータポリシーで使用できます STRING, BYTES カスタムマスキングルーチン 定義済みのマスキングルールの他に、ユーザー定義関数を使用して、独自のマスキングロジックを作成することも可能です。例えば、「電話番号の下4桁だけを表示する」「特定の辞書に基づいて置換する」といった高度な要件に対応できます。 ただし、 STRUCT 型には対応していません( STRUCT の中の各フィールドに対しては適用可能です)。 ルールの優先順位 1つのポリシータグに対して、複数のデータポリシーを設定することが可能です。ユーザーが複数のグループに所属している場合など、複数のルールが同時に適用されるユースケースでは、以下の優先順位に従って、最も具体的で有用性の高いルールが優先されます。 カスタムマスキングルーチン ランダムハッシュ ハッシュ(SHA-256) メールマスク 末尾 4 文字 先頭 4 文字 年月日マスク デフォルトのマスキング値 NULL 化 例えば、あるユーザーに対して「ハッシュ」の権限と「NULL 化」の権限の両方が与えられている場合、優先度の高い「ハッシュ」が適用されます。 参考 : Introduction to data masking - Data masking rule hierarchy 設定手順 参考 : Mask column data 分類とポリシータグの作成 Google Cloud コンソールの BigQuery > ポリシータグ を選択します。 分類(Taxonomy)とポリシータグを作成します。 データポリシーの作成 作成したポリシータグを選択し、データポリシーを管理を選択します。 「マスキングルール」と「対象のプリンシパル(ユーザーやグループ)」を指定します。 指定されたプリンシパルに roles/bigquerydatapolicy.maskedReader ロールが付与されます。 テーブル列へのタグ付け BigQuery のテーブルスキーマ編集画面 > Add policy tag を選択して、対象の列にポリシータグを付与します。 データポリシーの列への直接付与 別の設定手順として、ポリシータグを作成せずに、 データポリシーをテーブルの列に直接紐付ける ことができます。 ただし2026年2月現在、この設定方法は Preview です。また2026年2月現在、コンソール画面からの設定操作はできず、SQL を実行するか、REST API へのリクエストによって設定します。 この設定方法を使う場合は、いくつかの制約事項がありますので、使用の際は必ず公式ドキュメントを確認してください。 参考 : Mask column data - Mask data by applying data policies to a column 以下に、SQL を使った設定操作を紹介します。  CREATE TABLE または ALTER TABLE ステートメントを使用し、 OPTIONS 句でデータポリシーを指定します。 データポリシーの作成 -- 例: データポリシー「ハッシュ(SHA-256)」のマスキングを東京リージョンに作成 CREATE DATA_POLICY `your-project-id.region-asia-northeast1.test_direct_masking_policy` OPTIONS( data_policy_type= " DATA_MASKING_POLICY " , masking_expression= " SHA256 " ); テーブル列へのポリシー適用 -- 例: 既存の列にデータポリシーを適用する ALTER TABLE `your-project-id.your-dataset.your- table ` ALTER COLUMN email SET OPTIONS ( data_policies=[ " {'name':'your-project-id.region-asia-northeast1.test_direct_masking_policy'} " ]); 制約と注意点 互換性のない機能 レガシー SQL サポートされていません。GoogleSQL を使用する必要があります。 ワイルドカードテーブル ワイルドカードを使用したクエリでは、参照されるすべてのテーブルのすべての列に対して、生データの閲覧権限「きめ細かい読み取り」が必要です。 パーティション/クラスタ化列 パーティションまたはクラスタ化キーとして設定されている列に対してデータマスキングを適用した場合、その列を含むクエリはサポートされません。 テーブルのコピー テーブルコピーを行うには、ソーステーブルの全列に対する生データの閲覧権限が必要です。 SQL で利用する際の注意点 マスクされた列を SQL の WHERE 句などで使用する場合、挙動に注意が必要です。 SHA-256 ハッシュなどの決定的なマスキング(同じ入力に対して常に同じ結果が返るもの)では、等価比較( = )や GROUP BY による集計は機能しますが、大小比較( > や < )や LIKE 検索は元の値に基づいた結果にならないため、意味をなしません。 コストへの影響 オンデマンドでの BigQuery の料金はスキャンしたデータ量に基づきます。データマスキングで「NULL 化」や「デフォルトのマスキング値」が適用される場合、その列のデータはスキャンされず、課金対象のバイト数が削減される場合があります。 一方、ハッシュ化などの計算を伴うマスキングの場合、通常通りのスキャン料金が発生します。 セキュリティの考慮事項 SHA-256 ハッシュは決定論的であるため、ブルートフォース攻撃に対して脆弱になる可能性があります。攻撃者が元の値のリストを持っている場合、それらをハッシュ化して比較することで、元の値を推測できる可能性があります。 より高いセキュリティが必要な場合は、NULL 化やデフォルトマスキングルール、あるいは非決定論的なハッシュ化を行うランダムハッシュなど別のマスキング方法を検討してください。ただし、前述のとおり、ランダムハッシュは列に直接データポリシーを付与する場合にのみ使用できます(2026年2月現在、Preview)。 佐々木 愛美 (min) (記事一覧) クラウドソリューション部 データアナリティクス課。2024年7月 G-gen にジョイン。G-gen 最南端、沖縄県在住。最近覚えた島言葉は、「マヤー(猫)」。
アバター
G-gen の助田です。当記事では、 Network Connectivity Center を使い、異なるプロジェクトの VPC ネットワーク同士を接続する手順を解説します。 はじめに Network Connectivity Center とは 検証シナリオ ハイブリッドスポーク使用時の注意点 設定手順 事前準備 プロジェクト A: NCC ハブの作成とスポークの接続 プロジェクト B: スポークの作成と接続リクエストの送信 プロジェクト A: 接続リクエストの承認 疎通確認 ルートテーブルの確認 PING による疎通テスト はじめに Network Connectivity Center とは Network Connectivity Center (以下、NCC)は、Google Cloud 上の VPC ネットワークやオンプレミスネットワーク等を、ハブアンドスポークモデルで一元管理するためのネットワーク接続管理サービスです。複数の VPC ネットワークを統合管理し、推移的ルーティングや拠点間接続を実現できます。 NCC の基本的な仕様や詳細な説明については、以下の記事をご参照ください。 blog.g-gen.co.jp 検証シナリオ 当記事では、ハブを管理するプロジェクト A と、そこへ接続するスポークを持つプロジェクト B の構成を検証します。 具体的には、プロジェクト A に作成する NCC ハブ( ncc-hub-central )に対して、自プロジェクトの VPC ネットワーク( vpc-a )と、別プロジェクトであるプロジェクト B の VPC ネットワーク( vpc-b )を、それぞれスポークとして接続します。これにより、異なるプロジェクトに存在する VPC ネットワーク間で経路情報を交換し、 相互通信が可能な状態 を実現します。 構成図は、以下の通りです。 構成図 リソース定義は以下の通りです。 項目 プロジェクト A(ハブ管理) プロジェクト B(スポーク接続) プロジェクト ID project-a-hub project-b-spoke VPC ネットワーク名 vpc-a vpc-b サブネット subnet-a( 10.0.0.0/24 ) subnet-b( 172.16.0.0/24 ) リージョン asia-northeast1 asia-northeast1 NCC ハブ名 ncc-hub-central - スポーク名 spoke-a spoke-b ハイブリッドスポーク使用時の注意点 当記事ではプロジェクトを跨いだ VPC スポーク の接続手順を紹介しますが、プロジェクト間接続において、ハイブリッドスポーク(Cloud VPN、Cloud Interconnect、ルーター アプライアンス)は、 ハブと同じプロジェクト内に存在する必要 があります。 例えば、外部ネットワーク(オンプレミスや他クラウド等)との接続用リソースをスポーク側のプロジェクト(今回の例ではプロジェクト B)に配置し、プロジェクト A のハブへ接続することはできません。ハイブリッド接続を行う場合は、 ハブ側のプロジェクトへリソースを集約しなければならない という設計上の制約に留意が必要です。 参考 : ハイブリッドスポーク 設定手順 事前準備 プロジェクトを跨いだネットワーク構成とする場合、各プロジェクトでの作業内容に応じて適切な IAM 権限の付与が必要です。今回は以下の作業を実施するため、それぞれのプロジェクトで権限を設定します。 当記事の作業では、プロジェクト A において、ハブの作成や別プロジェクトからの接続承認、および自プロジェクトの VPC ネットワークのスポーク化を行います。この作業のためにハブの作成者が必要な権限は以下のとおりです。 リソース ロール プロジェクト A ・ハブ アンド スポーク管理者( roles/networkconnectivity.hubAdmin ) ・スポーク管理者( roles/networkconnectivity.spokeAdmin ) ・Compute ネットワーク管理者( roles/compute.networkAdmin ) 一方のプロジェクト B では、スポークを作成し、プロジェクト A のハブに対して接続リクエストを送信します。この作業のためにスポークの作成者が必要な権限は以下のとおりです。 リソース ロール プロジェクト A ・グループ ユーザー( roles/networkconnectivity.groupUser ) プロジェクト B ・スポーク管理者( roles/networkconnectivity.spokeAdmin ) ・Compute ネットワーク管理者( roles/compute.networkAdmin ) 上記では、プロジェクト A と B にそれぞれ別の管理者がいる前提で必要な権限を分けて記載しましたが、両方のプロジェクトに対して同じ管理者が操作をしても構いません。 参考 : ハブとスポークを操作する 参考 : 別のプロジェクトでスポークを提案する プロジェクト A: NCC ハブの作成とスポークの接続 まずはネットワークの中心となるハブを作成し、プロジェクト A 自身の VPC ネットワークを接続します。 NCC ハブのトポロジを選択します。今回は相互通信を行うため、 メッシュ トポロジ を選択します。 ハブ -トポロジ選択- ハブ名を入力し、作成ボタンを押下します。(スポークの追加は後ほど行います) ハブ -構成- 続いて、スポークを作成します。先ほど作成したハブに、 vpc-a をスポーク spoke-a として接続します。 スポークA -接続先のハブ設定- スポークA -編集- 同一プロジェクト内のスポーク接続では特別な承認ステップは発生せず、作成直後にスポークのステータスが Active となります。 スポークA -作成完了後- プロジェクト B: スポークの作成と接続リクエストの送信 次に、プロジェクト B でスポークを作成し、別プロジェクトにある NCC ハブへ接続します。 接続するハブのロケーションを指定します。別のプロジェクトにあるハブへ接続するため、 「別のプロジェクト内」 を選択し、ハブが存在する プロジェクト ID と ハブ名 を指定して、次のステップを押下します。 スポークB -接続先のハブ設定- vpc-b をスポーク spoke-b として作成します。 スポークB -編集- 作成完了後、スポークのステータスが 「確認待ち(Pending)」 となることを確認します。 スポークB -承認待ち- この時点では経路情報の交換は行われておらず、VPC ネットワーク間での通信はできません。 プロジェクト A: 接続リクエストの承認 プロジェクト間のスポーク接続においては、ハブ管理者が リクエストを承認する ことでハブへの接続が有効化されます。 プロジェクト A のハブ詳細画面から、ステータスが [確認待ち] のスポークを選択します。 リクエスト内容を確認後、 [スポークを承認] を押下し、接続を承認します。 スポークB -承認実行- 承認後、ステータスが Active となります。 スポークB -承認済- 疎通確認 ルートテーブルの確認 接続完了後、NCC ハブおよび各 VPC ネットワークのルートテーブルを参照し、以下の通りルートが追加されていることを確認します。 NCC ハブのルートテーブル スポーク A( 10.0.0.0/24 )およびスポーク B( 172.16.0.0/24 )のサブネットルートが学習されていることを確認します。 NCC ハブのルートテーブル VPC ネットワーク A のルートテーブル ネクストホップを NCC ハブとする 172.16.0.0/24 へのルートが自動追加されていることを確認します。 VPC-A ルートテーブル VPC ネットワーク B のルートテーブル 同様に 10.0.0.0/24 へのルートが追加されていることを確認します。 VPC-B ルートテーブル PING による疎通テスト 検証用に作成した各 VPC ネットワーク内の VM 間で、プライベート IP アドレスによる疎通を確認しました。 # VPC ネットワーク B の VM から、VPC ネットワーク A のVM(10.0.0.2)へ ping 実行 ping 10 . 0 . 0 . 2 -c 4 PING 10 . 0 . 0 . 2 ( 10 . 0 . 0 . 2 ) 56 ( 84 ) bytes of data. 64 bytes from 10 . 0 . 0 .2: icmp_seq = 1 ttl = 64 time = 1 . 23 ms 64 bytes from 10 . 0 . 0 .2: icmp_seq = 2 ttl = 64 time = 0 . 456 ms 64 bytes from 10 . 0 . 0 .2: icmp_seq = 3 ttl = 64 time = 0 . 421 ms 64 bytes from 10 . 0 . 0 .2: icmp_seq = 4 ttl = 64 time = 0 . 443 ms --- 10 . 0 . 0 . 2 ping statistics --- 4 packets transmitted, 4 received, 0 % packet loss, time 3004ms rtt min/avg/max/mdev = 0 . 421 / 0 . 637 / 1 . 230 / 0 . 342 ms NCC ハブを介して、プロジェクトを跨いだ通信が正常に行われていることが確認できました。 助田 真輝 (記事一覧) クラウドソリューション部所属。2024年11月、G-genにジョイン。クラウドインフラ設計、特にネットワークとセキュリティ分野に強い関心を持ち、関連技術の探求に日々取り組む。
アバター
G-gen の杉村です。2026年2月に発表された、Google Cloud や Google Workspace のイチオシアップデートをまとめてご紹介します。記載は全て、記事公開当時のものですのでご留意ください。 はじめに Google Cloud のアップデート BigQuery でパラメータ化クエリがコンソールから実行できるように Spanner で SQL からリモート関数を実行できるように(Preview) Google Cloud remote MCP Server が Resource Manager に対応(Preview) Gemini Enterprise と NotebookLM Enterprise でクエリ履歴がログ出力 Looker Studio(Pro)で複数のアップデート 複数サービスのリモート MCP サーバーが提供開始(Preview) Cloud KMS の Autokey がプロジェクトレベルで有効化可能に(Preview) BigQuery に新 AI 機能「dataset insights」が登場(Preview) Gemini Enterprise にモバイルアプリが登場(Private GA) App Engine(Standard 環境)からCloud Runへの移行コマンドが Preview Network Intelligence Center の Flow Anlyzer にレイテンシモードが登場 Looker の Conversational Analytics が iframe で埋め込み可能に(Preview) Vertex AI Search の回答用モデルで Gemini 3 Pro が Preview 公開 BigQuery で複数リージョンのデータを結合できるグローバルクエリが Preview Security Command Center の Standard tier が刷新 Gemini 3.1 Pro が登場 Gemini Enterprise でノーコードエージェントの共有が可能に BigQuery でデータセット復元のための UNDROP SCHEMA が GA Cloud Run functions(2nd gen)の Direct VPC Egress が一般公開(GA) ファイアウォールポリシーで Network contexts が使用可能に BigQuery のレガシー SQL が廃止へ(2026-06-01から) Gemini 等の呼び出しの料金体系の選択肢が追加(Preview) Google Workspace のアップデート Chromebook Plus の Chrome ブラウザに Gemini が統合(米国のみ) Google Meet の音声リアルタイム翻訳が一般公開、日本語は未対応 Gmail に校正(proofread)機能が登場 新アドオン「AI Expanded Access」が登場 Google カレンダーにおける DLP(Data Loss Prevention)が Beta 公開 Google ドキュメントで「音声概要」が使用可能になる Google Workspace 管理コンソールで Gemini の使用状況レポートが強化 Gemini アプリで30秒間の音楽を生成できるようになった Googleスプレッドシートに SHEET() 、SHEETS() 関数が登場 Google グループの「組織外のメンバーを禁止」が厳格化 Google フォームの回答結果を Gemini で定量的に分析できるように Google Vids の AI アバター&ボイスオーバー(音声生成)が日本語に対応 Gemini アプリから Google Chat をデータソースとして参照できるように はじめに 当記事では、毎月の Google Cloud(旧称 GCP)や Google Workspace(旧称 GSuite)のアップデートのうち、特に重要なものをまとめます。 また当記事は、Google Cloud に関するある程度の知識を前提に記載されています。前提知識を得るには、ぜひ以下の記事もご参照ください。 blog.g-gen.co.jp リンク先の公式ガイドは、英語版で表示しないと最新情報が反映されていない場合がありますためご注意ください。 Google Cloud のアップデート BigQuery でパラメータ化クエリがコンソールから実行できるように Run parameterized queries (2026-02-02) BigQuery でパラメータ化クエリが Google Cloud コンソールから実行できるようになった。これまでは bq コマンドやプログラムからしか実行できなかった。 パラメータ化クエリ(Parameterized queries)とは、 @変数名 や ? といったプレイスホルダを置いておき、後から値を渡せるクエリのこと。 Spanner で SQL からリモート関数を実行できるように(Preview) Spanner remote functions (2026-02-02) Spanner で SQL からリモート関数を実行できるようになった(Preview)。 Cloud Run または Cloud Run functions に関数をホストして SQL から呼び出し可能。複雑なロジックを SQL から切り離して任意の言語で記述できる。 Google Cloud remote MCP Server が Resource Manager に対応(Preview) MCP Reference: cloudresourcemanager.googleapis.com (2026-02-03) Google Cloud remote MCP Server が Resource Manager に対応(Preview)。 現在のところ使用可能な tool は search_projects のみ。会話の中でプロジェクト ID が必要になったときなど、他の MCP server 等と組み合わせて使用か。 Google Cloud remote MCP Server については、以下の記事を参照。 blog.g-gen.co.jp Gemini Enterprise と NotebookLM Enterprise でクエリ履歴がログ出力 Gemini Enterprise release notes - February 04, 2026 (2026-02-04) Gemini Enterprise と NotebookLM Enterprise でユーザザークエリとレスポンスが Cloud Logging に記録されるようになった。 REST API 経由で明示的な有効化が必要。NotebookLM Enterprise は、ドキュメント上はクエリ履歴は記録されないように見える。ノートブック作成、共有、削除、取得が記録される。 Looker Studio(Pro)で複数のアップデート Looker Studio release notes (2026-02-05) Looker Studio Pro Looker Studio Pro のサブスクリプションが Google Workspace 管理コンソールから購入できるようになった(従来は Looker Studio コンソールから購入) Conversational Analytics で、思考(reasoning)のステップが閲覧できるようになった Looker Studio チャート(図表)を PNG 画像としてエクスポートできるようになった レポート内の特定コンポーネントへのリンクを生成できるようになった 複数サービスのリモート MCP サーバーが提供開始(Preview) Supported products (2026-02-05) 複数サービスのリモート MCP サーバーが提供開始(Preview) Cloud Monitoring Cloud Logging Developer Knowledge API Vertex AI Search Google Cloud remote MCP Server については、以下の記事を参照。 blog.g-gen.co.jp Cloud KMS の Autokey がプロジェクトレベルで有効化可能に(Preview) Enable Cloud KMS Autokey (2026-02-11) Cloud KMS の Autokey がプロジェクトレベルで有効化可能になった(Preview)。 Autokey とは、Cloud KMS の暗号鍵を自動で生成、ローテなどしてくれる機能。ストレージ暗号化のために都度 KMS 鍵を手動で新規作成しなくてよい。 従来は、「フォルダレベルで有効化」する必要があった。 BigQuery に新 AI 機能「dataset insights」が登場(Preview) Generate dataset insights (2026-02-12) BigQuery に新 AI 機能「dataset insights」が登場(Preview)。 あるデータセット内のインサイト情報を生成する。以下が生成される。 データセットの説明(Description) テーブル間の関係性を可視化する「関係グラフ」 テーブル間の関係性を明らかにするための「サンプルクエリ」 ...等。 BigQuery dataset insights Gemini Enterprise にモバイルアプリが登場(Private GA) Gemini Enterprise release notes - February 12, 2026 (2026-02-12) Gemini Enterprise にモバイルアプリが登場(Private GA)。 使用には Google に申請が必要。モバイル端末から企業データを元にした AI タスクが実現可能。 App Engine(Standard 環境)からCloud Runへの移行コマンドが Preview App Engine standard environment for Java gen2 release notes - February 12, 2026 (2026-02-12) App Engine(Standard 環境)からCloud Runへの移行補助コマンドが Preview 公開。 Java、PHP、Node.js、Python、Ruby、Goの各言語に対応。 Network Intelligence Center の Flow Anlyzer にレイテンシモードが登場 Flow Analyzer overview (2026-02-13) ネットワーク管理ツール Network Intelligence Center の Flow Anlyzer に、パケットの RTT を分析可能な「レイテンシモード」が登場(GA)。 VPC Flow logsをもとにしてレイテンシ傾向を確認できる。 Looker の Conversational Analytics が iframe で埋め込み可能に(Preview) Embedding Conversational Analytics (2026-02-17) Looker の Conversational Analytics が iframe で埋め込み可能に(Preview)。 自社サイトやアプリに会話形分析を埋め込める。現在は Looker(Original)でのみ対応であり Google Cloud core では使用できない。 Vertex AI Search の回答用モデルで Gemini 3 Pro が Preview 公開 Answer generation model versions and lifecycle (2026-02-17) Vertex AI Search の回答用モデルで Gemini 3 Pro( gemini-3-pro-preview/answer_gen/v1 )が Preview 公開。 これまでは Gemini 2.5 Flash、Gemini 2.0 Flash のみ。なお Gemini 3 Flash はまだ使えない。 BigQuery で複数リージョンのデータを結合できるグローバルクエリが Preview Global queries (2026-02-17) BigQuery で複数のリージョンに保存されているデータセットを統合して参照できるグローバルクエリ機能が Preview 公開された。 これまでは異なるロケーションのデータ同士は結合できないため転送が必要だった。別プロジェクト同士でも実行可。 Security Command Center の Standard tier が刷新 Standard tier enhanced and automatically activated for some customers (2026-02-11) Security Command Center の Standard tier(無償)が刷新。 2026年2月11日から数カ月かけて自動的に移行される。DSPM などこれまで使えなかった機能が追加される一方で Web Security Scanner custom scans などは使えなくなる。 Gemini 3.1 Pro が登場 Gemini 3.1 Pro: A smarter model for your most complex tasks (2026-02-19) Gemini 3.1 Pro が登場。複雑なタスクやアニメーション生成などでより強化。 Vertex AI、Google AI Studio、Gemini CLI、Geminiアプリ、NotebookLMなどで提供開始。 Gemini Enterprise でノーコードエージェントの共有が可能に Share an agent (2026-02-23) Gemini Enterprise で個人が作成したノーコードエージェントを他人に共有できるようになった。 データソースへのアクセス権も共有されてしまうので注意。管理者による承認を必須にもできる。 BigQuery でデータセット復元のための UNDROP SCHEMA が GA Share an agent (2026-02-23) BigQuery で誤って削除したデータセットを復元するための UNDROP SCHEMA 構文が Preview → 一般効果(GA)された。タイムトラベル期間内のデータが復旧できる。 以下の記事も参照。 blog.g-gen.co.jp Cloud Run functions(2nd gen)の Direct VPC Egress が一般公開(GA) Configure Direct VPC egress for 2nd gen functions (2026-02-24) Cloud Run functions(2nd gen)の Direct VPC Egress が Preview → 一般公開(GA)。 関数から VPC リソースや VPN で接続されたオンプレミスリソースへ、プロキシインスタンスなしでアクセスできる。 ファイアウォールポリシーで Network contexts が使用可能に Network contexts (2026-02-25) ファイアウォールポリシーで Network contexts が使えるようになった。 IP アドレス帯で指定しなくても、コンテキストで接続元や宛先を指定できるようになりルール構成を簡素にできる。使えるコンテキストは以下のとおり。 Internet : インターネットとの送受信トラフィック Non-internet : 非インターネット。ロードバランサ、IAP、VPC など VPC networks : Non-internet のサブセットで、VPC ネットワーク間などの通信 Intra-VPC : Non-internet のサブセットで、同一の VPC 内での通信 BigQuery のレガシー SQL が廃止へ(2026-06-01から) Legacy SQL feature availability (2026-02-25) 以前から周知のとおり BigQuery のレガシー SQL は使えなくなる。免除申請も可能。 組織で 2025-11-01 から 2026-06-01 の間でレガシー SQL が使われていない場合、レガシー SQL は 2026-06-01 から使えなくなる 組織で 2025-11-01 から 2026-06-01 の間でレガシー SQL が使われた場合、既存ワークロードは稼働し続けるが、新規のものは稼働しなくなる可能性がある Gemini 等の呼び出しの料金体系の選択肢が追加(Preview) Vertex AI consumption options (2026-02-24) リリースノート未掲載(ドキュメント更新は 2026-02-24)。 Vertex AI 経由の Gemini 等の呼び出しの料金体系はこれまで Pay Go / Provisioned Throughput の2種類だったが、Pay Go が3種類(Standard / Priority / Flex) に増え、割り当てと単価が異なる。 Priority は 429 Resource exhausted 対策になる。 Standard : 従来の通常の従量課金 Priority : 単価が高い代わりにより高い割り当て Flex : 単価が安い代わりにレイテンシが大きい Google Workspace のアップデート Chromebook Plus の Chrome ブラウザに Gemini が統合(米国のみ) Gemini in Chrome is coming to Chromebook Plus devices (2026-02-03) Chromebook Plus(Chromebook のハイエンド版)の Chrome ブラウザに Gemini が統合。 ただしまずは米国内ユーザーのみ。ブラウザ上の記事の要約や開いているタブをコンテキストにしたタスク実行など。 Google Meet の音声リアルタイム翻訳が一般公開、日本語は未対応 Speech translation in Google Meet now generally available for businesses (2026-02-04) Google Meet の音声リアルタイム翻訳が一般公開(GA)された。 日本語は未対応で、英語、スペイン語、仏語、独語、ポルトガル語、イタリア語に対応。2026-01-27から順次ロールアウト。 Gmail に校正(proofread)機能が登場 Proofread your email with Gemini in Gmail (2026-02-04) Gmail に校正(proofread)機能が登場。生成 AI モデル Gemini が文章を簡潔・洗練されるよう書き換えを提案してくれる。 2026-02-04から順次展開される。ただし、日本語の対応状況はドキュメントに記載がなく不明。 新アドオン「AI Expanded Access」が登場 Get higher access to advanced AI in Google Workspace (2026-02-05) Google Workspace でより大きいAI機能の割り当て(使用回数上限)が得られる新しいアドオン「AI Expanded Access」が登場。 通常の Workspace プランより、画像や動画生成回数が多かったり、Proモデルの回数上限が大きくなる。 Google カレンダーにおける DLP(Data Loss Prevention)が Beta 公開 Data loss prevention policies for Google Calendar now available in beta (2026-02-11) Google カレンダーにおける DLP(Data Loss Prevention、データ損失防止)が Beta 公開。Enterprise Standard エディション以上が対象。 カレンダー予定への添付ファイルや、説明欄テキストに機密データが添付されることを防ぐ。試用にはフォームから申請が必要。 Google ドキュメントで「音声概要」が使用可能になる Listen to audio summaries in Google Docs (2026-02-12) Google ドキュメントで「音声概要」が使用可能になる。 Gemini が Docs を要約して音声で読み上げる。音声種別や読み上げ速度の調整も可能。 Google Workspace Business Standard 以上または Google AI Pro が必要。2026-02-12から15日間程度かけて順次展開。 Google Workspace 管理コンソールで Gemini の使用状況レポートが強化 View Gemini feature usage and threshold reports in the Admin console (2026-02-17) Google Workspace 管理コンソールで Gemini の使用状況レポートが強化された。 使用量上限(割り当て)へ達しているユーザー数なども見え、エディションのアップグレードの判断に使える。 Gemini アプリで30秒間の音楽を生成できるようになった Create custom soundtracks with Lyria 3 in the Gemini app (2026-02-18) Gemini アプリで30秒間の音楽を生成できるようになった。 Google の Lyria 3 モデルを使用。展開まで3日程度かかる場合あり。Google Workspace ユーザーや個人の Google アカウントでも利用可能。 Googleスプレッドシートに SHEET() 、SHEETS() 関数が登場 Two new functions in Google Sheets (2026-02-23) Googleスプレッドシートに以下の関数が新登場 =SHEET() =SHEETS() 引数で渡したシート名の番号を返したりファイルのシート数を返すため、ファイルの構成が変わっても数式の維持ができる。15日間かけてロールアウト。 Google グループの「組織外のメンバーを禁止」が厳格化 New internal and external membership classifications for Google Groups (2026-02-23) Googleグループの「組織外のメンバーを禁止」が厳格化。 これまで「組織外のメンバーを許可する」をオフにしても、管理者による操作やグループをネストすること等で所属できてしまったが、今後は不可能になる。2026年5月15日以降に適用。 Google フォームの回答結果を Gemini で定量的に分析できるように AI avatars and AI voiceovers in Google Vids now available in seven new languages (2026-02-24) Google フォームの回答結果を Gemini で定量的に分析できるようになる。 回答結果一覧を「テーマ別パーセンテージ」で集計して、回答の傾向をグラフで表示。Business Standard 以上に順次展開される。 Google Vids の AI アバター&ボイスオーバー(音声生成)が日本語に対応 AI avatars and AI voiceovers in Google Vids now available in seven new languages (2026-02-24) 動画編集ツール Google Vids で、AI アバター&ボイスオーバー(音声生成)が日本語に対応。 AI 生成の人物が入力した台本に基づいてナレーションしてくれる。これまで英語のみ対応していた。Google Workspace ユーザー向けに順次展開。 Gemini アプリから Google Chat をデータソースとして参照できるように Google Chat now available as a data source in Gemini app (2026-02-25) Gemini アプリから Google Chat をデータソースとして参照できるようになった。 従来の Google ドライブ、Gmail などに加えての追加。 杉村 勇馬 (記事一覧) 執行役員 CTO 元警察官という経歴を持つ IT エンジニア。クラウド管理・運用やネットワークに知見。AWS 認定資格および Google Cloud 認定資格はすべて取得。X(旧 Twitter)では Google Cloud や Google Workspace のアップデート情報をつぶやいています。 Follow @y_sugi_it
アバター
G-gen の堂原です。当記事では、Google Workspace の Google Meet で、誰が会議に参加できるかを定義する 会議へのアクセス 設定について、仕様を解説します。会議へのアクセス設定は「オープン」「信頼済み」「制限付き」から選択できますが、その結果はユーザーの属性や会議にアクセスした時間によって異なります。 はじめに 会議へのアクセスの設定値 タイミングによる挙動の違い 概要 開催 15 分前~開催中 開催 16 分以上前 デフォルト設定について はじめに Google Workspace の Google Meet では、会議の主催者が「誰が会議にリクエスト無しで入室できるか」「誰が参加リクエストを送る必要があるか」等を制御するための 会議へのアクセス という設定項目が存在します。 この設定は、設定値やユーザーの属性(組織内・組織外、Google カレンダーで招待しているか)、開催中か開催前かなどで挙動が変化します。当記事ではその挙動について解説します。 なお当記事では Google Workspace アカウントを利用した場合の仕様について解説しており、個人アカウントでは仕様が異なる可能性があります。 会議へのアクセスの設定値 「会議へのアクセス」の設定値は、 オープン 、 信頼済み 、および 制限付き から選択できます。 設定名 説明 オープン 誰でもリクエスト無しで参加できます。 信頼済み 組織内のユーザーであれば誰でもリクエスト無しで参加でき、組織外のユーザーは招待されている場合はリクエスト無しで参加できます。 制限付き 招待されたユーザーのみがリクエスト無しで参加できます。 「信頼済み」と「制限付き」においては、参加リクエストを送れるように許可するか、それともリクエスト自体をできなくするかを決定するオプションが存在します。 参考 : Google Meet のビデオ会議を開始またはスケジュール設定する - パソコン - Google Meet ヘルプ タイミングによる挙動の違い 概要 Google Meet の会議に、誰がリクエスト無しで参加できるか、あるいはリクエストが必要か、またそもそも参加できないか、については、以下の要素に影響を受けます。 会議へのアクセスの設定値 ユーザーの属性 タイミング(開催の 15 分前~開催中 / 開催の 16 分以上前) 開催 15 分前~開催中 会議が進行中、または開始予定時刻の 15 分前以降の場合、会議へのアクセスの設定値とユーザーの属性によって以下のように挙動が決定します。 ユーザーの属性 オープン 信頼済み (誰でもリクエスト可にチェックあり) 信頼済み (誰でもリクエスト可にチェックなし) 制限付き (誰でもリクエスト可にチェックあり) 制限付き (誰でもリクエスト可にチェックなし) 主催者 入室可 入室可 入室可 入室可 入室可 組織内・招待済 入室可 入室可 入室可 入室可 入室可 組織外・招待済 入室可 入室可 入室可 入室可 入室可 組織内・未招待 入室可 入室可 入室可 要リクエスト 入室不可 組織外・未招待 入室可 要リクエスト 入室不可 要リクエスト 入室不可 非Googleアカウント 入室可 要リクエスト 入室不可 要リクエスト 入室不可 表の凡例 入室可 : リクエスト無しで会議に入室可能 要リクエスト : 入室にリクエストおよび主催者の承認が必要 入室不可 : 会議への入室不可(リクエストも送れない) 開催 16 分以上前 次に開始予定時刻よりも 16 分以上前に、会議に入ろうとしたときの挙動です。入室にあたっての確認がより厳しくなっていることがわかります。 ユーザーの属性 オープン 信頼済み (誰でもリクエスト可にチェックあり) 信頼済み (誰でもリクエスト可にチェックなし) 制限付き (誰でもリクエスト可にチェックあり) 制限付き (誰でもリクエスト可にチェックなし) 主催者 入室可 入室可 入室可 入室可 入室可 組織内・招待済 入室可 入室可 入室可 要リクエスト 入室不可 組織外・招待済 入室可 要リクエスト 入室不可 要リクエスト 入室不可 組織内・未招待 入室可 入室可 入室可 要リクエスト 入室不可 組織外・未招待 入室可 要リクエスト 入室不可 要リクエスト 入室不可 非Googleアカウント 入室可 要リクエスト 入室不可 要リクエスト 入室不可 デフォルト設定について デフォルトでは、「会議へのアクセス」は「信頼済み」が選択されています。 Google Workspace 管理コンソールより、組織全体、または特定の組織部門に対して、会議作成時のアクセス設定のデフォルト値を指定できます。 左のサイドバーにて、「アプリ」をクリック 「Google Workspace」をクリック 「Google Meet」をクリック 設定項目にある「Meet の安全性設定」をクリック 遷移後の画面で「アクセスタイプ」をクリック 堂原 竜希 (記事一覧) クラウドソリューション部クラウドエクスプローラ課。2023年4月より、G-genにジョイン。 Google Cloud Partner Top Engineer 2023, 2024, 2025に選出 (2024年はRookie of the year、2025年はFellowにも選出)。休みの日はだいたいゲームをしているか、時々自転車で遠出をしています。 Follow @ryu_dohara
アバター
G-gen の堂原です。当記事では、 Agent Development Kit (ADK)を使用して開発した AI エージェントの開発者用 Web UI を、 Cloud Run へデプロイする方法を紹介します。 はじめに Agent Development Kit 当記事について ディレクトリ構成とソースコード Cloud Run へのデプロイ デプロイコマンド 実行例 留意事項 Gemini モデルとリージョン セッションの整合性 はじめに Agent Development Kit Agent Development Kit (ADK)は、Google によって開発された AI エージェント構築用のフレームワークです。ADK を使用することで、エージェントへの関数処理組み込みや外部ツールの利用、マルチエージェントの実装が行えます。 以下の記事カテゴリも参照してください。 blog.g-gen.co.jp 当記事について ADK には、開発したエージェントをブラウザ上でテストするための、 開発者用の Web UI 機能が備わっています。Web UI は、エージェントを開発しているローカル実行環境で adk web コマンドを実行することで起動できます。この Web UI は本来、開発者がローカル実行環境で使用することを想定しており、他人がアクセスすることは想定されていません。 当記事では、この Web UI をあえて Cloud Run (Cloud Run services)にデプロイして、外部からアクセス可能にします。PoC(概念実証)などの目的で複数人から AI エージェントを試用することが目的であり、 一般ユーザーによる使用を想定したものではない ことに注意して下さい。 ADK の Web UI 参考 : Build and deploy an AI agent to Cloud Run using the Agent Development Kit (ADK) 参考 : Deploy to Cloud Run - Agent Development Kit ディレクトリ構成とソースコード 当記事では、以下の記事で開発したエージェントを用います。 blog.g-gen.co.jp ディレクトリ構成は以下の通りです。 parent/ └ get_current_time/ ├ .env ├ agent.py └ __init__.py agent.py は、前掲の記事のソースコードです。 __init__.py は、以下の1行を記載します。 from . import agent .env には、エージェントが呼び出すエンドポイントの情報を記載します。 GOOGLE_GENAI_USE_VERTEXAI=TRUE とすることで Vertex AI 経由で Gemini API が呼び出されることになります(以下、Gemini API は Vertex AI 経由であることを前提とします)。 GOOGLE_GENAI_USE_VERTEXAI=TRUE GOOGLE_CLOUD_PROJECT={Gemini APIの呼び出し先のGoogle CloudプロジェクトのID} GOOGLE_CLOUD_LOCATION={Gemini APIの呼び出し先のリージョン} Cloud Run へのデプロイ デプロイコマンド ADK には、エージェントを Cloud Run へデプロイする adk deploy cloud_run コマンドが用意されています。このコマンドを使用することで、Dockerfile の作成やイメージのビルド、Cloud Run へのデプロイを一括で実行できます。 基本的な構文は以下の通りです。 adk deploy cloud_run [ OPTIONS ] AGENT AGENT には、エージェントのソースコードが格納されているフォルダへのパスを指定します。今回の場合においては、「parent」ディレクトリでコマンドを実行するのであれば get_current_time と指定します。 実行例 以下のシェルスクリプトを実行してデプロイします。環境変数には Cloud Run サービスをデプロイしたい Google Cloud プロジェクトの ID とリージョン、Cloud Run サービスに紐づけるサービスアカウントを設定してください。 export CLOUD_RUN_PROJECT = { Cloud Runサービスをデプロイする Google CloudプロジェクトのID } export CLOUD_RUN_LOCATION = { Cloud Runサービスをデプロイするリージョン } export CLOUD_RUN_SERVICE_ACCOUNT_EMAIL = { Cloud Runサービスにアタッチするサービスアカウント } adk deploy cloud_run \ --project = $CLOUD_RUN_PROJECT \ --region = $CLOUD_RUN_LOCATION \ --service_name = adk-get-current-time \ --with_ui \ get_current_time \ -- \ --service-account = $CLOUD_RUN_SERVICE_ACCOUNT_EMAIL \ --allow-unauthenticated 主要なオプションの詳細は以下の通りです。 --service_name : Cloud Runサービスのサービス名 --with_ui : Cloud Run サービス上で ADK の Web UI を起動させるために必要なフラグです -- (get_current_time の後ろ) : この記号以降には、サービスアカウントの指定や未認証アクセスの許可( --allow-unauthenticated )など、Cloud Run サービスに関するオプションを記載します。 gcloud run deploy コマンドにつけるオプションと同じとなります。 留意事項 Gemini モデルとリージョン .env ファイルの GOOGLE_CLOUD_LOCATION で指定したリーションにおいて、エージェントが呼び出す Gemini モデルが公開されている必要があります。 2026年2月現在、東京リージョンを例に取ると、公開されているモデルは gemini-2.5-flash や gemini-2.5-pro などです。 gemini-3-flash-preview などの最新モデルを利用したい場合は、 .env ファイルに GOOGLE_CLOUD_LOCATION=global と記述する必要があります。最新モデルは各個別リージョンではなく global ロケーションのみで公開される傾向があります。 どのロケーションでどのモデルが公開されているかについては、以下の公式ドキュメントを参照してください。最新情報を得るためには、ドキュメントを英語版に切り替えて確認してください。 参考 : Deployments and endpoints セッションの整合性 デプロイした Cloud Run サービスの Dockerfile を確認すると、Web UI の立ち上げコマンドは以下のようになっています。 CMD adk web --port = 8000 --host = 0 . 0 . 0 . 0 --session_service_uri = memory:// --artifact_service_uri = memory:// " /app/agents " 上記より、エージェントのセッション情報はコンテナのメモリ上で管理されます。そのため、以下の挙動が発生します。 複数コンテナ時の挙動 : 複数のコンテナが稼働している場合、アクセスの度に見えるセッション情報が異なる、不安定な状態になります。 リビジョンの更新 : Cloud Run のリビジョンが新しくなると、セッションはリセットされます。 堂原 竜希 (記事一覧) クラウドソリューション部クラウドエクスプローラ課。2023年4月より、G-genにジョイン。 Google Cloud Partner Top Engineer 2023, 2024, 2025に選出 (2024年はRookie of the year、2025年はFellowにも選出)。休みの日はだいたいゲームをしているか、時々自転車で遠出をしています。 Follow @ryu_dohara
アバター
G-gen の森です。Google Workspace において Google ドライブなどのストレージ容量上限を規定するための仕組みである、 ストレージプール の仕組みについて解説します。 概要 ストレージプールとは 対象となるデータ エディションごとの上限 ストレージ容量の管理 使用状況の確認 ストレージ制限の設定 容量が不足した場合の挙動 ストレージプールを増やす方法 ライセンスの追加購入 上位エディションへのアップグレード 追加ストレージの購入 概要 ストレージプールとは ストレージプール とは、組織内のすべてのユーザーが共有で使用できる、合算されたストレージ容量の仕組みです。Google Workspace のほとんどのエディションでは、契約しているライセンス数に応じた合計容量が組織全体の「プール」として提供され、その範囲内で全ユーザーがストレージを消費します。 例えば、Business Standard ライセンスには1ユーザーあたり 2 TiB のストレージが含まれています。50ユーザー分契約している場合、組織全体で 100 TiB(2 TiB × 50)のストレージプールが使用可能です。 参考 : 組織全体での保存容量の使用状況を確認する 対象となるデータ ストレージプールでは、以下の Google Workspace サービスのデータが合算してカウントされます。 サービス 説明 Google ドライブ マイドライブ内のファイル、共有ドライブ内のファイル、ゴミ箱内のファイル Gmail メールと添付ファイル(迷惑メールやゴミ箱内のアイテムを含む) Google フォト バックアップされた写真や動画 なお、以前は Google ドキュメント、スプレッドシート、スライドなどの Google 形式のファイルは容量を消費しませんでしたが、2022年5月2日以降に作成または編集されたファイルは、ストレージ消費の対象となります。 参考 : Google Workspace のストレージに関するよくある質問(管理者向け) エディションごとの上限 以下に、代表的なエディションの、ライセンス数あたりのストレージ上限を記載します。 エディション 上限 Business Starter 30 GiB × ユーザー数 Business Standard 2 TiB × ユーザー数 Business Plus 5 TiB × ユーザー数 Enterprise Standard 5 TiB × ユーザー数 Enterprise Plus 5 TiB × ユーザー数 参考 : 組織全体での保存容量の使用状況を確認する - ストレージ管理ツールに関するよくある質問 ストレージ容量の管理 使用状況の確認 組織全体で、上限に対してどのくらいのストレージが消費されているかを確認するには、いくつかの方法があります。 参考 : 組織全体での保存容量の使用状況を確認する 1つ目は、管理者アカウントで管理コンソール( https://admin.google.com/ )にアクセスし、左部メニューから「ストレージ」をクリックします。ここでは、組織全体の総容量、使用済み容量、およびストレージを多く消費しているユーザーや共有ドライブを特定できます。 管理コンソール > ストレージ 2つ目は、管理者アカウントで Google ドライブの画面にアクセスし、左下の「保存容量」をクリックすることです。この画面の上部には、各アカウントがどれくらいストレージを消費しているかが表示されます。管理権限を持つアカウントであれば、同画面の左下に、プール全体の消費状況が表示されます。 Google ドライブの「保存容量」画面 ストレージ制限の設定 特定のユーザーがプールの容量を大きく独占することを防ぐために、上限を設定することができます。上限は、ユーザーごと、グループごと、組織部門ごとなどの単位で設定できます。 例えば一般社員とデザイン部門で組織部門やグループを分け、「一般社員には 50 GiB まで」「デザイン部門には 500 GiB まで」といった制限を設定することで、ストレージプールの枯渇を防止できます。 参考 : ユーザーの保存容量の上限を設定する また、共有ドライブごとに個別の容量制限(上限)を設定することも可能です。部門ごとに共有ドライブを作成して上限を設定することで、ストレージプール消費量のバランスを取ることができます。 参考 : 共有ドライブの保存容量の上限を設定する 容量が不足した場合の挙動 組織全体でストレージプールの空き容量がなくなった場合、以下の制限が発生します。 まず、Google フォトでは直ちに、新規ファイルの追加やバックアップができなくなります。 次に、上限を超えた状態が14日間続いた時点か、保存容量超過が25%まで達した時点のどちらか早い方のタイミングで、以下の影響が生じます。 サービス 制限 Google ドライブ 新しいファイルの追加が不可 Google ドキュメント、スプレッドシート、スライド、フォームなど 新しいファイルの作成、編集、コピー、フォームの送信等が不可 Google Meet 会議の録画が不可 これらに加え、公式の FAQ には「(前略)この上限を超えた場合、Google はお客様によるドライブへのアップロードを無効にする、ご利用のドメインを停止する、ご利用のドメインとそのすべてのデータを削除する権限を有します。」と記載されています。 参考 : Google Workspace のストレージに関するよくある質問(管理者向け) ストレージプールを増やす方法 ライセンスの追加購入 ストレージプールは「1 ユーザーあたりの容量 × ライセンス数」で決まるため、ユーザーライセンスを追加で購入することで、組織全体のプール容量が増加します。 上位エディションへのアップグレード より多くのストレージが含まれるエディション(例 : Business Standard から Business Plus への移行など)にアップグレードすることで、ユーザーあたりの割り当て容量を増やすことができます。 参考 : 組織の空き容量を増やす、または保存容量を追加する 追加ストレージの購入 ライセンスを追加せずに容量だけを増やしたい場合、追加ストレージを購入できます。10 TiB 単位などのサブスクリプション形式で提供されています。 参考 : 組織用に Google Workspace の追加の保存容量を購入する 森 寛之 (記事一覧) クラウドソリューション部 三重県出身、愛知県在住のクラウドエンジニア! 業務システムエンジニアからクラウドエンジニアへ転向。 好きな分野は 業務分析と、BigQuery でデータ分析。 Follow @mori_chan_it
アバター
G-gen の堂原です。当記事では、 Google Workspace の Gmail で、メールの送受信を特定のメールアドレスやドメインとの間にだけ許可し、それ以外は制限する方法について解説します。 はじめに 当記事について 仕様 手順1 : アドレスリスト作成 手順1-1 : アドレスリストの管理画面への遷移 手順1-2 : アドレスリストの作成 手順2 : 「配信を制限」の設定 手順2-1 : コンプライアンス画面への遷移 手順2-2 : 「配信を制限」の設定 はじめに 当記事について E メールの利用に際して、組織内のユーザーが外部の不特定多数とメールを送受信することを防ぎたいケースがあります。例えば、学校の生徒が持つメールアドレスからは、同じ学校の教師と生徒だけと送受信できるようにするケースが考えられます。 Google Workspace の Gmail には「 配信を制限 」という機能があります。これを利用することで、管理者が許可した特定のメールアドレスやドメインとのみ送受信できるようにし、それ以外は禁止するように構成できます。当記事では、「配信を制限」機能の設定方法を紹介します。 参考 : メールの送受信を承認済みアドレスまたはドメインのみに制限する - Google Workspace 管理者 ヘルプ 仕様 「配信の制限」設定を行うと、対象の 組織部門 に所属するユーザーは、指定されたアドレスリストに含まれない送信元からのメールを受信できなくなり、またアドレスリストに含まれない宛先へメールを送信できなくなります。 制限に抵触した場合、送信元のメールアドレスには バウンスメール が返送されます。 バウンスメール例 手順1 : アドレスリスト作成 手順1-1 : アドレスリストの管理画面への遷移 まずは、送受信を許可したいドメインやメールアドレスを設定した アドレスリスト を作成するために、「アドレスリストの管理画面」へ遷移します。 管理コンソール( https://admin.google.com/ )にログイン 左のサイドバーの「アプリ」をクリック 「Google Workspace」をクリック 「Gmail」をクリック 「Gmail の設定」に遷移するため、設定項目にある「ルーティング」をクリック 「アドレスリストの管理」は最上位の組織部門でしか設定できないため、最上位の組織部門を選択 「アドレスリストの管理」をクリック 手順1-2 : アドレスリストの作成 「アドレスリストの管理」画面にて、アドレスリストを作成します。 「アドレスリストの管理」にて、「アドレスリストを追加」をクリックします。 「アドレス」に送受信を許可したいアドレスとドメインを入力します。注意点として、メールの送信に失敗した際に送信元に送られてくるバウンスメールを受信するためには、 mailer-daemon@googlemail.com を許可する必要があります。 手順2 : 「配信を制限」の設定 手順2-1 : コンプライアンス画面への遷移 「配信を制限」設定は「Gmail の設定」の「コンプライアンス」画面にあるため、まずはそこまで遷移します。 左のサイドバーにて、「アプリ」をクリック 「Google Workspace」をクリック 「Gmail」をクリック 設定項目にある「コンプライアンス」をクリック 手順2-2 : 「配信を制限」の設定 「配信を制限」の設定画面を開きます。 メールの送受信を制限したい組織部門を選択 「配信を制限」欄にある「設定」をクリック 以下が「配信を制限」の設定画面です。 メールの送受信を許可したいアドレスリストを 1. の箇所に追加します。 2. の箇所に入力した文言は、バウンスメール管理者からのメッセージとして記載されます。 再掲 : バウンスメール例 3. にチェックを付けた場合、同じドメインの Google Workspace アカウント(今回だと dev.g-gen.co.jp )に対して送信するメールは、「配信を制限」設定の影響を受けなくなります。すなわち、組織のドメインをアドレスリストに追加していなくても、組織内であればメールの送受信が可能です。 堂原 竜希 (記事一覧) クラウドソリューション部クラウドエクスプローラ課。2023年4月より、G-genにジョイン。 Google Cloud Partner Top Engineer 2023, 2024, 2025に選出 (2024年はRookie of the year、2025年はFellowにも選出)。休みの日はだいたいゲームをしているか、時々自転車で遠出をしています。 Follow @ryu_dohara
アバター
G-gen の菊池です。当記事では、Looker で BigQuery のデータを可視化するための一連のフローを、スクリーンショット付きで解説します。BigQuery との接続から、LookML の自動生成と調整、Explore での可視化などを説明します。 はじめに 当記事について Looker、ビュー、Explore、モデル 構成図 BigQuery 側の準備 デモ用データセットの作成 サンプルデータの投入 接続用サービスアカウント(SA) の作成と権限付与 Looker の接続設定 BigQuery への接続(Connection)の作成 接続テストと設定の保存 LookML プロジェクトの作成(新規モデルの作成) プロジェクトページへ移動 データベース接続を選択 テーブルを選択する 主キーの選択 作成する Explore を選択する モデル名を入力 LookML の定義と調整 自動生成されたファイルの確認 ディメンションからメジャーへの修正 日付データの修正 変更のコミットと本番反映 Explore でデータを可視化してみる Explore 画面の操作 フィルターの使い方 ディメンションからメジャーへの修正をしなかった場合 日付データの修正をしなかった場合 はじめに 当記事について 当記事では、Looker でデータを可視化する際の一連のフローである「BigQuery との接続・認証」「LookML の作成」、そしてビジュアリゼーション作成を含む「Explore での可視化」について解説します。 Looker、ビュー、Explore、モデル Looker とは、エンタープライズ向けのデータプラットフォームです。開発者向けのセマンティックレイヤーとユーザー向けの BI ツールの両方の特徴を併せ持っています。 Looker 独自のモデリング言語である LookML を使用することで、分析対象のデータの構造とビジネスルールを定義するデータモデルを作成、管理できます。 Looker は、この LookML で定義されたデータモデルから自動的に SQL を生成します。そのため、SQL を知らないユーザーでも、直感的なインターフェースからデータを探索し、分析できます。 参考 : Looker 参考 : LookMLの紹介 Looker は、データベースのテーブルと1対1で紐づく「 ビュー 」、どのビューをユーザーに見せるか定義する「 Explore 」、どのデータベースに接続するか、どの Explore をユーザーに公開するか定義する「 モデル 」の3つの構造で成り立っています。 参考 : LookMLの用語と概念 これら3つの構成要素についての詳細は、以下の記事も参照してください。 blog.g-gen.co.jp 構成図 今回構成する Looker から BigQuery のテーブルを参照する環境は以下の通りです。 構成 BigQuery 側の準備 デモ用データセットの作成 以下の名前でデモ用のデータセットを作成します。 項目 設定値 データセット名 looker_demo_source サンプルデータの投入 BigQuery では、Google Merchandise Store (Google ブランドの商品を販売するオンラインストア)の Google アナリティクス 4 のデータがサンプルデータとして使用できます。今回はそのサンプルデータから以下の SQL の結果を取得して参照用のテーブルとします。 WITH UserData AS ( SELECT event_date AS date , user_pseudo_id, ( SELECT value.int_value FROM UNNEST(event_params) WHERE key = ' ga_session_id ' ) AS session_id, geo.country AS country, event_name, ( SELECT value.string_value FROM UNNEST(event_params) WHERE key = ' session_engaged ' ) AS session_engaged_flag, ( SELECT value.int_value FROM UNNEST(event_params) WHERE key = ' engagement_time_msec ' ) AS engagement_time_msec FROM `bigquery- public -data.ga4_obfuscated_sample_ecommerce.events_*` WHERE PARSE_DATE( ' %Y%m%d ' , _TABLE_SUFFIX) BETWEEN DATE ' 2021-01-01 ' AND DATE ' 2021-01-31 ' ) SELECT date , --日付 COUNT ( DISTINCT CASE WHEN session_engaged_flag = ' 1 ' THEN user_pseudo_id WHEN event_name = ' first_visit ' THEN user_pseudo_id WHEN engagement_time_msec > 0 THEN user_pseudo_id END ) AS active_users, --アクティブユーザー数 COUNT ( DISTINCT CASE WHEN event_name = ' first_visit ' THEN user_pseudo_id END ) AS new_users, --新規ユーザー数 COUNT ( DISTINCT CONCAT (user_pseudo_id, CAST (session_id AS STRING))) AS sessions, --セッション数 country, --国 FROM UserData GROUP BY date , country ORDER BY date このテーブルには 2021 年 1 月の日付、国ごとのアクティブユーザー数、新規ユーザー数、セッション数が含まれています。 列名 説明 date 日付 active_users アクティブユーザー数 new_users 新規ユーザー数 sessions セッション数 country 国 SELECT 文のクエリ結果は、[結果の保存]をクリックし、[ローカルへのダウンロード] > [ CSV ]を選択して保存します。 クエリ結果の保存 作成していたデータセット「looker_demo_source」の右側の三点リーダーをクリックし、[テーブルを作成]を選択します。 [テーブルを作成]画面では、以下のように設定して、[テーブルを作成]をクリックします。 項目 設定値 ソース > テーブルの作成元 アップロード ソース > ファイルを選択 ダウンロードした CSV ファイル ソース > ファイル形式 CSV 送信先 > プロジェクト 自身のプロジェクト 送信先 > データセット looker_demo_source 送信先 > テーブル ga4_daily_metrics_by_country スキーマ > 自動検出 チェックを入れる 詳細オプション > ヘッダー行のスキップ 1 接続用サービスアカウント(SA) の作成と権限付与 Looker が BigQuery データベースへのアクセスに使用する認証を構成します。 サービスアカウント作成 1.Google Cloud コンソールで[ API とサービス] > [認証情報]へ移動します。 2.[認証情報を作成] を選択し、[サービス アカウント] を選択します。 3.サービス アカウントの作成画面で以下を入力して、[作成して続行] を選択します。 項目 設定値 サービスアカウント名 looker-bq-connection-sa サービスアカウントID サービスアカウント名を入力すると自動で同じ値が入力される。 サービスアカウントの説明 Looker から BigQuery へのアクセス用 サービスアカウント作成画面 4.権限の設定画面で、[ロールを選択] フィールドで以下のロールを選択します。2つ目以降も[別のロールを追加] を選択して、同じようにロールを選択します。 BigQuery > BigQuery データ編集者 BigQuery > BigQuery ジョブユーザー サービスアカウントの権限設定画面 サービスアカウントの権限設定 5.[続行] を選択して [完了] を選択します。 サービス アカウントの認証を構成 1.[認証情報] ページで、新しく作成したサービス アカウントのメールを選択します。 サービスアカウントの選択 2.サービス アカウントの詳細画面で[鍵]タブを選択し、[キーを追加] のプルダウンから [新しいキーを作成] を選択します。 サービスアカウントに新しいキーを作成 3.[キーのタイプ] で [JSON] を選択し、[作成] を選択します。 キーのタイプを選択 4.秘密鍵(JSON ファイル)がコンピュータに保存されるので、ダウンロード先をメモしてから[閉じる]をクリックします。 秘密鍵のダウンロード 鍵を再度ダウンロードすることはできないため、ここで忘れずに保存先をメモしておきます。 Looker の接続設定 BigQuery への接続(Connection)の作成 1.以下の 2 つの方法のいずれかで、[データベースを Looker に接続] ページを開きます。 [管理者] パネルの [データベース] セクションで [接続] を選択します。[接続(Connections)]ページで、[接続を追加(Add Connection)] ボタンをクリックします。 管理者パネルから接続ページへ メイン ナビゲーション パネルの [作成] ボタンをクリックし、[接続] メニュー項目を選択します。 メインパネルの作成から接続ページへ 2.全般設定の画面で以下の通りに設定し、[次へ]をクリックします。 項目 設定値 名前 conn-ga4-daily-demo SQL 言語(SQL Dialect) [Google BigQuery Standard SQL]を選択 プロジェクトの範囲 [すべてのプロジェクト]をチェック 全般設定 3.データベース設定の画面で以下の通りに設定します。 項目 設定値 課金プロジェクト ID データセットを作成したプロジェクトのID ストレージ プロジェクト ID なし プライマリ データセット looker_demo_source データベース設定 4.認証の設定で以下の通りに設定し、[次へ]をクリックします。 項目 設定値 認証方法 [サービスアカウント]を選択 サービスアカウント証明書 ダウンロードしていた秘密鍵(JSONファイル)を指定 認証の設定 5.オプションの設定で以下の通りに設定し、[次へ]をクリックします。 項目 設定値 ノードあたりの最大接続数 30 接続プールのタイムアウト 120 この接続に関する同時実行クエリの最大数 200 この接続に関するユーザーあたりの同時実行クエリの最大数 25 最大課金ギガバイト数 なし その他の JDBC パラメータ なし メンテナンス スケジュール なし コンテキストの無効化 選択 SSL 選択 テーブルと列を事前にキャッシュに保存 選択 スキーマを取得してキャッシュに保存 選択 PDT を有効にする オフ データベースのタイムゾーン Asia - Tokyo クエリのタイムゾーン Asia - Tokyo オプションの設定(1) オプションの設定(2) オプションの設定(3) 接続テストと設定の保存 6.接続の該当するフィールドをすべて入力したら、必要に応じて接続をテストを実施します。 接続テスト 7.[次へ]をクリックして、接続設定の確認をしたら、[保存]をクリックします。 接続の保存 LookML プロジェクトの作成(新規モデルの作成) プロジェクトページへ移動 1.Development Mode(開発モード)になっていることを確認し、ナビゲーション パネルの [開発] セクションから、[プロジェクト] を選択します。 開発パネルからプロジェクトページへ 2.[LookML プロジェクト] ページで、[New Model] をクリックします。 プロジェクトページ データベース接続を選択 3.[データベース接続を選択]画面で以下の通り設定して、[次へ]をクリックします。 項目 設定値 データベース接続 conn-ga4-daily-demo LookML Project Name proj_ga4_analysis データベース接続を選択 テーブルを選択する 4.[テーブルを選択する]画面で、Looker で接続するプロジェクトとデータセットを選択し、右側の[Tables]をクリックします。 項目 設定値 GCPプロジェクト データセットが存在する Google Cloud プロジェクト データセット looker_demo_source GCP プロジェクトとデータセット選択 5.選択したデータセットに存在するテーブルの一覧が表示されるので、以下のテーブルを選択します。その他のオプションはデフォルトのままで[次へ]をクリックします。 項目 設定値 テーブル ga4_daily_metrics_by_country テーブルの選択 主キーの選択 6.[主キーの選択]画面では、テーブルを適切に結合するための主キーを設定します。この手順は省略可能です。今回は主キーは不要なので何も選択せずに[次へ]をクリックします。 主キーの選択 作成する Explore を選択する 7.[作成する Explore を選択する]画面では、Explore のビューとして使用するテーブルを選択します。テーブル「ga4_daily_metrics_by_country」の横にあるチェックボックスを選択して、[次へ]をクリックします。 作成する Explore を選択 モデル名を入力 8.[モデル名を入力]画面で以下のモデル名を入力して、[完了してモデルを表示]ボタンをクリックします。 項目 設定値 モデル名 ga4_daily_demo モデル名を入力 以上の手順で、LookMLプロジェクトとモデルが作成され、Looker IDE(統合開発環境)が開かれます。 Looker IDE 参考 : モデルの生成 LookML の定義と調整 自動生成されたファイルの確認 直前の処理から遷移した Looker IDE 画面へは、メイン ナビゲーション メニューの [開発] パネルからもアクセスできます。ナビゲーション メニューで [開発] を選択して、[開発] パネルを開きます。 [開発] パネルでプロジェクトの一覧が表示されるので、アクセスするプロジェクトの名前を選択します。「プロジェクトを検索」欄にプロジェクト名の一部を入れることで、簡単に探し出すことができます。 プロジェクトへ移動 Looker IDE 画面 遷移した Looker IDE 画面の左側にある「①IDE ナビゲーション バー」から「ファイルブラウザ」を選択します。すると、②機能パネルにファイルブラウザが表示されます。 ファイルブラウザでファイルを選択すると、③IDE エディタパネルに選択したファイルの内容が表示されます。 ファイルブラウザには2種類のファイルが既に作成されています。これらは、モデルを作成する際に選択したテーブルの定義を元に作成されたファイルです。 作成されたファイル views フォルダにある「ga4_daily_metrics_by_country.view」というファイルは、Looker のビュー(View)を定義するファイルです。データベースのテーブル「ga4_daily_metrics_by_country」と1対1で対応しおり、テーブル内の各列を定義します。 ビューファイル models フォルダにある「ga4-daily-demo.model」というファイルは、Looker のモデルを定義するファイルです。 このファイルでは、 explore パラメータを使用して Explore(エクスプロア)が定義されています。ユーザーが UI 上で見る「データ探索(Explore)」画面の元となる定義です。モデルファイルは、どのデータベースに接続するか、どの Explore をユーザーに公開するかを管理します。 モデルファイル 自動で生成されたモデルファイルとビューファイルは、この状態でも BigQuery のテーブルを BI として確認できる状態です。 しかし、自動生成されたファイルをそのまま使うのではなく、いくつか修正する必要があります。なぜ修正が必要かについては、データを可視化する部分で説明します。 ディメンションからメジャーへの修正 ビューファイルはテーブル内の各列をディメンションとメジャーとして定義します。ディメンションとは、日付や顧客名、商品カテゴリといったデータの属性や切り口を表します。メジャーとは、売上合計やユーザー数、平均年齢といった集計値や計算したい値を表します。 自動生成されたビューファイルでは、数値として表示したい列がディメンションとして定義されている場合があります。そのような列はメジャーに修正する必要があります。 以下の3つの数値列をディメンションからメジャーへ修正します。 物理名 論理名 active_users アクティブユーザー数 new_users 新規ユーザー数 sessions セッション数 修正箇所 修正前 修正後 dimension measure type: number type: sum メジャー(measure)への修正 日付データの修正 以下の列は日付のデータを YYYYMMDD 形式(例:2026年1月1日の場合、20260101)の数値で格納した列です。BigQuery でテーブルを作成する際、スキーマ自動検出にしていたため、数値の列として作成されました。 物理名 論理名 date イベント日 date 列を日付型として扱うために、以下のように修正します。 修正箇所 修正前 修正後 dimension dimension_group type: number type: time なし timeframes: [date, week, month, year, raw] なし datatype: yyyymmdd 日付型の定義 変更のコミットと本番反映 ファイルに変更点がある場合、以下のようにファイル名の右側に青い丸が付き、エディタパネルの右上に「Save Changes」ボタンが表示されます。 ファイルに変更点がある場合 Save Changes ボタン 「Save Changes」ボタンをクリックすると変更が保存され、画面右上にある Git ボタンが「Validate LookML」となります。 Git ボタン(Validate LookML) 画面右上にある Git ボタンは、プロジェクトの状態に応じて、プロジェクトを環境に反映するために必要なアクションが表示されます。 アクション 表示 LookML を検証 Validate LookML commit、ブランチをリモートに push Commit Changes & Push 本番環境にデプロイ Deploy to Production ファイルに変更点がある場合、Git ボタンは「Validate LookML」となり、それをクリックすることで変更内容にエラーがないか検証されます。 エラーがない場合、Git ボタンは「Commit Changes & Push」となり、画面右側のサイドパネルには LookML の検証結果が表示されます。 LookML の検証結果 「Commit Changes & Push」となっている Git ボタンをクリックすると、Commit 画面が表示されます。変更を反映するファイルにチェックを入れ、コミットメッセージを入力して [Commit] ボタンをクリックします。 Commit 画面 Commit と Push が行われると、Git ボタンは「Deploy to Production」と表示されます。 本番環境へデプロイ 「Deploy to Production」となっている Git ボタンをクリックすることで、変更内容が本番環境にデプロイされます。本番環境にデプロイされた変更内容は、Looker インスタンスを使用するユーザー全員が確認できます。 変更内容を作業者が確認するだけならば、「Deploy to Production」をクリックする手前までで充分です。 参考 : 開発モードと本稼働モード Explore でデータを可視化してみる Explore 画面の操作 ナビゲーション メニューで [Explore] を選択して、[Explore] パネルを開きます。Explore の一覧が表示されるので、アクセスする Explore の名前を選択します。 「Explore を検索」欄に Explore 名の一部を入れると、すぐに探しだすことができます。 Explore を開く Explore 画面が表示されます。左側の[すべてのフィールド]タブに一覧で表示されているフィールドから、グラフとして表示したいフィールドを選択していきます。 Explore の初期画面 フィールドの一覧から、以下のフィールドを順に選択していきます。Date フィールドについては、[Date Date] の左側にある▼マークをクリックすることで、Date、Month、Week、Yearというフィールドが展開されます。 Date Country Sessions Active Users New Users フィールドの選択 フィールドを選択すると右側にある [データ] パネルに選択したフィールドが追加されます。右上にある [実行] ボタンをクリックします。 データパネル 選択したフィールドのデータが取得されます。「行数上限に達しました。結果の一部が表示されない可能性があります。」というメッセージが表示されることがあります。右上にある「行数上限」が 500 になっていますが、取得したデータが500行以上ある場合にこのメッセージが表示されます。 全てのデータを表示したい場合は、行数上限の値を取得データの行数より大きい値(例 : 5000)のようにして、[実行] ボタンを再度クリックします。 [ビジュアリゼーション] パネルの左側にある▼マークをクリックすると、[ビジュアリゼーション] パネルが表示されます。 ビジュアリゼーションパネルの展開 今回は、Country フィールドに国名のデータがあったため、Google マップのビジュアリゼーションが自動で選ばれました。 ここから、ビジュアリゼーションを表(テーブル)形式へ変更する場合は、ビジュアリゼーションパネルにあるテーブルのマークをクリックします。 ビジュアリゼーションの変更 テーブル形式のビジュアリゼーション テーブルの Country フィールドを見ると、数値の他にデータの値を表す水平棒グラフのビジュアリゼーションが表示されています。 セルのビジュアリゼーション このビジュアリゼーションが不要な場合は、ビジュアリゼーションタブの右側にある [編集] タブをクリックします。 表示されたパネルの [系列] タブを選択し、[カスタマイズ] で Sessions を展開し、「セルのビジュアリゼーション」をオフにします。 セルのビジュアリゼーションをオフにする セルのビジュアリゼーションなし 参考 : Explore の作成と編集 参考 : Looker での Explore の表示と操作 参考 : セルのビジュアリゼーション フィルターの使い方 フィールドの値を絞り込みたい場合は、フィルタを追加します。フィルタの追加方法は以下の2通りです。 左側のフィールド一覧で、フィールド名の右側にある [フィールドでフィルタ] を選択します。 [データ] パネルの [結果] タブで、フィールドの見出しにある歯車を選択し、[フィルタ] を選択します。 フィルタの追加方法 [フィルタ] パネルが開き、選択したフィールドのフィルタが表示されます。フィルタの値を指定するには、「任意の値」の欄をクリックします。 フィルタする値の選択箇所 値の一覧が表示されるので、フィルタに使用する値を選択します。 フィルタの値の選択 [実行] ボタンをクリックすることで、[ビジュアリゼーション] パネルの表が、フィルタで指定した値で絞り込みされます。 フィルタの結果 フィルタ方法を「次を含む」や「次で始まる」などに変更する場合は、「任意の値」欄の左側で選択します。 フィルタ方法の変更 参考 : データのフィルタリングと制限 ディメンションからメジャーへの修正をしなかった場合 LookML の定義と調整の手順で数値の列を、ディメンションからメジャーへ修正していました。 メジャーにした列は以下のような挙動になります。 Country : Albaniaでフィルタした場合の結果は、以下の通りです。 Countryでフィルタした結果 ここで、DateフィールドをMonthフィールドに変えた場合、フィルタした国の1ヶ月の数値として集計された結果になります。 月単位の集計結果 ディメンションとメジャーの挙動の違いを確認するため、active_users を dimension に変えて、反映してみます。 active_usersをディメンションにした場合 1ヶ月の集計結果は以下の図の通り、3行になってしまいます。 active_usersをディメンションにした結果 これは、active_users がディメンションであることにより、集計対象の数値ではなく、数字の1、2、3で分類する項目とみなされるようになったためです。意図した集計結果を出すためには、集計したい列をメジャーとして定義する必要があることがわかります。 日付データの修正をしなかった場合 date 列の元となった Google アナリティクス4のデータの event_date 列は日付を YYYYMMDD 形式で表示した文字列でした。 そして、その列から作成したサンプルデータの date 列は自動でスキーマを読み取った際に数字データとして取り込まれました。 そのため、生成されたままの date 列の定義では、数字のディメンションとして読み取られます。 修正する前の date 列の定義 date列の定義を修正しない場合 ここで、タイプによる挙動の違いを確認するため、date フィールドの type を string(文字列)に変えてみます。この状態では、日付データとしては認識されないことがわかります。 date 列を type:string に修正 type を string に修正した date 列 菊池 健太 (記事一覧) クラウドソリューション部データエンジニアリング課。2024年7月より、G-genに入社。群馬出身のエンジニア。前職でLookerの使用経験はあるが、GCPは未経験なので現在勉強中。
アバター
G-gen の min です。Google Apps Script(以下、GAS)で開発したアドオンをユーザーが実行した際、スクリプトプロパティの読み取り時に PERMISSION_DENIED エラーが発生しました。本記事では、この事象の原因と対処法を解説します。 事象 原因 対処法 定数としてコード内に記述する ユーザーにスクリプトファイルへの閲覧権限を付与する 事象 GAS で作成した機能を Google Workspace アドオンとして配布し、利用者がそのアドオンのメニューを実行した際、以下のようなエラーログが Google Cloud の Cloud Logging に記録され、処理が失敗しました。 { " insertId ": " -w58fk8fbk0qfb ", " jsonPayload ": { " message ": " ストレージからの読み取り中にサーバーエラーが発生しました。エラーコード: PERMISSION_DENIED。 ", " serviceContext ": { " service ": " AKfycbw...(省略)... " } } , " resource ": { " type ": " app_script_function ", " labels ": { " project_id ": " 000000000000 ", " invocation_type ": " menu ", " function_name ": " callUpdateMasterData " } } , " severity ": " ERROR ", " labels ": { " script.googleapis.com/deployment_id ": " AKfycbw...(省略)... " } } メインのエラーメッセージは、以下のとおりです。 ストレージからの読み取り中にサーバーエラーが発生しました。エラーコード: PERMISSION_DENIED。 該当のスクリプトでは、 PropertiesService.getScriptProperties().getProperty('KEY_NAME') メソッドを使用し、GAS エディタ上で手動設定した スクリプトプロパティ を読み取ろうとしていました。 該当のソースコード const TARGET_URL = PropertiesService . getScriptProperties () . getProperty ( 'TARGET_URL' ) ; function callUpdateMasterData () { // ...処理... // URLにアクセスしてデータを取得する const response = UrlFetchApp . fetch ( TARGET_URL ) ; // 結果をログに出力する Logger . log ( 'Response Code: ' + response . getResponseCode ()) ; } スクリプトプロパティ 原因 このエラーは、Google Workspace Marketplace で配布されるアドオンのセキュリティ仕様と、スクリプト実行環境の関係に起因しています。 Google Workspace アドオンでは、スクリプト実行ユーザーの環境で処理が実行されます。しかし、スクリプトプロパティは「スクリプトプロジェクト(ファイル)に紐づく共有ストレージ」であり、 そのファイルにアクセス権を持つユーザー間で共有 されるものです。 Marketplace 経由で配布されたアドオンを使用する場合、実行ユーザー(アドオン利用者)はスクリプトプロジェクト自体の所有者や編集者ではありません。 ユーザーには、開発者の Google ドライブ内にある GAS プロジェクトファイル自体へのアクセス権限がないため、結果としてそのファイルに付随するプロパティストアへのアクセスも拒否されます。 PropertiesService.getScriptProperties() を用いた読み取り処理が、実行時に PERMISSION_DENIED エラーとなります。 参考 : プロパティ サービス 対処法 定数としてコード内に記述する 外部サービスの URL や固定の ID など、公開されても問題ない設定値であれば、スクリプト プロパティではなくコード内の定数( const )として記述することでエラーを回避できます。 // 修正前:スクリプトプロパティから読み取る(アドオン配布時にエラーになる) // const TARGET_URL = PropertiesService.getScriptProperties().getProperty('TARGET_URL'); // 修正後:コード内に定数として定義する const TARGET_URL = 'https://blog.g-gen.co.jp/' ; function callUpdateMasterData () { // ...処理... // URLにアクセスしてデータを取得する const response = UrlFetchApp . fetch ( TARGET_URL ) ; // 結果をログに出力する Logger . log ( 'Response Code: ' + response . getResponseCode ()) ; } ただし、 API キーなどの機密情報 はソースコード内に直接記述してはいけないことに十分留意してください。 ユーザーにスクリプトファイルへの閲覧権限を付与する アドオンの実行ユーザーに対して、実体となる GAS プロジェクトファイルの 閲覧者権限 を付与します。 スクリプト プロパティはファイルに紐づくメタデータであるため、ユーザーがファイル自体へのアクセス権を持っていれば、プロパティの読み取りが可能になります。 ただし、この方法は ユーザーがソースコードを閲覧可能になる というセキュリティ上の懸念があります。社内用ツールなど、ソースコードの内容が利用者に公開されても問題ない場合にのみ採用してください。 佐々木 愛美 (min) (記事一覧) クラウドソリューション部 データアナリティクス課。2024年7月 G-gen にジョイン。G-gen 最南端、沖縄県在住。最近覚えた島言葉は、「マヤー(猫)」。
アバター
G-gen の三浦です。当記事では、Gemini CLI から Google SecOps MCP server を使用して、ケース確認からログ調査までを自然言語で要約した検証結果を紹介します。 前提知識 Google SecOps とは Gemini CLI とは 概要 Google SecOps MCP server とは 使用可能なツール 注意点 検証手順 事前準備 IAM 権限の付与と MCP サーバーの有効化 Customer ID の確認 Gemini CLI の設定 ケース運用 未対応のケース一覧の取得 高優先度ケースの抽出と要約 関連アラートの確認と影響範囲の確認 検索・調査 特定ユーザーの Google Workspace 操作ログ調査 AWS 特権ユーザーの操作ログ調査 前提知識 Google SecOps とは Google Security Operations (以下 Google SecOps、旧称 Chronicle)は、Google Cloud が提供する 統合セキュリティ運用プラットフォーム です。 SIEM、SOAR、脅威インテリジェンス、Gemini を利用した AI による運用支援を提供します。これらにより、脅威の検知・調査・対応を一元的に行えます。結果として、セキュリティ運用の効率化と高度化を実現できます。 参考: Google SecOps の概要 詳細は、以下の記事をご参照ください。 blog.g-gen.co.jp Gemini CLI とは Gemini CLI とは、ターミナルから直接 Gemini の機能を利用できるオープンソースのコマンドラインインターフェイスです。詳細は以下の記事をご参照ください。 blog.g-gen.co.jp 概要 Google SecOps MCP server とは Google SecOps MCP server は、Google Cloud が提供する Google Cloud MCP Servers の 1 つです。Gemini CLI などの MCP クライアントから、自然言語で Google SecOps を操作することができます。 参考 : Use the Google SecOps MCP server なお Google Cloud MCP Servers では、Google SecOps の他にも、Compute Engine や Google Kubernetes Engine(GKE)、Google Maps などのための MCP サーバーが提供されています。 参考 : Supported products Google Cloud MCP Servers の詳細は、以下の記事や公式ドキュメントを参照してください。 blog.g-gen.co.jp 使用可能なツール Google SecOps MCP server で使用可能な主なツールとユースケースは以下のとおりです。以下は一部抜粋であり、他にも多数のツールがあります。詳細は公式ドキュメントをご確認ください。 カテゴリ ツール ユースケース ケース運用 list_cases , get_case , update_case 未対応ケースの棚卸し、ケース詳細の確認、担当者の更新 検索・調査 translate_udm_query , udm_search , search_entity 検索条件(UDM クエリ)の作成・変換を行い、ログ/イベントを検索して、関連するユーザー/端末/IP などのエンティティを特定 ルール運用 create_rule , list_rules , list_rule_errors 検知ルールの作成と棚卸し、適用・運用上のエラーの把握 取り込み/整備 create_feed , create_parser , list_parsers ログ取り込み設定(フィード)の作成、ログ整形のためのパーサー作成、パーサーの一覧取得 参考 : Google SecOps MCP Reference 注意点 Google SecOps MCP server は、2026年2月現在、 Preview 版 です。当記事で解説する内容は一般提供(GA)の際に変更される可能性があることを予めご了承ください。 Preview 版のサービスや機能を使うに当たっての注意点は、以下の記事も参考にしてください。 blog.g-gen.co.jp 検証手順 検証の流れは以下のとおりです。 項番 項目 内容 1 事前準備 MCP サーバーの有効化、IAM 権限の付与、Customer ID の確認、Gemini CLI の設定 2 ケース運用 未対応ケースの一覧取得、高優先度ケースの確認、関連アラートと 関与したユーザー/IP の確認 3 検索・調査 ケース/アラートで得たユーザーや IP などの手がかりを起点に、Google SecOps に取り込まれたログ(例:Google Workspace / AWS)を検索し、重要な操作を時系列で整理 事前準備 IAM 権限の付与と MCP サーバーの有効化 Google SecOps MCP を実行するプリンシパル(Google アカウント/サービスアカウント)に、SecOps インスタンスが紐付くプロジェクトで以下の IAM ロールを付与します。 MCP ツールのユーザー(ベータ版)( roles/mcp.toolUser ) Chronicle API 管理者( roles/chronicle.admin ) Chronicle SOAR 管理者(ベータ版)( roles/chronicle.soarAdmin ) ※ roles/chronicle.admin と roles/chronicle.soarAdmin は管理者権限相当です。SecOps 運用に必要なメンバーのみに付与することを推奨します。 参考 : Google SecOps MCP Reference SecOps インスタンスが紐付くプロジェクトで、Google SecOps MCP を有効化します。 # SecOps が紐付くプロジェクト ID export PROJECT_ID = " YOUR_PROJECT_ID "   gcloud beta services mcp enable chronicle.googleapis.com --project =" $PROJECT_ID " ※ gcloud beta services mcp コマンドが「Invalid choice: 'mcp'」等のエラーで使用できない場合は、gcloud CLI が古い可能性があります。最新バージョンに更新してから再試行してください。 参考 : gcloud CLI のコンポーネントの管理 MCP サーバーを利用できるアカウントでログインし、アプリケーションのデフォルト認証情報(ADC)を設定します。 gcloud auth application-default login Customer ID の確認 本記事で利用する MCP ツールには、Google SecOps の Customer ID が必要なものがあります。Customer ID は Google SecOps コンソールの設定画面から確認できます。 確認手順の詳細は、以下の記事の 「Google SecOps 転送用のパラメータと認証情報の取得」 をご参照ください。 blog.g-gen.co.jp Gemini CLI の設定 Google(Google Cloud)のリモート MCP サーバーは、Gemini CLI では拡張機能として ~/.gemini/extensions/ 配下に設定します。本記事では拡張機能名を secops (任意)とします。 参考 : Configure MCP in an AI application 設定用のディレクトリと設定ファイル( ~/.gemini/extensions/secops/gemini-extension.json )を作成します。 mkdir -p ~/.gemini/extensions/secops   touch ~/.gemini/extensions/secops/gemini-extension.json 作成した設定ファイルに以下を記述します。 PROJECT_ID と httpUrl のリージョン(例: asia-northeast1 )は環境に合わせて置き換えてください。 { " name ": " secops ", " version ": " 1.0.0 ", " mcpServers ": { " secops ": { " httpUrl ": " https://chronicle.asia-northeast1.rep.googleapis.com/mcp ", " authProviderType ": " google_credentials ", " oauth ": { " scopes ": [ " https://www.googleapis.com/auth/chronicle " ] } , " headers ": { " x-goog-user-project ": " PROJECT_ID " } } } } Gemini CLI を起動し、 /mcp コマンドで MCP サーバーへの接続を確認します。ツール一覧が表示されれば、接続は成功です。 > /mcp Configured MCP servers:   🟢 secops ( from secops ) - Ready ( 57 tools ) Tools: - list_cases - get_case - list_case_alerts - list_case_comments - update_case ...(省略) ケース運用 未対応のケース一覧の取得 以下のようなプロンプトで未対応(OPENED)のケースを直近 10 件取得し、優先度と作成日時の傾向を確認します。 Project ID PROJECT_ID 、Customer ID CUSTOMER_ID 、Region REGION を使用して 未対応のケースを作成日時の新しい順に 10 件表示してください。 # 出力例   ✦ 最新の未対応ケース 10 件を取得しました。     ┌─────────┬──────────────────────────────────────────┬──────────┬────────┬────────┬────────────────────┐ │ Case ID │ Display Name │ Priority │ Stage │ Status │ Created Time ( UTC ) │ ├─────────┼──────────────────────────────────────────┼──────────┼────────┼────────┼────────────────────┤ │ 399 │ Replacement of Existing Compute Snapshot │ LOW │ Triage │ OPENED │ 2026-01-30 09:33 │ │ 398 │ Replacement of Existing Compute Snapshot │ LOW │ Triage │ OPENED │ 2026-01-30 01:33 │ │ 397 │ Replacement of Existing Compute Snapshot │ LOW │ Triage │ OPENED │ 2026-01-29 19:33 │ │ 396 │ Replacement of Existing Compute Snapshot │ LOW │ Triage │ OPENED │ 2026-01-29 13:33 │ │ 395 │ Replacement of Existing Compute Snapshot │ LOW │ Triage │ OPENED │ 2026-01-29 07:34 │ │ 394 │ Replacement of Existing Compute Snapshot │ LOW │ Triage │ OPENED │ 2026-01-28 23:34 │ │ 393 │ Replacement of Existing Compute Snapshot │ LOW │ Triage │ OPENED │ 2026-01-28 15:34 │ │ 392 │ Replacement of Existing Compute Snapshot │ LOW │ Triage │ OPENED │ 2026-01-28 11:33 │ │ 391 │ Replacement of Existing Compute Snapshot │ LOW │ Triage │ OPENED │ 2026-01-28 05:34 │ │ 390 │ Replacement of Existing Compute Snapshot │ LOW │ Triage │ OPENED │ 2026-01-27 23:34 │ └─────────┴──────────────────────────────────────────┴──────────┴────────┴────────┴────────────────────┘     すべてのケースが Replacement of Existing Compute Snapshot(既存のスナップショットの置換)という名称で、優先度は LOW です。 高優先度ケースの抽出と要約 以下のようなプロンプトで優先度が高いケースを抽出し、内容を要約して「先に見るべきケース」を絞り込みます。 Project ID PROJECT_ID 、Customer ID CUSTOMER_ID 、Region REGION を使用して、優先度が高いケースを検索し、最新の3件の内容を要約してください。 # 出力例   ✦ 優先度が高いケースの最新 3 件を取得し、要約しました。   高優先度ケースの要約(最新 3 件)   検出されたケースはすべて、Workspace 管理者による 2 要素認証(2FA)の強制設定解除に関するもので、内容は以下の通りです。   1 . Two Factor Authentication Enforcement Removal by a Workspace Admin User ( Case ID: 137 ) * 優先度: PRIORITY_HIGH * 作成日時: 2025 / 11 / 27 19:06:23 ( UTC ) * 概要: 管理者ユーザーによって 2 要素認証の強制設定が解除されました。セキュリティポリシー違反の可能性があるため、意図した変更か確認が必要です。   2 . Two Factor Authentication Enforcement Removal by a Workspace Admin User ( Case ID: 135 ) * 優先度: PRIORITY_HIGH * 作成日時: 2025 / 11 / 27 10:18:07 ( UTC ) * 概要: 管理者による 2FA 強制解除が検知されました。アラートが 2 件紐付いており、繰り返しのアクションや関連操作があった可能性があります。   3 . Two Factor Authentication Enforcement Removal by a Workspace Admin User ( Case ID: 131 ) * 優先度: PRIORITY_HIGH * 作成日時: 2025 / 11 / 26 13:33:44 ( UTC ) * 概要: 同様の 2FA 解除検知です。短期間に複数発生しているため、アカウント侵害や誤設定の影響範囲を確認してください。   管理者権限に関わる重要な変更であるため、早急な確認を推奨します。 関連アラートの確認と影響範囲の確認 以下のようなプロンプトで、前項で確認した Case ID 137 に紐づくアラートを取得し、 「誰が/どこから/何に対して」 の観点で影響対象を整理します。 Project ID PROJECT_ID 、Customer ID CUSTOMER_ID 、Region REGION を使用して、Case ID 137 に関連するアラートを取得し、影響対象と影響範囲を整理してください。 # 出力例   ✦ Case ID 137 に関連するアラート情報、および影響対象と影響範囲を整理しました。   1 . ケース概要 * Case ID: 137 * ケース名: Two Factor Authentication Enforcement Removal by a Workspace Admin User * 優先度: HIGH * ステータス: OPENED   2 . 関連アラート * アラート名: TWO FACTOR AUTHENTICATION ENFORCEMENT REMOVAL BY A WORKSPACE ADMIN USER * 発生日時: 2025-11-26 10:03:52 UTC ( 1764151432245 ) * 内容: Workspace管理者権限を持つユーザーによって、二要素認証(2FA)の強制設定が解除されました。   3 . 影響対象と関与エンティティ アラートに関連するエンティティ情報から、以下の事実が確認されました。   * 実行ユーザー ( Principal ) : * EXAMPLE@DEV.G-GEN.CO.JP * 接続元IPアドレス: * 0000:0000:0000:0000:0000:0000:0000:0000 ( IPv6 ) * 変更対象リソース ( Target ) : * ORGANIZATIONS/ 1234567890 /SECURITYSETTINGS * 組織レベルのセキュリティ設定オブジェクトです。   4 . 影響範囲の整理 このアラートは、特定のユーザーに対する操作ではなく、組織レベルのセキュリティ設定に対する変更を示唆しています。   * 直接的な影響: 組織ID 1234567890 (DEV.G-GEN.CO.JP 組織全体、または該当する組織部門)において、二要素認証の強制ポリシーが無効化された可能性があります。 * セキュリティリスク: 2FA強制が解除されると、組織内のユーザーアカウントがパスワード漏洩などの攻撃に対して脆弱になります。全ユーザー、または特定の組織部門(OU)配下の全ユーザーが影響を受ける可能性があります。   推奨される次のステップ: * 実行ユーザー ( EXAMPLE@DEV.G-GEN.CO.JP ) に連絡を取り、この設定変更が意図的かつ承認されたものか確認してください。 * 意図しない変更であれば、直ちに設定を元に戻し、該当ユーザーのアカウントが侵害されていないか調査する必要があります。 検索・調査 特定ユーザーの Google Workspace 操作ログ調査 以下のようなプロンプトで前項で確認した Case ID 137 に関連する特定ユーザーの Google Workspace 操作ログの抽出と整理を実施します。 Project ID PROJECT_ID 、Customer ID CUSTOMER_ID 、Region REGION を使用して、Case ID 137 で特定した関与ユーザー EXAMPLE@DEV.G-GEN.CO.JP(接続元 IP:0000:0000:0000:0000:0000:0000:0000:0000) が 2025-11-27(UTC) に行った操作をログから抽出し、重要な操作を時系列で整理してください。 ※ メールアドレスでヒットしない場合は、ケースで得たユーザーID(@ 前)や接続元 IP で再検索します。 # 出力例   ✦ 指定された条件(Case ID 137 、ユーザー EXAMPLE@DEV.G-GEN.CO.JP、日付 2025-11-27 UTC)に基づき、Chronicle SIEM のログを調査しました。   該当ユーザーによる操作ログが複数確認されました。特に「 2 段階認証プロセス導入ガイド」の作成や「パスキーの登録」など、認証セキュリティに関連する重要な操作が時系列で確認されています。   以下に、 2025 年 11 月 27 日(UTC)の重要な操作を時系列でまとめます。   ユーザー操作タイムライン ( 2025-11-27 UTC )   1 . OAuth アプリケーションの認可とスクリプト実行 ( 01:31 - 01:45 UTC ) * 01:31:08 - 01:45:34: XXXX というアプリケーションに対し、OAuth トークンを認可・取得しました。 * スコープ: Calendar, Drive, Presentations, Script Deployments 等の権限が含まれています。 * 操作: USER_RESOURCE_ACCESS ( authorize, activity ) * 詳細: Google Apps Script や Calendar API ( calendar.events.list, calendar.events.insert ) の呼び出しが記録されています。   2 . ドライブ コンテンツの作成と共有 ( 05:36 - 05:44 UTC ) * 05:36:14 - 05:38:05: Google ドライブ上で「XXXX プロジェクト」および「 2 段階認証プロセス導入ガイド」というファイルを編集・更新しました。 * 05:38:06: 新規ファイル 「 2 段階認証プロセス導入ガイド」(プレゼンテーション)を作成しました。 * 05:41:03: 上記ファイルの権限(ACL)を変更し、共有設定を行いました(USER_CHANGE_PERMISSIONS)。 * 05:41:11: Gmail にて、件名 【GAS自動送信】スライドURLのお知らせ: 2 段階認証プロセス導入ガイド」 のメールを送信しました。 * 接続元IP: 0000:0000:0000:0000:0000:0000:0000:0000 ※提示されたIPと同じサブネット   3 . セキュリティ設定の変更 ( 07:10 UTC ) * 07:10:03: ユーザー自身の認証設定として、パスキー ( Passkey ) を登録しました。 * 操作: STATUS_UPDATE ( product_event_type: passkey_enrolled ) * 接続元IP: 0000:0000:0000:0000:0000:0000:0000:0000   4 . デバイス管理 ( 07:46 UTC ) * 07:46:49: デバイスの同期/更新イベント ( DEVICE_REGISTER_UNREGISTER_EVENT ) が記録されています。   考察 Case ID 137 のアラート名は「Two Factor Authentication Enforcement Removal( 2 要素認証の強制解除)」ですが、ログからは解除操作そのものではなく、逆に「 2 段階認証プロセス導入ガイド」の作成・配布や、ユーザー自身の「パスキー登録」といった、セキュリティ強化に向けた準備やテストを行っていた動きが顕著に見られます。アラートはこれらの試行錯誤や設定変更の過程でトリガーされた可能性があります。 AWS 特権ユーザーの操作ログ調査 以下のようなプロンプトで、AWS 環境における特権ユーザーの重要な操作(権限変更やリソース削除など)を抽出します。   Project ID PROJECT_ID 、Customer ID CUSTOMER_ID 、Region REGION を使用して、 ユーザー XXX@g-gen.co.jp が 2026年1月26日から1月30日の間に AWS で行った操作の中でセキュリティに影響を与える操作を抽出して要約してください。     # 出力例   ✦ ユーザー XXX@g-gen.co.jp の 2026 年 1 月 26 日から 1 月 30 日の間の AWS 操作ログを分析しました。 主に既存の監視設定の削除と、Google SecOps と連携するための新規 IAM 設定が行われています。   以下にセキュリティに影響を与える主な操作を時系列で要約します。   1 . 監視・ログ収集リソースの削除 ( 1 月 28 日 07:52 - 07:57 ) 以前設定されていたと思われる監視用のリソースが一括して削除されました。これにより、一時的に対象環境のログ収集が停止した可能性があります。 * CloudTrail: トレイル XXXX の削除 * VPC: VPC フローログの削除 * S3: バケット XXXX の削除 * SNS/SQS: 通知用トピックおよびキューの削除 * CloudWatch Logs: ロググループの削除   2 . IAM 権限の操作 ( 1 月 28 日 04:44 - 09:56 ) 特定のユーザーやポリシーに対する権限変更が行われました。 * ポリシー更新: XXXX ポリシーのバージョン更新(S3バケットやSQSへのアクセス許可設定)。 * ユーザー権限変更: ユーザー XXXX に対して AdministratorAccess ( 管理者権限 ) の付与 ( AttachUserPolicy ) と、その直後の剥奪 ( DetachUserPolicy ) が行われました。   3 . Google SecOps 連携設定の構築 ( 1 月 29 日 01:59 - 06:01 ) Google SecOps ( Chronicle ) から AWS 環境を監視・操作するための信頼関係が構築されました。 * IAM ロール作成: XXXX の作成。 * OIDC プロバイダ作成: accounts.google.com を信頼する OpenID Connect プロバイダの作成。 * 信頼ポリシー設定: 作成したロールに対し、Google アカウントからの AssumeRole を許可する設定 ( UpdateAssumeRolePolicy ) 。   結論 このユーザーは、古いサンドボックス環境の監視設定をクリーンアップし、新たに Google SecOps を用いた監視体制を構築するためのセットアップ作業を行っていたと推測されます。 三浦 健斗 (記事一覧) クラウドソリューション部 2023年10月よりG-genにジョイン。元オンプレ中心のネットワークエンジニア。 ネットワーク・セキュリティ・唐揚げ・辛いものが好き。 Google Cloud Partner All Certification Holders 2025 / Google Cloud Partner Top Engineer 2026
アバター
G-gen の高宮です。Google 公式の技術ドキュメントを検索するための Developer Knowledge API を、Gemini CLI から MCP サーバー経由で使用した検証結果を紹介します。 はじめに Developer Knowledge API とは MCP サーバーで使用可能なツール 注意事項 事前準備 Google Cloud の設定 Gemini CLI の設定 search_documents での検索 質問の投入 検索と回答の流れ get_document での検索 質問の投入 検索と回答の流れ AI 開発におけるドキュメント参照 はじめに Developer Knowledge API とは Developer Knowledge API は、Google Cloud 製品や Google 製品(Android、Firebase など)の公式ドキュメントを検索するための API です。この API を使用すると、独自のアプリケーションやワークフローに、Google のナレッジベースを統合できます。 また当 API では、Google から リモート MCP サーバー (Developer Knowledge MCP server)も提供されており、ローカル環境の CLI ツールや IDE から、自然言語で Google の公式ドキュメントを検索して取得することができます。また、エージェンティックな開発の中で、AI が正確な API 仕様等をもとに開発を進めるためにも寄与します。 参考 : Developer Knowledge API 参考 : Connect to the Developer Knowledge MCP server Google Cloud MCP Servers では、Compute Engine や BigQuery、Google Maps などのための MCP サーバーが提供されています。詳細は以下の記事を参照してください。 blog.g-gen.co.jp blog.g-gen.co.jp MCP サーバーで使用可能なツール Developer Knowledge MCP server で使用可能なツールは以下のとおりです。 ツール名 説明 batch_get_documents search_documents で取得した結果から、複数のドキュメントの全ての内容を取得します。 get_document search_documents で取得した結果から、単一のドキュメントの全ての内容を取得します。 search_documents 入力したクエリに関連する Google の公式ドキュメントを検索します。検索結果で、 get_document または batch_get_documents を使用することで、ドキュメントの全ての内容を取得します。 参考 : MCP Reference: developerknowledge.googleapis.com 注意事項 Developer Knowledge API は、2026年2月現在、Public Preview です。当記事で解説する内容は一般提供(GA)の際に変更される可能性があることを予めご了承ください。 Preview 版のサービスや機能を使うに当たっての注意点は、以下の記事も参考にしてください。 blog.g-gen.co.jp 事前準備 Google Cloud の設定 使用する Google Cloud プロジェクトで以下の API を有効化します。 Developer Knowledge API gcloud services enable developerknowledge.googleapis.com 同じプロジェクトで、API キーを作成し、Developer Knowledge API 呼び出し時のみに使用できるように API キーを制限し保護します。 gcloud services api-keys create --display-name =" Developer Knowledge API Key " ※ Developer Knowledge API を有効化してすぐの場合は、「Select APIs」リストに表示されないことがあります。 以下のコマンドで Developer Knowledge MCP server を有効化します。 gcloud beta services mcp enable developerknowledge.googleapis.com 以下のメッセージが返却されたら、Developer Knowledge MCP server が有効化されます。 The MCP endpoint for service developerknowledge.googleapis.com has been enabled for the resource projects/プロジェクト名. ※ gcloud コマンドの実行中にエラーが発生した場合は、 gcloud components update beta コマンドでコンポーネントのアップデート後に再試行してください。 Gemini CLI の設定 作成した API キーを表示します。 Gemini CLI の構成ファイル( .gemini/settings.json )に MCP サーバーの設定を追加します。 { " mcpServers ": { " google-developer-knowledge ": { " httpUrl ": " https://developerknowledge.googleapis.com/mcp ", " headers ": { " X-Goog-Api-Key ": " 作成した API キー " } } } } MCP サーバーに接続できていれば、構成ファイルに記述した MCP サーバーと、使用できるツールの一覧が表示されます。 # Gemini CLI を起動 $ gemini # > /mcp Configured MCP servers: 🟢 google-developer-knowledge - Ready ( 3 tools ) Tools: - batch_get_documents - get_document - search_documents search_documents での検索 質問の投入 Gemini CLI に対して、以下のようなクエリを自然言語で投入します。 Google Cloud の API を有効化する Terraform のソースコードを Google の公式ドキュメントから検索してください。 入力したクエリに対して、Developer Knowledge MCP server の search_documents ツールを使用するか確認されます。 3. Allow all server tools for this session を選択すると、現在のセッション内では、Developer Knowledge MCP server の全てのツールの使用が許可されます。 検索と回答の流れ 入力した自然言語のクエリが、MCP サーバーへリクエストを送信するために JSON 形式に変換されます。 {"query":"Terraform enable Google Cloud API"} MCP サーバーから返却されたレスポンスに複数のドキュメントが格納されています。 レスポンスの JSON の構造は以下のとおりです。 { " results ": [ { " parent ":" 参照しているドキュメントのリソース名 ", " id ":" ドキュメント内のチャンク ID ", " content ":" チャンクしたドキュメントの内容 " } , ... } 取得した内容を元に、回答が生成されます。 get_document での検索 質問の投入 さらに詳細な情報が必要な場合は、以下のようなクエリを自然言語で投入します。 関連度の一番高いドキュメントを使用して、より詳細な情報を検索してください。 検索と回答の流れ 入力した自然言語のクエリに従って、 search_documents の検索結果から、関連度の高いドキュメントを判断し、MCP サーバーへリクエストを送信するために JSON 形式に変換します。 {"name":"documents/docs.cloud.google.com/docs/terraform/understanding-apis-and-terraform"} MCP サーバーから返却されたレスポンスに単一のドキュメントの詳細情報が格納されています。 レスポンスの JSON の構造は以下のとおりです。 { " name ":" 参照しているドキュメントのリソース名 ", " uri ":" 参照しているドキュメントの URI ", " content ":" Markdown 形式のドキュメントの内容 ", " description ":" ドキュメントの説明 " } 取得した内容を元に、より詳細な回答が生成されます。 AI 開発におけるドキュメント参照 例えば、以下のようなプロンプトを Gemini CLI に与えます。 組織 g-gen.co.jp の組織直下にある Google Cloud プロジェクトの一覧を取得する Python プログラムを記述して。 Google Cloud の Resource Manager API の情報を、公式ドキュメントから調べて確認してからプログラムの開発を始めて。 Gemini CLI は、必要なドキュメントを検索・取得して、コンテキストとして使いつつ、プログラムを記述します。 エージェンティックな開発の中で、適宜 Developer Knowledge MCP server を参照することで、開発の精度が向上することが期待できます。 また、必要なときには Developer Knowledge MCP server を参照するよう、 GEMINI.md などのコンテキストファイルに予めルールを記述することで、プロンプトで毎回記述する必要がなくなります。 参考 : Provide context with GEMINI.md files - Gemini CLI 参考 : Use the Gemini Code Assist agent mode - Gemini for Google Cloud 高宮 怜 (記事一覧) クラウドソリューション部クラウドエクスプローラ課 2025年6月より、G-genにジョイン。前職は四国のSIerで電力、製造業系のお客様に対して、PM/APエンジニアとして、要件定義から運用保守まで全工程を担当。現在はGoogle Cloudを学びながら、フルスタックエンジニアを目指してクラウドエンジニアとしてのスキルを習得中。 Follow @Ggen_RTakamiya
アバター
G-gen の三浦です。当記事では Google Antigravity を使用し、バイブコーディングで目標管理アプリを開発する手順と、Browser Agent によるデバッグの流れを紹介します。 概要 Google Antigravity とは リリースステージ 使用可能なモデル データの保護 検証手順 検証 インストール 初期設定 日本語化とルール設定 自然言語による開発 Browser Agent によるデバッグ 概要 Google Antigravity とは Google Antigravity は、AI を使用して開発作業ができる IDE(統合開発環境)です。Google Antigravity を使うことで、自然言語でやりたいことを伝えて AI がコードの生成や修正を進める開発スタイルである バイブコーディング (vibe coding)を実現できます。 自然言語を使ってチャットで Google Antigravity に作業を依頼すると、AI エージェントがエディタ、ターミナル、ブラウザを使って、実装や修正を段階的に実行します。 参考 : Google Antigravity 参考 : vibe コーディングとは Google Antigravity の主な特徴は以下のとおりです。 特徴 説明 AI-powered IDE エディタ内で AI と対話しながら、作成・修正・調査を一連の流れで実行 Asynchronous Agents 複数の作業を同時に依頼でき、複数タスクを並行して実行可 Agent Manager エージェントとの会話、進捗、成果物を1つの画面でまとめて管理 Multi-window 編集、管理、ブラウザ確認を分けて表示して効率的に並行作業 Browser Agent エージェントがブラウザを操作し、画面確認や情報収集を行う リリースステージ Google Antigravity は、2026年2月現在、 パブリックプレビュー です。当記事で解説する内容は一般提供(GA)の際に変更される可能性があることをあらかじめご了承ください。プレビュー版のサービスや機能を使うに当たっての注意点は、以下の記事も参考にしてください。 blog.g-gen.co.jp 使用可能なモデル Google Antigravity で使用するバックエンドの AI モデルとしては、Google が提供する Gemini シリーズに加えて、Anthropic の Claude など他社モデルも使用可能です。 2026年2月現在、Google Antigravity では以下の生成 AI モデルを選択できます。 提供元 モデル Google Gemini 3 Pro(high) Google Gemini 3 Pro(low) Google Gemini 3 Flash Anthropic Claude Sonnet 4.5 Anthropic Claude Sonnet 4.5(thinking) Anthropic Claude Opus 4.5(thinking) OpenAI GPT-OSS 参考 : Models データの保護 Google Antigravity は Google 製品であり、以下のような規約が適用されます。 Google Terms of Service Google Cloud - Service Specific Terms Google Workspace AI Ultra for Business で認証する場合に適用 Google Antigravity Additional Terms of Service Google Privacy Policy Generative AI Additional Terms of Service Google Antigravity 自体は無償で利用できますが、その場合、Google Antigravity Additional Terms of Service に記載のとおり、ユーザーデータやメタデータ、AI とのやりとりなどが記録され、保存されます。また、それらの情報はサービス改善に使用される可能性があります。ただし、Google Workspace AI Ultra for Business サブスクリプションを使用して認証する場合は、「当社はお客様のプロンプト、コンテンツ、またはモデル応答を収集しません。」とされています。 上記のような記載があるものの、Google Antigravity の企業による利用に際して、データがモデルのトレーニングに使用されないためにはどうすればよいか、という公式のガイダンスは、2026年2月現在、Google から発表されていません。 2026年2月現在、Google Antigravity のリリースステージがパブリックプレビュー段階であることからも、企業が当サービスを使うにあたりどのようにすべきかは明確になっていません。なお公式料金ページには、 Organization plan が近日中に発表されることが示唆されており、このプランは Google Cloud と連携することでデータの保護を提供するような内容となることが想定されます。 参考 : Choose the perfect plan for your journey 検証手順 検証手順は以下のとおりです。インストールとアプリ開発に加え、意図的にエラーが発生する状況を作り、Browser Agent で原因特定から修正までできるか確認します。 項番 内容 説明 1 インストールと初期設定 インストール後、初回起動〜サインインまでを実施し、エージェントの実行ポリシー(コマンド実行や変更適用のレビュー要否など)を設定します。 2 日本語化とルール設定 画面表示を日本語化し、「回答・計画は日本語で実施する」などのルールを設定します。 3 自然言語によるアプリ作成 チャットに要望を入力し、計画の提示 → レビュー → 実装 → 起動確認までを行います。 4 Browser Agent によるデバッグ検証 わざと不具合を入れ、Browser Agent(ブラウザ操作)でエラー画面を確認し、原因特定〜修正までできるかを確認します。 本検証時の端末と Antigravity のバージョンは以下のとおりです。 OS : Windows 11 Pro 実行環境 : WSL2(Ubuntu) Antigravity : 1.13.3 検証 インストール 公式サイトから、利用する OS に合わせたインストーラーをダウンロードして実行します。対応 OS と要件の詳細は公式ドキュメントをご確認ください。 対応 OS macOS Windows Linux 参考 : Download Google Antigravity 使用許諾契約書を確認して問題がない場合は「同意する」を選択し、「次へ」を選択します。 使用許諾契約書の同意 インストール先を指定し、「次へ」を選択します。 インストール先の指定 ショートカットの作成場所を指定し、「次へ」を選択します。 ショートカットの指定 その他で必要な項目があれば選択し、「次へ」を選択します。 追加タスクの選択 内容を確認し、「インストール」を選択します。 インストールの選択 インストールが完了したので、「完了」を選択します。 完了を選択 初期設定 Antigravity を起動し、「Next」を選択します。 起動と Next の選択 Visual Studio Code (以下、 VS Code )を使用している場合、設定をインポートできます。不要な場合は「Start fresh」を選択します。 VS Code 設定をインポートするかの選択 次に IDE のテーマ(配色などの見た目)を選択し、「Next」を選択します。 テーマの選択 Antigravity のエージェントをどのように動かすかを選択します。選択したモードに応じて、エージェントの動きが変わります。本検証では Review-driven development を選択します。 エージェントの設定 利用モード(左側)の違い モード 特徴 Secure Mode すべての操作を 都度確認 してから実行します。加えて、より厳格な保護設定が適用されます(詳細は公式ドキュメント参照)。 Review-driven development(推奨) 要所で 人間の確認を挟みながら 作業を実行します。 Agent-driven development エージェントが 自律的に反復 して作業を実行します(確認なしで進む場合があります)。 Custom configuration 実行ポリシー(例 : コマンド実行やレビュー要否)を 細かく設定 できます。 実行ポリシー(右側)の項目 項目 制御項目 選択肢 影響 Terminal execution policy ターミナル(コマンド)実行の扱い Always Proceed / Request Review コマンド 自動実行するか 、 都度確認するか を制御します。 Review policy 変更の適用・進行時の人間の確認の要否 Always Proceed / Agent Decides / Request Review 変更を 即適用するか 、 都度確認するか 、 状況に応じて自動判断するか を制御します。 JavaScript execution policy ブラウザ等での JS 実行 Always Proceed / Request Review / Disabled JavaScript を 自動実行するか 、 都度確認するか 、 無効化するか(Disabled) を制御します。 参考 : Secure Mode 参考 : Agent Modes / Settings エディタの初期設定を行い、「Next」を選択します。 Keybindings(キー割り当て) :通常は Normal を選択します。 Vim 操作に慣れている場合は Vim を選択します。 Extensions(拡張機能) :Python や Go などの言語拡張機能をインストールするかを選択します。 エディタの設定 「Sign in with Google」を選択し、Google アカウントで認証を実施します。 Google 認証の実施 認証が完了すると、以下画面に切り替わります。注意事項の確認と必要に応じてチェックボックスを有効化します。チェックボックスを有効化した場合、利用状況データの送信を許可することを指します。 利用規約の確認 初期設定は以上です。これらの設定は後から変更できます。 エディタの表示 日本語化とルール設定 左サイドバーの「Extensions」を選択し、 日本語 と入力して表示された Japanese Language Pack for Visual Studio Code の「Install」を選択します。 画面の日本語化 左下にポップアップが表示されるので、「Change Language and Restart」を選択します。 Antigravity の再起動 日本語表記になっていることを確認し、右上の三点リーダーから「Customizations」を選択します。 Customizations を選択 Rules タブで「Global」を選択し、以下を入力して保存します。Global ルールは全体の共通仕様です。 回答及び計画などの各種ドキュメントはすべて日本語にすること Rules の設定 参考 : Rules 自然言語による開発 右上の「Open Agent Manager」を選択します。 Open Agent Manager を選択 「Open Workspace」 > 「Open New Workspace」 を選択し、作業用フォルダ( Workspace )を開きます。 Open Workspace を選択 参考 : Workspaces 作業用のフォルダを選択します。 フォルダの選択 「Next」を選択します。 Next を選択 会話画面が表示されます。モデル( Gemini 3 など)の選択に加え、会話モードとして以下 2 つを選択できます。 モード 説明 Planning 実行前に計画(手順)を提示してから進めるモードです。調査や設計、複雑な作業を慎重に進めたいケースに適しています。 Fast 計画より実行を優先して、直接タスクを進めるモードです。軽い修正や試行をすぐに動かして確認したいケースに適しています。 モードの選択 モデルの選択 本検証時は以下の設定で、以下プロンプトを入力し、Enter キーを押下します。 モード : Planning モデル : Gemini 3 Pro(high) 社員の目標を管理するシステムを作りたい プロンプトの入力 エージェントから実装計画の確認依頼が来たので、内容を確認します。 実装計画の確認1 実装計画の確認2 実装計画の確認3 計画が問題ない場合、「Review」を選択してコメントを入力し、「Submit」を選択します。 計画の承認 エージェントから、 Next.js のプロジェクト作成コマンドの実行確認依頼が届きます。内容を確認して「Accept」を選択します。 エージェントによるコマンド実行の承認 エージェントから実装(ダッシュボードと社員一覧画面)の完了連絡が届いたら、コマンドを実行して確認します。 エージェントからの動作確認依頼 コマンドの実行 表示された URL にアクセスし、画面が表示されることを確認します。 アプリの表示確認1 アプリの表示確認2 Browser Agent によるデバッグ コードを意図的に改修し、アクセス時にエラーが出るようにします。 エラーが出るように改修 エージェントに対し、エラー内容をブラウザで確認するよう指示します。エージェントから Browser Agent を使用したデバッグの実行許可を求められるため、「Setup」を選択します。 エージェントによる Browser Agent のセットアップ確認 参考 : Browser Agent ブラウザが起動し、Antigravity 用の拡張機能のインストールが求められるため、確認してインストールを実施します。 拡張機能のインストール1 拡張機能のインストール2 拡張機能のインストール3 インストールすると、Antigravity によりエラーページへのアクセスとデバッグ情報の収集が開始されます。 エージェントによるデバッグ情報の収集 エージェントから修正完了連絡が来たので、再度アクセスしてエラーが表示されずに画面が表示されていることを確認します。 エージェントからの修正完了連絡 アクセスの確認 三浦 健斗 (記事一覧) クラウドソリューション部 2023年10月よりG-genにジョイン。元オンプレ中心のネットワークエンジニア。 ネットワーク・セキュリティ・唐揚げ・辛いものが好き。 Google Cloud Partner All Certification Holders 2025 / Google Cloud Partner Top Engineer 2026
アバター
G-gen の武井です。当記事では、Google が提供する SIEM/SOAR 製品である Google SecOps と AWS のログ連携をキーレス認証で実現する方法について解説します。 前提知識 Google SecOps データフィード キーレス認証 過去記事との相違 AWS の設定 カスタム IAM ロール カスタム IAM ロール(信頼ポリシー) ID プロバイダー データフィードの設定 動作確認 関連記事 前提知識 Google SecOps Google Security Operations (以下 Google SecOps、旧称 Chronicle)は、Google Cloud が提供する 統合セキュリティ運用プラットフォーム です。 SIEM、SOAR、脅威インテリジェンス、Gemini を利用した AI による運用支援を提供します。これらにより、脅威の検知・調査・対応を一元的に行えます。結果として、セキュリティ運用の効率化と高度化を実現できます。 参考: Google SecOps の概要 詳細は、以下の記事をご参照ください。 blog.g-gen.co.jp データフィード Google SecOps では、AWS、Azure、その他 SaaS など、Google Cloud 以外の環境のログデータを取り込む仕組みとして データフィード機能 があります。 SecOps UI もしくは Feed Management API を用いて、ログソース(Amazon S3、Cloud Storage、Pub/Sub、Webhook など)を指定し、各種ログを SecOps に取り込む設定を行います。 ソースタイプ 概要 ストレージ Google Cloud、AWS、Azure のクラウドストレージバケットに保存されたログデータを定期的に取得 Amazon SQS S3 バケットの通知をキュー経由で受信し、ログデータを取得(リアルタイムかつ安定的に取り込み) ストリーミング Amazon Data Firehose、Cloud Pub/Sub、Webhook などを経由し、SIEM の HTTPS エンドポイントにログデータをストリーミングでプッシュ サードパーティ API CrowdStrike、SentinelOne、Palo Alto など、外部 SaaS から API 経由でログデータを取得 参考: フィード管理の概要 キーレス認証 データフィードで AWS のログを取り込む際のデータソースに Amazon S3 や SQS を選択した場合、従来は アクセスキー と シークレットアクセスキー が必要でした。 しかし2025年5月26日のアップデートにより、 AWS IAM Role for Identity Federation を選択することで キーレス認証 (キーを使用しない認証)が可能となりました。 従来のキー認証方式(データフィードの設定画面より) キーレス認証方式(データフィードの設定画面より) これは、Google SecOps と AWS の間に 信頼関係 (ID フェデレーション)を結ぶことで、固定のアクセスキーを使わずに認証を行う仕組みです。 Google SecOps が発行する OIDC トークンを AWS に提示し、AWS Security Token Service(STS)の AssumeRoleWithWebIdentity という API を介して一時的なアクセス権限を取得しています。 キーの流出リスクを根本的に排除でき、管理の手間も削減できるため、一般的にはよりセキュアな認証方式といえます。 参考: Google Security Operations release notes(May 26, 2025) 参考: AssumeRoleWithWebIdentity 参考: STSの一時的な認証情報取得APIコールについてまとめてみる 過去記事との相違 当記事では以下の構成のもと、S3 バケットに格納した CloudTrail ログを、データフィード機能を使って Google SecOps に取り込みます。 以下の記事でも同様の構成でログ取り込み検証を行っていますので、当記事ではキーレス認証への変更点のみ詳しく解説します。 # 設定項目 設定箇所 過去記事との手順差異 1 S3 バケットの設定 AWS なし 2 SQS の設定 AWS なし 3 SQS アクセスポリシーの設定 AWS なし 4 S3 イベント通知の設定 AWS なし 5 CloudTrail の設定 AWS なし 6 IAM の設定 AWS あり 7 データフィードの設定 Google SecOps あり blog.g-gen.co.jp AWS の設定 カスタム IAM ロール キー認証方式ではキーを発行したマシンアカウントに紐づけていた許可ポリシーを カスタム IAM ロール に紐づけます。 そのため、今回の例では SecOpsFederationRole という名前で新規作成します。 # 設定項目 設定値 1 信頼されたエンティティタイプ ウェブアイデンティティ 2 アイデンティティプロバイダー Google 3 Audience サブジェクト ID なお サブジェクト ID はデータフィードの設定画面から取得可能で、後述する信頼ポリシーや ID プロバイダーの設定でも使用します。 データフィードの設定画面からサブジェクトIDを取得 次に、S3 と SQS に関する最小権限をもつ許可ポリシー(今回の例では secops-s3-access )をロールに紐づけます。 # secops - s3 - access { " Version ": " 2012-10-17 ", " Statement ": [ { " Sid ": " ListAllowedBuckets ", " Effect ": " Allow ", " Action ": " s3:ListBucket ", " Resource ": [ " arn:aws:s3:::yutakei-secops-cloudtrail-test " ] } , { " Sid ": " ReadObjectsFromAllowedBuckets ", " Effect ": " Allow ", " Action ": " s3:GetObject ", " Resource ": [ " arn:aws:s3:::yutakei-secops-cloudtrail-test/* " ] } , { " Sid ": " ReadFromSQSForCloudTrailFeed ", " Effect ": " Allow ", " Action ": [ " sqs:ReceiveMessage ", " sqs:DeleteMessage ", " sqs:GetQueueAttributes ", " sqs:GetQueueUrl " ] , " Resource ": [ " arn:aws:sqs:ap-northeast-1:945008193730:yutakei-secops-cloudtrail-queue " ] } ] } カスタム IAM ロール(信頼ポリシー) ロールを作成後、Google SecOps が OIDC トークンを用いてこのロールを一時的に引き受けられるようにするため(Assume Role するため)、 信頼ポリシー を以下のように定義します。 Principal には OIDC プロバイダ ( Google )を、Condition 句には サブジェクト ID ( accounts.google.com:sub )を明示することで、指定した SecOps インスタンスのアクセスのみを許可します。 { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Principal ": { " Federated ": " arn:aws:iam::945008193730:oidc-provider/accounts.google.com " } , " Action ": " sts:AssumeRoleWithWebIdentity ", " Condition ": { " StringEquals ": { " accounts.google.com:sub ": " 1234567890987654321 " } } } ] } ID プロバイダー IAM ロールの設定に加え、AWS アカウント全体の設定として ID プロバイダー (OIDC プロバイダー)の設定が必要です。 Google の認証基盤( https://accounts.google.com )を信頼済みプロバイダーとして登録し、Google SecOps の サブジェクト ID を追加します。 これにより、Google SecOps が発行するトークンを、AWS 側が正当なリクエストとして受け入れられるようになります。 # 設定項目 設定値 1 プロバイダのタイプ OpenID Connect 2 プロバイダの URL https://accounts.google.com 3 対象者 サブジェクト ID データフィードの設定 認証方式を キーレス認証 (AWS IAM Role for Identity Federation)に変更し、先ほど作成したロール ARN を入力し変更を反映させます。(サブジェクト ID は自動入力されます) これによりキー認証によるログ取り込みからキーレス認証のログ取り込みに切り替わります。 なお、前述の ID プロバイダーの設定が未完了の場合、以下のようにエラーが発生します。 ID プロバイダー未設定による設定エラー 動作確認 キーレス認証に切り替えた後も問題なくログが取り込めていることを確認できました。 関連記事 blog.g-gen.co.jp 武井 祐介 (記事一覧) クラウドソリューション部クラウドエンジニアリング課。 Google Cloud Partner Top Engineer 2026 選出。 趣味はロードレースやサッカー観戦、ゴルフ、筋トレ。 Follow @ggenyutakei
アバター
G-gen の武井です。当記事では、Google が提供する SIEM/SOAR 製品である Google SecOps に、AWS CloudTrail ログを取り込む方法について解説します。 はじめに Google SecOps とは データフィードとは 設定の流れ AWS の設定 S3 バケット SQS(Simple Queue Service) SQS アクセスポリシー S3 イベント通知 CloudTrail IAM データフィードの設定 動作確認 関連記事 はじめに Google SecOps とは Google Security Operations (以下 Google SecOps、旧称 Chronicle)は、Google Cloud が提供する 統合セキュリティ運用プラットフォーム です。 SIEM、SOAR、脅威インテリジェンス、Gemini を利用した AI による運用支援を提供します。これらにより、脅威の検知・調査・対応を一元的に行えます。結果として、セキュリティ運用の効率化と高度化を実現できます。 参考: Google SecOps の概要 詳細は、以下の記事をご参照ください。 blog.g-gen.co.jp データフィードとは Google SecOps では、AWS、Azure、その他 SaaS など、Google Cloud 以外の環境のログデータを取り込む仕組みとして データフィード機能 があります。 SecOps UI もしくは Feed Management API を用いて、ログソース(Amazon S3、Cloud Storage、Pub/Sub、Webhook など)を指定し、各種ログを SecOps に取り込む設定を行います。 ソースタイプ 概要 ストレージ Google Cloud、AWS、Azure のクラウドストレージバケットに保存されたログデータを定期的に取得 Amazon SQS S3 バケットの通知をキュー経由で受信し、ログデータを取得(リアルタイムかつ安定的に取り込み) ストリーミング Amazon Data Firehose、Cloud Pub/Sub、Webhook などを経由し、SIEM の HTTPS エンドポイントにログデータをストリーミングでプッシュ サードパーティ API CrowdStrike、SentinelOne、Palo Alto など、外部 SaaS から API 経由でログデータを取得 参考: フィード管理の概要 設定の流れ 当記事では以下の構成のもと、S3 バケットに格納した CloudTrail ログを、データフィード機能を使って Google SecOps に取り込みます。 その際、 Amazon SQS を用いることで、S3 バケットへのログ格納通知をキュー経由で受信し、ログデータを リアルタイムかつ安定的 に取り込みます。 大まかな設定手順は、以下のとおりです。 順序 設定項目 設定箇所 1 S3 バケットの設定 AWS 2 SQS の設定 AWS 3 SQS アクセスポリシーの設定 AWS 4 S3 イベント通知の設定 AWS 5 CloudTrail の設定 AWS 6 IAM の設定 AWS 7 データフィードの設定 Google SecOps 8 動作確認 Google SecOps 参考: AWS CloudTrail ログを収集する AWS の設定 S3 バケット S3 バケットは以下の手順に従い作成します。 参考: 汎用バケットの作成 SQS(Simple Queue Service) 今回の構成では、バケット全体を定期スキャンするのではなく、 ログ生成をトリガーにリアルタイムで取り込み を行います。 そのため、以下の手順に従い 標準タイプ でキューを作成します。 参考: Amazon SQS コンソールを使用した標準キューの作成 SQS アクセスポリシー S3 バケットから SQS キューにメッセージを送信するため、キューのアクセスポリシーを編集し、 S3 サービスプリンシパル ( s3.amazonaws.com )に対して、キューへのメッセージ送信( SQS:SendMessage )を許可します。 また、意図しないバケットからの書き込みを防ぐため、ポリシー内の Condition 句で「特定の AWS アカウント」かつ「特定の S3 バケット」からのリクエストのみを許可するように制限を行います。 今回の例では、以下のアクセスポリシーを定義しました。 { " Version ": " 2012-10-17 ", " Id ": " S3ToSQS ", " Statement ": [ { " Sid ": " AllowS3ToSendMessage ", " Effect ": " Allow ", " Principal ": { " Service ": " s3.amazonaws.com " } , " Action ": " SQS:SendMessage ", " Resource ": " arn:aws:sqs:ap-northeast-1:945008193730:yutakei-secops-cloudtrail-queue ", " Condition ": { " StringEquals ": { " aws:SourceAccount ": " 945008193730 " } , " ArnLike ": { " aws:SourceArn ": " arn:aws:s3:::yutakei-secops-cloudtrail-test " } } } ] } 参考: Amazon SQS でのポリシーの使用 S3 イベント通知 続けて、S3 バケットから SQS キューにメッセージを送信するため、S3 バケットのプロパティからイベント通知を設定します。 すべてのオブジェクト作成イベントを先ほどのキューに送信 できるよう、以下の手順に従い作成します。 参考: Amazon S3 イベント通知 CloudTrail 以下の手順に従い、先ほど作成した S3 バケットを CloudTrail ログの格納先とする 証跡 を作成します。 今回の構成では AWS KMS や SNS を使用しないため、 ログファイルの SSE-KMS 暗号化 ならびに SNS 通信の配信 については有効化しません。 なお、ログとして取り込むイベントタイプや管理イベントの API アクティビティは任意です。 参考: AWS CloudTrail と S3 を構成する 参考: CloudTrail コンソールで証跡を作成する IAM Google SecOps のデータフィードで CloudTrail ログを取り込むには、 アクセスキー と シークレットアクセスキー が必要です。 そのため、以下の公式ドキュメントに従い Google SecOps 用のマシンユーザー(AWS マネジメントコンソールへのユーザーアクセス不可)を作成してキーを発行します。 公式ドキュメントには、作成したマシンユーザーに AmazonS3FullAccess を付与する旨の記述がありますが、今回の例では S3 と SQS に関する 最小権限のカスタム IAM ポリシー を以下のとおり作成して付与しました。 { " Version ": " 2012-10-17 ", " Statement ": [ { " Sid ": " ListAllowedBuckets ", " Effect ": " Allow ", " Action ": " s3:ListBucket ", " Resource ": [ " arn:aws:s3:::yutakei-secops-cloudtrail-test " ] } , { " Sid ": " ReadObjectsFromAllowedBuckets ", " Effect ": " Allow ", " Action ": " s3:GetObject ", " Resource ": [ " arn:aws:s3:::yutakei-secops-cloudtrail-test/* " ] } , { " Sid ": " ReadFromSQSForCloudTrailFeed ", " Effect ": " Allow ", " Action ": [ " sqs:ReceiveMessage ", " sqs:DeleteMessage ", " sqs:GetQueueAttributes ", " sqs:GetQueueUrl " ] , " Resource ": [ " arn:aws:sqs:ap-northeast-1:945008193730:yutakei-secops-cloudtrail-queue " ] } ] } 参考: AWS IAM ユーザーを構成する データフィードの設定 CloudTrail ログが格納された S3 バケットの URI、SQS キューの ARN、そしてキー情報を用いて Google SecOps との連携を行い、ログの取り込みを行います。 その他にも、ログの種別や取り込み先環境を識別するために Ingestion Labels と Namespace も設定します。 設定が適切に行われると STATUS 列の値が Active と表示されます。なお、ログが取り込めている場合でも、LAST SUCCEDED ON 列に ログの最終取り込み日時 (UTC)が表示されないこともあります。 参考: AWS CloudTrail フィードを設定する方法 参考: Supported log types with a default parser 参考: アセットの名前空間を使用する 動作確認 AWS はデフォルトパーサーが用意されているため、Google SecOps にログが取り込まれると自動的に UDM イベントにパースされます。 SIEM Search (UDM 検索)メニューから以下のクエリを入力して実行すると、ログが取り込まれていることを確認できました。 metadata.log_type = "AWS_CLOUDTRAIL" 選択した UDM イベントを展開すると、筆者が S3 API をコールした際の記録が残されていました。 Event Viewer を Event Fields(UDM)から Raw Log に切り替えると、パースされる前の生ログを確認することも可能です。 Data Ingestion and Health (ネイティブダッシュボードの1つ)からも、CloudTrail のログ( AWS_CLOUDTRAIL )がエラーなく取り込めていることも確認できました。 関連記事 blog.g-gen.co.jp 武井 祐介 (記事一覧) クラウドソリューション部クラウドエンジニアリング課。 Google Cloud Partner Top Engineer 2026 選出。 趣味はロードレースやサッカー観戦、ゴルフ、筋トレ。 Follow @ggenyutakei
アバター
G-gen の杉村です。2026年1月に発表された、Google Cloud や Google Workspace のイチオシアップデートをまとめてご紹介します。記載は全て、記事公開当時のものですのでご留意ください。 はじめに Google Cloud のアップデート LOAD DATA/CREATE EXTERNAL TABLE のフォーマット指定オプションが GA Cloud Run functions で Direct VPC egress が使用可能に(Preview) Gemini CLI 利用状況を Cloud Monitoring にエクスポート Gemini Enterprise の Agent Designer が一般公開(GA) Cloud Run(functions)で pyproject.toml を使ったデプロイに対応 Cloud Load Balancing に Managed Workload Identity が登場(Preview) Cloud DNS で「DNS Armor」が一般公開(GA) Looker Studio で異なるデータソースの図表に同じフィルタを適用できるように Google Cloud にバンコクリージョン(asia-southeast3)が登場 Gemini Cloud Assist を使って BigQuery のジョブ履歴を解析できるように Compute Engine で N4A インスタンスが Preview → 一般公開(GA) Spanner でカラムナエンジンが Preview 公開 AlloyDB for PostgreSQL が PostgreSQL 18 に対応(Preview) BigQuery で Conversational Analytics 機能が Preview 公開 割り当て(Quota)の自動調整機能が組織やフォルダレベルにも対応 Google Workspace のアップデート Dropbox から Google ドライブへの移行ツールが一般公開(GA) Google Meet 音声翻訳がベータ版で利用可能になる予定(2026-01-27) Google フォームで締切日や集まった回答数に応じた自動的な受付停止が可能に Microsoft Office のパスワード保護付きファイルが編集できるように Google Workspace ユーザー向けに動画生成ツール Flow が使えるように Google チャットでメッセージの転送が可能に Google Meet の Ask Gemini 機能が2月上旬から日本語に対応 Google カレンダーで予定作成時に Gemini が会議参加者の空き時間を提案 Gemini アプリで NotebookLM をデータソースとして追加可能に Google フォームで回答者を細かく制御できるようになった はじめに 当記事では、毎月の Google Cloud(旧称 GCP)や Google Workspace(旧称 GSuite)のアップデートのうち、特に重要なものをまとめます。 また当記事は、Google Cloud に関するある程度の知識を前提に記載されています。前提知識を得るには、ぜひ以下の記事もご参照ください。 blog.g-gen.co.jp リンク先の公式ガイドは、英語版で表示しないと最新情報が反映されていない場合がありますためご注意ください。 Google Cloud のアップデート LOAD DATA/CREATE EXTERNAL TABLE のフォーマット指定オプションが GA BigQuery release notes - January 06, 2026 (2026-01-06) BigQueryの「LOAD DATA」「CREATE EXTERNAL TABLE」の際の以下オプションが Preview → 一般公開(GA)。これまで必要だったデータ取り込み前のいくつかの前処理が不要になり運用が簡素化される。 time_zone date_format、datetime_format、time_format、timestamp_format null_markers source_column_match BigQuery のロード時や外部テーブル作成時のオプション Cloud Run functions で Direct VPC egress が使用可能に(Preview) Configure Direct VPC egress for 2nd gen functions (2026-01-06) Cloud Run functions(2nd gen)で Direct VPC egress が使用可能に(Preview)。 サーバーレス関数から VPC にアクセスする手段の1つ。従来手法である Serverless VPC Access connector よりも安価で低レイテンシのため、GA 後はこちらが推奨。 Cloud Run functions で Direct Vpc Egress が使用可能に Gemini CLI 利用状況を Cloud Monitoring にエクスポート Instant insights: Gemini CLI's New Pre-Configured Monitoring Dashboards (2026-01-08) Gemini CLI 利用状況を Cloud Monitoring にエクスポートできるように。 OpenTelemetry によりメトリクスとログを送信。 Gemini Enterprise の Agent Designer が一般公開(GA) Agent Designer overview (2026-01-13) Gemini Enterprise の Agent Designer が一般公開(GA)。ノーコードエージェントを開発するための Web UI。 Gemini Enterprise の Agent Designer でノーコードエージェントを開発 以下の記事も参照。 blog.g-gen.co.jp Cloud Run(functions)で pyproject.toml を使ったデプロイに対応 Deploy Python applications with a pyproject.toml file (2026-01-13) Cloud Run(ソースコードからのデプロイ)と Cloud Run functions の Python ランタイムで、pyproject.toml を使ったデプロイに対応。 これまで主流だった requirements.txt に加え、PEP 518 や PEP 621 で標準化された pyproject.toml を直接利用できる。これにより、Poetry や Hatch といったモダンなツールを用いたプロジェクト構成をそのままデプロイに活用可能。 Google Cloud の Buildpacks がこのファイルを自動検出し、必要なライブラリをインストールしてコンテナをビルドする。ビルド設定や依存関係、メタデータを一つのファイルに集約できるため、プロジェクトの管理効率が向上する。 Cloud Load Balancing に Managed Workload Identity が登場(Preview) Backend mTLS with managed workload identity overview (2026-01-16) Cloud Load Balancing に Managed Workload Identity が登場(Preview)。 LB とバックエンド間の mTLS の構築がシンプルに。証明書の自動管理で運用負荷を下げつつ通信中のデータのセキュリティを強化。 Cloud DNS で「DNS Armor」が一般公開(GA) Advanced threat detection with DNS Armor (2026-01-16) Google Cloud の Cloud DNS で「DNS Armor」が一般公開(GA)。 VM 等からの DNS クエリを検査して悪意あるアクティビティを検知してログ記録する。Infoblox 社が提供する脅威情報に基づく。 Looker Studio で異なるデータソースの図表に同じフィルタを適用できるように Use controls across data sources (2026-01-18) Looker Studio で、異なるデータソースを参照しているチャート(図表)を単一のフィルタ(コントロール)で制御できるようになった。 フィールド ID を上書きして共通にすることでフィルタリングを共通化できる。 Google Cloud にバンコクリージョン(asia-southeast3)が登場 Cloud locations (2026-01-20) Google Cloud にバンコクリージョン(asia-southeast3)が登場。 タイ国内や周辺地域からのレイテンシなどが最適。東アジアではシンガポール、ジャカルタ、香港、台湾、東京、大阪、ソウルに次いで8個目。 これにより、2026年1月現在の Google Cloud リージョンの総数は43、ゾーンは130になった。 Google Cloud のリージョン・ゾーンの総数 Gemini Cloud Assist を使って BigQuery のジョブ履歴を解析できるように Analyze jobs (2026-01-21) Gemini Cloud Assist を使って BigQuery のジョブ履歴を解析できるようになった。 長時間クエリの原因を調べたりジョブ失敗の原因などを Gemini に質問できる。Gemini Cloud Assist を使うには現在、Google Cloud コンソールの言語設定を英語に変更する必要あり。 Compute Engine で N4A インスタンスが Preview → 一般公開(GA) N4A machine series (2026-01-26) Google Cloud の Compute Engine で N4A インスタンスが Preview → 一般公開(GA)。 Google が開発した Arm ベースプロセッサである Axion を搭載。費用対効果に優れる。ただし2026年1月末現在では、東京・大阪リージョンは未対応。 Spanner でカラムナエンジンが Preview 公開 Spanner columnar engine overview (2026-01-26) Spanner でカラムナエンジンが Preview 公開。 database でポリシーを有効にするとバックグラウンドで列指向形式でもデータを保持するようになり、適切なときに自動でそちらを使うようになる。分析系クエリの性能が最大200倍向上とされている。 AlloyDB for PostgreSQL が PostgreSQL 18 に対応(Preview) Create a new cluster and primary instance (2026-01-27) AlloyDB for PostgreSQL が PostgreSQL 18 に対応(Preview)。 PostgreSQL 18 は 2025-09-25 にリリースされた最新メジャーバージョン。 BigQuery で Conversational Analytics 機能が Preview 公開 Conversational analytics overview (2026-01-29) BigQuery で Conversational Analytics 機能が Preview 公開。 生成 AI に自然言語で質問すると AI が自動でクエリを作成して質問に回答してくれる。データソースとなるテーブルを指定してエージェントを作成。 詳細は、以下の記事も参照。 blog.g-gen.co.jp 割り当て(Quota)の自動調整機能が組織やフォルダレベルにも対応 Use the quota adjuster (2026-01-30) 割り当て(Quota)の自動調整機能が、組織やフォルダレベルにも対応。 これまではプロジェクトレベルのみ。ピーク使用量が割り当てに近づいたとき、自動で引き上げリクエストが試みられる。以下の記事も参照。 blog.g-gen.co.jp Google Workspace のアップデート Dropbox から Google ドライブへの移行ツールが一般公開(GA) Now generally available: Migrate files from Dropbox to Google Drive (2026-01-05) Dropbox から Google ドライブへの移行ツールが一般公開(GA)。昨年11月にオープンベータ公開されていた。 Google 管理コンソールから利用。Google Workspace 各種エディションで利用可能。 Google Meet 音声翻訳がベータ版で利用可能になる予定(2026-01-27) Control Speech Translation in Google Meet for your users (2026-01-07) Google Meet 音声翻訳は現在、アルファ版で利用可能。同機能が、2026-01-27 にベータ版としてより多くの人が利用可能になる予定。 Business Plus、Enterprise Plus など一部の Google Workspace エディションのみのためドキュメントを要確認。 Google フォームで締切日や集まった回答数に応じた自動的な受付停止が可能に Set Google Forms to automatically stop accepting responses based on date and time or response count (2026-01-12) Google フォームで、締め切り日や集まった回答数に応じて、自動的に受付停止できるように。 イベント登録フォームなどで、手動で受付停止しなくても済むようになる。Google Workspace、個人アカウント等などで 2026-01-12 から順次ロールアウト。 Microsoft Office のパスワード保護付きファイルが編集できるように Editing password-protected Microsoft Office files directly in Google Drive (2026-01-14) Google Workspaceで、Microsoft Office のパスワード保護付きファイルが編集できるように。 Word、Excel、PowerPoint に対応。全エディションで、順次ロールアウトされて使用可能になる。 Google Workspace ユーザー向けに動画生成ツール Flow が使えるように Flow now available as an additional Google service for Workspace customers (2026-01-16) Google Workspace ユーザー向けに動画生成ツール Flow が使えるように。 「AI-powered filmmaking tool」とされており、文章から動画や画像を生成できる。プロンプトの調整機能など、動画編集に関する機能が充実。 Google Workspace においては「additional Google service(その他の Google サービス)」の扱いであり、以下のような条件が適用される。 サービスは予告なく変更される場合があります。 地域によってはご利用いただけないサービスがあります。 現在のところ、これらのサービスは、サポートおよびサービスレベル契約の対象外です。サービスに関してご不明な点がある場合は、Google ヘルプセンターとヘルプ フォーラムをご確認ください。その他のサービスに対するサポートの拡充は、今後の検討事項となっています。 Google チャットでメッセージの転送が可能に Forward messages in Google Chat (2026-01-20) Google チャットで、メッセージの転送ができるようになった。 全ユーザーに順次ロールアウト。 Google Meet の Ask Gemini 機能が2月上旬から日本語に対応 Ask Gemini in Google Meet is expanding to Workspace Business Standard customers, additional languages, and mobile usage (2026-01-21) Google Meet の Ask Gemini 機能が2月上旬から日本語に対応。 会議に遅れて参加しても会議内のチャットで Gemini に質問してキャッチアップしたり、要点やアクションアイテムをまとめたりできる。 また、対応エディションが拡充し、Business Standard エディションでも利用可能になった。 Google カレンダーで予定作成時に Gemini が会議参加者の空き時間を提案 Better time suggestions for meeting with your colleagues using Gemini in Google Calendar (2026-01-26) Google カレンダーで予定作成時に Gemini が会議参加者の空き時間を提案してくれるようになった。 全員の空きスロットを探して自動でスロットを提案する。即時リリースドメインではすでに使用可能になっている。 Gemini アプリで NotebookLM をデータソースとして追加可能に Take your notebooks further by adding NotebookLM as a source in the Gemini app (2026-01-27) Google Workspace ユーザーの Gemini アプリで、NotebookLM をデータソースとして追加可能になった。個人アカウントでは以前から使えた機能が、Google Workspace にも展開された。 2026-01-20から順次ロールアウトが始まっている。 データソースとして NotebookLM を追加 Google フォームで回答者を細かく制御できるようになった All Google Forms will now have granular controls over who can respond (2026-01-29) Google フォームで回答者を細かく制御できるようになった。 ユーザー、グループなどに限定して回答者を制限できる。以前は回答者は「組織内」「リンクを知っている全員」しか選べなかった。 杉村 勇馬 (記事一覧) 執行役員 CTO 元警察官という経歴を持つ IT エンジニア。クラウド管理・運用やネットワークに知見。AWS 認定資格および Google Cloud 認定資格はすべて取得。X(旧 Twitter)では Google Cloud や Google Workspace のアップデート情報をつぶやいています。 Follow @y_sugi_it
アバター
G-gen の杉村です。BigQuery には Conversational Analytics (対話型分析)機能が備わっており、データに関する質問を生成 AI に対してチャット形式で投げかけることができます。この機能を使うことで、SQL の知識がなくても、自然言語でデータをクエリすることができます。 概要 Conversational Analytics とは 使用イメージ 料金 他の手法との比較 自然言語による BigQuery へのクエリ Looker Studio Pro の Conversational Analytics との違い データエージェント データエージェントとは 設定項目 公開とアクセス制御 データインサイトの自動生成 BigQuery ML 対応 精度向上のために ビジネスロジックの組み込み メタデータの整備 割り当て(Quota) 概要 Conversational Analytics とは BigQuery の Conversational Analytics (対話型分析)、あるいは データエージェント (data agents)とは、日本語や英語などの 自然言語で BigQuery のデータを抽出 できる、生成 AI 機能です。 チャット形式で生成 AI に自然言語で質問をすることで、SQL が自動生成され、テキストや図表による回答が得られます。 参考 : Conversational analytics overview BigQuery の Conversational Analytics Conversational Analytics は、以下のような質問に答えることができます。 「〇年〇月の〇〇カテゴリの商品の売上金額を集計して」 「〇年〇月から〇年〇月までの間の、〇〇の在庫量の変動をチャートにして」 当機能は Google Cloud の Web コンソール画面に組み込まれており、追加ライセンス等は不要です。 当機能は、管理者側で データエージェント と呼ばれる設定を事前に作成し、利用者向けに権限を付与して公開することで使用できます。このように、エージェントの機能や特性を管理する側と、それを利用する側で役割の分担ができることも特徴です。 データエージェントの動作 なお当機能は2026年2月初旬現在、Preview 段階です。一般公開(GA)されるまでは、技術サポートの対象外であるほか、仕様変更の可能性等があります。 参考 : Preview版のサービスを使うとはどういうことなのか - G-gen Tech Blog 使用イメージ 架空の文房具販売店の「注文履歴」「商品マスタ」「顧客マスタ」テーブルを登録したデータエージェントを使って、当機能の使用例を紹介します。 データエージェントとのチャット画面で、 2026年2月の、売れ行きトップ10の商品をリストしてください。 と質問します。 質問を入力 データエージェントは、テキストや図表を交えて質問に回答します。バックエンドでは、生成 AI が日本語による質問を SQL に変換して BigQuery に実行していますが、利用者はそれを意識する必要はありません。 データエージェントによる回答 チャットでは、前の回答を踏まえて、続けて質問ができます。 追加の質問にも回答できる この例では事前にデータエージェントに複数のテーブルを登録してあるため、バックエンドではそれらのテーブルが結合(join)されています。この例では、1つのトランザクションテーブル( orders )と2つのマスタテーブル( customers 、 items )が結合されています。 エージェントに登録されているテーブル 組織における使用イメージは、例えば以下のようなものとなります。 管理者側(クラウド管理者やデータエンジニア、データスチュアードなど)がデータエージェントを作成し、ソースデータやアクセス制御を定義する 使用者はデータエージェント選択画面の URL( https://console.cloud.google.com/bigquery/agents_hub )へアクセス。エージェントを選択して対話型分析を使用開始する エージェント選択画面 なお、データエージェントとのチャット画面は Google Cloud コンソールの一部ですので、Google Cloud コンソールにログインして「BigQuery > エージェント」と遷移することでもアクセスできます。 料金 BigQuery の Conversational Analytics 機能は、2026年2月現在、無料で使用できます。ただし、ドキュメントには「プレビュー期間中は追加の料金が発生しません。」と記載されており、一般公開(GA)後は、追加料金が発生する可能性が示唆されています。 なお Conversational Analytics 機能自体の課金の有無に関わらず、 BigQuery へのクエリ料金 は通常どおり発生します。後述のとおり、意図しない大規模スキャンによる突発課金を防ぐために、事前にエージェントに最大バイト数を指定することができます。 参考 : Conversational analytics overview - Pricing 他の手法との比較 自然言語による BigQuery へのクエリ BigQuery に対して、自然言語によってクエリを行う手法は、当記事で紹介する Conversational Analytics 以外にも複数あります。以下の記事も参照してください。 blog.g-gen.co.jp Looker Studio Pro の Conversational Analytics との違い Google が無償で提供する BI ダッシュボードツール Looker Studio の有償版ライセンスである Looker Studio Pro にも、 Conversational Analytics (対話型分析)が付属しています。 参考 : Looker Studio の Conversational Analytics の概要 Looker Studio Pro の対話型分析 同機能は BigQuery の Conversational Analytics と類似の機能を提供しますが、以下のような差異があります。 項目名 BigQuery(当記事で紹介) Looker Studio Pro 主要な機能 AI に自然言語で質問 AI に自然言語で質問 データソース ・BigQuery テーブル、ビュー、UDF ・BigQuery テーブル、ビュー ・Looker の Explore ・Google スプレッドシート ・CSV ファイル 登録可能なテーブル数 複数 1つ コンテキストの カスタマイズ ・手順(instruction) ・検証済みクエリ ・Dataplex 用語集 ・カスタムメタデータ ・手順(instruction) 課金バイト数制限 可能 不可 高度な分析 なし Python コード生成による 高度な分析 追加金銭コスト なし Pro ライセンス Looker Studio Pro に付属する Conversational Analytics は、BigQuery 以外にも、スプレッドシートや CSV などのデータソースに対応しています。 一方で BigQuery の Conversational Analytics は、複数のテーブルを分析対象にできたり、コンテキストのカスタマイズが充実していたり、通常の BigQuery 利用料金の他は追加の金銭コストがかからないなどの利点があります。BigQuery に対するデータ分析に特化した場合には、BigQuery 付属の Conversational Analytics のほうが利点が多いといえます。 データエージェント データエージェントとは BigQuery の Conversational Analytics 機能を使用するには、まず管理者が データエージェント を作成します。データエージェントは AI チャットの管理単位です。 データソースとなるテーブルの登録やカスタムメタデータの定義、利用者への権限付与などを、データエージェントの単位で行います。 参考 : Create data agents 使用者が Google Cloud コンソールのデータエージェント一覧画面にアクセスし、一覧からエージェントを選択することで、チャットが開始されます。 設定項目 データエージェントには、以下のような設定項目があります。 名称 説明 ナレッジソース データソースとなるテーブル、ビュー、UDF(ユーザー定義関数)。複数選択できる 手順 (Instructions) エージェントに組み込むプロンプト(システムインストラクション)。守らせる手順やルールなどを自然言語で記述する 検証済みクエリ AI が参考にするための、ビジネスロジックを反映したゴールデンクエリ。想定質問とそれに対する SQL を記述する 用語集 ユーザープロンプト理解のため AI が参考にする Dataplex 用語集 課金される最大バイト数 BigQuery の費用スパイクを防止するため、最大バイト数を設定できる エージェント編集画面 公開とアクセス制御 エージェントを作成したり編集したあと、エージェントを 公開 することで、設定が使用者に反映されます。公開せずに 保存 のみを行い、管理者のみに反映された状態にしておくこともできます。 参考 : Create data agents - Preview and publish the agent エージェントには IAM によるアクセス制御が適用されるため、特定の従業員にだけ公開できます。エージェントに質問するユーザーは、エージェントに対する権限に加え、データソースとなるテーブルやビュー等に対する閲覧権限も必要です。 参考 : Analyze data with conversations - Required roles データインサイトの自動生成 データエージェントのナレッジソースとしてテーブルを追加すると、自動的に データインサイト (data insight)が生成されます。このメタデータは、AI によってデータの理解に利用されます。 参考 : Create data agents - Generate insights なおデータインサイトは Dataplex Universal Catalog の機能であり、Conversational Analytics 機能を使わない場合でも、単独で使用できます。 参考 : Dataplex Universal Catalog でデータ分析情報にアクセスする BigQuery ML 対応 BigQuery の Conversational Analytics 機能は、 BigQuery ML にも対応しています。データエージェントの回答に BigQuery ML 関数の結果を含ませられるほか、検証済みクエリに含ませることもできます。 以下の BigQuery ML 関数が使用可能です。 AI_FORECAST AI.DETECT_ANOMALIES AI.GENERATE_BOOL / AI.GENERATE_INT / AI.GENERATE_DOUBLE 特に、データエージェントの検証済みクエリに BigQuery ML 関数を使ったクエリを記述しておくことで、AI が関数を使った回答を生成しやすくなります。 参考 : Conversational analytics overview - BigQuery ML support 精度向上のために ビジネスロジックの組み込み データエージェントの精度を向上するには、管理者がエージェントを作成する際に、適切な 手順 (Instructions)や 検証済みクエリ 、 Dataplex 用語集 などをエージェントに登録します。 これにより、組織のビジネスロジックが AI エージェントに組み込まれ、利用者のプロンプト(質問文)が正確に SQL に反映されるようになるほか、質問があいまいでもある程度カバーすることができます。 ただし公式ドキュメントには「カスタムテーブルメタデータやフィールドのメタデータ、検証済みクエリなど、他のコンテキスト機能でサポートされていない方法でコンテキストを改善したりする必要がある場合にのみ、エージェント向けのカスタム指示を作成してください。」と記載されており、 まずはメタデータ付与や検証済みクエリの登録を試すべき である、と示唆されています。 参考 : Create data agents - Create agent instructions メタデータの整備 BigQuery の標準機能として、テーブルやそのフィールドには、テキスト形式の 説明 (description)を付与できます。テーブルや列のビジネスメタデータを自然言語で付与しておくことで、AI がテーブルやデータを理解することの助けになります。これらのメタデータが正確に付与されていれば、生成される SQL の精度が向上します。 参考 : テーブルを管理する - テーブルの説明を更新する 参考 : テーブル スキーマの変更 - 列の説明を変更する また、データエージェントの設定で、 カスタムテーブルメタデータ や カスタムフィールドメタデータ を付与できます。これらはエージェントが使うためにのみ定義されます。ここにメタデータを設定しても、元のテーブルやビュー等のメタデータ設定には影響しません。カスタムメタデータを設定する画面では、どのようなテキストを付与したらよいか、生成 AI(Gemini)による提案も表示されます。 カスタムメタデータの編集画面 割り当て(Quota) 当機能はバックエンドで生成 AI モデルの Gemini を使用しています。通常の API 経由の Gemini 呼び出しと同じく、当機能による Gemini 呼び出しも、 動的共有割り当て (Dynamic Shared Quota、 DSQ )を採用しています。 多くの Google Cloud プロダクトは、Google Cloud プロジェクトごと、あるいはリージョンごとに割り当て(クォータ)が設定されていますが、Gemini API が採用する DSQ では、他のユーザーと共有するプールからリソースが割り当てられ、需要と共有の変動に応じて割り当てが変動します。 これにより、Google 側でリソースが不足すると 429 Resource Exhausted エラーが発生し、一時的に機能が利用できなくなる可能性があります。このエラーメッセージが表示された場合は、需要と共有のバランスが変動するまで待つ必要があります。 杉村 勇馬 (記事一覧) 執行役員 CTO 元警察官という経歴を持つ IT エンジニア。クラウド管理・運用やネットワークに知見。AWS 認定資格および Google Cloud 認定資格はすべて取得。X(旧 Twitter)では Google Cloud や Google Workspace のアップデート情報をつぶやいています。 Follow @y_sugi_it
アバター
G-gen の森です。Google Cloud のオブジェクトストレージサービスである Cloud Storage において、見落とされがちなのが レプリケーション料金 です。当記事では、ロケーションタイプの選択による料金スパイクの事象と、リージョン間レプリケーション料金の仕組み、ロケーションタイプを決めるポイントについて解説します。 事象 原因 ロケーションタイプ ロケーションタイプと可用性 リージョン間レプリケーション料金とは 料金の算出方法 ターボレプリケーション ロケーションタイプ決定の判断基準 可用性と堅牢性 コストとレイテンシの最適化 事象 Cloud Storage バケットを新規に作成し、大容量(全体で約12.4TiB)のオブジェクトをアップロードしました。すると、想定よりも大きな Cloud Storage 料金が発生しました。 オブジェクト数は1,000個以内であり、オペレーション料金は大きく発生しない想定でした。 料金がスパイクした SKU を確認すると、 Network Data Transfer GCP Replication within Asia ( CA61-E18A-B2D6 )でした。 なお、当記事で扱うこの事象は、以下の SKU でも発生する可能性があります。 Network Data Transfer GCP Replication within Europe( CB83-3C2D-160D ) Network Data Transfer GCP Replication within Latin America( AFC0-C8B7-9708 ) Network Data Transfer GCP Replication within Northern America( AED0-3315-7B11 ) Network Data Transfer GCP Replication within Oceania( 1193-6316-413E ) 原因 当該のバケットを作成する際、ロケーションタイプの設定において、コンソールのバケット作成画面におけるデフォルト設定である マルチリージョン を選択していました。 マルチリージョンまたはデュアルリージョンでは、オブジェクトの作成や更新を行うと、データが地理的に離れた場所にレプリケーション(コピー)されるため、 リージョン間レプリケーション料金 が発生していました。この仕様を認識していなかったため、レプリケーション料金は想定外のものとなりました。 ロケーションタイプ ロケーションタイプと可用性 Cloud Storage では、バケット作成時に ロケーションタイプ 、すなわちデータの保存場所を、以下の3つのうちいずれかから選択します。 ロケーションタイプ 説明 リージョン(Region) 東京( asia-northeast1 )などの特定の1地点に保存 デュアルリージョン(Dual-region) 東京と大阪( asia1 )などの特定の2リージョンに保存 マルチリージョン(Multi-region) アジア( asia )などの広大な地理的エリア内の複数リージョンに保存 上記のうち、デュアルリージョンとマルチリージョンは、リージョン障害に対する耐性を持ちますが、内部的にリージョンをまたいでデータをコピーするため、リージョン間レプリケーション料金が発生します。 参考 : バケットのロケーション リージョン間レプリケーション料金とは リージョン間レプリケーション料金 とは、デュアルリージョンまたはマルチリージョンバケットにオブジェクトを作成したり、更新したりする際に発生する、データ転送費用のことです。 Cloud Storage の下り(Egress)料金は外部に読み出すときにだけ発生すると誤解しがちです。しかし実際には上記のように、デュアルリージョンまたはマルチリージョンバケットのように冗長化構成をとっているバケットで、書き込み時にもネットワーク費用が発生するという点に注意が必要です。 料金の算出方法 リージョン間レプリケーション料金は、書き込んだデータのサイズに応じて発生します。2026年1月現在の主要なロケーションでの料金例は以下の通りです。 ロケーション 料金 (1 GiB あたり) 北アメリカ(US など) $0.02 ヨーロッパ(EU など) $0.02 アジア(ASIA など) $0.08 最新の正確な料金単価は、以下の公式料金ページをご確認ください。 参考 : Cloud Storage の料金 - リージョン間レプリケーション ターボレプリケーション デュアルリージョンのバケットでは、オプション機能として ターボレプリケーション (Turbo Replication)を有効にできます。この機能が有効になっていると、通常より料金が多く発生します。 まず、ターボレプリケーションがオフの場合、リージョン間のコピーは以下の仕様で行われます。 新しく書き込まれたオブジェクトの 99.9% に対しては1時間以内を目標にリージョン間でコピーを完了させる 残りのオブジェクトに対しては12時間以内を目標にコピーを完了させる 一方でターボレプリケーションを有効にすると、オブジェクトの100% が、15分以内にコピー完了するように SLA が設定されます。 参考 : データの可用性と耐久性 - 複数のリージョンにわたる冗長性 参考 : データの可用性と耐久性 - ターボ レプリケーション 参考 : Cloud Storage Service Level Agreement (SLA) その代わり、ターボレプリケーションを有効にすると、リージョン間レプリケーション料金の単価が割増になります。高頻度で大容量の書き込みが発生するワークロードでターボレプリケーションを有効化すると、コストが大幅に上昇する可能性があるため、RPO 要件に基づいた適切な判断が必要です。 参考 : Cloud Storage の料金 - リージョン間レプリケーション ロケーションタイプ決定の判断基準 可用性と堅牢性 単一リージョンのバケットを使用することで、レプリケーション料金を排除できます。分析用の一時ファイルや頻繁に更新されるログなどは、単一リージョンのバケットを選ぶことで、コストを最適化できます。 単一リージョンのバケットであっても、データは複数のゾーンに冗長化されており、十分に高い冗長性と堅牢性(年間99.999999999%)を持っています。 一方で、リージョンレベルの障害が許容できないほどの高い可用性が必要なデータは、その性質によっては、データ転送のコストをかけてでもデュアルリージョンやマルチリージョンを検討します。 コストとレイテンシの最適化 マルチリージョンバケットに保存されるオブジェクトを読み取る際は、読み取り元のコンピューティングリソース(Compute Engine など)が存在するリージョンにかかわらず、常にネットワーク下り料金が発生します。 そのため、特定のリージョンのコンピューティングリソースから頻繁にオブジェクトを読み取る場合は、デュアルリージョンまたは単一リージョンを選択することで、コストを最適化できます。 また、デュアルリージョンまたは単一リージョンは、読み取り側のコンピューティングリソースと同一リージョンであれば、レイテンシも最適化されます。 森 寛之 (記事一覧) クラウドソリューション部 三重県出身、愛知県在住のクラウドエンジニア! 業務システムエンジニアからクラウドエンジニアへ転向。 好きな分野は 業務分析と、BigQuery でデータ分析。 Follow @mori_chan_it
アバター