この記事は公開されてから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を作成するようにしましょう。