Amazon EC2 Macインスタンスを導入してみました

  • 2021.03.02
  • CI
Amazon EC2 Macインスタンスを導入してみました

こんにちは。エンジニアの鈴木聡です。

昨年の暮れ頃に、AWSの新インスタンスとして「Amazon EC2 Macインスタンス(mac1.metal)」が発表されました。

これにより、社内で稼働させているビルドマシンをクラウド上で稼働させることができる可能性が出てきたため、検証も兼ねて、AWSのMacインスタンスを用いたビルドフローを構築してみることにしました。

今までの環境について

今までは、JenkinsのコントローラをGoogleCloudPlatform上のLinuxインスタンスで稼働させて、エージェントは社内にMacを複数台置いて、分散ビルドを行っています。

これにより、ジョブを走らせるのがVPN経由で社外からもできるようになっており、リモートでの開発/リリース/メンテナンスが可能な状態になっています。

ただ、エージェントが全て社内に置かれているため、障害が起きてエージェントが落ちた時には、管理者が復旧のために緊急で出社をする必要がありました。

インスタンス構築

弊社の場合は、インフラチームがプロジェクトチームとは別に存在しており、インスタンス構築に関する依頼ができるようになっています。

今回の検証についても、インフラチームに存在していた検証用アカウントを用いて、インスタンスの立ち上げとセキュリティまわりの設定の対応をしてもらいましたが、最初のうちはセキュリティ保護の観点から、ほとんどのポートを閉じた状態で立ち上げられていました。

ビルド環境のセットアップを行うに従って、要求されるポートやIPについて見えてきたため、最低限必要なものだけをピックアップして、ポート開放してもらいながら対応を進めました。

図1. mac1.metalとしてインスタンスタイプが設定されています
図2. Macの画面共有で設定可能です

インスタンスの稼働時間抑制について

インスタンスは起動しているとその分お金がかかるので、使用していないタイミングではインスタンスを落としておくことが重要になります。特にMacインスタンスについては、登場したてということもあるのか、かなり高価なものになっています。

当初はJenkinsで要求されたらインスタンスが起動して、ビルドが終わり次第インスタンスが落とされるような運用を検討していたのですが、Macインスタンスは停止してから再起動できるまでに1時間くらいかかることが判明しました。そこで、細かくインスタンスを起動停止するのはあきらめて、平日の勤務時間内に稼働させて、それ以外の時は停止させる運用を目指すことにしました。

さすがに手動で毎日起動と停止を行うのは厳しいものがあるので、起動停止用のIAMアカウントを用意してもらって、そのアカウントを用いてAWSコマンドラインインターフェースを使って、Jenkinsから指定時間で起動停止するようにしました。

それだけだと、インスタンスが起動した時に、Jenkinsとの接続が復旧されないので、そちらについては、LaunchAgentsやMacOSの各機能を駆使して、インスタンス起動時にユーザログインを行い、そのユーザでJenkinsへ接続を行うように設定を行いました。

このJenkinsへの自動接続についてはMacインスタンス上でうまくいったので、すでに社内で稼働しているMacについても同様の設定を行い、Macを再起動するだけでJenkinsに繋ぎにいくようにしました。これにより、障害発生時にも、再起動だけで復旧できるようになり、緊急出社の頻度を落とすことが可能になりました。

図3. インスタンス起動スクリプト これを定時実行で呼び出しています

検証を行った結果

検証を行った結果、在宅で環境設定を行って、ビルドフローに組み込んで問題なく動作するところまで確認が取れました。しかし、インスタンスの稼働時間抑制を入れたとしても、金銭面において、全てのMacをAWS Macインスタンスに置き換えることは難しいことが確認できました。

最終的には、何かあった時の保険として、少しだけインスタンスを走らせておいて、社内で何か障害が発生した時も、復旧までの間にインスタンス側で最低限持ち堪えられるようにしました。

インスタンスの費用が下がってくれば、完全な置き換えも視野に入ってくるのではないかと思いますが、こちらについては今後の普及により価格が下がってくるのを期待したいと思います。