Rust言語のメリットと課題、「Azure IoT Edge」の事例から分かることMicrosoft社内の採用事例

MicrosoftはRust言語を実運用環境で採用した。「Azure IoT Edge」に向けたセキュリティデーモンを実装するプログラミング言語として利用している。Microsoft Security Response Center(MSRC)は、このような決定の背景と、実装過程で分かったメリットと課題について解説した。

» 2019年10月02日 18時00分 公開
[@IT]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

 Microsoft Security Response Center(MSRC)は2019年9月30日(米国時間)、Microsoft社内におけるRust言語の採用事例を発表した。

 「Azure IoT Edge」のセキュリティデーモンコンポーネントを実装するプログラミング言語として「Rust」を選択した背景と、実装過程で分かったメリットと課題が分かる。

 Azure IoT Edgeは、MicrosoftのAzure IoTチームが手掛けるオープンソースのクロスプラットフォームソフトウェアプロジェクト。プロジェクトの目的は、クラウドからオンプレミスネットワーク内のエッジへとコンピューティング機能の分散を進め、管理する上での問題解決だ。

Azure IoT Edgeデバイスとクラウドの関係(出典:Microsoft

 Azure IoT Edgeのセキュリティデーモンは、Azure IoT Edgeランタイムを起動(ブートストラップ)する。さらに、Azure IoTランタイムとさまざまなホストサービスの間で通信ブローカーとして機能する。例えばコンテナランタイムや、ハードウェアベース暗号化デバイスのHSM(Hardware Security Modules)やTPM(Trusted Platform Modules)などのホストサービスだ。

セキュリティデーモンの要件と技術スタックの選択

 セキュリティデーモン(Microsoft社内ではエッジレットと呼ぶ)の開発に着手するに当たり、まず次のような設計目標を定めた。

  • エッジレットは、実行する際に.NET CLR(Common Language Runtime)のようなランタイムを必要としないネイティブコンポーネントでなければならない
  • エッジレットは、デバイス上のHSM/TPMハードウェアにアクセスするためのチャネルとして機能するので、セキュアでなければならない
  • エッジレットはC ABI(Application Binary Interface)を介してHSM/TPMハードウェアと通信する。そのため、オブジェクト/DLLのロードとC関数の呼び出しが簡潔でなければならない

 これらの設計目標から、C、C++、Rustなど、ネイティブコードにコンパイルされるプログラミング言語を選択することになった。

 ガベージコレクションのランタイムオーバーヘッドを避けたかったため、Go言語は選択肢から外れた。加えて、デーモンに必要なセキュリティ関連の要件から、メモリや並行性(コンカレンシー)に由来するバグに対処する必要のない言語が必要だった(関連記事)。こうした条件を踏まえ、Rustが最適だという結論に達した。

Rustの採用で得たものとは?

 Azure IoT Edgeの一般提供を開始する前に外部のセキュリティベンダーと契約し、開発したソフトウェアに対するペネトレーションテストを実施した。その結果、コードベースのうち、Rustで作成した部分では、セキュリティ問題が見つからなかった。

 開発時にはRustエコシステムが役立った。開発当初から、「rust-clippy」を使用し、Rustコンパイラがカバーしない範囲の細かい警告を出力させることにした。

 加えて、継続的インテグレーション(CD)を実行する際、Rustコードの整形ツール「rustfmt」による処理を経ていないプルリクエストを却下する仕組みを採用したことで、コードベース全体で一貫したコードの整形が可能になった。

 Rustコンパイラの更新プロセスとツール整備は順調に進んだ。コンパイラへのアップグレードは、ほぼ常にスムーズだった。

Rust言語は難しくないのか

 Rustは、他の一般的なプログラミング言語と比べて学習曲線の勾配が急だ。つまり学習の負担が大きい。このことがプロジェクトスケジュールに影響するのではないかとの懸念があった。

 今回の開発担当者は主にC、C++、C#、Javaに精通していたが、Rustを熱心に支持するメンバーが数人いたことが功を奏した。そこでRustのハンズオンワークショップを開き、Rustの不慣れな部分に対する各メンバーの理解が進んだ。

 最終的に、Rustの学習曲線は、予想したほど大きな問題にはならなかった。4〜6週間で開発チームのほぼ全てのメンバーが、Rustコードの作成に重要な貢献ができるようになった。

本番環境に初めてRustコードをデプロイ、どのような課題が見つかったのか

 Azure IoT Edgeのセキュリティデーモンコードは、Microsoftにとって、初めて本番環境にデプロイしたRustコードだ。本番デプロイに至るまでの経験は全体的に好ましいものだったが、幾つかの課題に対処しなければならなかった。

  • Rustのエコシステムは他の確立された言語と比較すると新しいため、インフラの一部を構築する必要が生じた
  • コンパイラのエラーメッセージを解析困難な場合があった。例えば「tokio Future」や「std::iter::Iterator」を多用するコードを扱う場合だ
  • RustはC#やJavaと比べて、コードの編集やデバッグを支援するツールが充実していない。例えばVisual Studio CodeのRust(RLS)拡張は、実際には非常に不安定だった
  • tokio Futureの複雑なコンビネータチェーンを扱うときに必ず構築される複雑な型を扱いにくいことがあった

 このような課題はあったものの、Azure IoT Edgeの一般提供開始後、Microsoftでは、Rustの利用が拡大の一途をたどっている。既に多くのクラウドサービスの開発にRustを使っている。MSRCは、Rustが実現するメモリの安全性とデータの安全性、パフォーマンスは、Azure IoTに極めて適していると考えている。

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。