【2023年11月】今月の行動指針

プロダクトマネージャーの鈴木です。11月はアシュアードの有志で千葉県にキャンプに行きました。お子さんを連れて家族で参加するメンバーもいて、普段とは違う雰囲気で楽しめた良い体験になりました。

ということで、仕事の方ではプロダクトチームのメンバーがどんな行動指針に取り組んでいたのか、ぜひご覧ください。

今月はどういったこと(に挑戦した|を学んだ|で速さを追求した|を楽しんだ)か教えてください

オリバー

未踏へのチャレンジャー リリース後もデータの信頼性を保つための運用フローの構築

先日、「AIを活用したクラウドサービスのセキュリティ対策状況分析機能」をリリースしました。Assured上で掲載するクラウドサービスの情報として、認証の取得状況、各サービスサイトの規約やポリシー等のURLを提供し、それらの内容を生成AIを用いて要約する機能です。

リリースするまでに各情報を一から収集する作業にも多くの時間がかかりましたが、リリース後もこれらのデータの「鮮度」と「信頼性」を保ち続けることは非常に重要です。鮮度の観点では、期限のあるセキュリティ認証情報の更新やアクセスできなくなったURLの更新が必要ですし、信頼性の観点では、収集した情報が誤っていないかを人が都度確認し、必要があれば更新するといった作業が必要となります。

11月は、そうしたデータの鮮度と信頼性を保つため、データ更新の運用フローを模索していました。もともと更新用のデータ抽出などはエンジニアが行なっている部分も多かったのですが、データの更新作業は非エンジニアの方に任せられるようにするために、最終的には本番データやクローリングしたデータをBigQueryに一度同期し、それをスプレッドシートコネクテッドシートで参照しながら作業できる環境を整えました。

全体のアーキテクチャ

「鮮度の確認」についてはシステム化できる部分が多かったため、CloudRunでクローリングを定期実行する仕組みを実装しています。「信頼性の担保」については、人の確認が必要なデータをクエリによって適切にフィルタし、必要なデータのみ確認し作業できるように工夫しています。閲覧するデータを絞ることで、作業に必要なハードルを下げるとともに、セキュリティ観点でも安全に取り組めるようになりました。

データの「鮮度」と「信頼性」の運用をシステムと人の両面から考えることで、高品質なデータ・プロダクトを維持し続けられると考えています。これからもより良い運用フローを模索したいと思います。

内山

学びのティーチャーお客様への影響を出さずに認可機能の刷新

従来、Assuredのシステムでは画面の出し分けや機能の利用可否を契約したプランごとに判別していました。プランが少なかったときにはこれで問題なかったのですが、サービス(シャドーIT)検知機能の単体プランやサービス検知機能と既存プランの併用を考えたときに、以下のような課題が出てきました。

  • プランが多いと条件式が冗長になる
  • プランに増減があった際に条件式を見直す必要がある
  • 条件式を記述する度に、各プランでの利用可否を意識する必要がある

そこで、機能毎の権限(どのリソースに対して、どのアクションができるか)を定義し、各プランが持つ権限を集合で表現し、API側では集合に必要な権限が含まれるかで判断するように変更しました。

val planA: Set[Scope] = Set(
  "service_book:read", // サービス台帳の読み込み権限
  "service_book:write" // サービス台帳の書き込み権限
)
// Controller

SecureAction.withScopes("service_book:write") {
  // 認証済みユーザーが service_book:write の権限を持っていればブロック内を処理
  // 持っていない場合は Forbidden を返す
}

また、権限を集合で表現したことで、集合の演算で別の権限を表現できるというメリットもあります。今回はプランの持つ権限に絞って実装しましたが、今後ユーザー毎に権限を細かく指定するといったこともできます。

  • 併用プラン: プランとプランの権限の集合の和
  • 閲覧限定ユーザー: プランの権限の集合とread権限だけの集合の積
val planAwithB = planA ++ planB      // 併用プランの権限の集合
val readOnlyPlanA = planA & readOnly // planAの閲覧限定権限の集合

ここまで考えたはよかったのですが、認可機能の刷新になるので、影響範囲はシステム全体に及びます。システム全体をくまなく検証しきるまでメインのブランチにマージできないとなると、最新の変更を取り込んだり、取り込んだ上で検証し直したりと実装コストも検証コストも上がってしまいます。

