Open10

[NOT SOLVED]M1 Mac で Docker の Amazon Linux 2 Image に vagrant ssh できる環境を作りたい

amay077amay077

Vagrant は既定の仮想マシンが VirtualBox になっているが、VirtualBox は M1 Mac に対応していない。
そのため仮想マシン(Providerという)に Docker を使用する。

その上で、EC2 を模した環境をローカルに作りたい。
具体的には Amazon Linux 2 の Docker Image から作ったコンテナを Vagrant から起動して、vagrant ssh でログインできるようにした。

amay077amay077

まずは vagrant 関係なしに、Amazon Linux 2 の Docker Image をビルド&起動して、ssh で入れることを確認したいが、いきなりつまづいた。

先人たちの知恵↓

をトレースしてみたが、私の M1 Mac では、ssh ec2-user@localhost -p 2222 -i id_rsa_for_docker を実行すると、

sshamazonlinux2 % ssh ec2-user@localhost -p 2222 -i id_rsa           
kex_exchange_identification: Connection closed by remote host

というエラーが出てログインできない。
同じ構成で Windows 10 で実行するとログインできる(鍵ファイルもコピーしてきたので権限の過不足があり、 【Windows】SSHの鍵認証で「UNPROTECTED PRIVATE KEY FILE」が発生した場合の解決方法の紹介 – fumidzuki に従って解決した)。

PS C:\dev\sshamazonlinux2> ssh ec2-user@localhost -p 2222 -i .\id_rsa
Last failed login: Sun Dec 26 08:06:09 UTC 2021 from gateway on ssh:notty
There were 3 failed login attempts since the last successful login.
-bash-4.2$ whoami
ec2-user
amay077amay077

Intel Core i7 な MacBook Pro(2016 late) で試してみたら M1 Mac と同じエラーになった。

sshamazonlinux2 % ssh ec2-user@localhost -p 2222 -i id_rsa 
kex_exchange_identification: Connection closed by remote host
amay077amay077

ここまでのおさらい

手順

Amazon linux 2 docker image を ec2 で使われているものと似た感じにする - o296.com をトレース。

Dockerfile

FROM amazonlinux:2

# `shadow-utils` `procps` には基本的なコマンドが多く含まれています
RUN yum install -y sudo shadow-utils procps wget
RUN yum install -y openssh-server openssh-clients

# easy_install を使うためです
RUN wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python

# SSH の設定
RUN systemctl enable sshd.service
RUN echo "PasswordAuthentication no" >> /etc/ssh/sshd_config
COPY ./id_rsa.pub /home/ec2-user/.ssh/id_rsa.pub
RUN cat /home/ec2-user/.ssh/id_rsa.pub >> /home/ec2-user/.ssh/authorized_keys

# no password で sudo を可能にします
RUN useradd ec2-user
RUN echo "ec2-user ALL=NOPASSWD: ALL" >> /etc/sudoers

CMD /sbin/init

docker-compose.yml

version: '3'
services:
  web:
    build: .
    tty: true
    privileged: true
    ports:
      - "2222:22"
  1. ssh-gen -t rsa -f id_rsaid_rsaid_rsa.pub を生成
  2. docker-compose up --build -d
  3. ssh ec2-usert@localhost -p 2222 -i id_rsa

結果

  1. M1 Mac - kex_exchange_identification: Connection closed by remote host
  2. Intel Mac - kex_exchange_identification: Connection closed by remote host
  3. Windows10 - 成功

なんなん?

amay077amay077

DockerfileFROM amazonlinux:2FROM centos:8 に変えると成功するんだよなァ

※ easy_install の wget の行はコメントアウト(ただしここをコメントアウトしても amazonlinux:2 は動かない)

amay077amay077

昔の Image なら動くかも、と思って、

で試したけど変わらずエラーだった。

  • amazonlinux:2017.03.0.20170812 は docker build で失敗した
amay077amay077

vagrant-virtualbox が M1 Mac で使えない(Windows なら動く)から docker にしようとしているのに、そっちも windows でしか動かないんじゃ意味がないんよ。

amay077amay077

なぜ Amazon Linux 2 の Docker Image にこだわるのかと言うと、既存 proj の環境構築スクリプトが Amazon Linux 2 に依存しているから。
具体的に判っていることの一つは amazon-linux-extras を使っているということ。

centos イメージで amazon-linux-extras を使う方法があればそれでも良さそうだけど見つからない。

「じゃあスクリプト直せば」と言われたら、それだったら vagrant 使わなくても良いじゃんまである。
環境構築スクリプトでは postgres とか諸々をインストールしているので、だったらそれぞれの docker イメージを pull して・・・という docker-compose.yml を作ってスクリプトをそれに合わせればよいので。

今は 「Host が Mac の時に Amazon Linux 2 に ssh できないのはなぜ?」への興味が大きい。

amay077amay077

とはいえ、そこまで vagrant にも EC2 にも関心はないので、いったん諦めよう。