Upgrade to Pro — share decks privately, control downloads, hide ads and more …

EC2 Mac インスタンスに入門してみた

EC2 Mac インスタンスに入門してみた

81d7473937e0f9443ca3dbb7dcd7b7ff?s=128

Hisashi.Iguchi

April 15, 2021
Tweet

Transcript

  1. EC2 Mac インスタンスに入門してみた - CIサービスのビルド Agent として活用できるのか - 井口 恒志

    (Hisashi Iguchi) 株式会社ディー・エヌ・エー システム本部 品質統括部 品質管理部 SWET第二グループ @Amazon Game Tech Conference 2021 [2021/04/15]
  2. 自己紹介 • 氏名 • 井口 恒志 (Hisashi Iguchi) @hisa9chi • 所属 •

    株式会社ディー・エヌ・エー SWET Gr. • 役割 • 自動テストの開発・導入サポート • CI/CD の活用促進や関連技術調査 • その他活動 • CircleCI Japan User Group Community Leaders • パーソナル • バスケ(プレイ、観戦)好きで、Bリーグ・NBAを毎日のようにみている 2
  3. 今日の内容 • EC2 Mac インスタンスを実際に利用してわかったことを紹介 • 現時点でJenkins ビルドAgent として利用可能か検討 3

  4. 目次 4 SWETとは? ビルドマシンのクラウドシフト EC2 Mac インスタンス入門 1 3 利用可能性の検討

    4 2
  5. 目次 5 SWETとは? ビルドマシンのクラウドシフト EC2 Mac インスタンス入門 1 3 利用可能性の検討

    4 2
  6. 6 SoftWare Engineer in Test c.f.> Google SET 「テストから見えてくるグーグルのソフトウェア開発」  

    https://shop.nikkeibp.co.jp/front/commodity/0000/P85120/
  7. 7 MISSION ソフトウェアテストを起点とした • DeNAサービス全般の品質向上 • DeNAエンジニアの開発生産性向上 により、価値あるものを素早く提供できるようにする VISION Make

    Testing Fun, Smart, and Delighting End-Users
  8. Make Testing Fun, Smart, and Delighting End-Users • Fun •

    テスティングを楽しくクリエイティブなものにする。 • Smart • 定型的なテストを人の手を煩わせず実現する。 • テストによるフィードバックを上手に活用して、素早い開発サイクルを実現する。 • Delighting End-Users • テストにより事業の成功を後押しするため、エンドユーザをデライトさせる様々な品質を計測し 改善する。 8
  9. SWETのプロジェクトへの関わり • ソフトウェアテスト技術分野ごとのチーム • アーキテクチャ • 自動テスト • プロセス(CI/CD) •

    それぞれのチームが様々な技術領域の案件へサポート • QAによるテスト工程よりも前の工程で品質・生産性の向上 • デバッグの効率化・工数削減などテスト技術の蓄積 • テスト全般の実行環境・プロセスサポート・サービス化 9 私が所属するチーム 開発プロセスにてCI/CDを効果的に 活用できるように ゲーム開発案件へサポート中 開発チームに技術として蓄積して運用していけるようにもサポート
  10. 10 SWETの取り組みを 定期的に投稿 https://swet.dena.com もしくは SWET Blog で検索

  11. 目次 11 SWETとは? ビルドマシンのクラウドシフト EC2 Mac インスタンス入門 1 3 利用可能性の検討

    4 2
  12. CI/CD環境 • iOS/android 向けのクライアントアプリビルド • Jenkins Cluster 構成を構築 • master:

    Linux(クラウド) • agent: macOS(物理マシン)、Linux(クラウド) • サーバ側開発 • Jenkins、CircleCI を活用 12 ビルド時間を短縮するためにハイスペックなマ シンを用意して利用 しかし、物理マシンの管理運用には高いコストがかかる クラウドのリソースを活用していきたい <参考>管理運用に関してのSWETの取り組み 「モバイルゲーム開発におけるJenkins  〜クラウド時代のJenkins構築と管理テクニック〜」 https://speakerdeck.com/dena_tech/mohairukemukai-fa-niokerujenkins kurautoshi-dai-falsejenkinsgou-zhu-toguan-li-tekunituku
  13. 13 https://www.macstadium.com/ 画像引用: https://www.macstadium.com/company/media を検証し導入 そこで、

  14. CI/CD環境 • iOS/android 向けのクライアントアプリビルド • Jenkins Cluster 構成を構築 • master:

    Linux(クラウド) • agent: macOS(MacStadium, 物理マシン)、Linux(クラウド) • サーバ側開発 • Jenkins、CircleCI を活用 14
  15. 15 ただ、MacStadium は物理マシンを クラウド上で借りられる サブスクリプション型サービス ユースケースも限られる

  16. 16 そんな中...

  17. 17 2020/12 AVAILABLE NOW! Amazon EC2 Mac Instances https://aws.amazon.com/jp/blogs/aws/new-use-mac-instances-to-build-test-macos-ios-ipados-tvos-and-watchos-apps/

  18. 18 えっ!!??

  19. 19 Run macOS on-demand in the cloud for the first

    time
  20. 20 使った分だけ支払いなので いろいろなユースケースで活用できそう

  21. 21 利用検証せずにはいられない!

  22. 目次 22 SWETとは? ビルドマシンのクラウドシフト EC2 Mac インスタンス入門 1 3 利用可能性の検討

    4 2
  23. EC2 Mac インスタンス基本情報 • 提供リージョン • us-east-1 : 米国東部(バージニア州北部) •

    us-east-2 : 米国東部(オハイオ州) • us-west-2 : 米国西部(オレゴン州) • eu-west-1 : 欧州(アイルランド) • ap-southeast-1 : アジアパシフィック(シンガポール) • スペック • サポートOS • Mojave :10.14.6 • Catalina :10.15.7 • Big Sur :11.2.1 23 インスタンス サイズ vCPU メモリ (GiB) インスタンスストレー ジ ネットワーク帯域幅 (Gbps) EBS帯域幅 (Mbps) EBS IOPS (16k ブロック) mac1.metal 12 32 EBS のみ 10 8,000 80,000
  24. EC2 Mac インスタンス基本情報 • インスタンス種別 • 専有ホスト上で動作 • 料金体系 •

    課金単位は1秒単位 • macインスタンス用の専有ホストは最低利用時間が 24時間 に設定 • 最低利用時間が経過しないと専有ホストのリリースは不可能 参考> • 概要: https://aws.amazon.com/jp/ec2/instance-types/mac/ • 料金: https://aws.amazon.com/jp/ec2/dedicated-hosts/pricing/ 24
  25. 25 実際に利用してわかった 注意点などを交えて紹介します

  26. EC2 Mac インスタンス起動 〜 破棄 • 起動から破棄までは大まかに以下の手順となる 1. 専有ホスト割り当て 2.

    インスタンスの起動 (EC2 Mac インスタンスの利用) 3. インスタンス停止 4. 専有ホストリリース 26 利用費用発生期間 注意 • 専有ホスト割り当て完了時点から費用が発生 • インスタンスの起動時間ではない
  27. 専有ホストの割り当て 1. AWS コンソールで 「EC2」へアクセス 2. 左メニューより「専有ホスト」を選択 3. 右上の ”専有ホストを割り当て”

    を選択 注意 • AZの選択を間違えないように • 割り当て完了すると変更できない • 24時間リリースできないので無駄な費用が発生 27 画像引用: AWSマネージメントコンソール
  28. 専有ホストの割り当て • 割り当てが完了すると以下のようにホストの状態が “Available” となる • 状態ごとの利用費用 • Available :インスタンス起動可能もしくはインスタンスが起動している状態

    => ⭕ 課金対象 • Pending :インスタンス停止後のリソース(SSD,NVRAMなど)初期化中状態 => ❌ 課金対象外 28 画像引用: AWSマネージメントコンソール
  29. EC2 Mac インスタンス起動 • 割り当てたホストを選択してインスタンス起動 • 基本的にはオンデマンドインスタンスを立ち上げるのと同様の手順 • 初回起動のステータスチェック •

    システムステータス / インスタンスステータスのチェック合格後に SSH接続可能 29 画像引用: AWSマネージメントコンソール
  30. EC2 Mac インスタンス起動 • 初回起動時のステータスチェック • Linuxマシンとは違い時間がかかる • ステータスチェックが完了する時間を以下で計測 •

    Catalina: 882秒 => 14分42秒 • Big Sur に関してはローンチプロセスの改善が計画されている模様 • 参考>> Big Sur: 467秒 => 7分20秒 • 起動の高速化の可能性 • EBSのFast Snapshot Restore(FSR)機能の利用 • 参考: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-fast-snapshot-restore.html 30 aws ec2 describe-instance-status | jq -r '.InstanceStatuses[] | select(.InstanceId == "InstanceID" and .InstanceStatus.Status == "ok" and .SystemStatus.Status == "ok") | true'
  31. EC2 Mac インスタンス開始と停止 • インスタンスの開始(Stopped => Running) • ステータスチェックがOKとなるまでの時間を計測 •

    Catalina: 334秒 => 5分34秒 • インスタンスの停止(Running => Stopped) • ステータスが Stopped になるまでの時間を計測 • Catalina: 1,143秒 => 19分3秒 31 aws ec2 describe-instance-status | jq -r '.InstanceStatuses[] | select(.InstanceId == "Instance ID" and .InstanceStatus.Status == "ok" and .SystemStatus.Status == "ok") | true' aws ec2 describe-instances | jq '.Reservations[].Instances[] | select(.InstanceId == "Instance ID" and .State.Name == "stopped") | true'
  32. 専有ホスト再利用可能までの時間 • インスタンスの停止命令実行後、専有ホストは Pending 状態となる • Pending 状態は専有ホストの再利用が不可(インスタンスが起動できない) • 専有ホストのリリースも行えない

    • Pending => Available の状態になるまでの時間を計測 • Catalina: 3,959秒 => 65分59秒 • 注意点 • インスタンスが起動された状態で共有ホストをリリースしたい場合 • インスタンスを停止して専有ホストがAvailable になってからリリース • 専有ホストの即時リリースが不可能 • 自動的に終了させるために現状は StepFunction などを駆使する必要あり • 間違えてインスタンスを停止した場合 • Available になるまで再度インスタンスが起動できない 32 aws ec2 describe-hosts | jq '.Hosts[] | select(.HostId == "Host ID" and .State == "available") | true'
  33. 専有ホストのリリース • 24時間以上稼働しており起動中のインスタンスがなければリリース可能 • インスタンス終了・停止状態の場合にリリース可能 • リリースが正常終了すると 状態が “Released” となる

    • 24時間経過していない場合やインスタンスが起動している場合はエラー 33 画像引用: AWSマネージメントコンソール
  34. 専有ホストリリース後の停止インスタンス起動 • インスタンスが停止された状態であれば専有ホストはリリース可能 • この停止されているインスタンスを再度起動するには以下の手順で可能 1. 新規に専有ホスト割り当て 2. 停止インスタンスの「インスタンスの配置の変更」実施 ホストのアフィニティで新規に割り当てた専有ホストを選択

    3. 停止インスタンスの起動 34 画像引用: AWSマネージメントコンソール
  35. OSのアップデート • パッチアップデートやメジャーアップデート自体は可能 • ただし • Disk IO(EBS)がボトルネックになる可能性あり • 新規AMIからオーケストレーションツールを活用の方が早い可能性あり

    • アップデート手順(考えられる手順) 1. 新規に専有ホストに新規AMIからインスタンス起動 2. オーケストレーションツールでセットアップ 3. 動作確認後にAMI作成 4. 古いインスタンスのENIを用いて3で作成したAMIからインスタンス起動 もしくは検証に利用したマシンに古いインスタンスのENIを付け替える 5. 不要な専有ホストを削除 35
  36. 目次 36 SWETとは? ビルドマシンのクラウドシフト EC2 Mac インスタンス入門 1 3 利用可能性の検討

    4 2
  37. 37 Jenkins ビルドAgent として 活用可能かを考える

  38. 38 まずはインスタンスの初期設定

  39. Mac インスタンスの初期設定 • ユーザ設定などの設定 • デフォルトユーザである ec2-user はパスワード変更または削除を推奨 • 新たに利用するユーザを新規で追加設定

    • /usr/local 配下のファイルオーナーを新規追加ユーザに変更 • brew などを新規ユーザ追加で実行可能とするため • ディスクの拡張 • ブートディスクサイズがデフォルトのサイズのままなので以下で拡張が必要 • 参考: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-mac-instances.html#mac-instance-increase-volume 39 % PDISK=$(diskutil list physical external | head -n1 | cut -d" " -f1) % APFSCONT=$(diskutil list physical external | grep "Apple_APFS" | tr -s " " | cut -d" " -f8) % echo y | sudo diskutil repairDisk $PDISK % sudo diskutil apfs resizeContainer $APFSCONT 0
  40. Mac インスタンスの初期設定 • VNC有効化 • UIでのログインが必要なこともあるので以下のコマンドで有効化 • 自動ログイン設定 • インスタンス起動時に自動でログインした状態としておくため

    • Jenkins agent などユーザのログインが必要な場合は設定しておくと便利 • VNCでログインして「システム環境設定」-「ユーザとグループ」 • "ログインオプション" にてユーザの自動ログインを有効化 40 sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart \ -activate -configure -access -on -clientopts -setvnclegacy -vnclegacy yes -clientopts -setvncpw \ -vncpw "ユーザのパスワード" -restart -agent -privs -all ここまでの設定で一部はインスタンス起動時の user-data として 設定して初回起動時に実行可能なようにすることも可能
  41. 41 初期設定とビルド用マシンとして セットアップしたAMIを作成することで いろいろと活用できそうな気がする

  42. カスタムAMIの活用 • インスタンスを起動して利用に応じたセットアップ後にAMIを作成 • 一度作成すれば再利用が容易 • EBSのFast Snapshot Restore(FSR)機能を利用すれば起動も高速化 •

    OSのバージョンごとにAMIを残しておく • 過去のバージョンでの検証などに利用が可能 • Jenkins agent として追加が容易になる • 接続のためのパラメータは user-data を活用すれば自動接続までできそう • 同様のイメージであれば個々のプロジェクトで作成する必要がない • チーム(アカウント)を超えてAMIを配布可能 • Jenkins ビルドAgent として必要なツールなどインストールしたAMIを作成して配布 • その後チームごとでカスタマイズしてAMIの再作成 42
  43. 43 専有ホストにはインスタンスを 複数停止状態で置いておくことが可能

  44. 専有ホストで起動可能なインスタンスをスタンバイ • 専有ホストは複数インスタンスで利用可能 • インスタンスが起動していなければ他のインスタンスを起動可能 • 例えば以下のようなことが実現可能 • 1つの専有ホストには1インスタンスのみの起動可能なリソースしかない •

    必要な時に必要なマシンを立ち上げて利用可能 • ただし、インスタンス停止後専有ホストが再利用可能になるまで時間がかかる 44 Dedecated host Dedecated host running running stopped stopped stopped Catalina Big Sur Catalina Big Sur Mojave
  45. 45 この専有ホストの再利用可能までに 約1時間かかるためマシンを切り替えて 利用するには障壁になる この再利用までにかかる時間は今後改善をしていく計画はあるようです

  46. 46 そこで、専有ホストを複数利用する という方針が考えられるが、、、

  47. 専有ホストの複数利用に関して • コスト面の問題 • mac インスタンス用の専有ホストは最低利用が24時間となっている • コストを削減のため利用時間をスケジュールするのが困難 • 例>

    平日 10:00 - 20:00 だけ利用するなど • Savings Plans など割引も利用可能だが割高な印象 • 概算: EC2 Instance Savings Plans で 1.062 USD/hour => 月に約 765 USD 47 最低利用時間が解除されて他の専有ホストと同様になれば1ホストに1インスタンスとして 必要な時に必要な時間だけ利用することが可能になるのでは 今後の改善に期待! コスト削減しつつ活用が可能
  48. 48 最後に 実際にJenkins Agent に設定して 簡単にパフォーマンスを比較してみた

  49. Jenkins ビルド Agent として実行パフォーマンス比較 • EC2 Mac インスタンスにJenkins ビルドAgent としてセットアップしたAMIを活用

    • サンプルプロジェクトをビルドするジョブで処理時間を比較 • サンプルは Unity プロジェクトであるが中身は空 • 物理の macOS と EC2 Macインスタンスの処理時間を比較 • タスクは iosプロジェクトのエクスポートと iosクライアントビルド • 参考>> マシンスペック(OS: Catalina 10.15.7) • 物理 macOS : 3.2 GHz 6core, 64GB • EC2 Mac : 12 vCPU (3.2 GHz 6core), 32GB 49 マシン \ タスク ProjectExport XcodeBuild 物理 macOS 2 min 25 s 20 min 2 s EC2 Mac 2 min 26 s 19 min 10 s
  50. 50 まとめ

  51. まとめ • macインスタンスを実際に立ち上げて使用感を確認 • 利用費用はインスタンス起動時間ではなく専有ホストを割り当てからリリースまで • 専有ホストは最低利用時間が24時間に設定 • インスタンスの起動や停止には時間がかかる •

    専有ホストの再利用までは約1時間ほどかかる • カスタムAMIを作成することで多くのシーンで利用可能 • OSのバージョンごとに作成することで過去バージョンでの検証が容易 • ビルドマシンとしてセットアップしたAMIからJenkins agent の追加が容易 • 現状大きくコスト削減することが困難 • 最低利用時間があることから利用ユーザが多い時間帯だけ台数を増やすなどが難しい 51 今回の我々の利用目的では Jenkins ビルド Agent として利用するにはコスト面で難しい 違う利用ケースだとマッチすることもあると思うで是非検証してみてください 多くの利用ケースの情報を共有していければ良いな思います
  52. 52 まだリリースされてからまもないので 今後さらに良い改善が実施されるはず 我々も今後の発展に期待しています!

  53. 53 End