はじめに
CloudFunction(PHP)を使用して、Cloud Storage内に配置したCSVファイルのデータをBigQueryへ転送する方法をまとめました。
CSVファイルのデータは前回の記事の方法で用意しました。
・Cloud Functions(PHP)を使用して、Cloud SQLのデータをCloud Storageへ転送する
使用サービス
- Cloud Functions
- Cloud Storage
- BigQuery
やろうとしていること
- Cloud Storageに配置したCSV読み込み → BigQuery転送
ソース
use Google\CloudFunctions\CloudEvent;
use Google\Cloud\Storage\StorageClient;
use Google\Cloud\BigQuery\BigQueryClient;
use Google\Cloud\Core\ExponentialBackoff;
function function2(CloudEvent $cloudevent)
{
// BigQuery へのアクセス準備(事前にコンソール側でデータセットやテーブルの作成は済ませておく)
$bigquery = new BigQueryClient([
'projectId' => 'test_project', // project名
]);
$dataset = $bigquery->dataset('test_dataset'); //データセット名
$table = $dataset->table('test_table'); //テーブル名
// CSVファイル内の(\N = NULL)の設定
$options = [
'configuration' => [
'load' => [
'nullMarker' => "\N"
]
]
];
// 読み込むcsvファイルを指定
$uri = "gs://test_bucket/test.csv";
// オプション等を設定
$loadConfig = $table->loadFromStorage($uri, $options)->writeDisposition('WRITE_TRUNCATE');
// csvデータのBigQueryへの転送処理
$job = $table->runJob($loadConfig);
// ExponentialBackoff処理
$backoff = new ExponentialBackoff(10); //リトライ数を設定
$backoff->execute(function () use ($job) {
$job->reload();
if ($job->isComplete() === false) {
throw new Exception('Job has not yet completed', 500);
}
});
// 実行結果の検証
$info = $job->info();
if (isset($info['status']['errorResult'])) {
// エラー処理など
}
}
今回Cloud Functionsの実行は、イベントタイプをCloud Storage(google.storage.object.finalize)にして対象のバケットにファイルが格納されると起動するようにしています。
CSVファイル内のカラムにNULLが存在する場合は「\N」で設定されていることを前提に、BigQueryClientのloadFromStorageにオプションを設定しています。
BigQueryへの転送は、処理に時間が掛かることもあるので、実行が失敗した時のためにExponential Backoff でのリトライ処理を入れています。
実行するCloud Functionsとは別のプロジェクトのBigQueryへ転送したい場合は、Cloud Functionsのサービスアカウント(のメールアドレス)を別プロジェクトのIAMにプリンシパルで追加する必要があります。
権限は下記で動きますが、必要な権限のみに絞る方が良いと思います。
・BigQuery ジョブユーザー
・BigQuery データ編集者