Webアプリケーション出身エンジニアがネットワーク制御ソフトの開発に挑戦したときの苦労話

ご挨拶と今回の記事について

こんにちは、BBSakura NetworksでOCX開発グループに所属している渡邉です。
私の担当開発はOCXのバックエンド部分、つまりソフトウェア周りの開発になります。
以前、弊社の川畑の記事にありました制御システム、ソフトウェア部分になります。

blog.bbsakura.net

過去、私も本ブログで数記事執筆させていただいていますので興味のある方は名前などで記事検索していただければと思います。

以前投稿した記事でも触れましたが、私は元々WebアプリケーションエンジニアでNW周りについて何も知らない状態でした。
今回は BBSakura Networks Advent Calendar 2024 の 23日目として、Internet GatewayにBGP対応を行った際の苦労話について記事にしました。

※Internet Gatewayのサービス解説記事はこちら

blog.bbsakura.net

ここから本題が始まりますが、本記事はBGPというものについて個人の見解や理解に基づいた内容になっており、実態に即していない可能性があります。
まだまだ理解が追いついていない、足りていない部分もたくさんあると思いますので、何卒温かく見守っていただければ幸いです。

そもそもBGPって何?というところからのスタート

Internet Gatewayのロンチ後、SaaS Connectionの開発とInternet GatewayのBGP対応が始まりました。
ちなみにSaaS ConnectionはInternet Gatewayとは違いStatic Routeは対応しておらず、BGPのみになります。
当時は「BGPって何?」「Static Routeが無いのにどうやってルートを??」状態でした。
※SaaS Connectionの開発の苦労話についてはまた別の機会に触れられればと思います。
※SaaS Connectionのサービス解説記事はこちら

blog.bbsakura.net

やはり頼りになるのは先人の知恵

開発にあたってBGPとは何かを調べるところから始まります。
SaaS ConnectionとInternet Gatewayは基本的な作りは同じ。
Internet GatewayにStatic Routeがあるのに対し、SaaS ConnectionはStatic Routeが無いのであれば、BGPはStatic Routeと対にもしくは類似の機能なのだろう、という予測はつきました。
インターネットで先人の知恵を借り(いつもありがとうございます)、Static Routeが静的なルート構築に対し、BGPは動的なルート構築(Dynamic Routing)ということはわかりました。
(余談ですが、ネットワーク系のシステム開発を行っていて、対になる機能でも言葉として対になっていないことが多く、パッと理解が難しいなと実感しますね)

なんとなく理解が進んでいく

さて、Dynamic Routingというのはわかったぞ、ということでIPアドレスをよしなに使うのかなと思いきや、AS番号が出てきました。
つまりBGPはIPアドレスを意識せず、AS番号でもってルーティングを動的に行う機能なのか、と理解できました。
対してStatic Routeはルーティングを行う人がIPアドレスを一つ一つ設定して構築していく。と

AS番号の沼にハマる

段々と「ふむふむ、AS番号を用いた動的なルーティング機能であり、運用上の負荷が下がる」のがBGPなのかと理解が深まってきました。
もうちょい深堀りすると深淵を覗くというのは詳しい方(@paina )が言っていたのでこのあたりで開発を始めていこう、と開発を開始しました。

とはいえゼロから作るのではなくOCXで提供しているサービスの一つであるOCX-Router(v1)にはBGP機能がありますので、これを参考に開発を進めます。
「ん?リモートAS番号とローカルAS番号???」

今回BGPを対応するサービスはお客様NW環境と接続先(Internet/SaaS事業者様)を閉域で繋ぐサービス。つまりローカルAS番号がお客様NW環境側で、リモートAS番号が接続先のAS番号かな?となりました。

仕様「リモートAS番号はお客様が自由に設定できるAS番号です」 ←接続先のAS番号じゃないのかな?いや、そもそもInternetにAS番号とは?
仕様「ローカルAS番号も同様にプライベートAS番号の範囲で自由に設定可能です」 ←これはなんとなくわかる

自分の理解と、仕様の記載が一致していない状態。

振り返ることの重要さ

一度ここでInternet GatewayやSaaS Connectionがどういったサービスなのかを改めて確認します。
同時にそもそも経路交換の仕組みやインターネットって上り下りがあるよねというのを復習していきました。

すると「リモートAS番号はお客様NWのAS番号」「ローカルAS番号はInternet GatewayやSaaS ConnectionのAS番号」というのが理解できてきました。
が、ここで次の問題が出てきます。
「接続先のAS番号はどこで使うのか」
BGPというのはAS番号を用いてルート構築を動的に行う機能。であるならば接続先のAS番号も知っていないといけないのでは?となりました。
しかしOCX利用者はどうやって接続先のAS番号を知るんだろうか、という状態です。

そこで、Internet GatewayやSaaS ConnectionがNWにおいてどういった立ち位置のサービスなのかということ振り返ります。
2つのサービスは接続先は違えど大きく言うとお客様NW環境と接続先(Internet/SaaS事業者様)を繋ぐ役割を果たしています。
つまり、接続先のAS番号はお客様が知っている必要がない(=すでにOCXが接続先と経路交換している)のです。
お客様はあくまでInternet GatewayやSaaS Connectionまでの経路を構築していただくだけで良い、ということです。
これでバックエンドのシステムとしてBGPに必要な各種項目をどのようにconfigしていけば良いかというのがわかり、開発が進んでいきました。

"SaaS ConnectionとInternet Gatewayは利用者様環境と接続先SaaS事業者、インターネットを繋ぐ役割をしており利用者様がconfigで意識するのは利用者様の環境からSaaS ConnectionとInternet Gatewayまでで、SaaS ConnectionとInternet Gatewayから接続先SaaS事業者様、インターネットへの経路は気にしなくて良い" Internet GatewayとSaaS Connectionの簡易イメージ

ネットワークを構築するためのシステムを開発することの難しさ、楽しさ

ほかにもiBGPやeBGPの違いなどで調べながらの開発をしていきましたが、今回は割愛させていただきます。
ともあれ、こうして苦労もありつつ無事にInternet GatewayのBGP対応とSaaS Connectionがリリースされました。
思えば、BBSakuraにジョインしてからまもなく丸2年が経ちます。
これまで自分が開発してきたものとはまるで異なる分野でのシステム開発のため、難しさを感じる一方、新しいことへ挑戦できることへの楽しさも感じています。
まだまだ力不足に感じる点だらけですが、それでも少しは貢献できていれば幸いです。

最後に

OCX開発グループは新規のサービスの開発だけでなく、すでにリリースしたサービスについてもお客様のニーズにあわせて日々機能強化を進めております。
少しでもOCXを利用されるお客様にご満足頂けるようこれからも新規サービスの開発、既存サービスの機能強化に努めてまいります。
最後の最後の余談ですが、私はInteropなどのイベントにエンジニアスタッフとしてOCXブースに立たせていただくことがよくあります。
もしOCXやBBSakuraという組織に興味がある方がいましたらぜひブースに足に運びいただき、お声がけ頂ければと思います。

eBPF の個人的おもしろトピック

この記事は BBSakura Networks Advent Calendar 2024 の 12/14(土)の記事です。

こんにちは BBSakura Networks 3年目の金井 (@masu-mi.bsky.social, @masu-mi) です。

