Rust言語のメリットと課題、「Azure IoT Edge」の事例から分かること:Microsoft社内の採用事例
MicrosoftはRust言語を実運用環境で採用した。「Azure IoT Edge」に向けたセキュリティデーモンを実装するプログラミング言語として利用している。Microsoft Security Response Center(MSRC)は、このような決定の背景と、実装過程で分かったメリットと課題について解説した。
Microsoft Security Response Center(MSRC)は2019年9月30日(米国時間)、Microsoft社内におけるRust言語の採用事例を発表した。
「Azure IoT Edge」のセキュリティデーモンコンポーネントを実装するプログラミング言語として「Rust」を選択した背景と、実装過程で分かったメリットと課題が分かる。
Azure IoT Edgeは、MicrosoftのAzure IoTチームが手掛けるオープンソースのクロスプラットフォームソフトウェアプロジェクト。プロジェクトの目的は、クラウドからオンプレミスネットワーク内のエッジへとコンピューティング機能の分散を進め、管理する上での問題解決だ。
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.
関連記事
Microsoft、安全で高効率のプログラミング言語として「Rust」を高く評価
Microsoft Security Response Center(MSRC)は、ソフトウェアのセキュリティ確保と効率性の両方の要件を満たす最も有望なシステムプログラミング言語の一つとして、「Rust」を高く評価した。メモリ破壊バグをそもそも作り込まないことでセキュリティを確保できるという。Microsoftが「Rust」言語を導入、安全性以外の理由あり(続報)
Microsoft Security Response Center(MSRC)は、C/C++に代わるシステムプログラミング言語の最有力の選択肢として「Rust」を挙げ、その理由を解説した。合わせてMicrosoftのような大規模なコードベースを持つ企業にとっての課題も示した。「Azure IoT Edge」ソリューション用のCI/CDパイプラインを作成する、Azure Pipelinesを利用
Microsoftは、さまざまなプラットフォームでAzure IoT Edgeモジュールをビルドしてプッシュし、一連のAzure IoT Edgeデバイスに継続的に提供する簡単な方法を紹介した。「Azure Pipelines」内の「Azure IoT Edge」タスクを使用する。