【Flutter】GCPのSecret ManagerをFlutterアプリで参照する
はじめに
いつもお世話になっております。
今回は、GCPの「Secret Manager」というAPIキーなどの機密データを一元管理してくれるサービスをfirebase functions(cloud functions)を使ってFlutterアプリから参照してみようという記事です。
「Secret Manager」についての解説は他の方がわかりやすく解説してくださっているので、リンクを記事の最後に記載しています。
手順
手順を簡潔に紹介します。また、Cloud FunctionsやFirebaseの環境構築についてはこの記事では触れません。
手順1:Secret Managerにシークレットを作成
「Secret Manager」に機密データを登録します。
この手順は特に難しくはないので、リンクだけを貼ります。こちらを参考にシークレットを作成してください。
また、「Secret Manager」に登録し、管理してもらうデータのことをシークレット
と呼称するそうです。
手順2:ファンクションを作成
手順1で作成したシークレットをFlutterアプリから参照するためのファンクションを作成します。
以下コードはjavascript(Node.js)で記述したファンクションになります。
const functions = require("firebase-functions")
/// 関数名:fetchApiKey
exports.fetchApiKey = functions
.runWith({
// 手順1で作成したシークレット名を記入(例:secrets: ["シークレットの名前"])
secrets: ["SECRET_NAME"],
}).https.onCall((request, res) => {
// こちらにも手順1で作成したシークレット名を記入(例:process.env."シークレットの名前")
return process.env.SECRET_NAME;
});
このファンクションで気をつけないといけないのは、runWith
パラメータを使用することです。
runWith
パラメータを明示的に指定しないとシークレットを参照することはできず、null
が返されます。
また、上記のファンクションではonCall
関数を使用していますが、onRequest
関数でも問題はありません。しかし、その場合は手順3で紹介するFlutterアプリ側での呼び出し方が変わります。
こちらで詳しい解説をしてくださっている方がいます。
手順3:Flutterアプリで呼び出す関数を定義
以下のコードで、手順2で定義したファンクションを呼び出します。
void callFecthApiKey() async {
try {
// httpsCallable()の引数に、手順2で作成したファンクション名を指定
var callable = FirebaseFunctions.instance.httpsCallable("fetchApiKey");
var result = await callable();
print(result.data);
} on FirebaseFunctionsException catch (error) {
print(error);
}
}
もし、onCall
関数ではなくonRequest
関数を使用した場合はhttp
パッケージを使用し、ファンクションのトリガーURIを呼び出します。私はURIを記述することに抵抗があったのでonCall
関数を使用します。
まとめ
FirebaseやCloud Functionsの公式ドキュメントを参考にしても、初心者の私ではシークレットを参照することに時間を要しました。なので、こちらの記事が同じく初心者の方の参考になったら嬉しいです。
また、この記事に誤りがありましたら、気軽にコメントなどで指摘していただけると助かります。
参考
公式ドキュメント
参考にさせていただいた記事様
Discussion