ここ数年 eBPF は注目され続けてますね。先日 BBSakura Networks もスポンサーとして eBPF Japan Meetup #2 に携わりました。 これについては、16日の記事として松下さんが参加報告をしてくれたようです

そこで eBPF の個人的なおもしろトピックを紹介したいと思います。 はじめに断っておきますが、概念実証など本番利用からすこし離れたトピックが中心で、最新の話題でもありません。

P99Conf: How eBPF Could Make Faster Database Systems

タイトルがキャッチーな感じの発表でした。

スライドの前半で Tigger: A Database Proxy That Bounces with User-Bypass (VLDB'23) が Statless Systems として紹介されています。 後半の BPF-DB が Stateful System のようです。しかし発表以外で公開された情報を見つけられず詳細はつかめませんでした。

Tiger(Stateless Systems) の説明

内容は PostgreSQL 用コネクションプールを eBPF でユーザースペースバイパスして高速化したというものです。プロジェクトページは User-bypass Methods です。

下の図のようなコネクションプール機能を持ったプロキシの性能改善に eBPF を使っています。

DBMS proxy の一般的な概念図で proxy が複数のクライアントからのメッセージをサーバーのセッションに詰めている
Tiger: DBMS Proxy 概要

メッセージ交換機能を eBPF プログラムとして主に Socket Stack に挟んでいるようです。 本文中では eBPF プログラムを ソケット, TC レイヤにアタッチするという記述はありましたが具体的なプログラムタイプは確認できませんでした。 また実装では stack, array, sockmap といった eBPF Maps を使っているようです。

Tiger の User-bypass proxy の説明で、カーネル内部のソケットスタックに eBPF プログラムとしてプロキシ処理が置かれている
Tiger: アーキテクチャ(User-bypass proxy)

ref. Tigger: A Database Proxy That Bounces with User-Bypass (VLDB'23)

Tiger は、セッション確立をユーザースペースで行うようです。そしてセッション確立後のメッセージ転送は fast path として eBPF プログラムで取り扱うという流れです。

3.1 Kernel-Bypass vs. Uesr-Bypass のなかで両者のアプローチの利点や利用される技術やライブラリが紹介されてます。 4.1 章で具体的に sockmap を使ってプロキシ実現するやり方を書いていて、5.章で Tigger のアプリケーションレベルの組み込みを説明しています。

性能試験では PgBouncerOdyssey とレイテンシーを比較しています。

  • 評価項目は、クライアントと DBMS の直接接続を基準に、プロキシ構成でのレイテンシー悪化率でした
  • 環境は AWS 上で複数のインスタンスで実行していました
  • ワークロードは、 TATP, TPC-C, YCSB といった代表的なワークロードで行っていた

TATP というテレコム向けのベンチマークも含んでいるのは面白いですね。

試験環境をちゃんと評価しないと意味がないのでグラフだけ載せても仕方ないのですが派手なので載せておきます。 ここで Nop-op は空クエリを投げる試験のようです。 詳細は論文を読んでください。

DBMS proxy のレイテンシー悪化率の比較しているグラフ
Tiger: 性能比較 (グラフ部分抜粋)

ref. Tigger: A Database Proxy That Bounces with User-Bypass (VLDB'23)

BPF-DB(Stateful Systems) の説明

Tail Call で構成された eBPF マップを利用して eBPF プログラムのための Key-Value Store を作った話みたいです。 使える命令は BEGIN, SET, GET, COMMIT の4つです。

eBPF Maps はテーブル用途にインデックス用1つとサイズ別のバリュー用3つの計4つで構成しているようです。WAL ログや TXS など他の Maps の存在も示唆されてますが詳細は明かされてません。 インデックス更新はMVCC with strict 2PC(NO WAIT) という方式を採用しているとスライドにはありました。

  • 2PL(NOWAIT)
    • レコードごとにロックを取得していき部分的な解放を行わない
    • ロック取得失敗時は ABORT
  • インデックステーブルでキーに対して、ロック情報・複数バージョンの値への参照とタイムスタンプを保持
  • SET で不要なバージョンの破棄

説明に An empirical evaluation of in-memory multi-version concurrency control (VLDB '2017) のリンクが表示されていたのでこちらを採用していそうです。 永続性のためにリングバッファでユーザースペースに WAL ログを送っているようです。ユーザースペース側でコンパクションを行い delta checkpoint を作成するとありました。 Flink の Checkpointing みたいなことをやってそうだなと感じましたが詳細が明かされてないので何とも言えません。

感想

Tiger の論文では 3.1 Kernel-Bypass vs. Uesr-Bypass のなかで User-Bypass のメリットとして L1-L4 をカーネルに任せられことが挙げられており、 kTLS のおかげで User-Bypass を選べるようになったと説明してました。

ここで参考文献となったセッションと Cilium の資料いくつか読むとよさそうです。 また、最近のカーネルのネットワークスタックも改善しているといくつかリファレンスが紹介されていたので読みたいなと思いました。

Diameter Relay Agent (DRA) など L4 を終端する中継機はいろいろあるので適用先は探せそうです。 複雑な初期化処理をユーザースペースに任せて性能が要求される単純な部分をカーネルに任せるのは定番のパターンなので構成自体は目新しく感じなかった覚えがあります。

BPF-DB はほとんど詳細が公開されてないので何とも言えません。 特に永続化の部分と SET, COMMIT の Tail Call フローの説明がないので困ります。 Dragonfly との性能比較も評価するためにも早く詳細が公開されないかなと思いました。

XRP: In-Kernel Storage Functions with eBPF (OSDI ‘22)

Linux カーネルを拡張して XRP という eBPF プログラムのフレームワークを作成しています。 XRP では eBPF を NVMe driver で動かし FS, BIO をバイパスすることで lookup, aggregation を高速化したようです。

ざっくりした説明

背景など

背景として NVM Express Revision 2.0(NVMe2.0) はハードウェアレイヤが十分に高速でソフトウェアのオーバーヘッドが無視できなくなっているということが挙げられてます。

この論文や同じチームの BPF for storage: an exokernel-inspired approach (HotOS'21) のなかで NVM Express Revision 2.0(NVMe2.0) で下のようなグラフが出てきます。

XRPの論文に掲載された HW 性能進歩による SW オーバーヘッドの割合増加のグラフで NVMe 2 でソフトウェア部分が50%近くに登っている
HW 性能進歩による SW オーバーヘッドの割合増加

ref. XRP: In-Kernel Storage Functions with eBPF (OSDI ‘22)

これは Optana P5800X で O_DIRECT を使って 512B のランダムリードで試験していて、レイテンシーへのオーバーヘッドでソフトウェアおける割合が 50% 近くまで来てます。

これに対して eBPF を使いとカーネル内で I/O request resubmission(再提出)することで折り返すことでカーネル処理を減らそうというのが主旨です。

設計など

syscall レベルと NVMe driver レベルと2つのアプローチで比較しています。

XRP アーキテクチャの2方式( (syscall, driver))を紹介している
XRP アーキテクチャ (syscall vs driver)

ref. XRP: In-Kernel Storage Functions with eBPF (OSDI ‘22)

この性能評価では深さ10の B+木 の lookup 試験を行っているようです。NVMe driver レベルで実施したバイパス処理で IOPS の改善で約 2.5倍と書かれていました。 また論文のなかではレガシーな read と io_uring での比較も行っていてどちらでも改善がみられたようです。

具体的な値はワークロードで大きく変わりそうなのだけど効果は大きそうに思いました。

XRP は NVMe 割り込みハンドラで I/O request resumptions を行う仕組みで、3つの技術要素で構成されてるようです。

  • BPF hook
  • ファイルシステムの変換
  • 新しい物理オフセットで次の NVMe I/O request の 再提出(resumption)

XRP デザイン

ref. XRP: In-Kernel Storage Functions with eBPF (OSDI ‘22)

XRP の設計方針は 4つあげられています

One file at a time.

XRP で chain される(連続実行される) I/O request resumptions は 1ファイル内に限定する。

Stable data structures.

ファイルレイアウトとその配置(pointer) は長期間変化しないファイルを対象とする。

User-managed caches.

ファイルシステムのページキャッシュに安全にアクセスできないため、XRP を利用する DBMS はユーザースペースでキャッシュしてることを前提とする。

Slow path fallback.

(ファイルサイズが変更されたなど)何らかの理由で XRP によるファイル内 travesal が失敗した時には、 DBMS はユーザースペースに fallback して対応する。

これらは、次のような設計課題と観察事実を踏まえた設計判断のようです。 設計課題には NVMe Driver で実行するとファイルシステムやセキュリティの情報が欠落してしまうことと、並行処理によるファイルの利用範囲が処理中に変更されてしまうことの2つが挙げられています。 また観測事実として、多くのデータベースではストレージ上のレコードやファイルサイズが長い間変化しないことが書かれていました。

このプロジェクトありがたいのはカーネルにパッチ当てたソースコードを公開しているところ。 XRP というリポジトリが XRP プロジェクトの中核で改変した Linux カーネルや BPF-KV という参考実装を含むほか、XRP 対応版の WiredTigerや試験用のYCSB まで含んでいました。

将来の目標が2つ挙げられています。

まず、 smart storage device や FPGA を用いたハードウェアオフロードです。 NVMe Computational Storage に関係した動きのようです。

もう一つは、 networked storage です。 こちらも翌年にプレプリント BPF-oF: Storage Function Pushdown Over the Network が公開されています。

この実装では NVMe-oF (NVMe over Fabric) で Pushdown を行ったようです。 プレプリントを読むと NVMe Driver が I/O 命令を BIO サブシステムに投げたりしていて面白いです。

XRP + BPF-oF 対応版 RocksDB のソースコードも公開されていました。

感想

Linux を拡張した試験実装を読めば eBPF の用途を広げるやりかたが学べそうなので興味をもっています。 XRP 実装のために行った Linux カーネルの変更は 900 行以下みたいです。

また、一部の処理を低レイヤに押し付けて最適化する場面にはしばしば出会います。 DBMS という複雑な具体例で制限された汎用性を意識したフレームワークを設計しているというのは学ぶ価値があるなと思いました。

BPF Instruction Set Architecture (ISA) - RFC 9669

次は eBPF ISA が RFC で標準化されている話です。これ自体はなんか標準化されるのかくらいで気に留めてませんでした。

上述の XRP を調べていた時に関連記事 Standardizing BPF [LWT.net] を見つけたため面白かったので紹介します。

どうやら、もともとの「BPF のプラットフォーム独立」の意味は異なるアーキテクチャの Linux でも動く程度だったが状況が変わったという趣旨で標準化についての相談してました。 背景に挙げられていた項目は Windows での eBPF サポート、 ネットワーク機器での XDP のオフロード、そして XRP という試みの行き詰まり、でした。

この記事では NVMe Computational Storage というコンセプトはあっても、 NVMe ベンダーは BPF 標準化されないと大規模な投資をためらっている紹介していました。 また、少なくとも ISA は標準化の対象だがセマンティック含め標準化するべき項目についても議論の余地があるという話です。

これを読んだ時に、たしかに実行環境が増えていて共通言語としてのバイトコードと意味に仕様が必要になるな思い RFC 9669 をちゃんと読むかという気持ちになりました。 あとで教えてもらったのですがIETF-120のスライドにオフロード機能に関する期待が書かれてました。 BPF/eBPF(bpf) の議事録を一通り眺めておくのも理解が捗りそうです。

あと ISO が嫌われていて面白かったです。

BPF meets io_uring [LWN.net]

いままでと変わって結構前(2021)の LWN.net の投稿です。io_uring(7) と eBPF の出会いについてセキュリティ・複雑化について言及しています。

io_uring(7) はカーネルとユーザースペースで共有した2つのリングバッファを用いて非同期 I/O を行うインタフェースです。 この記事では io_uring のリングバッファから eBPF が使えるようにする概念実証とみつかった課題が紹介されています。 eBPF で可能なことが広がるおもしろそうな話です。

これに類することは記事よりさらに1年くらい前に ScyllaDB も記事にしてました。 しかし記事では、ケイパビリティの整理や複雑になる実装、そして予期困難なレイテンシーなど大きな課題も紹介していました。

少しずれますが io_uring と eBPF 関連では RingGuard: Guard io_uring with eBPF (COMM eBPF'23) という論文がでています。 これは io_uring に eBPF をアタッチさせてセキュリティや監査を実現した実装みたいです。 背景には io_uring は seccomp の標準的な仕組みをバイパスしてしまいセキュリティが働かないこと、まだ若くセキュリティインシデントが多いことを挙げていました。 カーネルパッチを待たずに素早く対処できるというのが提案手法のメリットのようでした。 自分は seccomp で素直に io_uring を扱うのがダメなのか理解できてません。パラメータなど詳細をみないと対応できないからなんですかね。そこを調べたり読み直したりしないと評価できないなと思っています。

論文を読んでいると io_uring(7) のセキュリティ関連記事( LWN.net, CVE )へのリンクが多くあり背景の理解からやっていこうと思いました。

おわり

今回はすこし将来になりそうな話題を拾いましたが eBPF の周辺はまだまだ広がりそうで楽しかったです。 概念実証の先ではレイヤをバイパスする時に失われるメタ情報の補完やセキュリティ対応が待ち構えているのもよく実感できます。 XRP などは実装も公開されています。読んだり実験したりすれば eBPF やセキュリティの議論にフィードバックを返せるようになるかもしれません。

リリース済みの機能や利用事例に限っても eBPF は話題が豊富でキャッチアップは大変ですが楽しい分野です。 eBPF Japan meetup は今後も実施されるようなので興味持った方は参加してみてください。

eBPF Japan Meetup #2 に参加してきました!

この記事はBBSakura Networksアドベントカレンダー2024の16日目の記事です。

こんにちは! 新卒の松下です。 本日は、eBPF Japan Meetup #2 に参加してきましたので、その様子をブログにまとめてみました!
私は大学時代に Kubernetes を触っていた経験があり、eBPF はそのバックボーン技術の一つとして以前から興味があったため、今回のイベントに参加しました。

イベントの概要

今回のミートアップはオフライン形式で、さくらインターネット株式会社の東京支社で開催されました。
50名ほどの参加者が集まり、前回のミートアップよりも増加していることから、eBPFへの注目度の高まりを実感しました。 多様なバックグラウンドを持つエンジニアの方々が集まり、eBPF の最新情報や実際の活用事例が共有されました。

eBPFとは?

「eBPFって何?」と思う方もいるかもしれませんので、簡単にまとめると以下のような技術です。

  • カーネル上で動作する仮想マシン
  • C言語で記述し、カーネル上のイベントによって動作する

eBPF を使えば、ネットワークやセキュリティ、観測データの処理を効率的に実現できます。

特に印象に残った発表

1. XDPでEtherIPを実装したい話

発表者: Takaharu Umeda

EtherIP のカプセル化がボトルネックになっている問題を、eBPF を使った XDP (eXpress Data Path) で高速化したという発表です。
encap/decap 処理をドライバーレベルで実施し、カーネル内部のプロトコルスタックに入る前に処理することで効率化が可能となります。このように通信全体の遅延を削減し、高速化を実現している点が非常に興味深かったです。 この記事により詳しいことが書いてあります。

特筆すべきは、発表者が大学生で、BBSakura でアルバイトをしている方だったことです!後でお話する機会がありましたが、ご自身で AS を運用したり、積極的に技術イベントに参加したりしている姿勢にとても刺激を受けました。若いながらも生粋のエンジニアだと感じました。

2. Protecting the kernel on AGL; preventing attacks with ebpf filters

発表者: Caleb McGary

車両間通信において、eBPF を活用してシステムコールをフィルタリングし、セキュアな通信を実現するという発表です。
Linux の seccomp (システムコールのフィルタリング機能で、eBPFによって拡張可能)を車両通信に応用することで、以下のメリットがあると説明されていました。

  • ソフトウェア実装よりも、将来的な仕様変更が少ない可能性が高い
  • 従来のソフトウェアベースのフィルタリングと比較して高速に処理可能

車両通信では最新の車両と古い車両が共存するため、通信速度を遅い車両に合わせる必要があります。そのため、長期間にわたって安定した基盤を提供できる Linux のシステムを採用することが重要とのことでした。 このスライドにより詳しいことが書いてあります。 私自身、学生時代に車両通信の研究をしていた経験があるため、この発表には特に興味を引かれました。

感想

今回のミートアップでは、ここで紹介した以外にも様々な発表があり、eBPF が非常に広い分野で活用されていることを実感しました。
私は「eBPF に興味はあるけれど、具体的に何に使えるのかよく分からない」という状態で参加しましたが、「こんな使い方もあるのか!」と感動の連続でした。特に印象的だったのは、多くのエンジニアの方々が「技術が趣味」と言えるほど深く打ち込んでいる姿勢です。自分も今後キャリアを考える中で、そういった”はまれる”ものを見つけられるように、色々なことに挑戦していきたいと思いました。
また、BBSakuraでは実際に eBPF を用いたソフトウェアを開発し、プロダクション環境で運用しています。詳しくは主催の Hayasaka さんが前回発表したスライドをご参照ください。今回のイベントでは弊社がスポンサーとして関与し、従業員 2 名が発表を行いました。弊社ではこうした技術コミュニティへの積極的な貢献を通じて、社内外での技術力の向上や交流を大切にしていきます!
このように、挑戦を支援し、成長を後押ししてくれる環境が整っているからこそ、より多くのことにチャレンジできると感じました。今後もこのような場を活用して、さらに技術力を磨いていきたいと思います!
BBSakuraでは、ソフトウェア開発を一緒に推進する仲間を募集しています。エンジニアとして挑戦や成長をしたい方、ぜひ一緒に働きましょう。

SIMについて整理しよう

この記事はBBSakura Networksアドベントカレンダー2024の15日目の記事です。

こんにちは。BBSakura Networksでソフトウェアエンジニアをやっている楽野です。普段日常的に何気なく利用しているSIMカードですが、自分自身の理解が曖昧なところもあり今回アドベントカレンダーの場を借りて整理してみようと思いました。

SIMいろいろあって分かりにくい

携帯電話等で利用されているSIMカードですが、ユースケースに応じて様々な種類が存在します。ここでは簡単にSIMの種類を眺めてみようと思います。

形状・サイズによる分類

まず一番分かりやすい形状とサイズによってSIMを分類してみます。 形状は大きく

  • カード型SIM
  • チップ型SIM

に分類されます。カード型SIMは一般的に広く普及しているSIMで、コンシューマ用途で多く用いられています。チップ型SIMは最小のカード型SIMの半分くらいのサイズで、MFF(Machine-to-machine Form Factor)とも呼ばれます。チップ型SIMはカード型SIMに比べ耐用年数や耐熱性能などに優れており、IoT機器など組み込み用途にも使用されています。

Comparison of SIM card sizes
By Jbond2018 - Own work, CC0, Link

次にサイズですがカード型SIMでは次のサイズが規定されています。

カード型SIM

Form Factor 名称
1FF(1st Form Factor ) Full-size
2FF Mini-SIM
3FF Micro-SIM
4FF Nano-SIM

GSM Micro SIM Card vs. GSM Mini Sim Card - Break Apart.svg
By Justin Ormont - Own work, CC BY-SA 3.0, Link

1FFはクレジットカードなどと同じサイズのSIMですが、近年のデバイスではあまり使用されていません。(私はカードリーダでSIM情報を読み出すときなどに使用したりします)マルチカットSIMを購入したときの各サイズ切り出し前の大きさが1FFです。 なお、1FF/2FFはISO/IEC 7810、3FF/4FFはETSI TS 102 221、MFFに関してはETSI TS 102 671でそれぞれ形状が規定されています。

UICCという呼び方

SIMをUICCと呼ぶこともあります。UICCはUniversal Integrated Circuit Cardの略で、SIMのベースとなるsmart cardのことです。ISO/IEC 7816/10536でICカードとしての物理的な特性や基本的なプロトコル・データ構造などが規定され、ETSI TS 102 221でSIMとしてのインタフェース・データ構造の仕様が定められています。UICCはCPU, ROM, RAM, EEPROM と I/O で構成され、UICC上でSIMアプリケーションが動作しSIMの機能(通信プロファイル・AKA認証機能等)を提供しています。

じゃあ、eUICCって何?

embedded UICCのことをeUICCと呼びGSMAで仕様が定められています。元々組込み機器でのSIM利用の利便性を向上させるために検討された仕様で、複数のSIMプロファイル(ある通信キャリアと通信するのに必要な情報が記述されているファイル)を保持し選択して利用する、遠隔でプロファイルの書き換えが行える、などの機能があります。

紛らわしいeSIM

最近よく耳にするeSIMについてですが、組み込みを表す “embedded” と リモートプロファイル書き換え・マルチプロファイルを表す “eUICC” の2つの意味を持っています。

  • embedded SIM

    • チップ型SIMであるMMFタイプのSIMを指します
  • eUICC SIM

    • 遠隔でプロファイルを書き換えられるSIMであれば形状は問わず、カード型・チップ型のどちらもeSIMと呼ぶことがあります

よって、eSIMであってもプロファイルのリモート書き換えが行えないSIMも存在しますので文脈に注意が必要です。

その他の名称

元々SIMはGSMという2Gの携帯電話システムで利用が始まりました。その後3Gの時代で UIM(W-CDMA用) R-UIM(CDMA2000用) などシステムに応じた異なる名称が用いられるようになりましたが、現在では特に区別せずSIMと呼ぶことも多くなっています。

おわりに

今回は広く一般的に普及しているSIMについて種類や名称を簡単に整理しました。 近年ではSIM用に専用の集積回路を必要としないiSIM(Integrated SIM) / SoftSIMも市場に登場しています。日本では3G以降本格的にSIMの採用が始まりましたが、今後携帯電話の加入者情報をさらに便利に取り扱えるサービスも生まれてくると思います。今後もSIMやその他モバイルに関する記事を書いていく予定です。

最後までお付き合い下さりありがとうございました。記事に間違いや不明瞭な点がありましたら、ご指摘頂けるととても嬉しいです。

SaaS Connection を使用してみる

はじめに

こんにちは!

BBSakura Networks でネットワークエンジニアしています大野木です。

9 月 26 日に OCX のサービスとして SaaS Connection をリリースしました。

https://www.bbsakura.net/ja/information/press/ocx-2024-09-26-01

この SaaS Connection を使用すると、お客さまは OCX 網内からインターネットを経由せずに指定の SaaS に接続できます。

SaaS を使用したいが、社内のセキュリティポリシー上、インターネット接続を許容できないといったお客さまのニーズにお応えするべく、SaaS Connection は開発されました。

この記事では、SaaS Connection の使用方法についてご紹介します。

また、BBSakura Networks Advent Calendar 2024 の 13 日目の記事となります。

事前情報

SaaS Connection の接続構成例と実際の使用方法についてご紹介する前に、SaaS Connection の特徴、接続先、設定項目について事前情報の確認をします。

SaaS Connection の特徴

SaaS Connection は、次の特徴があります。

  • 指定の SaaS 事業者への閉域接続を NAT 機能(SNAT)とともに提供している
  • OCX リソースの VC とアタッチできる
  • IPv4 のみ対応している
  • SaaS への名前解決は別に用意する必要がある
  • お客さま CPE や OCX Router (v1) とは eBGP を使用して接続する

SaaS Connection の接続先

SaaS Connection の接続先として、現在( 2024/12/13 時点)では以下になります。

  • Cybozu
  • Microsoft Azure Peering Service (以下 MAPS と略する) *1

今後もさらに SaaS Connection の接続先は追加されますので、 より便利にご利用頂けると考えています。

SaaS Connection の設定項目

SaaS Connection では、次の設定項目を入力し SaaS Connection リソースを作成します。

  • 名前: OCX ポータル上で表示される SaaS Connection リソース名
  • ロケーション: SaaS Connection が作成されるロケーション
  • 接続先 SaaS : 接続する SaaS 事業者名
  • IPv4 ゲートウェイアドレス:お客さまのネットワークから SaaS へと接続するデフォルトゲートウェイの IP アドレス
  • NAT IP アドレス:SaaS 接続時に SNAT するための変換用グローバル IP アドレス
  • ローカル ASN : SaaS Connection で動作させる AS 番号

OCX ポータル上での SaaS Connection (Cybozu)の作成画面
SaaS Connection (Cybozu)の作成画面

SaaS Connection を作成後、お客さまの CPE や OCX-Router(v1)と接続するために、BGP Parameter を設定します。

  • BGP Parameter:SaaS Connection で BGP 機能を使うための設定項目(ローカルアドレス、リモートアドレス、リモート ASN)

SaaS Connection の BGP Parameter の設定後の画面
SaaS Connection の BGP Parameter の設定後の画面

「IPv4 ゲートウェイアドレス」と「NAT IP アドレス」の詳細については、Internet Gateway サービス解説 に詳細な記載がありますので、ぜひご覧ください。

SaaS Connection の使用方法

実際に SaaS Connection を使用する手順を説明します。使用する手順を項目で記載すると次のようになります。

  1. OCX の他のリソース準備を行なう
    • Physical Port、VCI、VC 作成しアタッチする
  2. SaaS Connection を使用する
    • SaaS Connection を使用する構成を検討する
    • SaaS Connection を作成する
      • SaaS Connection の BGP Parameter 作成
    • (オプション) OCX-Router(v1)を作成する
      • インタフェースを作成する
      • OCX-Router(v1 の BGP Parameter 作成
    • SaaS Connection を接続したい VC へアタッチする

1 については、OCX の他リソースの説明も含みますので、今回のご説明では省略します。適宜、 ドキュメントサイト をご覧ください。

2 については、次の章で構成例と BGP Prameters の例を示しながら、説明していきます。

SaaS Connection を使用した構成例

SaaS Connection を使用する際の構成例について説明します。

代表的な構成例として、

  • ①お客さま用意の CPE と SaaS Connection が BGP 接続を行なう構成
  • ② OCX-Router(v1) を使用した構成

の2種類が挙げられます。*2 *3

ポイントとしては、SaaS Connection の特徴でもご説明した通り、eBGP 接続を使ってお客さま CPE や OCX-Router(v1) と通信を行なうため、事前に BGP の設計を考えておくことが重要になります。

また、OCX-Router(v1) を BGP 接続の集約ポイントとしてご使用いただくことで、OCX の他のリソースである Cloud Connection とも接続が容易なため、おすすめです。

今回の説明では、②の構成で CPE と OCX-Router(v1)間を BGP 接続した構成を使用して、SaaS Connection の使用方法について説明していきます。

SaaS Connectionを使った構成を2つ例に挙げている
SaaS Connectionを使った構成例

次の章で、構成例②を実際に設定項目を記述しながら説明します。

BGP Parameter の設定例

BGP Parameter を次の項目のように決定し、SaaS Connection と OCX-Router(v1) を作成、BGP Parameter の設定をします。

  1. SaaS Connection に関しての設定
    • SaaS Connection 作成時に設定入力
      • ローカル ASN: 65002
    • BGP Parameter 作成時に設定入力
      • リモート ASN: 65000
      • ローカルアドレス: 10.70.0.1
      • リモートアドレス: 10.70.0.2
  2. OCX-Router(v1) に関しての設定
    • OCX-Router(v1)作成時に設定入力
      • ローカル ASN: 65000
    • (CPE 向け)インタフェース作成時に設定入力
      • ローカル IPv4 アドレス: 10.70.0.1
    • (SaaS Connection 向け)インタフェース作成時に設定入力
      • ローカル IPv4 アドレス: 10.90.0.2
    • (CPE 向け) BGP Parameter 作成時に設定入力
      • リモート ASN: 65001
      • ローカルアドレス: 10.70.0.1
      • リモートアドレス: 10.70.0.2
    • (SaaS Connection 向け) BGP Parameter 作成時に設定入力
      • リモート ASN: 65002
      • ローカルアドレス: 10.90.0.2
      • リモートアドレス: 10.90.0.1
  3. CPE に関しての設定
    • CPE 側の仕様にあわせて設定
      • ローカル ASN: 65001
      • リモート ASN: 65000
      • ローカルアドレス: 10.70.0.2
      • リモートアドレス: 10.70.0.1

 BGP Parameter を設定した構成例
BGP Parameter を設定した構成例

SaaS Connection と OCX-Router(v1) を作成後、画像の構成例に従って SaaS Connection 等を VC にアタッチします。

アタッチが終了すれば、SaaS Connection を使用する準備は整いました。

SaaS Connection の動作確認

最後に、これまで紹介した構成例に Ubuntu Desktop を接続して、どのような動作になるか確認していきます。

次の図のように、Ubuntu Desktop を CPE に接続します。

また、SaaS Connection では、名前解決は別に用意する必要があります。今回は、CPE 側で Ubuntu Desktop 用の 名前解決用に Google Public DNS (8.8.8.8) 向けへの疎通性を別に用意しました。

Ubuntu Desktop をCPEに接続するイメージ図
Ubuntu Desktop をCPEに接続するイメージ図

今回は、SaaS Connection (Cybozu) を使用しているので、試しに store.cybozu.com にブラウザからのアクセスできるかを試します。

store.cybozu.comにアクセスが成功している図
store.cybozu.comにアクセスが成功している図

無事に、store.cybozu.com にアクセスできました。

また、コンソールより traceroute の結果を見ても、本日紹介した構成例に従って、ルートを通っていることがわかります。

bbix@bbix-virtual-machine:-$ tracepath -n store.cybozu.com
1?: [LOCALHOST]    pmtu 1500
1: 192.168.112.1    0.976ms
1: 192.168.112.1    0.862ms
2: 10.70.0.1        1.329ms
3: 10.90.0.1        1.075ms asymm 4
4: 10.249.77.0      1.547ms
5: 10.249.76.80     2.144ms
6: 101.203.88.167   3.416ms
7: 103.79.12.54     2.851ms
8: no reply
9: no reply

また、違うサイトに閲覧できないことも確認します。例として、Wikipedia のメインページにアクセスします。

Wikipedia にアクセスができない図
Wikipedia にアクセスができない図

問題なくアクセスできないことが確認できました。

おわりに

この記事では OCX の新サービスである SaaS Connection の使用方法について解説しました。

SaaS Connection は今後も機能強化していく予定ですので、楽しみにお待ちください。

もし、今回の記事を通して OCX のご利用に興味を持たれましたら、弊社までお問い合わせください!また、不明点などもありましたら遠慮なくお知らせくださいませ。

*1:MAPSとは、Microsoft が提供する「Microsoft Cloud」(「Microsoft Teams」「Microsoft 365」「Dynamics 365」「Azure」などのクラウドサービスの総称)へ直接接続を行なうことで、品質を強化するネットワークサービスです。

*2:今回の構成例では、説明簡略化のため冗長構成を省略して記述しております。

*3:②の構成の注意点として、CPE と OCX-Router(v1)間を Static Route で経路設定をした場合、OCX-Router(v1)の「Connected と Static Routes の経路再配布」機能を使用することを忘れないようにしてください。

転生したらホームページがWordPressだった件

#異世界転生と、忘れ去られたWordPress

・・・おや・・?

私の名前は、Maki。 ある日、私は仕事中に突然の睡魔に襲われ、あっという間にこの世を去ってしまった。 そして、気がつくと私は、見知らぬ草原にいた。 私は、自分が異世界に転生したことを悟った。そう、ここは、フロント・エンドと言う世界ーーーー。

異世界で目を覚ました私は、そこで見慣れたロゴが表示されているパソコンを眼の前に見た。それは、私がかつて使っていた、あのWordPressのロゴだ。

「WordPress!?」

私は思わず声を出してしまった。 そうだ。前世の私は、BBSakuraというエンジニア集団の会社でモバイルコアのバックエンドエンジニアとして働いており、自社のホームページをWordPressで構築した経験があった。しかし、その記憶はなぜか断片的で、詳細を思い出せない。

#WordPressの課題感

・・WordPress・・そうだ!

私は前世の記憶を一つ思い出した。それは、WordPressの運用がとても大変だったこと。

「しばらくさわってないし、まずはこのWordPressをメンテしよう!」

そう思った私は、さっそくパソコンの前に座る。しかし、WordPressの操作方法はほとんど覚えていない。

WordPressでホームページを本格運用した場合、以下のような問題が発生したはずだ。

  • ステージングと本番を分けるのが大変
  • 開発ブランチを作りたい(開発自体をGitでやりたい)
  • 投稿記事のフォーマットが記事によってズレてしまったりする
  • 動作がもっさり
  • プラグインのバージョンメンテが大変
  • 子テーマを作らないといけない問題
  • プラグインのバージョンメンテナンス、脆弱性の問題

そこで、最新の技術を使って、もっと簡単にホームページを作成できないかと考えた。

最近話題のRemixというフレームワークを使えば、Reactのコンポーネントをサーバーサイドでレンダリングできると聞いたことがある。これなら、動的なホームページを簡単に作成できるはずだ。

#モジュールの壁にぶつかる

そこで、私は、初めてのフロントエンドフレームワークであるRemixを使って、自社ホームページを構築することにした。 Remixは、最新のWeb開発のトレンドを取り入れた、とても便利なフレームワークらしい。フロントエンドやWebの知識がまったくないところからのスタートだけど、便利で最新って書いてある。

バックエンドもやってたし、Remixもなんとかなるはず!簡単だ!(フラグ)

私は、Remixでプロジェクトを作成し、さっそく記事を作成するためのモジュールを探し始めた。しかし、なかなか良いものが見つからない。記事を誰でも簡単に書けるように、Markdown形式で入力できるようにしたい。 ようやく見つけたモジュールは、機能的には申し分なかったが、なんとRemixに対応していなかったのだ。

#フロントの基礎を学ぶ

Remixの壁にぶつかり、私は改めてWeb開発の基礎を学び直すことにした。JavaScript、TypeScript、Reactといったフロントエンドの技術を、一から勉強し直す。

JavaScriptは、Webの基本となる言語だ。TypeScriptは、JavaScriptの静的型付け言語だ。Reactは、Facebookが開発した、Webアプリケーションの開発によく使われるフレームワークだ。 まずは会社で契約しているUdemyを使ってJavaScriptの勉強をスタートしてみた。

JavaScriptとTypeScriptの学習は、それほど苦労しなかった。しかし、Reactの学習は、とても難しかった。Reactの考え方は、今までのGoでのプログラミングの経験とはまったく異なるものだった。

  • React
    • フロントエンド開発に特化したJavaScriptのライブラリ
    • ブラウザ(クライアント)で実行されるコードと、サーバーで実行されるコードを、シームレスに書くことができる。
    • UIの部品(コンポーネント)を作成し、作成したコンポーネントを組み合わせることで画面を構築する。
    • 非同期処理が中心(沼)。ユーザー入力やバックエンドとのAPI通信のために最適化されている。
    • DOM(ウェブページの設計図)を直接更新せず、仮想DOM(DOMのレプリカのようなもの)を使って間接的にレンダリングを行うことで、DOMを直接更新するより高速に動作する。
    • コンポーネントごとに状態管理を行い、状態が変わるとコンポーネントを再レンダリングする。
  • Go
    • 汎用プログラミング言語。
    • Goroutineによる並行処理がシンプルに記述でき、高負荷なバックエンドの処理を効率化できる。

また、Reactと同じくフロントエンド開発の2大巨塔のひとつとしてVueも存在するが、この検討段階では選択肢に入らなかった。なぜなら、BBSakuraが開発しているプロダクトのひとつであるネットワーキングポータル「OCX」はReactで書かれているからだ。できるだけ同じライブラリで作った方が、メンテナンスもしやすく、また、「OCX」で実現したいことの実験場としてホームページを使うこともできるかもしれない。

それでも、私は諦めずにReactの学習を続けた。そして、ようやくReactの基本的な部分を理解することができた。

Remix and Next.js is the subsets of React, NuxtJS is the subset of Vue.js. The two sets is the subsets of JavaScript and TypeScript.
Reactとそのおともだちの依存関係

#Next.jsで再挑戦

しばらくの間、基礎を固めた後、再びホームページの開発に取り掛かる。今回は、Next.jsというReactフレームワークを使うことにした。Next.jsは、静的サイト生成とサーバーサイドレンダリングの両方に対応している。また、静的サイト生成により高速に動作するため、SEOにも強いという点が魅力だ。

ホームページの開発にNext.jsなどのフレームワークを使うのは、少々オーバーキルかもしれない。しかし、フロントの基礎を学んでいるときに感じたように、「OCX」はNext.jsを使って開発されており、「OCX」で実現したいことの実験場としてホームページを使うには、Next.jsという選択が一番良いと考えた。

Markdown形式で記事を作成するためのモジュールも、Next.jsに対応しており、スムーズに開発を進めることができた。

WebアーキテクチャのSSG、SSR、ISGの比較
Webアーキテクチャを整理し、さまざまなフレームワークの中からNext.jsを選択した

#社内リソースの確保と開発の大義名分の建てつけ

この世界、フロント・エンドに降り立ってからというもの、私の使命は「OCX」を開発することだった。しかし、いきなり未経験の状態から既存のプロダクトに手を付けるにはいささか手腕がたりない。それならば、この忘れ去られたホームページをプロジェクト化し、人を募っていろいろな知見のアウトプットの場にしよう。部署横断でわちゃわちゃして、Geeks' Playground を実現しよう。ないのなら作る。そう、自らの手で。それが私であり、BBSakuraだ。

少しずつ感覚を取り戻してきた。

この案件をプロジェクト化するには、まずは以下のことが必要だ。

  • 直接お金を生まないという性質上、この案件を実行する大義名分が必要(体力)
  • ホームページという性質上、デザイン実装が得意なメンバーと事業が得意なメンバーが必要(パーティメンバー)
  • 納期を自ら設定し、最後までやりきる根気(SAN値)

私は、事業メンバーをつかまえ、「Geeks' Playground を実現したい」「後進の育成に使いたい」「部署横断のコミュニケーションの場をつくりたい」「BBSakuraのプロモーションに力を入れるための第一歩を踏みたい」という大義名分を伝えたところ、快く同意していただいた。また、デザイン実装が得意なメンバーも集めてくれるというのだ。とても助かった。

ここからみんなで力を合わせて、ホームページを作っていこう。

#力を入れたはじめてのフルスクラッチ自社ホームページ

私がこの業界で仕事をするにあたって、とても大切にしている心がある。それは、「技術を人に意識させない」こと。せっかくフルスクラッチで少数精鋭で取り組んできたプロジェクトだ。ここに、自分の思いを思い切りぶつけたい。その思いを体現するために重視したのは、以下の1つのシンプルなポイントだ。

  • ユーザーの「自然体」をじゃましないデザインにする

このポイントは奥が深い。自然体をじゃましないためには、色調やデザインもシンプルにしたい。また、目の導線を遮らないボタンやテキストの配置にも工夫した。また、上に書いたように、記事を誰でも簡単に書けるように、Markdown形式 にすることも、メンテナーの自然体にできるだけ近づけるための努力だ。

BBSakura's homepage with the blue sky and a building behind a cherry blossom.
執筆時点でのBBSakuraのホームページ(WordPress脱却のすがた)

#新たな壁、そして決断

ホームページの開発が完了し、Vercelでデプロイできた喜びも束の間、新たな問題が浮上した。グループ会社の方針により、特定の認証局が発行したSSL証明書を使用する必要が生じたのだ。Vercelでは、この要件を満たすことが困難だった。

Vercelは、GitHubのリポジトリと連携するだけで簡単にWebサイトのデプロイ〜ホスティングまでを実現できる便利なツールだ。しかし、持ち込み証明書を利用できるEnterpriseプランに切り替えるには多額の費用がかかる。弊社で利用するアカウントの数を考慮すると、会社を倒産させる規模の価格の試算がでてしまった。(執筆時点の情報)

これらの問題を解決するため、私は別のプラットフォームへの移行を決意した。

#Google Cloudへの移行

いくつかのクラウドホスティングサービスの中から、私はGoogle Cloudを使うことを決意した。比較対象は以下の3つ。

  • Cloudflare Pages
  • さくらのクラウド
  • Google Firebase Hosting

この中から、以下の条件を満たすものを絞り込んだ結果、Google Cloudを選ぶこととなった。

  • 低コスト: 費用をできるだけ安く抑える。
  • シンプル構成: 組み合わせるサービスを最小限にする。
  • 簡易機能: 複数サービスを組み合わせる場合、シンプルな機能のものを選ぶ。
  • サーバーレス: 運用の負担を軽減するため、サーバーレス構成にする。
  • 環境分離: ステージング環境と本番環境を分離する。
  • 限定公開: ステージング環境を社内のみに公開することでセキュリティを強化する。

Google Cloudへの移行を決意した私は、よりスケーラブルで効率的な環境を目指し、Compute Engineではなく、Cloud BuildとCloud Run、そしてCloud Load Balancingという組み合わせを選択した。 まず、Cloud Buildを使って、Dockerイメージを作成する。Next.jsのアプリケーションをDockerfileで定義し、Cloud Buildトリガーを設定することで、コードの変更を検知し、自動的に新しいイメージをビルドするようにした。

次に、Cloud Runにコンテナをデプロイする。Cloud Runは、サーバーレスコンテナプラットフォームであり、リクエストに応じてコンテナを起動・停止するため、非常にコスト効率が良いのが特徴だ。また、自動スケーリング機能も備わっており、トラフィックの変動に柔軟に対応できる。 最後に、Cloud Load Balancingを使って、複数のCloud Runインスタンスにトラフィックを分散させる。これにより、高い可用性と耐障害性を確保することができる。

BBSakuraホームページは、GitHub上にある本番ブランチと開発ブランチをそれぞれ分けて、Google Cloud上にデプロイされている。
BBSakuraホームページのデプロイ図

#新たな章へ、そして未来へ

Cloud Build、Cloud Run、Cloud Load Balancingという組み合わせは、私にとって新たな挑戦だった。しかし、これらのツールを組み合わせることで、非常に効率的でスケーラブルなWebアプリケーションを構築することができた。

現在は、Cloud RunのログをCloud Loggingで集計し、Cloud Monitoringで監視することで、アプリケーションの状況を常に把握している。 異世界に転生し、WordPressから始まり、Next.js、そしてGoogle Cloudのサーバーレス環境へと、私のWeb開発の旅はますます加速している。一生懸命制作したホームページだが、まだまだ改善点はもりだくさん。もっといいUI、もっといいデザインを求め、もっといいUXを探求しよう。この異世界で、私はこれからもWeb開発のスキルを磨き、より革新的なWebアプリケーションを作り続けていきたい。

#最後に

この記事は BBSakura Networks アドベントカレンダー 12 日目の記事です。

大きくなりつつある会社のオンボーディングを整える

はじめに

この記事は BBSakura Networks アドベントカレンダー 2024 の 11 日目の記事です。

adventar.org

こんにちは。開発本部 モバイル開発グループの みずき @n0mzk です。

モバイルコアの開発・運用がメインの業務ですが、今年の 8 月から兼務で人事をやっています。人事といっても労務管理などは行わず(もともと担当してくれている方がいるので)、人材開発といわれるような分野を担当しています。今日は、人事をやることにした背景と、最初の取り組みとして行っているオンボーディングについて書きます。

BBSakura で人事を始めた

BBSakura は今年の 8 月で設立から丸 5 年が経ちました。設立時には 20 名程度だった社員数もいまは 100 人を越え*1、当初エンジニア中心だった職種も、企画・営業・経理など、多様化しています。

人数が増えたことで、OCX(Open Connectivity eXchange)のような大きなプロダクトを作れるようになった反面、組織課題も大きくなってきていると感じていました。具体的な課題意識については後に記載しますが、それらの課題について対策を打ちたく、人事業務をやらせてほしいと上司に訴え、兼務でやらせてもらうことになりました。

設立から 5 年経った BBSakura の組織課題

以下のような課題を感じていました。

  • テキスト・非同期コミュニケーションメインとする、リモートワーク前提の働き方が崩れつつある
  • 越境しづらくなっている

テキスト・非同期コミュニケーションメインとする、リモートワーク前提の働き方が崩れつつある

BBSakura は設立時(コロナ禍前)からフルリモートで働く前提の会社でした。そのためテキスト・非同期コミュニケーションを重視しています。オフィスに全員で集まって議論しながら開発することがなかなかできないため、全員に議論の背景と結論を伝えるにはテキストが残っている必要があるのです。

ですが、東京在住で東京の拠点に出社する頻度の高いメンバーが増えてきたためにオフィスでの口頭コミュニケーションで意思決定がなされ、テキストが残らないことが増えてきました。そうするとその場にいなかったメンバーには断片的な決定事項のみが伝えられ、背景を理解できないまま開発することになります。後から質問しながら・当時の議論を思い出しながら認識を合わせる必要があったり、開発が進んでから手戻りが発生したりして、開発スピードが下がります。

今ではプロダクトの規模も大きくなっていて、その場にいた人だけが手を動かせば作れるというものでもなくなっているのも、この問題が発生する背景です。

越境しづらくなっている

BBSakura の行動指針のひとつに "Beyond the border" というものがあります(参考: 会社紹介 | BBSakuraについて | BBSakura Networks株式会社)。

自分の担当範囲・自部署の責任範囲の業務だけやればよいという意識でいるのではなく、部署を越えて互いに興味を持ち、口も手も出し、自律協調してみんなで良いものを作ろうということだと理解しています。

ですが会社が大きくなり互いの部署のことを知る機会が減っていること、また事業の規模が大きくなってそれぞれ自分の仕事で忙しくなっていることから、越境(Beyond the border)しづらくなっていると感じています。忙しいのは仕方ないにしても、部署を越えて業務内容や人となりを知れる状態を維持することで、互いに興味を持ち越境しやすい組織にしたいのです。

まずはオンボーディングから

これらの課題への対策として、まずは BBSakura に入ってきてくれる方たちに、BBSakura がどんな会社なのか、なにを大事にし、なにを目指しているのかを伝えられるようにしようとしています。

これまで入社者へのオンボーディングは配属先の部署任せになっていました。ですが会社として大事にしていること・やろうとしていることは全員に同じように伝える必要があるので、入社初日に人事として時間をもらって会社としてのオンボーディングを行うようにしました。

組織や事業の紹介ももちろん行いますが、下記のようなことを伝えるのに時間を割いています。

  • フルリモート前提の働き方をする会社であること
  • そのため、テキスト・非同期コミュニケーションを重視していること
  • フロー情報・ストック情報を意識してツールを使い分けていること
  • スムーズなコミュニケーション・円滑な業務遂行のために、リモートでも互いの様子や人となりを知ることも大事にしていること

以下はオンボーディングで利用している資料の 1 ページです。Slack を中心とした社内コミュニケーションについて説明しています。

「BBSakura の社内システムとコミュニケーション」というタイトルのスライド。記載内容は以下のとおり。「Kibela のオンボーディングページ に貼ったリンクを見ながら説明します。Slack オープンチャンネルでのテキストコミュニケーションに慣れてほしい・出退勤、休暇、離席などの連絡は #timecard で・times などのチャンネル作成ご自由に・チームチャンネルや times でつぶやいてくれると状況がわかって助かります・発信してくれると周囲のメンバーもフォローしやすくなります・Working Out Loud でお願いします!」
オンボーディング資料の一部

いつも下記の記事を紹介させていただきながら、Working Out Loud を推奨しています。

blog.studysapuri.jp

Working Out Loud を実践するのは、助けてもらいやすい状況を作るためだけでなく、それぞれが自分のことを発信することで互いに興味を持てるようにするためでもあり、またチームを越えてノウハウの共有が行われる可能性を生むものでもあります。

入社オンボーディングはオフラインで顔を合わせて行うのがいいかなという迷いもありつつ、リモートワーク前提の働き方を伝えるために今のところはあえてオンラインで行っています。入社してくれた方の意見を聞きながら、毎月、試行錯誤しています。

今後やりたいこと

オンボーディングに対して「社内のやりとりの雰囲気がわかった」、「溶け込みやすかった」という感想をもらい、やってよかったなあと思っているし、今年入社した鐘ヶ江さんがアドベントカレンダー 8 日目の記事で「オンラインでもオフラインでも、メンバー一人一人が自分らしく参加できる文化が根付いているため、私のような中途組も自然と馴染めている気がします!」と書いてくれているのはとても嬉しい感想でした。

BBSのコミュニケーション文化の魅力 - BBSakura Networks Blog

ですが、まだまだやれていないこと・やりたいこともあります。今後は以下のようなことも取り入れたいと思っています。

社内の人間関係構築支援

配属先以外の部署について各部署から説明してもらうとか、直属以外の上司と 1on1 してもらうというのを最近入社した方には行っています。他部署の業務を理解することに加え、ふだんあまり関わらない人とのコミュニケーションのきっかけにもなるとよいと思っています。なにか困ったときに配属先部署の外に相談できる相手がいる状態であることが、主に中途で入った方にとっては安心材料になると考えているからです。

上司部下の関係にならない上位レイヤーの人や、業務上少し関わりがある人への紹介・1on1 設定など、まだ人間関係を構築するための支援できることはあるので、今後増やしたいと考えています。

入社後の継続的なサポート

いまのところ人事として行っているのは入社初日のオンボーディングのみです。ですが、会社に馴染んで活躍してもらうためには入社後 1 か月・3 か月などのタイミングで様子を聞いたり、困っていることを聞いてサポートしたりという継続的なサポートも必要だと思っています。これも今後取り組みたいことのひとつです。

おわりに

大きくなりつつある組織で新しいメンバーに活躍してもらえる組織を作るための取り組みについて紹介しました。

本業である開発業務と並行してこれらを行う負担の大きさや、組織として立ち上がっていない状態で人事をやるやりづらさはありますが、やりたいことを自分から提案すれば実現させてもらえるところは、設立時から変わらない、BBSakura の良いところです。新しく入ったメンバーにも、やりたいことを持ってそれを主張できる状態まで馴染んでもらえるよう、初期からいるメンバーとしてサポートしたいなと思っています。

*1:親会社と兼務のメンバーも多くいます