前提
以前作成した下記記事の環境からスタートします。
サービスアカウントを作成
スタートガイドでサービスアカウントを作成
サービスアカウント名を入力
作成して続行をクリック
ロールを選択(今回は編集者にしました)
続行をクリック
完了
keyの作成
上記手順で作成したアカウントがあることを確認
そのアカウントのリンクをクリック
「キー」を選択
鍵を追加、「新しい鍵を作成」をクリック
「JSON」 で作成
JSON
上記でダウンロードした「JSON」をpackage.jsonと同じ階層でcredentials.jsonとして保存
envファイルでは、GOOGLE_APPLICATION_CREDENTIALS="./credentials.json"のように保管
BigQuery
GCP > BigQuery > SQLワークスペースで予め作成しておくもの
プロジェクト
データセット
今回BQに入れたいデータ
const costGraphData = [
{ date: "01-01", cost: 1100 },
{ date: "01-02", cost: 1200 },
{ date: "01-03", cost: 1000 },
{ date: "01-04", cost: 800 },
{ date: "01-05", cost: 1700 },
{ date: "01-06", cost: 1000 },
{ date: "01-07", cost: 1000 },
{ date: "01-08", cost: 600 },
{ date: "01-09", cost: 800 },
{ date: "01-10", cost: 400 },
{ date: "01-11", cost: 1600 },
{ date: "01-12", cost: 1400 },
{ date: "01-13", cost: 1100 },
{ date: "01-14", cost: 1200 },
{ date: "01-15", cost: 900 },
]
データセットからテーブルを作成
テーブル名の入力
フィールドを2つ追加する
フィールド名:date タイプ:STRING
フィールド名:cost タイプ:INTEGER
※DATE型もありますが、今回はSTRING型で入れます
上記の手順を行い、テーブルを作成
src > bq.ts
import { BigQuery } from "@google-cloud/bigquery"
import { initLogger } from "../logger/index"
const { infoLogger, errorLogger } = initLogger("logger/index.ts")
export const insertRowsAsStream = async () => {
const bigQuery = new BigQuery()
const costGraphData = [
{ date: "01-01", cost: 1100 },
{ date: "01-02", cost: 1200 },
{ date: "01-03", cost: 1000 },
{ date: "01-04", cost: 800 },
{ date: "01-05", cost: 1700 },
{ date: "01-06", cost: 1000 },
{ date: "01-07", cost: 1000 },
{ date: "01-08", cost: 600 },
{ date: "01-09", cost: 800 },
{ date: "01-10", cost: 400 },
{ date: "01-11", cost: 1600 },
{ date: "01-12", cost: 1400 },
{ date: "01-13", cost: 1100 },
{ date: "01-14", cost: 1200 },
{ date: "01-15", cost: 900 },
]
try {
infoLogger("Big Query にレコードのインサート開始")
await bigQuery.dataset(データセット名).table(テーブル名).insert(costGraphData)
infoLogger("Big Query にレコードのインサート完了")
return Promise.resolve()
} catch (error) {
errorLogger("インサート失敗", { error })
return Promise.reject(error)
}
}
※もしデータを何かで取得した場合、costGraphDataの形に直してあげればBQにインサートができます。
app.ts
import express from "express"
import { insertRowsAsStream } from "./bq"
const app = express()
app.use(express.json())
app.get("/", insertRowsAsStream)
const port = 8080
app.listen(port, () => {
// eslint-disable-next-line no-console
console.log(`Listening on port ${port}`)
})
app.tsでbq.tsの関数を実行
最後に
ターミナルでyarn devを実行
別ターミナルでcurl http://localhost:8080を叩く
1のターミナルでインサートが完了、GCPのBQテーブル(プレビュー)でデータが反映されていればOK!
コードよりも権限やBQを設定する準備の方が難しく、時間がかかりました。
特に「サービスアカウントを作成」手順3番の権限周りが一番苦戦しました...
参考文献
↧