そこで、Feature Flag(※1)を利用して段階的に実装を公開していく方針を取ることにしました。Feature FlagがONの時は新しく実装した権限を用いた実装で、OFFの時は既存の実装で判断するようにし、以下のような手順で公開しました。

  1. 検証環境でFeature FlagをONにしてAutifyでの自動テストの実行
  2. 検証環境でFeature FlagをONにして全プランを手動で検証
  3. 全てのお客様のFeature FlagをONにする
  4. 不具合が発生しないことを確認してFeature Flagを削除

影響範囲が大きく、長らくかかった実装でしたが、この11月についに4のステップまで完了することができました。

Feature Flagを活用することで単体プランの公開までの時間を短縮しつつ、お客様への影響を出さずに認可機能の刷新を行うことができました。これからも、お客様に機能を提供することを最優先としつつも、コードや開発体験の改善も並行して行い続けていきたいと思います。

※1. コード内にフラグを埋め込み、機能のON/OFFを切り替える手法

岩松

最速のスプリンターサービス台帳一括インポート機能のノーコード実装

以前紹介したように、Assuredではプロジェクト制によって組織や役割を超えてプロダクト改善を進めています。

tech.assured.jp

その中で、サービス台帳機能に対して一括インポート機能を用意できないか?という話が出ていました。これまでなんとなく必要そうだと感じていましたが、一括インポート、すなわちファイルアップロードによる一括処理をちゃんと作ろうとすると考慮しなければいけないこと(データフォーマット,バリデーション処理,負荷,非同期処理,セキュリティ, etc)が多く、またお客様がこの機能を本当に必要とされているのか、うまく機能を使っていただけるのかわからなかったので、実装の工数がかかる一方で活用されないリスクがあると感じていました。

一方で、プロジェクトを通してセールスチームと共にお客様の課題感を聞いていくうちに、お客様にとって必要性が高いということはわかってきました。また、一番のユースケースはオンボーディング時の初回のデータの取り込みであり、短期間で何度も利用されることは少なそうであることもわかってきました。これらを踏まえ、より小さなコストで機能を検証することができないかということで、データのアップロードを代行するという手段を考えました。

flowchart LR
  C["お客様"]
  subgraph 本来はプロダクト上で実現したい
    A["Assured DB"]
    D["Assured運営"]
  end

  C-->|台帳の入力用エクセルを送付|D
  D-->|データを確認後アップロード|A

とは言え、人手を介すことでいい加減なデータを作ってしまうわけにはいきません。そこでスプレッドシートの関数を駆使して入力データを検証する仕組みを用意してみました。さらにデータが適切にインポートされているか、重複が存在していないか等確認するために、Datastream for BigQueryも駆使してリアルタイムにスプレッドシートからインポートの状況を確認できる仕組みを用意してみました。

flowchart LR
  SP["Spread Sheet"]
  DB["Cloud SQL"]
  BQ["BigQuery"]
  Data["Data"]
  D["Assured運営"]

  subgraph Gogle Cloud
    DB
    BQ
  end

  DB-->|Datastream|BQ
  BQ---|Connected Sheet|SP
  D-->|データを補正|SP
  SP-->|データ検証/生成|Data
  Data-->|アップロード|DB

スプレッドシートで色々工夫するのも簡単ではありませんが、前述した様々な懸念をクリアして機能をリリースするよりもずっと早く「サービス台帳に一括インポートできる」という状態を作り上げることができました。ここから「よりお客様にとって求められる機能」を検証していきます!

おわりに

こうやってやっていることを見返してみると、Assuredでは提供すべき機能や手間をかけるべき実装にメリハリをきかせて開発できているのかなと思います。あまりスポットライトの当たらないコードやデータにも丁寧に関わることが高い品質につながり、お客様からの信頼を獲得できると思っているので、今後もしっかりやっていきたいと思います。

少しでもAssuredの事業に興味をお持ちいただいた方は、ぜひ気軽にお声掛けください。以下のリンクからカジュアル面談への応募をお待ちしています。 forms.gle

エンジニアチームの紹介 careers.assured.jp