前提
以前作成した下記記事の環境からスタートします。
サービスアカウントを作成
スタートガイドでサービスアカウントを作成
- サービスアカウント名を入力
- 作成して続行をクリック
- ロールを選択(今回は編集者にしました)
- 続行をクリック
- 完了
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
ターミナルでyarn add @google-cloud/bigquery
を実行
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番の権限周りが一番苦戦しました...
参考文献