EC2でCentOSを起動する時はKeyPairの指定に注意

2014.09.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。望月です。
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を作成するようにしましょう。