01 Jan 2022

multipass で開発環境を構築したメモ

Multipass 上に開発環境を構築したメモ。

背景

  • もともと Vagrant + VirtualBox (クライアントは MacOS) で開発環境を構築していた
  • M1 チップの Mac に乗り換えたところ、VirtualBox が未対応だったので、EC2 (ubuntu) 上に環境を移した
  • 今回 multipass がなかなか良さそうなので環境の移植を試した

multipass とは

  • canonical が開発している ubuntu の仮想環境がさくっと立ち上げられるもの
  • cli のみだったり、コマンドもシンプルだったり、cloud-init に対応していたり、なかなか developer friendly というかセンスが良い第一印象

やってみた感想の雑多なメモ

  • M1 Mac 上ではアーキテクチャが aarc64 の ubuntu のイメージしかなさげだった
    • 自分の場合これまで x86 前提の環境だったので、結局ここの移行コストが一番高かった (まだ全部終わっていない)
2022-01-01 00:31 ubuntu@t2 $ uname -a
Linux t2 5.4.0-91-generic #102-Ubuntu SMP Fri Nov 5 16:30:45 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux
  • cloud-init の ユーザーデータフォーマット として cloud-config の yaml 形式にしか対応していない
    • これまで shell script を使っていたので yaml に移植する必要が出てしまった
    • 簡潔な仕様なのでそんなに大変ではないけど、cloud-init 対応が謳われていて既存の資産がそのまま使えるかなと期待していたのは裏切られた
  • 次のようなコマンドで直接 ssh アクセスができるらしい
    • multipassd が管理している秘密鍵を使えば良いらしい
    • このあたりを multipass shell などが隠蔽してくれているのだと思う
    • ssh port forward もこれでできる
    • 秘密鍵の所有者が root なので、適宜パーミッションの調整が必要
      • 例えば multipass のインスタンスに vscode remote でつなぐため、とりあえず秘密鍵を別の場所にコピーし一般ユーザーに chown した
        • もっと適切なやり方がありそうだが一旦こういう方法もあるということで
    • ref. Port forwarding · Issue #309 · canonical/multipass
sudo ssh -i /var/root/Library/Application\ Support/multipassd/ssh-keys/id_rsa ubuntu@<multipass instance ip>

# port forward するならこんな感じ
sudo ssh -N -i /var/root/Library/Application\ Support/multipassd/ssh-keys/id_rsa -L 0.0.0.0:3000:localhost:3000 ubuntu@<multipass instance ip>
  • cloud-config の packages に存在しないパッケージ名が混ざるとすべてのインストールが行われない
  • shebang が #! /bin/sh の場合、source コマンドが無い
    • まず /bin/sh の実態は他のシェルで、bash が使われることが多いが ubuntu は dash らしい
    • dash には source が無いので、#! /bin/shsource ~/.bashrc などとすると失敗する
    • . の方が汎用的なのでそちらのほうがいいらしい (i.e., . ~/.bashrc)
    • ref. bash - source command not found in sh shell - Stack Overflow
    • (multipass は関係ない ubuntu の話)

PR