EC2でCentOSを起動する時はKeyPairの指定に注意
こんにちは。望月です。
Marketplace提供のCentOS6.5関連でちょっとハマったので、メモ書きしておきます。
ハマった内容
最近Packerをよく利用してAMIを作成しているのですが、CentOSに対してPackerを利用してAMIを作成した後、そのAMIを起動してもSSHで接続ができなくなりました。
どう頑張っても接続できなかったので、一度素のCentOSを起動し、ログインして調査していました。すると、/etc/rc.localに以下の記述があることを発見しました。
# Get the root ssh key setup ReTry=0 while [ ! -f /root/.ssh/authorized_keys ] && [ $ReTry -lt 10 ]; do sleep 2 curl -f http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key > /root/.ssh/authorized_keys ReTry=$[Retry+1] done chmod 600 /root/.ssh/authorized_keys && restorecon /root/.ssh/authorized_keys
ポイントは上の3行目と5行目です。/root/.ssh/authorized_keysがない時のみ、インスタンスメタデータの秘密鍵公開鍵を取得し、authorized_keysファイルを作成しています。これは言い換えると、CentOSのAMIに対しては、Key Pairの指定は初回起動時のみ有効ということになります。
実はPackerでは、AMIを作成するために一時的にインスタンスを起動するのですが、その際にtemporaryのKeyPairを作成し、インスタンスに紐付けています。Packerが作成した鍵情報がauthorized_keysに残ってしまったため、Packerで作成したAMIからインスタンスを起動する時にKeyPairを指定しても、反映されなかったのです!
回避方法
これに対する対処法は様々あると思いますが、私は上のスクリプトを少し書き換えて独自AMIを作成し、それを基にインスタンスを起動することで対応しました。変更点は以下の通りです。
$ diff -u /etc/rc.local.orig /etc/rc.local --- /etc/rc.local.orig 2014-09-01 08:40:41.329247112 +0000 +++ /etc/rc.local 2014-09-01 08:31:10.400720040 +0000 @@ -18,9 +18,14 @@ # Get the root ssh key setup ReTry=0 -while [ ! -f /root/.ssh/authorized_keys ] [ $ReTry -lt 10 ]; do +while [ $ReTry -lt 10 ]; do sleep 2 - curl -f http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key > /root/.ssh/authorized_keys + curl -f http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key >> /root/.ssh/authorized_keys + if [ $? -eq 0 ]; then + break + fi ReTry=$[Retry+1] done +cat /root/.ssh/authorized_keys | sort | uniq > /root/.ssh/authorized_keys.tmp +mv -f /root/.ssh/authorized_keys.tmp /root/.ssh/authorized_keys chmod 600 /root/.ssh/authorized_keys && restorecon /root/.ssh/authorized_keys
メタデータから公開鍵を取得する条件から、ファイルの存在確認を外しました。そして、/root/.ssh/authorized_keysに必ず追記するように設定しました。
その上で、重複したエントリは排除して、既存のauthorized_keysを上書きしています。この変更により、2回目以降の起動でもKeyPairが正常に設定されるようになります。
まとめ
AMIを取得した後、前回起動時とは異なるキーペアを指定して起動することはよくあると思います(例 : AMIを別アカウントからコピーして起動した時など)。
CentOSに対してそうする必要がある時はこの設定のことを思い出し、何かしら対処してからAMIを作成するようにしましょう。