はじめに
どうもmasamoriです。
突然ですが、流しそうめんって知ってます?夕方のニュースでたまに夏の風物詩として流れてくるあれです。
家族で参加して「わー、取れなかったー!」「まぁ、次は取れるといいわね!」「うん!」なんて、微笑ましい光景が脳裏に浮かんだ方も多いのではないのでしょうか?
実は数年前、友人と流しそうめんに参加したことあるんですが、あれ、急にそうめんが流れてくるのでおちおち喋っていられないんですよね。話が盛り上がったらいきなりそうめんが、シャー!って流れてくるんで、もう神経を尖らせなければ参加できません。HUNTER x HUNTERの円を使わないとあれ食べれないんじゃないか、と思うぐらいシビアです。
結局円を使えない僕は一本もそうめんを食べれずに流しそうめんの料金だけ払ってやったぜ〜。ワイルドだろぉ〜?
さて、Firebase Authenticationを使用して認証に使っている方もいると思います。手軽にソーシャル認証も実装できるので、自分もプライベートで使用するときもあります。
ただ、Firebase Authenticationにはデフォルトでユーザー情報の自動バックアップ機能がついてないんですね。これを実装するには、Firebase内の他のサービスを使う必要があります。
Firebaseの中にはプランがあって、無料のSparkプランではFirebase Realtime Databaseで自動バックアップ機能を使えないんですよね。従量課金プランBlazeプランなら使えるそうです。
さて、ここで従量課金するのはどうかなぁと考え、それならクレジットが残っているAzureに自動バックアップできる構成を組んじゃえばいいのでは?と思い立ち、構成を考えて実装することにしました。なお、勉強を兼ねてのアウトプットなので、間違ってることも多々あるかと思いますが、そこはお手柔らかに。。
構成と使用するサービス
さて、今回の構成を超シンプルに描いてみます。
使用するAzureのサービス.
- VNet
- Postgresql for Azure
- サービスエンドポイント
- Azure Function
- Key Vault
VNetの中にサブネットを切って、そこにDBを置き、サービスエンドポイントを使ってDBとの通信をするようにします。Azure Functionに、Firebase Authentication からユーザー情報を取得しDBに保管するPythonのスクリプトファイルを置きます。なお、Firebaseとのやりとりの際に、Firebase AuthのSDKとserviceAccountKey.jsonが必要になります。(serviceAccountKey.jsonの取得の仕方は記事がたくさんあるので、方法はそちらを参照してください。)
秘密情報の取り扱い
さて、Firebase AuthのSDKを用いてローカル環境でFirebase Authenticationに登録してあるユーザーを取得するのは結構簡単です。serviceAccountKey.jsonを適切なディレクトリに配置して、スクリプトを書くだけです。しかしこれをデプロイするとなると話は別で、serviceAccountKey.jsonをどのように取り扱うかがまず一つのポイントになると思います。このような秘密情報を取り扱う方法はいくつかありますが、今回はAzure のKeyVaultサービスを使いたいと思います。 azure.microsoft.com
ちなみに、chatGPTにserviceAccountKey.jsonをそのままGithubにデプロイしたらどうなるか聞いてみました。
いい感じにヨイショしてくれて叱ってくれました。chatGPT優秀!!!
KeyVaultの使い方
Azure KeyVaultに格納できるオブジェクトは
- キー
- シークレット
- 証明書
この3点で、今回はシークレットを使います。シークレットは、その名の通りアプリケーションなどのシークレット情報をkey-valueの形で格納できます。今回はserviceAccoutKey.jsonを文字列に変換して一つのvalueとして取り扱い、キーを指定して取り出すときにjsonモジュールを使用してjsonに戻すという形を取りました。
Azure CLIを使ってシークレットを作成する
さて方針が決まったところで、早速対象のjsonファイルをシークレットに格納します。Azure のportal画面からポチポチやってもいいんですが、ここはエンジニアとしてCLIを使って、サラッといきたいところです。ですが、PC内のグローバル環境汚したくないなぁとか、どんなライブラリインストールすればいいんだっけ。みたいなこと考えてたら、全然サラッといきませんでした。
順序としては以下のとおりです。
- AzureCLI にログイン
- jsonファイルを文字列に変換
- KeyVaultを指定して格納
2,3に関するコードはこちら
bash JSON_DATA='{ "type": "service_account", "project_id": "project", ... "client_x509_cert_url": "---" }' az keyvault secret set --name [シークレットの名前] --vault-name [Key Vaultの名前] --value "$JSON_DATA"
という感じです。 jsonファイルの中身をそのまま文字列に変換しています。シークレットの名前はなんでもOK。
ここで注意。
ログインしているユーザーが、シークレットに対して書き込み権限がない場合はエラーが出ます。なので、対象のシークレットに対して権限が適切に振られているか確認してください。portalから簡単に権限割り振れます。CLIでも多分できるんじゃないかなと思います。
この段階で、シークレット情報が作成されているはず。
上手くいったかどうかはportalでも確認できますし、
bash az keyvault secret show --name [シークレットの名前] --vault-name [Key Vaultの名前]
これでも確認できます。(シークレットキーの名前のみ確認できて、中身は表示されません。)