4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ZOZOAdvent Calendar 2024

Day 22

BigQuery Editionsの管理プロジェクトの費用を各プロジェクト毎に分割する

Last updated at Posted at 2024-12-21

BigQuery Editionsを利用する時には、Reservationを作成するための専用のプロジェクト(管理プロジェクト)を作成することが推奨されています。このような構成にすることで複数のプロジェクトで1つのReservationを共有したり、あるReservationで余ったスロットを別のReservationにお裾分けすることができ、コスパ良くBigQueryを利用できます。

しかし、この構成を取ると請求コンソールや請求情報のBigQueryエクスポート的には管理プロジェクトが全ての費用を使っているように見えてしまいます。BigQueryのコスト管理をする際には各プロジェクトの費用が分かっている方がやりやすいため、管理プロジェクトの費用を各プロジェクトに分割する方法を紹介します。

まずは、以下のクエリでそれぞれのReservationに所属するプロジェクト毎のSlot利用割合を求めます。
GCPの費用はPST(米国西海岸時間)で月次の締め処理が行われるため、タイムゾーンをPSTにしてあります。

with consumed_slot_hour_by_reservation_project_date as (
  select
    reservation_id,
    project_id,
    date(creation_time, 'America/Los_Angeles') as date_pst,
    ifnull(sum(total_slot_ms), 0) / 10000 / 60 / 60 as slot_hour,
  from `<INFORMATION_SCHEMA.JOBS_BY_ORGANIZATION>`
  where reservation_id is not null and reservation_id <> 'default-pipeline' and
  job_type = 'QUERY' and 
  statement_type != 'SCRIPT' and
  creation_time > current_timestamp - interval 30 day
  group by all
), reservation_consumption_rate_by_project_date as (
  select
    * except(slot_hour),
    slot_hour / sum(slot_hour) over (partition by reservation_id, date_pst) as reservation_consumption_rate,
  from consumed_slot_hour_by_reservation_project_date
  order by reservation_id, date_pst, project_id
)

次に、このクエリで各Reservationに割り当てられたSlot時間の積算値を日毎に求めます。

with assigned_slot_by_reservation_date as (
  select
    reservation_id,
    date(period_start, 'America/Los_Angeles') as date_pst,
    sum(slots_assigned + autoscale.current_slots) / 60 as slot_hour,
    edition,
  from `<INFORMATION_SCHEMA.RESERVATIONS_TIMELINE>`
  where period_start > current_timestamp - interval 30 day
  group by all
)

最後に上記の2つの情報を組み合わせることで、Edition毎・プロジェクト毎にどのプロジェクトが何割の費用を発生させているのかを求めます。

with assigned_slot_by_project_date as (
  select
    reservation_id,
    edition,
    date_pst,
    project_id,
    slot_hour * reservation_consumption_rate as slot_hour,
  from reservation_consumption_rate_by_project_date
  left join assigned_slot_by_reservation_date
  using(reservation_id, date_pst)
), cost_consumption_rate_by_project as (
  select
    date_pst,
    edition,
    project_id,
    slot_hour / sum(slot_hour) over (partition by date_pst, edition) as cost_consumption_rate,
  from (
    select
      date_pst,
      edition,
      project_id,
      sum(slot_hour) as slot_hour
    from assigned_slot_by_project_date
    group by all
  )
)

select * from cost_consumption_rate_by_project

このクエリで出力された cost_consumption_rate をそれぞれの日のそれぞれのエディションの費用に対して掛けると、管理プロジェクトの費用を各プロジェクトに分割できます。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?