こんにちは。
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ですが、開発する上でのパフォーマンスは素晴らしいです。強力なパートナーとして、これからも共に歩んでいきます。