🙏

【Flutter】GCPのSecret ManagerをFlutterアプリで参照する

2023/06/01に公開

はじめに

いつもお世話になっております。
今回は、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)で記述したファンクションになります。

index.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の公式ドキュメントを参考にしても、初心者の私ではシークレットを参照することに時間を要しました。なので、こちらの記事が同じく初心者の方の参考になったら嬉しいです。
また、この記事に誤りがありましたら、気軽にコメントなどで指摘していただけると助かります。

参考

公式ドキュメント

https://cloud.google.com/secret-manager?hl=ja

https://firebase.google.com/docs/functions/config-env?hl=ja&gen=2nd#create-secret

https://firebase.google.com/docs/functions?hl=ja

参考にさせていただいた記事様

https://zenn.dev/nananaoto/articles/43e3414fdb1da37b377e

https://zenn.dev/nbstsh/scraps/a2135438f0a89c

Discussion