Google Cloudの費用をLooker Studioでモニタリング

:::note warn
本記事は2024年11月時点での内容になります。最新情報については公式サイトなどを確認願います。
:::

# Google Cloudの使用料をLooker Studioで可視化する手順

[BigQueryのコストを可視化する方法](https://qiita.com/ricardinho/items/40796235ba0171960429)については以前紹介しましたが、今回はGoogle Cloud Billing Exportを利用して、Google Cloud全体の使用料をBigQueryにエクスポートし、Looker Studioで可視化するための手順を紹介します。

---

## ステップ 1: Google Cloud Billing Exportの設定

1. **Google Cloud Consoleにログイン**  
   [Google Cloud Console](https://console.cloud.google.com/) にアクセスして、使用しているプロジェクトを選択します。

2. **Billing Exportの有効化**  
   - メニューから「課金」 > 「課金エクスポート」を選択。
   - 「BigQueryエクスポート」をクリック。
   - 使用データをエクスポートするBigQueryプロジェクトとデータセットを指定。
   - 「エクスポートを有効にする」をクリックして設定完了。
     ※ 上記を行うには下記の権限（ロール）が必要です。
        - Billing Account Administrator（課金アカウント管理者）このロールは、課金アカウントの設定を変更するために必要です。
      - Billing Account Viewer（課金アカウント閲覧者）課金情報を閲覧するために必要です。
     - BigQuery Data Editor（BigQueryデータ編集者）データセットやテーブルを作成し、データを書き込む権限が必要です。
     - BigQuery Job User（BigQueryジョブユーザー）BigQuery内でのジョブ（クエリやデータの読み書き）を実行するために必要です。

3. **データ確認**  
   数時間から24時間以内に、エクスポートされた使用料データがBigQueryの指定したデータセット内に保存されます。主に以下のテーブルが作成されます：
   - `gcp_billing_export_v1_<BillingAccountID>`（リソース別の課金詳細）

---

## ステップ 2: BigQueryでのデータ確認とカスタマイズ

1. **BigQueryにアクセス**  
   [BigQueryコンソール](https://console.cloud.google.com/bigquery) で、課金データが正しくエクスポートされていることを確認します。

2. **カスタムクエリの作成（必要に応じて）**  
   使用状況データを整理し、Looker Studioでの可視化に適した形式にするためのクエリを作成します。例えば：
   ```sql
   SELECT
       TIMESTAMP_TRUNC(usage_start_time, DAY) AS usage_date,
       service.description AS service_name,
       sku.description AS sku_name,
       SUM(cost) AS total_cost
   FROM
       `your_project_id.your_dataset_id.gcp_billing_export_v1_*`
   WHERE
       _TABLE_SUFFIX BETWEEN '20240101' AND '20241231'
   GROUP BY
       usage_date, service_name, sku_name
   ORDER BY
       usage_date;
   ```

---

## ステップ 3: Looker Studioでのデータ接続

1. **Looker Studioにログイン**  
   [Looker Studio](https://lookerstudio.google.com/) にアクセス。

2. **新しいデータソースを追加**  
   - 「データソースを追加」をクリック。
   - 「BigQuery」を選択。
   - 使用データを保存したプロジェクト、データセット、テーブルを選択。

3. **スキーマ確認**  
   フィールド（列）が正しく認識されているか確認。必要に応じてフィールドタイプを変更します（例: 日付フィールドは日付型に設定）。

---

## ステップ 4: レポートの作成と可視化

1. **新しいレポートを作成**  
   - 「新しいレポートを作成」をクリック。
   - 先ほど作成したデータソースをレポートに接続。

2. **グラフやテーブルを追加**  
   - 折れ線グラフ: 日付ごとの使用料を可視化。
   - 円グラフ: サービスごとのコスト割合を表示。
   - 棒グラフ: SKUごとの使用料比較。

3. **フィルタとコントロールの追加**  
   - フィルタ: 特定の期間やサービスに絞り込む。
   - コントロール: ユーザーがインタラクティブにデータを操作できるようにする。

4. **スタイルとフォーマット調整**  
   見た目を整え、読みやすいデザインにする。

---

## ステップ 5: レポートの共有

- **共有リンクを生成**  
  「共有」 > 「リンクを共有可能にする」でレポートへのリンクを生成。
- **アクセス権の設定**  
  特定のユーザーにのみアクセスを許可するか、リンクを知っているすべての人が閲覧できるように設定します。

---

## クエリの詳細解説

以下は、Google Cloud BillingデータをBigQueryで加工する際のクエリ例とその解釈です。

```sql
WITH target AS(
  SELECT 
    150 AS rate, -- ドル円レート（固定値）
    6.25 AS fee_tb, -- 1TBあたりの料金（USD）
    PARSE_DATE("%Y%m%d", @DS_START_DATE) AS start_date,
    PARSE_DATE("%Y%m%d", @DS_END_DATE) AS end_date
) 
,billing as(
  SELECT 
      service.description AS service,
      TRIM(REGEXP_EXTRACT(TRIM(COALESCE(REGEXP_EXTRACT(REPLACE(sku.description,'Long-Term','Long Term'),r'^(.*?)[(-]'), sku.description)), r'^[A-Z][A-Za-z]*(?:\s[A-Z][A-Za-z]*)*')) AS sku_description, 
      sku.description AS original_sku_description,
      DATE(usage_start_time,'Asia/Tokyo') AS usage_date,
      project.id AS project_id,
      project.name AS project_name,
      CASE WHEN sku.description LIKE '%Replication%' THEN REGEXP_EXTRACT(resource.name, r'/datasets/([^\/]+)/') ELSE resource.name END AS resource_name, -- sku_descriptionがAnalysisの場合はジョブID、Storageの場合はデータセット名
      ROUND(SUM(cost) + SUM(IFNULL((SELECT SUM(c.amount) FROM UNNEST(credits) c), 0)),2) AS cost_jpy,
      MIN(DATE(DATETIME(usage_start_time,'America/Los_Angeles'))) AS usage_start_date,    
      MAX(DATE(DATETIME(usage_start_time,'America/Los_Angeles'))) AS usage_end_date
  FROM `<project_id>.all_billing_data.gcp_billing_export_resource_v1_<billing_id>` 
  CROSS JOIN target
  WHERE 
    DATE(DATETIME(usage_start_time,'Asia/Tokyo')) BETWEEN start_date AND end_date
  GROUP BY ALL
  HAVING cost_jpy > 0
)
SELECT 
  project_id,
  resource_name,
  service,
  sku_description,
  usage_date,
  cost_jpy
FROM billing;
```

### **クエリの目的**
- BigQueryの使用料（ストレージ、クエリ、レプリケーションなど）を日付、リソース、プロジェクト単位で集計。
- ドル円レートを考慮し、費用を日本円で計算。
- クレジットを適用して実際のコストを反映。

### **重要なポイント**
1. **為替レート**:
   クエリ内で`rate`を固定値として設定していますが、Googleスプレッドシートなど外部ソースと連携することで動的な為替レートも可能。

2. **期間指定**
   @DS_START_DATE、@DS_END_DATEとすることで、Looker Studioの期間フィルターで指定した期間が対象となる

3. **リージョン**:
   リージョンに応じて`usage_start_time`のタイムゾーンを切り替える仕組みがあります（日本時間またはアメリカ時間）。

4. **クレジットの考慮**:
   `UNNEST(credits)`を利用して適用済みのクレジット額を費用に反映。

---

これで、Google Cloudの使用料をLooker Studioで可視化し、プロジェクトごとの費用をより詳細に分析できます！