AirbnbがAWSのMacインスタンスでiOS向けCIシステムを再構築した理由:新しいiOS CIシステムの利点4つも紹介
Airbnbが、メンテナンスをより簡単に行えるiOS CIシステムを発表した。
Airbnbは2023年5月11日(米国時間)、Amazon Web Services(AWS)のAmazon EC2 Macインスタンス上に再構築した、iOSアプリ向けCI(Continuous Integration:継続的インテグレーション)環境について説明した。公式ブログで再構築の背景や、新システムのメリットを紹介した。
今までの課題はメンテナンスコストとMacフリートの容量
同社によると、従来のCIシステムではメンテナンスにかかる膨大なコストが大きな課題という。これまでは、AirbnbのiOS向けCIはMacで運用して、仮想化せずにCIを実行することでスピードアップを図っていた。しかし、ハードウェア上でCIジョブを直接実行するため、多額のメンテナンスコストがかかっていた。
iOSインフラエンジニアが300台以上のマシンに個別にログインし、MDM(モバイルデバイス管理)ツールへのMacの登録やmacOSのアップグレードといった管理タスクを実行するやり方は、フリートの拡張性を制限してしまい、エンジニアの時間を消費していたと同社は指摘する。
2つ目の課題は、Macにおけるフリートの容量が固定されていた点だ。容量が固定されていたために、新しいバージョンに対してiOSのCIジョブを徹底的に検証することが難しかった。「Xcode」の新しいバージョンにアップデートする際も、エラーがたびたび発生していたという。
Airbnbの多くのiOSエンジニアは「Swift」とXcodeのリリースを頻繁にチェックし、新しい言語機能やIDEの改良の採用を希望しているため、Airbnbでは新しいXcodeバージョンを定期的にロールアウトするよう努めているという。
しかし、Macにおけるフリートの容量が固定されていたことで、以前のXcodeバージョンからのCIジョブを受け入れることができなくなっていた。
カスタムmacOS AMIでCIをアップグレード
これらの課題を解決するためにAirbnbが注目したのが、「Amazon Machine Images」(以下、AMI)だった。AMIは、ファイルシステムの内容やその他のメタデータを含む、インスタンスの状態のスナップショットだ。Amazon Web Services(AWS)は、各macOSのバージョンに対応したベースAMIを提供しており、稼働中のインスタンスから独自のAMIを作成することも可能だ。
AMIを使えば、人手を介さずに新しいインスタンスを追加することができる。そして、macOSをアップデートする際、フリート内の全てのマシンにログインする必要がなくなり、代わりに新しいmacOSバージョン用にAWSのベースAMIから起動した1つのインスタンスにログインできるという。
TerraformでCI環境を定義する
これらのAMIを活用した新しいCIシステムは多くの環境で構成されており、それぞれが独立して管理できるようになっている。各CI環境の中心的なAWSコンポーネントはAuto Scalingグループで、「Amazon EC2 Macインスタンス」の起動を担当している。Auto Scalingグループのインスタンス数はグループの希望容量プロパティによって決定され、minとmaxのサイズプロパティによって制限されている。
Auto Scalingグループは、起動テンプレートを使用して新しいインスタンスを作成する。起動テンプレートは、AMIを含む各インスタンスの構成を指定し、インスタンスの起動時に「ユーザーデータ」スクリプトの実行を許可する。起動テンプレートはバージョンを管理することができ、それぞれのAuto Scalingグループは、その起動テンプレートの特定のバージョンからインスタンスを起動するように構成される。
環境の導入により、インフラがコードで定義されていれば、その複雑さは管理できるようになる。iOS向けCIのためのAWSインフラは全て「Terraform」のコードで指定され、ソースコントロールにチェックされ、iOS向けCIに関連するプルリクエストをマージするたびに、Terraform Enterpriseは自動でAWSアカウントに変更を適用する。
新しいiOS CIシステムの4つの利点
新しいiOS CIシステムには4つの利点がある。
1.CI環境の柔軟性が高い
新しいTerraformの設定により、最小限のオーバーヘッドで任意の数のCI環境をサポートすることができるようになった。CPUアーキテクチャやXcodeのバージョンごとに新しいCI環境を作成し、OSをアップデートする際には、複数のバージョンのmacOSでこれらの環境を複製することも可能だ。
CI環境を定期的に使用しなくなった場合、Terraformモジュールを呼び出す際に最小キャパシティーをゼロに指定することができ、基礎となるAuto Scalingグループにも同じ値を設定することができる。そうすることで、Auto Scalingグループは、スケーリングサービスによって希望する容量が増加したときのみインスタンスを起動するようになる。そして、いったん停止した環境であっても、その環境を復活させるには、Gitで幾つかのコミットを元に戻し、スケーリングサービスを再デプロイするだけでよい。
2.インスタンスのローテーションでCIの一貫性を高める
Amazon EC2インスタンスがドリフトする機会を最小限に抑えるため、毎晩全てのインスタンスを終了させ、毎日入れ替える。こうすることで、1日の始まりにCIフリートが良好な状態にあることを確かめることができる。
インスタンスがコンフィギュレーションドリフトを起こした場合、ワンクリックでそのインスタンスをCIツール「Buildkite」から切り離すことができる。CI全体のキャパシティーを安定させるために、手動でインスタンスを追加することもできる上、インスタンスを早期に終了すれば、自動的に代替のインスタンスが起動する。
3.Xcodeのバージョンアップがより迅速に
オンデマンドでAWSから追加の「Amazon EC2 Dedicated Hosts」をリースすることで、CI使用量の予期せぬ急増に対応し、ソフトウェアのアップデートを徹底的にテストすることができるようになった。
これらの機能により、AirbnbのiOS開発者は、Swiftの機能やXcode IDEの改良に、より迅速にアクセスできるようになった。同社ではXcodeをアップデートするペースが20%以上速くなったという。
4.マイグレーションを完了
Airbnbが発表した新しいCIシステムは、2022年10月から12月の間で1000万分以上のCIジョブを実行したという。Amazon EC2へのアップグレード後、コードベースが増え、常にジョブ量が多いにもかかわらず、メンテナンスに費やす時間が大幅に減少したという。
AWSへの移行後、iOS向けCIはAirbnb内ですでに使用されている共有インフラからより多くの利益を得ている。そのため、AirbnbはAWS、Packer、Terraformの3つを2023年の大規模iOS開発における柔軟なCIシステム構築のための必須技術と捉えている。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- SwiftとiOSでgRPCクライアントを開発する――gRPCサービスの相互運用
第7回は、第4回で実装したサーバサイドストリーミングgRPCサービスを利用するモバイルアプリケーションを、iOS用にSwiftで開発します。前回と同様に、gRPCとモバイルアプリケーションの相性などを理解し、異なるプラットフォームとプログラミング言語で構成されるサービスを問題なく利用できることを理解します。 - GoogleのVPNサービス「VPN by Google One」を使って安全なインターネット接続を実現する【Windows 10/11】
公衆無線LANやホテルなどでインターネット接続を行うと、場合によってはハッカーなどによって通信内容が盗まれる危険性がある。それを防ぐにはVPN接続を利用するとよい。Googleが、オンランストレージサービス「Google One」の付加サービスとして提供を開始したVPN接続サービス「VPN by Google One(Google One VPN)」は設定が簡単で使い勝手がよい。このサービスの利用方法を紹介しよう。 - Microsoft、「Windows Community Toolkit」のアップデートを発表 次期バージョンで何が変わる?
Microsoftは「Windows Community Toolkit」の最新アップデートとして、新しい「Windows Community Toolkit Labs」コンポーネントと、「vNext」と呼ぶ次期バージョンのプレビュー版を紹介した。