M1 Mac の環境構築で大変だったこと

こんにちは。
Webエンジニアの村田です。
マッチングアプリ「CoupLink(カップリンク)」の開発に携わっています。

今回は、M1 Macの環境構築で大変だったことをご紹介します。

目次

背景

リンクバルでは、エンジニア向けに開発用のPCが貸与されるのですが、M1 Macが貸与されるのは私が初めてでした。

そのため、社内Wiki等にもM1に関するドキュメントはなく、Web上の情報を頼りに、また先輩エンジニアの助けを借りて、試行錯誤しながら環境構築をしました。

本記事は、その備忘録です。

M1 とは

  • Apple M1とは、AppleがMac及びiPad向けに設計したシステムオンチップ(SoC)
  • 2020/11/10 Apple Eventで発表
  • ARMアーキテクチャ

アーキテクチャとは

(命令セット)アーキテクチャとは、CPUが行う諸々の処理の仕様です。

  • ARM:ARM社のアーキテクチャ
    • スマホ、家電、ゲーム機、富岳
  • x86:インテル社 ( やAMD社 )のアーキテクチャ
    • Intel ( Core, Celeron, … ), AMD ( Ryzen, … )

同じアーキテクチャのCPUであれば、どの会社のCPUでも同じプログラムが動作します。
言い換えれば、異なるアーキテクチャだと、同じプログラムが動作しない、ということです。

M1の環境構築を難しくしているのは、このアーキテクチャの違いです。

色々動かない

ここからが本題です。
M1の環境構築で詰まった点を、3つに分けてご紹介します。

1. Docker ( MySQL )

リンクバルのサービスでは、いくつかのシステムでDockerを使用しています。
そのDocker上でMySQLというRDBMSを動かしているのですが、今回はここが詰まった点でした。

CoupLink(カップリンク)では、MySQL 5.7というバージョンを使用しているのですが、このバージョンは、ARM向けのイメージがありませんでした。

https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0167 より引用

そのため、--platformというDockerのオプションを設定する必要がありました。

--platformフラグ

  • Intelイメージをエミュレーション上で動かすことができるDockerの機能
  • QEMUの技術が用いられている
    • エミュレータ型の仮想化ソフトの一つ
    • CPU等の動作をソフトウェアによって再現

--platformフラグの使い方についてはこちらのサイトが詳しいです。

Tips: チーム開発での対処

--platformフラグ自体はdocker-compose.ymlに記述するだけで適用されますが、M1ユーザーだけコードに余計な差分が出てしまうため、以下のように対処しました。

  • Composeファイル2つ用意する
    • docker-compose.yml
    • docker-compose.local.yml
  • overrideする
    $ docker-compose -f docker-compose.yml -f docker-compose.local.yml up
  • gitignoreする:docker-compose.local.yml

2. リンクバルID

リンクバルIDとは、リンクバルの各種サービスで用いられている共通会員IDのシステムです。CoupLink(カップリンク)でも使用しています。

このリンクバルIDでもDockerとMySQL5.7が使われているので、前述の--platformフラグで対処しました。

一方、リンクバルID特有で起きた問題もありました。

goose

  • gooseとは、リンクバルIDで使用しているマイグレーションツール
  • これのバイナリがARMに対応していなかった

この問題は、インフラチームに依頼して、ARM向けのバイナリをリンクバルIDのプロジェクトに置いてもらうことで対処しました。

3. node-sass

CoupLink(カップリンク)では、Sassのコンパイルにnode-sass(LibSass)というライブラリを使用しています。このnode-sassもARM非対応でした。

この問題には、M1のRosetta 2という機能を使って対処しました。

Rosetta 2

Rosetta 2とは、Intel Mac用のバイナリをARMベースのM1 Macでも動くようにさせるためのエミュレーションソフトです。

このRosetta 2上でNode.jsを動かすことで、ARM非対応のnode-sassを、M1でも使えるようにしました。

細かい作業内容については、Qiitaに投稿しているので、そちらをご覧ください。

ちなみに、なぜRosetta 2なのかというと、2004年にMacintoshがPowerPCからIntelアーキテクチャに移行したときに使われたのがRosettaで、その後継なのでRosetta 2だそうです。

おわりに

今後の展望

今回の対処は、全体として「x86のエミュレータで何とかする」という方向性です。

しかし、今後M1 Macを使うエンジニアが増えることを考えると、M1にネイティブに対応する方が、より望ましいでしょう。

  • Dockerで使うMySQLのバージョンを上げる
    • MySQL 8.0であれば、ARMに対応したイメージが用意されている
  • node-sass(LibSass)から、Dart Sassに乗り換える
    • Dart SassはARMに対応している
    • node-sassは非推奨の流れが強くなっている

所感

Rosetta 2は問題なく動いています。M1の本領は発揮されていないと思いますが、それでも開発に支障が出るようなパフォーマンス低下は起きていません。

発売から2年近く経過していることもあり、Web上には比較的多くのノウハウが転がっていました。
主流どころの技術を使う場合は、何かしらの解決策が引っかかると思います。

大変なことも多いM1ですが、開発する上でのパフォーマンスは素晴らしいです。強力なパートナーとして、これからも共に歩んでいきます。