Cloud BillingをAWSへ取り込む

# これは何？
Google Cloudの利用料データ（Cloud Billing）をAWS側へ取り込み方法の検討メモ。
（最終的には取り込んだデータをQuickSightで可視化したい。）

## Google Cloud、AWS間でのCloud Billingの連携
連なるべくマネージドサービスに寄せる方針で検討。

＜案としては3つ＞
1. AthenaからBigQueryに対してクエリを投げる。
1. GlueでBigQueryのデータをS3へ保存。S3へ保存したメタデータをGlue Data Catalogに保存し、Athanaからクエリを投げる。
1. BigQueryからCloudStorageにエクスポートする。AthenaからCloudStorageに対しクエリを投げる。

### 1. AthenaからBigQueryに対してクエリを投げる。
Athenaカスタムコネクタを使って、AthenaからBigQueryへクエリを投げる方法。

ドキュメントに、Athenaカスタムコネクタの制約事項に構造体データは未サポートという記載がある。
Cloud Billingのデータでは一部構造体データを含むデータが存在するが、Viewを作成することで回避は可能と思われる。（未検証）

参考）
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/connectors-bigquery.html
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/connect-data-source-serverless-app-repo.html

カスタムコネクタの実体はLambda関数とのこと。
AWS Serverless Application Repositoryにテンプレートが用意されているので、
パラメーターを入力すればカスタムコネクタ環境のデプロイができる。

参考）
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/connect-to-a-data-source-lambda.html

### 2. GlueでBigQueryのデータをS3へ保存。S3へ保存したメタデータをGlue Data Catalogに保存し、Athanaからクエリを投げる。
Glueカスタムコネクタを使って、BigQueryデータを取り込む方法。

### 3. BigQueryからCloudStorageにエクスポートする。AthenaからCloudStorageに対しクエリを投げる。
Athenaカスタムコネクタを使って、AthenaからCloudStorageへクエリを投げる方法。

参考）
https://docs.aws.amazon.com/athena/latest/ug/connectors-gcs.html
https://cloud.google.com/bigquery/docs/scheduling-queries?hl=ja#set_up_scheduled_queries


## Glueカスタムコネクタの方法で検証
### ①Glueカスタムコネクタの設定
大まかな流れはの[ドキュメント](https://aws.amazon.com/jp/blogs/news/migrating-data-from-google-bigquery-to-amazon-s3-using-aws-glue-custom-connectors/)を参照すればできる。

AWS MarketplaceにAWSが提供しているGlueカスタムコネクタがあるのでそちらを使用する。
ただ、ドキュメントからMarketplaceのリンクの飛ぶと、カスタムコネクタのバージョンが古くて削除されている。
新しいカスタムコネクタは[こちら](https://aws.amazon.com/marketplace/pp/prodview-sqnd4gn5fykx6)。

ドキュメントと差異があるのはGlueのバージョン選択くらい。
![スクリーンショット 2023-03-15 12.09.04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1287372/b02d6631-bcfd-8941-e75c-dea7f9517988.jpeg)

Glueジョブもドキュメントに従い作成できる。
BigQueryから取り込んだデータはS3へ保存され、メタデータがGlue Data Catalogへ保存される。

### ②Athenaでクエリを実行
AthenaでGlue Data Catalogのデータが参照できることを確認。

### ③Glueジョブのスケジューリング設定
追加で行った設定として、
日次でBigQueryからデータを取り込みたいので、Glueジョブのスケジューリングを設定。
（UTC時刻で設定）

参考）
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/about-triggers.html

### ④取り込みデータの重複排除について
日次でデータを取り込むにあたって、データ重複が懸念される。
Glueジョブのジョブブックマーク機能を利用すれば、最後のジョブ実行以降の増分データのみを取り込み対象とできるのだが、
ソースデータがGlueカスタムコネクトだと対応していないらしい。

参考）
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/monitor-continuations.html
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/monitor-continuations.html

#### データ重複で増え続けていくと
- 毎日データを取り込むことになるため、S3側に重複したデータが溜まり続けることになる。取り込むデータ量にもよるがS3の利用料が膨れる。
- QuickSightでビジュアル化する際にAthena経由でクエリを投げることになるが、クエリの実行時間も長くなってしまう。

#### 対応方法
S3のライフサイクルポリシーで1日経過したオブジェクトは削除。
ライフサイクルの削除タイミングにより一時的にデータ重複する期間はある為、Athena側で重複データは丸める方針とした。
他の方法としては、Pushdown Predicate による入力データの絞り込みを行う方法もあるようだが未検証。


## 備考
### Google Cloudの利用料データをエクスポートするには
プロジェクトの利用料データ（Cloud Billing）は請求先アカウントに集約される。
利用料データをエクスポートするには、請求アカウントでBigQueryに対して利用料データのエクスポートの設定がされている必要があり、
BigQueryを介して利用料データを取得する必要がある。

参考）
https://cloud.google.com/billing/docs/how-to/manage-billing-account?hl=ja
https://cloud.google.com/billing/docs/how-to/export-data-bigquery?hl=ja

### Cloud Billingデータの構成について
料金テーブルは2種類存在する。
- 標準の使用料金テーブル – BigQuery データセットでは、このテーブルには gcp_billing_export_v1_<BILLING_ACCOUNT_ID> という名前が付けられています。
- 詳細な使用料金テーブル - 標準の使用料金テーブルのすべてのデータ項目に加えて、リソースレベルの費用データを提供する追加の項目（例: サービス使用量を生成する仮想マシンまたは SSD）が含まれます。BigQuery データセットでは、このテーブルの名前は gcp_billing_export_resource_v1_<BILLING_ACCOUNT_ID> です。

参考）
https://cloud.google.com/billing/docs/how-to/export-data-bigquery-tables?hl=ja
https://cloud.google.com/billing/docs/how-to/export-data-bigquery-tables/standard-usage?hl=ja
https://cloud.google.com/billing/docs/how-to/export-data-bigquery-tables/detailed-usage?hl=ja