コンテキスト: FireStore ダッシュボードからデータを取得 (ダウンロード) する方法を学びました。明らかに、ブラウザで Google ダッシュボードを開いて、Google Dasboard を所有していることを目で確認する方がはるかに簡単です。とはいえ、個人的な理由から、私の会社ではオペレーターは 3 つ目のダッシュボードを見ることができません。内部ダッシュボードのみを表示できます。ダッシュボードに入力するために使用される同じデータを取得/ダウンロードし、Dynatrace/ELK に基づく内部ソリューションにインポートできるいくつかの回避策を試しています。
学習目的で、Google ダッシュボードのデータをダウンロードするために、次の手順に従いました。
1 - gcloud を使用して ACCESS_TOKEN を取得する
C:\Program Files (x86)\Google\Cloud SDK>gcloud auth application-default print-access-token
C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\bin\..\lib\third_party\google\auth\_default.py:69: UserWarning: Your application has authenticated using end user credentials from Google Cloud SDK. We recommend that most server applications use service accounts instead. If your application continues to use end user credentials from Cloud SDK, you might receive a "quota exceeded" or "API not enabled" error. For more information about service accounts, see https://cloud.google.com/docs/authentication/
warnings.warn(_CLOUD_SDK_CREDENTIALS_WARNING)
ya29. ... ACCESS-TOKEN ...7hu
2 - 上記の ACCESS_TOKEN を使用して、次のようなダッシュボード データを取得します。
curl --location --request GET 'https://monitoring.googleapis.com/v3/projects/firetestjimis/timeSeries?filter=metric.type%20%3D%20%22firestore.googleapis.com%2Fdocument%2Fread_count%22&interval.endTime=2020-05-07T15:01:23.045123456Z&interval.startTime=2020-05-05T15:01:23.045123456Z' --header 'Authorization: Bearer ya29...ACCESS-TOKEN 7hu'
明らかに、これはフィルター基準を満たす接続の数を取得する方法の単なる例です。Google Cloud MetricsとGoogle Cloud API v3に従って API とフィルターを調整しながら検索を続けることができます
今回APIバージョン1からDashboardメタデータを取得する他の例は
curl --location --request GET 'https://monitoring.googleapis.com/v1/projects/firetestjimis/dashboards' --header 'Authorization: Bearer ya29... ACCESS-TOKEN ...7hu'
gcloud から ACCESS-TOKEN を取得する際の警告は、認証ガイダンスを確認することを奨励し、私はそれを実行しました。この警告を修正する方法についても、「アプリケーションが Cloud SDK のエンド ユーザー資格情報を引き続き使用すると、「クォータを超えました」または「API が有効になっていません」というエラーが表示される可能性がある」理由についても説明されていません。ダッシュボードからデータを取得するためのトリックが機能していることはわかりますが、ACCESS-TOKEN を取得するために奇妙な方法に頼っているようです。
したがって、私の率直な質問は次のとおりです。ACCESS-TOKEN を手動で取得し、そのような警告を回避して curl/postman で使用するための適切な手順は何ですか?
このstackoverflowの回答に基づいて、根本的な原因は「...このエラーメッセージは、サービスアカウントではなくユーザーアカウントを使用していることを意味します...」どうすれば修正できますか? サービス アカウントを作成する必要がありますか? もしそうなら、どのように?この受け入れられた回答の最後に、「...真のアプリケーションのデフォルトを使用するには、gcloud auth application-default loginを使用できます...」と読みました。これは、gcloudでログを記録する方法とまったく同じです:gcloud auth application-default loginを実行します、Google SingleSignOnを開くと、Firebaseアカウントに登録したのと同じユーザーであるメールを選択します。回答には、「... 特定のサービス アカウントを関連付ける方法は gcloud auth activate-service-account --key-file です ....」 も記載されています。約?
関連する場合、私の場合、Firebase プロジェクトで FireStore のみを使用しています (FireStore 以外は使用していません)。
***ジョンの回答後に編集
このプロジェクトは間もなく本番環境に移行します。
1 - 当社のモバイル アプリは、当社の内部マイクロサーブに投稿することで送金を作成します。このようなポスト リクエストは、内部 NodeJs サーバーから生成された CustomToken を返します。
2 - 当社の内部マイクロサービスは、そのような転送を Firestore にレプリケートし、それに応じて Firestore の状態を更新します。
3 - モバイル アプリのポーリングまたは内部マイクロサービスをリッスンしてステータスを取得する代わりに、Firestore をリッスンして、それぞれのドキュメントからステータスを取得します。リッスンするために、ステップ 1 の投稿から返された CustomToken を使用します。当社は、このプロジェクトで Google Firestore のリアルタイム データベース機能を利用したいと考えています (リアクティブ アプローチ)。
私がやっていることをあなたの声明と比較すると、何か考慮事項がありますか?
CustomToken は、この NodeJs サーバーで内部的に作成され、Google Firebase からの事前のユーザー認証/ユーザーから抽出された uid に応じて作成されます。
const admin = require('firebase-admin');
exports.serviceAccount = {
"type": "service_account",
"project_id": "firetestjimis",
"private_key_id": "ecfc6 ... fd05923",
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIE .... 5EKvQ==\n-----END PRIVATE KEY-----\n",
"client_email": "firebase-adminsdk-fg6p9@firetestjimis.iam.gserviceaccount.com",
"client_id": "102422819688924138150",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-fg6p9%40firetestjimis.iam.gserviceaccount.com"
}
admin.initializeApp({
credential: admin.credential.cert(exports.serviceAccount)
});
var uid = "NS .... Ro2"; //copied from https://console.firebase.google.com/project/firetestjimis/authentication/users
var claim = {
control: true
};
admin.auth().createCustomToken(uid)
.then(function (customToken) {
console.log(customToken)
})
.catch(function (error) {
console.log("Error creating custom token:", error);
});
私たちのモバイル (Angular の例ですが、IOS と Android の考え方は同じです) には、次のようにダウンロードした SERVICE_ACCOUNT_JSON_FILE があります。
環境.ts:
export const environment = {
production: false,
firebaseConfig: {
apiKey: "AIzaSy ... 3DCGihK3xs",
authDomain: "firetestjimis.firebaseapp.com",
databaseURL: "https://firetestjimis.firebaseio.com",
projectId: "firetestjimis",
storageBucket: "firetestjimis.appspot.com",
messagingSenderId: "795318872350",
appId: "1:7953 ... 32b26fb53dc810f"
}
};
app.component.ts
public transfers: Observable<any[]>;
transferCollectionRef: AngularFirestoreCollection<any>;
constructor(public auth: AngularFireAuth, public db: AngularFirestore) {
this.listenSingleTransferWithToken();
}
async listenSingleTransferWithToken() {
await this.auth.signInWithCustomToken("eyJh ### CUSTOMTOKEN GENERATED FROM INTERNAL NODEJS SERVER ABOVE ### CVg");
this.transferCollectionRef = this.db.collection<any>('transfer', ref => ref.where("id", "==", "1"));
this.transfers = this.transferCollectionRef.snapshotChanges().map(actions => {
return actions.map(action => {
const data = action.payload.doc.data();
const id = action.payload.doc.id;
return { id, ...data };
});
});
}
}
CustomToken の作成とモバイルからのその使用の両方がサービス アカウントに完全に依存していることを理解しています。私は正しいですか?いくつかの概念を見逃していて、舞台裏で USER CREDENTIAL を使用していて、DEV 環境で適切に動作する何かが本番環境で驚きをもたらすでしょうか? 明らかに、この質問はすべて私の無料アカウントからのものですが、実稼働環境では有料アカウントになりますが、コードと手順はこことまったく同じです。