electronで定期的にAPI取得・DBに保存・データ表示とかしようとしてましたが、前2つはクラウドでやった方が色々と楽で便利なんじゃないかと思いついた。
AWSも最近放置気味なんで新しくGCPを触ってみることにしました。
なんといっても無料枠がありますし。
参考にしたリンク
- Firestore Quick Start
- Always Free制限(日本語):各サービスのリミット。日本語は数値の抜けあり。
サービス名称と概要
DBと処理実行のサービスをざっと見る。
- GCP(Cloud Platform):プラットフォーム名称(≒AWS)
- Cloud Storage – DB
- Bigtable:大規模用NoSQL
- Datastore:NoSQL
- FireStore:新しいNoSQL
- Cloud SQL:MySQL および PostgreSQL
- コンピューティング
- GAE(App Engine):ウェブアプリPaaS
- GCE(Compute Engine):Iaas、仮想マシン(≒EC2)
- GKE(Kubernetes Engine):コンテナ管理
- Cloud Functions:イベントトリガーで動く関数(≒Lambda)
- Cloud Run:サーバレスコンテナ管理
APIで取ったJSONをそのまま使えるNoSQL、せっかくなので新しいFirestore。
処理は常駐型のものが欲しい。
Functionsは無制限、GAEは最大24時間実行可能らしいので上手くやれば常駐にできるかも。ただどうしても無料枠には収まらない。
まぁ普通にGCEを使うか。
無料トライヤルの開始
これをしなくてもFirestoreは使えたんですが、登録しないと使えないサービスもあったので登録してみる。必要なのはクレカと住所だけです。
飽きてほったらかしになっても勝手に課金されることはないようですし、$300のフリークレジット付きでした。
Firestore
よくわからないまま適当に作ってみる。
コレクションとドキュメントはエンティティとインスタンスみたいなものか。
同プロジェクトのGCEからであれば鍵はいらないかもしれませんが、ローカルでテストもしたいのでキーを作成します。
「IAMと管理→サービスアカウント」にあるアカウントで「キーを作成」します。
GCE
AllwaysFreeの条件に即してOregonリージョン、f1-micro、30G標準ストレージ。
gcloudを使うと良さそうだけど、まずは普通にSSHログインしてみる。
1 2 |
//ssh-keygen //秘密鍵がないなら作る cat ~/.ssh/id_rsa.pub |
この文字列をメタデータのSSH鍵に追加する。
1 |
ssh user_name@external_IP |
これでログインできた。
デフォルトではIPがエフェメラル(一時的)なので静的IPを割り当てる。
インスタンスの編集からネットワークインターフェースを変更します。
実はインスタンス作成時に指定できたけど折り畳みで気付かなかった。
IPアドレス自体は「ネットワーキング→VPCネットワーク」で管理されます。
AWSと同様にインスタンスに紐づけされない静的IPは課金対象みたいなのでGCEを止めるときには気を付ける。
とりあえずこれで実行場所の確保はできた。
Firestoreアクセス
QuickStartを見ながらデータベースにアクセスしてみます。
Goで書きましたがサンプルは変に略されてるので若干使いにくい。
1 2 3 |
>go get firebase.google.com/go >go run main.go map[data:map[] id:] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
package main import ( "context" "fmt" "log" firebase "firebase.google.com/go" "google.golang.org/api/iterator" "google.golang.org/api/option" ) const keyPath = "../project-xxxx.json" const cName = "data" func main() { ctx := context.Background() sa := option.WithCredentialsFile(keyPath) app, err := firebase.NewApp(ctx, nil, sa) if err != nil { log.Fatalln(err) } client, err := app.Firestore(ctx) if err != nil { log.Fatalln(err) } defer client.Close() iter := client.Collection(cName).Documents(ctx) for { doc, err := iter.Next() if err == iterator.Done { break } if err != nil { log.Fatalf("Failed to iterate: %v", err) } fmt.Println(doc.Data()) } } |
サンプルで作ったドキュメントをとってくることが出来ました。
後は処理を書いてGCEに渡すだけです。