生涯未熟

生涯未熟

プログラミングをちょこちょこと。

GCPのIAP周りの隠れ仕様

dev, staging環境のアクセスを社内の人間のみに制限したいな〜って時にGCPのIAPを使っているのですが、そんなIAPの隠れ仕様を見つけたのでメモ✍

どんな仕様?

IAPはOAuth2 Client IDを必要とし、IAPを有効化することによってOAuth2 Client IDが増えていきます。 その様子は"APIとサービス"の"認証情報"を見ると分かるのですが、実はこのOAuth2 Client IDは36個までしか登録出来ません

stackoverflow.com

こちらのスタックオーバーフローを読むと色々と書いてありますが、公式なやり取りだと以下を読むといいかもしれません。

issuetracker.google.com

私もこの質問者と同じくIAPを新規作成する際に36個制限を越えてしまい、エラーとなってしまいました。
36個を越えて登録したい場合はGoogleに問い合わせてくれと回答している方もいますが、公式なやり取りを読むと「制限があり、上限を上げる予定はない」って書いてありますね🤔

正直、この辺りに関する情報が全く見つからず公式ドキュメントを漁っても見つかりませんでした・・・
現状では必要のないIDについては削除していくしかないようです、というお話でした。

cloud_sql_proxyをv1.15からバージョンアップさせたら大怪我した

cloud_sql_proxyをかませてCloud SQLへの接続を行っているのですが、v1.15からエイヤッでv1.28.1に上げたら事故ったので簡単にメモ。

何が起きた?

全てがこれに詰まってます。

github.com

で、このissueにも書いてあるような nc を使ったLivenessProveを行っていたのでまんまと撒いた環境全部落ちました・・・
cloud_sql_proxyがSIGTERMを受信して死んでたので、ムムッ!?と思いましたがまさかそこが原因とは🤔
「そんな変更加えるなら1.15->2.0にしろや!」って感じで怒ってらっしゃる方がいるように、マイナーバージョン上げるくらいなら大丈夫だろ〜と油断してたらやられました。

対策

health checkどうすっぺかな〜と探してたら、 -use_http_health_check オプションという便利なものを発見したのでこれを使うことに。

zenn.dev

これでなんとか通すことが出来ました。めでたしめでたし。

DropDownButtonのselectedItemBuilderを初めて活かせた話

Flutterにはドロップダウンリストを作るためのDropDownButtonがありますが、このクラスのプロパティの一つである selectedItemBuilder が正直何に使うのか分からなかったけど初めて活かせた話をします。

selectedItemBuilderとは何なのか?

こちらを参照👀

api.flutter.dev

デモにもあるように「ドロップダウンリストに表示される項目名」と「選択後に表示される項目名」を変えたい時に使うプロパティになります。
ただ、これだけ見ると「何のために存在してるんや?」ってずっと疑問に思っていました。

どう活かしたのか?

んじゃ実際にそれをどう活かしたのかというと、以下のようなドロップダウンリストを作るために活かしました。

f:id:syossan:20220113180128p:plain

  • 生年月日の「年」のデフォルトは「年」で表示

f:id:syossan:20220113180203p:plain

  • 選択中項目は「1992」にして、デフォルトの"選択年"も1992にする

f:id:syossan:20220113180255p:plain

  • 何も選択せずに閉じるとデフォルト選択年の1992が設定される

タップするまではよくある hint プロパティの表示っぽく見せて、タップしたらデフォルトで選択される1992に選択されている状態にしたいという仕様でした。
で、これを解決するために selectedItemBuilder を活用したわけです。

必要なところ以外のコードはバッサリ切って説明するのですが、

  • 初期状態では何も選択されていないことを表しておく(選択年を司る変数を0にでも設定しておく)
  • selectedItemBuilder で「何も選択されていないなら"年"を表示」「なにか選択されていれば選択された年を表示」の条件分岐を書く
  • タップされた時にデフォルトで選択される年を選択年を司る変数にセットし、ステートの変更を通知する

を行います。

コードで表すとこんな感じです(状態管理にはGetXを使用)

色んな必要なものを省いていて恐縮ですが、主にこんな感じのコードを書くとできます。

こういうことに使えるんだな〜と思ったので書き留めておきました。誰かの役に立つことを祈る🙏

GKEノードの自動アップグレードを監視する

所属しているチームでは様々なイベントを監視し、Slackのモニタリングチャンネルへ通知を飛ばしています。

f:id:syossan:20220110132625p:plain

※ エラーログではエラーが発生したCloud Loggingのリンクが貼り付けており、詳細を追従しやすくなっています

この中で、PodのCreate / Deleteを監視しているのですが(画像のPodのデプロイの通知)、デプロイ以外にもGKEノードの自動アップグレードでも通知が飛ぶためその度に「なんで通知走ってるんだっけ?」といった会話がされることがありました。(突然来ると不気味ですしね)

そこで、GKEノードの自動アップグレードがあった際にはSlackへ通知を飛ばすようにしました。

何をしたか?

やったこととしては自動アップグレードイベントを監視するログルーターを作成し、そこからPubSubを通してCloud Functionsを実行し、Slackへ通知を飛ばすようにしています。
今ではCloud Functionsなどを通さずに、ログベースのアラート機能を使うのがベターかもしません。

cloud.google.com

で、通知を飛ばすまでの処理は他の方々の記事で書いてあると思いますので割愛しまして、肝心要の監視するログは以下のようになります。

さて、これでSlackへ通知を飛ばすようにするとこんな感じに。

f:id:syossan:20220110134459p:plain

先程のPodのデプロイの後に自動アップグレードイベントからの通知が来てますね!
ちょっとしたTipsなのですが監視を強化したい方は是非〜

Flutterでログイン後に再インストールしたらログイン済みのままなのをどうにかした

相変わらずFlutterやってるおじさんです。

今回はFirebase Authenticateを用いてログイン済みのユーザーが、アプリを再インストールしたらログイン済みのままになっていたのが気持ち悪いのでどうにかしました。

何故そうなったか?

iOS, Androidともに裏でバックアップを取っていますが(Android: Google Drive, iOS: keychainを使いバックアップ)、これをdisableにしようと思うとAndroidは以下のようにすればいいので簡単ですが、iOSだとちと骨が折れる作業となります。

  • AndroidManifest.xml
<application
    android:allowBackup="false"
>
</applicatoin>

そこで、 shared preferences を使って「インストール後、初めて起動した場合にはログアウトさせる」という処理を噛ませることにしました。

pub.dev

基本的な使い方についてはこちらで詳しくまとまってました。

www.virment.com

で、肝心の実装ですが必ず最初に通る main.dart に対して以下のようなコードを実装しました。

shared preferencesで保存した値はアンインストール時に揮発しますので、再インストール時でも問題なくログアウトされます。
こっちの方が楽なのでこういう形で実装しましたが、他に良い方法を知っている方がいらっしゃいましたら教えて下さい!